From 9c11401c73aed7ce2f6fc137ab275ce6eef8f16a Mon Sep 17 00:00:00 2001 From: Chedva Erblich Date: Sun, 4 Aug 2024 10:28:34 +0300 Subject: [PATCH 01/33] GUI: user interface --- .gitignore | 47 ++++ CMakeLists.txt | 22 ++ src/draggable_square.cpp | 48 ++++ src/draggable_square.h | 29 +++ src/dummy_program1/CMakeLists.txt | 6 + src/dummy_program1/main.cpp | 10 + src/dummy_program2/CMakeLists.txt | 6 + src/dummy_program2/main.cpp | 10 + src/main.cpp | 13 + src/main_window.cpp | 387 ++++++++++++++++++++++++++++++ src/main_window.h | 69 ++++++ src/process.cpp | 31 +++ src/process.h | 24 ++ src/process_dialog.cpp | 93 +++++++ src/process_dialog.h | 33 +++ src/simulation_data_manager.cpp | 122 ++++++++++ src/simulation_data_manager.h | 62 +++++ 17 files changed, 1012 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 src/draggable_square.cpp create mode 100644 src/draggable_square.h create mode 100644 src/dummy_program1/CMakeLists.txt create mode 100644 src/dummy_program1/main.cpp create mode 100644 src/dummy_program2/CMakeLists.txt create mode 100644 src/dummy_program2/main.cpp create mode 100644 src/main.cpp create mode 100644 src/main_window.cpp create mode 100644 src/main_window.h create mode 100644 src/process.cpp create mode 100644 src/process.h create mode 100644 src/process_dialog.cpp create mode 100644 src/process_dialog.h create mode 100644 src/simulation_data_manager.cpp create mode 100644 src/simulation_data_manager.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..09602ddc --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj +# Precompiled Headers +*.gch +*.pch +# Compiled Dynamic libraries +*.so +*.dylib +*.dll +# Fortran module files +*.mod +*.smod +# Compiled Static libraries +*.lai +*.la +*.a +*.lib +# Executables +*.exe +*.out +*.app +# CMake-related files +**/cmake-build-debug +**/CMakeCache.txt +**/cmake_install.cmake +**/install_manifest.txt +**/CMakeFiles/ +**/CTestTestfile.cmake +**/Makefile +**/*.cbp +**/CMakeScripts +**/compile_commands.json +# IDE-specific files +.idea/ +# Visual Studio Code +.vscode/ +# Ignore build directory +build/ +# Exclude generated files in include, lib, bin +include/divisible/* +lib/* +bin/* +# Test-specific files +test/test_runner \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..70b30005 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.5) + +# Set the project name and version +project(DraggableSquares VERSION 1.0) + +# Find the Qt5 library +find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui) + +# Include current source directory +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +# Add the main application files + +add_executable(DraggableSquares src/main.cpp src/draggable_square.cpp src/process.cpp src/process_dialog.cpp src/main_window.cpp) + +# Use the Qt5 Widgets module +target_link_libraries(DraggableSquares Qt5::Core Qt5::Gui Qt5::Widgets) + + diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp new file mode 100644 index 00000000..fa7903cd --- /dev/null +++ b/src/draggable_square.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#include +#include "draggable_square.h" + +DraggableSquare::DraggableSquare(QWidget *parent) : QWidget(parent), label(new QLabel(this)) +{ + setFixedSize(100, 100); + setStyleSheet("background-color: green;"); + QVBoxLayout *layout = new QVBoxLayout(this); + layout->addWidget(label); + setLayout(layout); +} + +void DraggableSquare::setProcess(const Process &process) +{ + this->process = process; + label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") + .arg(process.getId()) + .arg(process.getName()) + .arg(process.getCMakeProject()) + .arg(process.getQEMUPlatform())); +} + +const Process DraggableSquare::getProcess() const +{ + return process; +} + +void DraggableSquare::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + dragStartPosition = event->pos(); + initialPosition = pos(); + } +} + +void DraggableSquare::mouseMoveEvent(QMouseEvent *event) +{ + if (!(event->buttons() & Qt::LeftButton)) return; + QPoint newPos = mapToParent(event->pos() - dragStartPosition); + newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); + newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); + move(newPos); +} diff --git a/src/draggable_square.h b/src/draggable_square.h new file mode 100644 index 00000000..2f9235fd --- /dev/null +++ b/src/draggable_square.h @@ -0,0 +1,29 @@ +#ifndef __DRAGGABLE_SQUARE_H__ +#define __DRAGGABLE_SQUARE_H__ + +#include +#include +#include +#include "process.h" + +class DraggableSquare : public QWidget +{ + Q_OBJECT + +public: + explicit DraggableSquare(QWidget *parent = nullptr); + void setProcess(const Process &process); + const Process getProcess() const; + +protected: + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + +private: + QPoint dragStartPosition; + QPoint initialPosition; + QLabel *label; + Process process; +}; + +#endif // __DRAGGABLE_SQUARE_H__ diff --git a/src/dummy_program1/CMakeLists.txt b/src/dummy_program1/CMakeLists.txt new file mode 100644 index 00000000..d7812c0c --- /dev/null +++ b/src/dummy_program1/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.5) +project(DummyProgram) + +set(CMAKE_CXX_STANDARD 11) + +add_executable(dummy_program main.cpp) \ No newline at end of file diff --git a/src/dummy_program1/main.cpp b/src/dummy_program1/main.cpp new file mode 100644 index 00000000..bdf4d0bf --- /dev/null +++ b/src/dummy_program1/main.cpp @@ -0,0 +1,10 @@ +#include +#include +#include + +int main() { + for (int i = 0; i < 10; ++i) { + std::cout << "Dummy Program 1 is running: " << i << std::endl; + } + return 0; +} diff --git a/src/dummy_program2/CMakeLists.txt b/src/dummy_program2/CMakeLists.txt new file mode 100644 index 00000000..d7812c0c --- /dev/null +++ b/src/dummy_program2/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.5) +project(DummyProgram) + +set(CMAKE_CXX_STANDARD 11) + +add_executable(dummy_program main.cpp) \ No newline at end of file diff --git a/src/dummy_program2/main.cpp b/src/dummy_program2/main.cpp new file mode 100644 index 00000000..245aecc1 --- /dev/null +++ b/src/dummy_program2/main.cpp @@ -0,0 +1,10 @@ +#include +#include +#include + +int main() { + for (int i = 0; i < 10; ++i) { + std::cout << "Dummy Program 2 is running: " << i << std::endl; + } + return 0; +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 00000000..1f89d29a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,13 @@ +#include +#include "main_window.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + MainWindow window; + window.setFixedSize(600, 600); + window.show(); + + return app.exec(); +} diff --git a/src/main_window.cpp b/src/main_window.cpp new file mode 100644 index 00000000..0f7ec4ac --- /dev/null +++ b/src/main_window.cpp @@ -0,0 +1,387 @@ +#include +#include +#include "process.h" +#include "main_window.h" +#include +#include + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent), process1(nullptr), process2(nullptr), timer(nullptr) +{ + QWidget *centralWidget = new QWidget(this); + setCentralWidget(centralWidget); + + QHBoxLayout *mainLayout = new QHBoxLayout(centralWidget); + + QWidget *toolbox = new QWidget(this); + toolboxLayout = new QVBoxLayout(toolbox); + startButton = new QPushButton("Start", this); + endButton = new QPushButton("End", this); + timerButton = new QPushButton("Set Timer", this); + timeInput = new QLineEdit(this); + timeLabel = new QLabel("Enter time in seconds:", this); + logOutput = new QTextEdit(this); + QPushButton *chooseButton = new QPushButton("choose img", this); + + timeLabel->hide(); + timeInput->hide(); + logOutput->setReadOnly(true); + + mainLayout->addWidget(toolbox); + + QPushButton *addProcessButton = new QPushButton("Add Process", toolbox); + toolboxLayout->addWidget(addProcessButton); + toolboxLayout->addStretch(); + connect(addProcessButton, &QPushButton::clicked, this, &MainWindow::createNewProcess); + connect(startButton, &QPushButton::clicked, this, &MainWindow::startProcesses); + connect(endButton, &QPushButton::clicked, this, &MainWindow::endProcesses); + connect(timerButton, &QPushButton::clicked, this, &MainWindow::showTimerInput); + connect(chooseButton, &QPushButton::clicked, this, &MainWindow::openImageDialog); + + toolbox->setMaximumWidth(100); + toolbox->setMinimumWidth(100); + toolboxLayout->addWidget(startButton); + toolboxLayout->addWidget(endButton); + toolboxLayout->addWidget(timerButton); + toolboxLayout->addWidget(timeLabel); + toolboxLayout->addWidget(timeInput); + toolboxLayout->addWidget(logOutput); + toolboxLayout->addWidget(chooseButton); + + workspace = new QWidget(this); + workspace->setStyleSheet("background-color: white;"); + + imageLabel = new QLabel(this); + imageLabel->setAlignment(Qt::AlignCenter); + imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + + mainLayout->addWidget(workspace); + centralWidget->setLayout(mainLayout); + + int i = 0; + Process mainProcess(i, "Main", "../src/dummy_program1", "QEMUPlatform"); + addProcessSquare(mainProcess, i); + addId(i++); + Process hsmProcess(i, "HSM", "../src/dummy_program2", "QEMUPlatform"); + addProcessSquare(hsmProcess, i); + addId(i++); + Process logsDbProcess(i, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); + addProcessSquare(logsDbProcess, i); + addId(i++); + Process busManagerProcess(i, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); + addProcessSquare(busManagerProcess, i); + addId(i++); +} + +MainWindow::~MainWindow() +{ + qDeleteAll(squares); + if (process1) delete process1; + if (process2) delete process2; + if (timer) delete timer; +} + +void MainWindow::createNewProcess() +{ + ProcessDialog dialog(this); + + if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { + int id = dialog.getId(); + if (id <= 10) { + QMessageBox::warning(this, "Invalid ID", "The ID must be greater than 10."); + return; + } + if (!isUniqueId(id)) { + QMessageBox::warning(this, "Non-unique ID", "The ID entered is already in use. Please choose a different ID."); + return; + } + Process newProcess(id, dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform()); + addProcessSquare(newProcess); + addId(id); + } +} + +void MainWindow::addProcessSquare(const Process& process) +{ + DraggableSquare *square = new DraggableSquare(workspace); + square->setProcess(process); + + QPoint pos = squarePositions.value(process.getId(), QPoint(0, 0)); + square->move(pos); + square->show(); + + squarePositions[process.getId()] = pos; + squares.push_back(square); +} + +void MainWindow::addProcessSquare(const Process& process, int index) +{ + DraggableSquare *square = new DraggableSquare(workspace); + square->setProcess(process); + + int x = (index % 2) * (square->width() + 10); + int y = (index / 2) * (square->height() + 10); + QPoint pos = squarePositions.value(process.getId(), QPoint(x, y)); + square->move(pos); + square->show(); + + squarePositions[process.getId()] = pos; + squares.push_back(square); + +} + +bool MainWindow::isUniqueId(int id) +{ + return !usedIds.contains(id); +} + +void MainWindow::addId(int id) +{ + usedIds.insert(id); +} + +void MainWindow::startProcesses() +{ + QString inputText = timeInput->text(); + bool ok = true; + int time = 0; + + if (!inputText.isEmpty()) { + time = inputText.toInt(&ok); + } + + if (!ok || (time <= 0 && !inputText.isEmpty())) { + QMessageBox::warning(this, "Invalid Input", "Please enter a valid number of seconds."); + timeInput->clear(); + return; + } + + if (time > 0) { + logOutput->append("Timer started for " + QString::number(time) + " seconds."); + + if (timer) { + timer->stop(); + delete timer; + } + + timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &MainWindow::timerTimeout); + + timer->start(time * 1000); + timeLabel->hide(); + timeInput->hide(); + } + + + + compileBoxes(); + + // if (process1 && process1->state() != QProcess::NotRunning) { + // logOutput->append("Process1 is already running."); + // return; + // } + + // if (process2 && process2->state() != QProcess::NotRunning) { + // logOutput->append("Process2 is already running."); + // return; + // } + + // process1 = new QProcess(this); + // process2 = new QProcess(this); + + // QDir dir1("../src/dummy_program1/build"); + // QDir dir2("../src/dummy_program2/build"); + + // connect(process1, &QProcess::readyReadStandardOutput, this, &MainWindow::readProcess1Output); + // connect(process2, &QProcess::readyReadStandardOutput, this, &MainWindow::readProcess2Output); + + // logOutput->append("Starting process1 from: " + dir1.absoluteFilePath("dummy_program")); + // logOutput->append("Starting process2 from: " + dir2.absoluteFilePath("dummy_program")); + + // process1->start(dir1.absoluteFilePath("dummy_program"), QStringList()); + // process2->start(dir2.absoluteFilePath("dummy_program"), QStringList()); + + // if (!process1->waitForStarted() || !process2->waitForStarted()) { + // logOutput->append("Failed to start one or both processes."); + // delete process1; + // delete process2; + // process1 = nullptr; + // process2 = nullptr; + // return; + // } + + // logOutput->append("Both processes started successfully."); +} + +void MainWindow::endProcesses() +{ + logOutput->append("Ending processes..."); + + if (process1 && process1->state() != QProcess::NotRunning) { + logOutput->append("Ending process1..."); + process1->terminate(); + process1->waitForFinished(); + delete process1; + process1 = nullptr; + } + + if (process2 && process2->state() != QProcess::NotRunning) { + logOutput->append("Ending process2..."); + process2->terminate(); + process2->waitForFinished(); + delete process2; + process2 = nullptr; + } + + logOutput->append("All processes ended."); + + if (timer) { + timer->stop(); + delete timer; + timer = nullptr; + } + + timeInput->show(); + timeLabel->show(); + timeInput->clear(); +} + +void MainWindow::showTimerInput() +{ + timeLabel->show(); + timeInput->show(); +} + +void MainWindow::timerTimeout() +{ + logOutput->append("Timer timeout reached."); + endProcesses(); +} + +void MainWindow::readProcess1Output() +{ + logOutput->append("Process1: " + process1->readAllStandardOutput()); +} + +void MainWindow::readProcess2Output() +{ + logOutput->append("Process2: " + process2->readAllStandardOutput()); +} + +void MainWindow::openImageDialog() +{ + QString imagePath = QFileDialog::getOpenFileName(this, tr("Select Image"), "", tr("Image Files (*.png *.jpg *.jpeg)")); + if (!imagePath.isEmpty()) { + QPixmap pixmap(imagePath); + if (!pixmap.isNull()) { + QPalette palette; + palette.setBrush(this->backgroundRole(), QBrush(pixmap.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation))); + this->setPalette(palette); + this->setAutoFillBackground(true); + } + } +} + + +QString MainWindow::getExecutableName(const QString &buildDirPath) { + QDir buildDir(buildDirPath); + + // List all files in the build directory + QStringList files = buildDir.entryList(QDir::Files | QDir::NoSymLinks); + + // Iterate over the files to find the executable + foreach (const QString &file, files) { + QFileInfo fileInfo(buildDir.filePath(file)); + + // Check if the file has no extension (common on Linux) or is an executable (on Windows) + if (!fileInfo.suffix().isEmpty()) continue; + + // Check if the file has execute permissions (Unix-based systems) + if (fileInfo.isExecutable()) { + return fileInfo.fileName(); + } + } + + // If no executable file is found, return an empty string + return QString(); +} + + +void MainWindow::compileBoxes() { + + // Iterate over each directory and compile + for (const DraggableSquare* square : squares) { + QString cmakePath=square->getProcess().getCMakeProject(); + logOutput->append("Compiling " + cmakePath); + + // Define the build directory path + QDir cmakeDir(cmakePath); + QString buildDirPath = cmakeDir.absoluteFilePath("build"); + + // Create the build directory if it doesn't exist + QDir buildDir(buildDirPath); + if (!buildDir.exists()) { + if (!buildDir.mkpath(".")) { + logOutput->append("Failed to create build directory " + buildDirPath); + continue; + } + } + + QProcess cmakeProcess(this); + cmakeProcess.setWorkingDirectory(buildDirPath); + cmakeProcess.start("cmake", QStringList() << ".."); + if (!cmakeProcess.waitForFinished()) { + logOutput->append("Failed to run cmake in " + buildDirPath); + continue; + } + logOutput->append(cmakeProcess.readAllStandardOutput()); + logOutput->append(cmakeProcess.readAllStandardError()); + + QProcess makeProcess(this); + makeProcess.setWorkingDirectory(buildDirPath); + makeProcess.start("make", QStringList()); + if (!makeProcess.waitForFinished()) { + logOutput->append("Failed to compile " + buildDirPath); + continue; + } + logOutput->append(makeProcess.readAllStandardOutput()); + logOutput->append(makeProcess.readAllStandardError()); + + + logOutput->append("Successfully compiled " + buildDirPath); + + + // Run the compiled program + QString exeFile=getExecutableName(buildDirPath); + QString executablePath = buildDir.absoluteFilePath(exeFile); + QProcess runProcess(this); + runProcess.setWorkingDirectory(buildDirPath); + runProcess.start(executablePath, QStringList()); + if (!runProcess.waitForFinished()) { + logOutput->append("Failed to run the program in " + buildDirPath); + continue; + } + logOutput->append(runProcess.readAllStandardOutput()); + logOutput->append(runProcess.readAllStandardError()); + + } +} + + + + + + + + + + + + + + + + + +// Include the generated moc file +#include "moc_main_window.cpp" diff --git a/src/main_window.h b/src/main_window.h new file mode 100644 index 00000000..c7e7111d --- /dev/null +++ b/src/main_window.h @@ -0,0 +1,69 @@ +#ifndef MAIN_WINDOW_H +#define MAIN_WINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "process.h" +#include "draggable_square.h" +#include "process_dialog.h" + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + void startProcesses(); + void endProcesses(); + void showTimerInput(); + void timerTimeout(); + void readProcess1Output(); + void readProcess2Output(); + void openImageDialog(); + +private slots: + void createNewProcess(); + +private: + void addProcessSquare(const Process &process); + bool isUniqueId(int id); + void addId(int id); + void addProcessSquare(const Process& process, int index); + void compileBoxes(); + QString getExecutableName(const QString &buildDirPath); + QVBoxLayout *toolboxLayout; + QWidget *workspace; + std::vector squares; + QMap squarePositions; + QSet usedIds; + QSize originalSize; + QPushButton *startButton; + QPushButton *endButton; + QPushButton *timerButton; + QLineEdit *timeInput; + QLabel *timeLabel; + QTextEdit *logOutput; + QProcess *process1; + QProcess *process2; + QTimer *timer; + QLabel *imageLabel; +}; + +#endif // MAIN_WINDOW_H diff --git a/src/process.cpp b/src/process.cpp new file mode 100644 index 00000000..9f1a904e --- /dev/null +++ b/src/process.cpp @@ -0,0 +1,31 @@ +#include "process.h" + +Process::Process(int id, const QString &name, const QString &cmakeProject, const QString &qemuPlatform) + : id(id), name(name), cmakeProject(cmakeProject), qemuPlatform(qemuPlatform) +{ +} + +Process::Process() + : id(-1), name(""), cmakeProject(""), qemuPlatform("") +{ +} + +int Process::getId() const +{ + return id; +} + +QString Process::getName() const +{ + return name; +} + +QString Process::getCMakeProject() const +{ + return cmakeProject; +} + +QString Process::getQEMUPlatform() const +{ + return qemuPlatform; +} diff --git a/src/process.h b/src/process.h new file mode 100644 index 00000000..18401f9e --- /dev/null +++ b/src/process.h @@ -0,0 +1,24 @@ +#ifndef PROCESS_H +#define PROCESS_H + +#include + +class Process +{ +public: + Process(int id, const QString &name, const QString &cmakeProject, const QString &qemuPlatform); + Process(); + + int getId() const; + QString getName() const; + QString getCMakeProject() const; + QString getQEMUPlatform() const; + +private: + int id; + QString name; + QString cmakeProject; + QString qemuPlatform; +}; + +#endif // PROCESS_H diff --git a/src/process_dialog.cpp b/src/process_dialog.cpp new file mode 100644 index 00000000..d1821282 --- /dev/null +++ b/src/process_dialog.cpp @@ -0,0 +1,93 @@ +#include "process_dialog.h" +#include +#include +#include +#include +#include +#include + +ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + + QLabel *idLabel = new QLabel("ID:"); + idEdit = new QLineEdit(this); + idEdit->setValidator(new QIntValidator(11, 10000, this)); + layout->addWidget(idLabel); + layout->addWidget(idEdit); + + QLabel *nameLabel = new QLabel("Name:"); + nameEdit = new QLineEdit(this); + layout->addWidget(nameLabel); + layout->addWidget(nameEdit); + + QLabel *cmakeProjectLabel = new QLabel("CMake Project:"); + cmakeProjectEdit = new QLineEdit(this); + layout->addWidget(cmakeProjectLabel); + layout->addWidget(cmakeProjectEdit); + + QLabel *qemuPlatformLabel = new QLabel("QEMU Platform:"); + qemuPlatformEdit = new QLineEdit(this); + layout->addWidget(qemuPlatformLabel); + layout->addWidget(qemuPlatformEdit); + + QRegExp regex("[a-zA-Z0-9]*"); // Allows only English letters and numbers + QRegExpValidator *validator = new QRegExpValidator(regex, this); + + QRegExp cmakeProjectRegex("[\\x20-\\x7E]*"); // Allows any printable ASCII character + QRegExpValidator *cmakeProjectValidator = new QRegExpValidator(cmakeProjectRegex, this); + + nameEdit->setValidator(validator); + cmakeProjectEdit->setValidator(cmakeProjectValidator); + qemuPlatformEdit->setValidator(validator); + + QHBoxLayout *buttonLayout = new QHBoxLayout(); + QPushButton *okButton = new QPushButton("OK", this); + QPushButton *cancelButton = new QPushButton("Cancel", this); + buttonLayout->addWidget(okButton); + buttonLayout->addWidget(cancelButton); + layout->addLayout(buttonLayout); + + connect(okButton, &QPushButton::clicked, this, &ProcessDialog::validateAndAccept); + connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject); + + setLayout(layout); +} + +int ProcessDialog::getId() const +{ + return idEdit->text().toInt(); +} + +QString ProcessDialog::getName() const +{ + return nameEdit->text(); +} + +QString ProcessDialog::getCMakeProject() const +{ + return cmakeProjectEdit->text(); +} + +QString ProcessDialog::getQEMUPlatform() const +{ + return qemuPlatformEdit->text(); +} + +bool ProcessDialog::isValid() const +{ + return !idEdit->text().isEmpty() && !nameEdit->text().isEmpty() && + !cmakeProjectEdit->text().isEmpty() && !qemuPlatformEdit->text().isEmpty(); +} + +void ProcessDialog::validateAndAccept() +{ + if (isValid()) + { + accept(); + } + else + { + QMessageBox::warning(this, "Input Error", "Please fill in all fields correctly."); + } +} diff --git a/src/process_dialog.h b/src/process_dialog.h new file mode 100644 index 00000000..c15d901d --- /dev/null +++ b/src/process_dialog.h @@ -0,0 +1,33 @@ +#ifndef PROCESSDIALOG_H +#define PROCESSDIALOG_H + +#include +#include +#include +#include +#include + +class ProcessDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ProcessDialog(QWidget *parent = nullptr); + + int getId() const; + QString getName() const; + QString getCMakeProject() const; + QString getQEMUPlatform() const; + bool isValid() const; + +private slots: + void validateAndAccept(); + +private: + QLineEdit *idEdit; + QLineEdit *nameEdit; + QLineEdit *cmakeProjectEdit; + QLineEdit *qemuPlatformEdit; +}; + +#endif // PROCESSDIALOG_H diff --git a/src/simulation_data_manager.cpp b/src/simulation_data_manager.cpp new file mode 100644 index 00000000..cadee0d8 --- /dev/null +++ b/src/simulation_data_manager.cpp @@ -0,0 +1,122 @@ +#include "simulation_data_manager.h" +#include +#include +#include +#include + +SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + saveButton = new QPushButton("Save Simulation Data", this); + loadButton = new QPushButton("Load Simulation Data", this); + layout->addWidget(saveButton); + layout->addWidget(loadButton); + + connect(saveButton, &QPushButton::clicked, this, &SimulationDataManager::on_save_button_clicked); + connect(loadButton, &QPushButton::clicked, this, &SimulationDataManager::on_load_button_clicked); + + // Initialize simulation data (for demonstration) + data.processes = { {1, "Process1", "Code1", "Platform1", {10, 20}, {5, 5}}, + {2, "Process2", "Code2", "Platform2", {20, 30}, {5, 5}}}; + data.user = { 1, "User1", "./img" }; +} + +void SimulationDataManager::on_save_button_clicked() +{ + save_simulation_data("simulation_data.bson"); +} + +void SimulationDataManager::on_load_button_clicked() +{ + load_simulation_data("simulation_data.bson"); +} + +void SimulationDataManager::save_simulation_data(const std::string &fileName) +{ + bson_t *document = bson_new(); + + bson_t processes; + BSON_APPEND_ARRAY_BEGIN(document, "processes", &processes); + for (const auto &process : data.processes) { + bson_t proc; + char key[16]; + snprintf(key, sizeof(key), "%d", process.id); + BSON_APPEND_DOCUMENT_BEGIN(&processes, key, &proc); + BSON_APPEND_INT32(&proc, "id", process.id); + BSON_APPEND_UTF8(&proc, "name", process.name.c_str()); + BSON_APPEND_UTF8(&proc, "code", process.code.c_str()); + BSON_APPEND_UTF8(&proc, "platform", process.platform.c_str()); + + bson_t coordinate; + BSON_APPEND_DOCUMENT_BEGIN(&proc, "coordinate", &coordinate); + BSON_APPEND_INT32(&coordinate, "x", process.coordinate.x); + BSON_APPEND_INT32(&coordinate, "y", process.coordinate.y); + bson_append_document_end(&proc, &coordinate); + + bson_t size; + BSON_APPEND_DOCUMENT_BEGIN(&proc, "size", &size); + BSON_APPEND_INT32(&size, "x", process.size.x); + BSON_APPEND_INT32(&size, "y", process.size.y); + bson_append_document_end(&proc, &size); + + bson_append_document_end(&processes, &proc); + } + bson_append_array_end(document, &processes); + + bson_t user; + BSON_APPEND_DOCUMENT_BEGIN(document, "user", &user); + BSON_APPEND_INT32(&user, "id", data.user.id); + BSON_APPEND_UTF8(&user, "name", data.user.name.c_str()); + BSON_APPEND_UTF8(&user, "img", data.user.img.c_str()); + bson_append_document_end(document, &user); + + // Convert BSON to JSON and print + print_json(document); + + uint32_t length; + uint8_t *buf = bson_destroy_with_steal(document, true, &length); + + std::ofstream file(fileName, std::ios::binary); + if (file.is_open()) { + file.write(reinterpret_cast(buf), length); + file.close(); + std::cout << "Successfully saved data to " << fileName << std::endl; + } else { + std::cerr << "Failed to open file for writing: " << fileName << std::endl; + } + + bson_free(buf); +} + +void SimulationDataManager::load_simulation_data(const std::string &fileName) +{ + std::ifstream file(fileName, std::ios::binary | std::ios::ate); + if (!file.is_open()) { + std::cerr << "Failed to open file: " << fileName << std::endl; + return; + } + + std::streamsize size = file.tellg(); + file.seekg(0, std::ios::beg); + + std::vector buffer(size); + if (file.read(buffer.data(), size)) { + const uint8_t *data = reinterpret_cast(buffer.data()); + bson_t *document = bson_new_from_data(data, size); + if (document) { + print_json(document); + bson_destroy(document); + } else { + std::cerr << "Failed to parse BSON document" << std::endl; + } + } else { + std::cerr << "Failed to read file: " << fileName << std::endl; + } +} + +void SimulationDataManager::print_json(const bson_t *document) +{ + char *json = bson_as_json(document, nullptr); + std::cout << json << std::endl; + bson_free(json); +} diff --git a/src/simulation_data_manager.h b/src/simulation_data_manager.h new file mode 100644 index 00000000..dbb5e62f --- /dev/null +++ b/src/simulation_data_manager.h @@ -0,0 +1,62 @@ +#ifndef SIMULATION_DATA_MANAGER_H +#define SIMULATION_DATA_MANAGER_H + +#include +#include +#include +#include +#include + +class SimulationDataManager : public QWidget { + Q_OBJECT + +public: + SimulationDataManager(QWidget *parent = nullptr); + virtual ~SimulationDataManager() = default; + void save_simulation_data(const std::string &fileName); + void load_simulation_data(const std::string &fileName); + +private slots: + void on_save_button_clicked(); + void on_load_button_clicked(); + +private: + QPushButton *saveButton; + QPushButton *loadButton; + + struct Coordinate { + int x; + int y; + }; + + struct Size { + int x; + int y; + }; + + struct Process { + int id; + std::string name; + std::string code; + std::string platform; + Coordinate coordinate; + Size size; + }; + + struct User { + int id; + std::string name; + std::string img; + }; + + struct SimulationData { + std::vector processes; + User user; + }; + + SimulationData data; + + void print_json(const bson_t *document); +}; + +#endif // SIMULATION_DATA_MANAGER_H From 150185110ef1298c151da862c8d82bb57395952f Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Wed, 31 Jul 2024 01:13:21 +0300 Subject: [PATCH 02/33] GUI: Update .gitignore and remove ignored files from tracking --- .gitignore | 11 ++++++- src/draggable_square.cpp | 63 ++++++++++++++++++++++++++++++++++++++-- src/draggable_square.h | 2 +- src/main_window.cpp | 30 +++++++++---------- src/main_window.h | 2 +- 5 files changed, 87 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 09602ddc..a0dfacd9 100644 --- a/.gitignore +++ b/.gitignore @@ -44,4 +44,13 @@ include/divisible/* lib/* bin/* # Test-specific files -test/test_runner \ No newline at end of file +test/test_runner +#else +src/dummy_program1 +src/dummy_program2 +src/main.cpp +src/process_dialog.cpp +src/process_dialog.h +src/process.h +src/simulation_data_manager.cpp +src/simulation_data_manager.h \ No newline at end of file diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index fa7903cd..e80c3b2d 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -1,3 +1,55 @@ +// #include +// #include +// #include +// #include +// #include +// #include +// #include "draggable_square.h" +// #include +// #include +// #include + +// DraggableSquare::DraggableSquare(QWidget *parent,QString &color,int width,int height) : QWidget(parent), label(new QLabel(this)) +// { +// setFixedSize(width, height); +// setStyleSheet(color); +// QVBoxLayout *layout = new QVBoxLayout(this); +// layout->addWidget(label); +// setLayout(layout); +// } + +// void DraggableSquare::setProcess(const Process &process) +// { +// this->process = process; +// label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") +// .arg(process.getId()) +// .arg(process.getName()) +// .arg(process.getCMakeProject()) +// .arg(process.getQEMUPlatform())); +// } + +// const Process DraggableSquare::getProcess() const +// { +// return process; +// } + +// void DraggableSquare::mousePressEvent(QMouseEvent *event) +// { +// if (event->button() == Qt::LeftButton) { +// dragStartPosition = event->pos(); +// initialPosition = pos(); +// } +// } + +// void DraggableSquare::mouseMoveEvent(QMouseEvent *event) +// { +// if (!(event->buttons() & Qt::LeftButton)) return; +// QPoint newPos = mapToParent(event->pos() - dragStartPosition); +// newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); +// newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); +// move(newPos); +// } + #include #include #include @@ -5,11 +57,16 @@ #include #include #include "draggable_square.h" +#include +#include +#include -DraggableSquare::DraggableSquare(QWidget *parent) : QWidget(parent), label(new QLabel(this)) +// Update the constructor definition to match the declaration +DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, int width, int height) + : QWidget(parent), label(new QLabel(this)) { - setFixedSize(100, 100); - setStyleSheet("background-color: green;"); + setFixedSize(width, height); + setStyleSheet(color); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(label); setLayout(layout); diff --git a/src/draggable_square.h b/src/draggable_square.h index 2f9235fd..958a9e4f 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -11,7 +11,7 @@ class DraggableSquare : public QWidget Q_OBJECT public: - explicit DraggableSquare(QWidget *parent = nullptr); + explicit DraggableSquare(QWidget *parent = nullptr,const QString &color = "background-color: green;",int width=100,int height=100); void setProcess(const Process &process); const Process getProcess() const; diff --git a/src/main_window.cpp b/src/main_window.cpp index 0f7ec4ac..b075292d 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -58,19 +58,19 @@ MainWindow::MainWindow(QWidget *parent) mainLayout->addWidget(workspace); centralWidget->setLayout(mainLayout); - int i = 0; - Process mainProcess(i, "Main", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(mainProcess, i); - addId(i++); - Process hsmProcess(i, "HSM", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(hsmProcess, i); - addId(i++); - Process logsDbProcess(i, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(logsDbProcess, i); - addId(i++); - Process busManagerProcess(i, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(busManagerProcess, i); - addId(i++); + int id = 0; + Process mainProcess(id, "Main", "../src/dummy_program1", "QEMUPlatform"); + addProcessSquare(mainProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addId(id++); + Process hsmProcess(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); + addProcessSquare(hsmProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addId(id++); + Process logsDbProcess(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); + addProcessSquare(logsDbProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addId(id++); + Process busManagerProcess(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); + addProcessSquare(busManagerProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addId(id++); } MainWindow::~MainWindow() @@ -114,9 +114,9 @@ void MainWindow::addProcessSquare(const Process& process) squares.push_back(square); } -void MainWindow::addProcessSquare(const Process& process, int index) +void MainWindow::addProcessSquare(const Process& process, int index,const QString &color) { - DraggableSquare *square = new DraggableSquare(workspace); + DraggableSquare *square = new DraggableSquare(workspace,color,350,200); square->setProcess(process); int x = (index % 2) * (square->width() + 10); diff --git a/src/main_window.h b/src/main_window.h index c7e7111d..6ee3472a 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -45,7 +45,7 @@ private slots: void addProcessSquare(const Process &process); bool isUniqueId(int id); void addId(int id); - void addProcessSquare(const Process& process, int index); + void addProcessSquare(const Process& process, int index,const QString &color = "background-color: green;"); void compileBoxes(); QString getExecutableName(const QString &buildDirPath); QVBoxLayout *toolboxLayout; From 480f528eea8a743e99b9e6c3022fb51c797e9966 Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Wed, 31 Jul 2024 11:28:41 +0300 Subject: [PATCH 03/33] GUI: Modified to ensure processes terminate and allowed the user to select QEMU from predefined options --- src/draggable_square.cpp | 54 +---------------- src/dummy_program1/main.cpp | 1 + src/dummy_program2/main.cpp | 1 + src/main.cpp | 2 +- src/main_window.cpp | 114 +++++++++++------------------------- src/process_dialog.cpp | 18 +++--- src/process_dialog.h | 4 +- 7 files changed, 50 insertions(+), 144 deletions(-) diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index e80c3b2d..1eb7dadb 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -1,55 +1,3 @@ -// #include -// #include -// #include -// #include -// #include -// #include -// #include "draggable_square.h" -// #include -// #include -// #include - -// DraggableSquare::DraggableSquare(QWidget *parent,QString &color,int width,int height) : QWidget(parent), label(new QLabel(this)) -// { -// setFixedSize(width, height); -// setStyleSheet(color); -// QVBoxLayout *layout = new QVBoxLayout(this); -// layout->addWidget(label); -// setLayout(layout); -// } - -// void DraggableSquare::setProcess(const Process &process) -// { -// this->process = process; -// label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") -// .arg(process.getId()) -// .arg(process.getName()) -// .arg(process.getCMakeProject()) -// .arg(process.getQEMUPlatform())); -// } - -// const Process DraggableSquare::getProcess() const -// { -// return process; -// } - -// void DraggableSquare::mousePressEvent(QMouseEvent *event) -// { -// if (event->button() == Qt::LeftButton) { -// dragStartPosition = event->pos(); -// initialPosition = pos(); -// } -// } - -// void DraggableSquare::mouseMoveEvent(QMouseEvent *event) -// { -// if (!(event->buttons() & Qt::LeftButton)) return; -// QPoint newPos = mapToParent(event->pos() - dragStartPosition); -// newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); -// newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); -// move(newPos); -// } - #include #include #include @@ -102,4 +50,4 @@ void DraggableSquare::mouseMoveEvent(QMouseEvent *event) newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); move(newPos); -} +} \ No newline at end of file diff --git a/src/dummy_program1/main.cpp b/src/dummy_program1/main.cpp index bdf4d0bf..5fe229f3 100644 --- a/src/dummy_program1/main.cpp +++ b/src/dummy_program1/main.cpp @@ -5,6 +5,7 @@ int main() { for (int i = 0; i < 10; ++i) { std::cout << "Dummy Program 1 is running: " << i << std::endl; + std::this_thread::sleep_for(std::chrono::seconds(1)); // Simulate work } return 0; } diff --git a/src/dummy_program2/main.cpp b/src/dummy_program2/main.cpp index 245aecc1..2f268002 100644 --- a/src/dummy_program2/main.cpp +++ b/src/dummy_program2/main.cpp @@ -5,6 +5,7 @@ int main() { for (int i = 0; i < 10; ++i) { std::cout << "Dummy Program 2 is running: " << i << std::endl; + std::this_thread::sleep_for(std::chrono::seconds(1)); // Simulate work } return 0; } diff --git a/src/main.cpp b/src/main.cpp index 1f89d29a..2bb643de 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,4 +10,4 @@ int main(int argc, char *argv[]) window.show(); return app.exec(); -} +} \ No newline at end of file diff --git a/src/main_window.cpp b/src/main_window.cpp index b075292d..d48ebf7b 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -116,7 +116,7 @@ void MainWindow::addProcessSquare(const Process& process) void MainWindow::addProcessSquare(const Process& process, int index,const QString &color) { - DraggableSquare *square = new DraggableSquare(workspace,color,350,200); + DraggableSquare *square = new DraggableSquare(workspace,color,120,120); square->setProcess(process); int x = (index % 2) * (square->width() + 10); @@ -175,75 +175,33 @@ void MainWindow::startProcesses() compileBoxes(); - - // if (process1 && process1->state() != QProcess::NotRunning) { - // logOutput->append("Process1 is already running."); - // return; - // } - - // if (process2 && process2->state() != QProcess::NotRunning) { - // logOutput->append("Process2 is already running."); - // return; - // } - - // process1 = new QProcess(this); - // process2 = new QProcess(this); - - // QDir dir1("../src/dummy_program1/build"); - // QDir dir2("../src/dummy_program2/build"); - - // connect(process1, &QProcess::readyReadStandardOutput, this, &MainWindow::readProcess1Output); - // connect(process2, &QProcess::readyReadStandardOutput, this, &MainWindow::readProcess2Output); - - // logOutput->append("Starting process1 from: " + dir1.absoluteFilePath("dummy_program")); - // logOutput->append("Starting process2 from: " + dir2.absoluteFilePath("dummy_program")); - - // process1->start(dir1.absoluteFilePath("dummy_program"), QStringList()); - // process2->start(dir2.absoluteFilePath("dummy_program"), QStringList()); - - // if (!process1->waitForStarted() || !process2->waitForStarted()) { - // logOutput->append("Failed to start one or both processes."); - // delete process1; - // delete process2; - // process1 = nullptr; - // process2 = nullptr; - // return; - // } - - // logOutput->append("Both processes started successfully."); } -void MainWindow::endProcesses() +void MainWindow::endProcesses() { logOutput->append("Ending processes..."); - - if (process1 && process1->state() != QProcess::NotRunning) { - logOutput->append("Ending process1..."); - process1->terminate(); - process1->waitForFinished(); - delete process1; - process1 = nullptr; - } - - if (process2 && process2->state() != QProcess::NotRunning) { - logOutput->append("Ending process2..."); - process2->terminate(); - process2->waitForFinished(); - delete process2; - process2 = nullptr; - } - - logOutput->append("All processes ended."); - if (timer) { timer->stop(); delete timer; timer = nullptr; } - timeInput->show(); timeLabel->show(); timeInput->clear(); + for (const DraggableSquare* square : squares) { + QString cmakePath = square->getProcess().getCMakeProject(); + logOutput->append("Compiling " + cmakePath); + // Define the build directory path + QDir cmakeDir(cmakePath); + QString buildDirPath = cmakeDir.absoluteFilePath("build"); + QProcess endProcess(this); + endProcess.setWorkingDirectory(buildDirPath); + if (endProcess.state() != QProcess::NotRunning) { + logOutput->append("Ending process..."); + endProcess.terminate(); + endProcess.waitForFinished(); + } + } } void MainWindow::showTimerInput() @@ -282,8 +240,8 @@ void MainWindow::openImageDialog() } } - -QString MainWindow::getExecutableName(const QString &buildDirPath) { +QString MainWindow::getExecutableName(const QString &buildDirPath) +{ QDir buildDir(buildDirPath); // List all files in the build directory @@ -306,8 +264,8 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) { return QString(); } - -void MainWindow::compileBoxes() { +void MainWindow::compileBoxes() +{ // Iterate over each directory and compile for (const DraggableSquare* square : squares) { @@ -321,12 +279,24 @@ void MainWindow::compileBoxes() { // Create the build directory if it doesn't exist QDir buildDir(buildDirPath); if (!buildDir.exists()) { + // Remove all files and subdirectories in the build directory + QFileInfoList fileList = buildDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); + foreach (const QFileInfo &fileInfo, fileList) { + if (fileInfo.isDir()) { + QDir dir(fileInfo.absoluteFilePath()); + dir.removeRecursively(); + } else { + QFile::remove(fileInfo.absoluteFilePath()); + } + } + } else { + // Create the build directory if it doesn't exist if (!buildDir.mkpath(".")) { logOutput->append("Failed to create build directory " + buildDirPath); continue; } } - + QProcess cmakeProcess(this); cmakeProcess.setWorkingDirectory(buildDirPath); cmakeProcess.start("cmake", QStringList() << ".."); @@ -363,25 +333,9 @@ void MainWindow::compileBoxes() { } logOutput->append(runProcess.readAllStandardOutput()); logOutput->append(runProcess.readAllStandardError()); - } } - - - - - - - - - - - - - - - // Include the generated moc file -#include "moc_main_window.cpp" +#include "moc_main_window.cpp" \ No newline at end of file diff --git a/src/process_dialog.cpp b/src/process_dialog.cpp index d1821282..2020424b 100644 --- a/src/process_dialog.cpp +++ b/src/process_dialog.cpp @@ -5,6 +5,7 @@ #include #include #include +#include ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) { @@ -27,9 +28,10 @@ ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) layout->addWidget(cmakeProjectEdit); QLabel *qemuPlatformLabel = new QLabel("QEMU Platform:"); - qemuPlatformEdit = new QLineEdit(this); + qemuPlatformCombo = new QComboBox(this); + qemuPlatformCombo->addItems({"x86_64", "arm", "aarch64"}); layout->addWidget(qemuPlatformLabel); - layout->addWidget(qemuPlatformEdit); + layout->addWidget(qemuPlatformCombo); QRegExp regex("[a-zA-Z0-9]*"); // Allows only English letters and numbers QRegExpValidator *validator = new QRegExpValidator(regex, this); @@ -39,7 +41,7 @@ ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) nameEdit->setValidator(validator); cmakeProjectEdit->setValidator(cmakeProjectValidator); - qemuPlatformEdit->setValidator(validator); + // qemuPlatformEdit->setValidator(validator); QHBoxLayout *buttonLayout = new QHBoxLayout(); QPushButton *okButton = new QPushButton("OK", this); @@ -71,23 +73,21 @@ QString ProcessDialog::getCMakeProject() const QString ProcessDialog::getQEMUPlatform() const { - return qemuPlatformEdit->text(); + return qemuPlatformCombo->currentText(); } bool ProcessDialog::isValid() const { return !idEdit->text().isEmpty() && !nameEdit->text().isEmpty() && - !cmakeProjectEdit->text().isEmpty() && !qemuPlatformEdit->text().isEmpty(); + !cmakeProjectEdit->text().isEmpty() && !qemuPlatformCombo->currentText().isEmpty(); } void ProcessDialog::validateAndAccept() { - if (isValid()) - { + if (isValid()) { accept(); } - else - { + else { QMessageBox::warning(this, "Input Error", "Please fill in all fields correctly."); } } diff --git a/src/process_dialog.h b/src/process_dialog.h index c15d901d..88623070 100644 --- a/src/process_dialog.h +++ b/src/process_dialog.h @@ -6,6 +6,7 @@ #include #include #include +#include class ProcessDialog : public QDialog { @@ -27,7 +28,8 @@ private slots: QLineEdit *idEdit; QLineEdit *nameEdit; QLineEdit *cmakeProjectEdit; - QLineEdit *qemuPlatformEdit; + // QLineEdit *qemuPlatformEdit; + QComboBox *qemuPlatformCombo; }; #endif // PROCESSDIALOG_H From be598ae931361f4bb111fce24c6c7d8bc1970186 Mon Sep 17 00:00:00 2001 From: Tamar-Leibovitz Date: Wed, 31 Jul 2024 12:53:53 +0300 Subject: [PATCH 04/33] GUI: Make all proccesses run together and fix the end button --- src/main_window.cpp | 112 +++++++++++++++++++++++--------------------- src/main_window.h | 2 + 2 files changed, 60 insertions(+), 54 deletions(-) diff --git a/src/main_window.cpp b/src/main_window.cpp index d48ebf7b..f68ec721 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -177,31 +177,28 @@ void MainWindow::startProcesses() compileBoxes(); } -void MainWindow::endProcesses() -{ +void MainWindow::endProcesses() { logOutput->append("Ending processes..."); + if (timer) { timer->stop(); delete timer; timer = nullptr; } + timeInput->show(); timeLabel->show(); timeInput->clear(); - for (const DraggableSquare* square : squares) { - QString cmakePath = square->getProcess().getCMakeProject(); - logOutput->append("Compiling " + cmakePath); - // Define the build directory path - QDir cmakeDir(cmakePath); - QString buildDirPath = cmakeDir.absoluteFilePath("build"); - QProcess endProcess(this); - endProcess.setWorkingDirectory(buildDirPath); - if (endProcess.state() != QProcess::NotRunning) { + + for (QProcess* process : runningProcesses) { + if (process->state() != QProcess::NotRunning) { logOutput->append("Ending process..."); - endProcess.terminate(); - endProcess.waitForFinished(); + process->terminate(); + process->waitForFinished(); } + delete process; } + runningProcesses.clear(); } void MainWindow::showTimerInput() @@ -264,12 +261,18 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) return QString(); } -void MainWindow::compileBoxes() -{ +void MainWindow::compileBoxes() { + // Clear previous running processes + for (QProcess* process : runningProcesses) { + process->terminate(); + process->waitForFinished(); + delete process; + } + runningProcesses.clear(); // Iterate over each directory and compile for (const DraggableSquare* square : squares) { - QString cmakePath=square->getProcess().getCMakeProject(); + QString cmakePath = square->getProcess().getCMakeProject(); logOutput->append("Compiling " + cmakePath); // Define the build directory path @@ -279,60 +282,61 @@ void MainWindow::compileBoxes() // Create the build directory if it doesn't exist QDir buildDir(buildDirPath); if (!buildDir.exists()) { - // Remove all files and subdirectories in the build directory - QFileInfoList fileList = buildDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); - foreach (const QFileInfo &fileInfo, fileList) { - if (fileInfo.isDir()) { - QDir dir(fileInfo.absoluteFilePath()); - dir.removeRecursively(); - } else { - QFile::remove(fileInfo.absoluteFilePath()); - } - } - } else { - // Create the build directory if it doesn't exist if (!buildDir.mkpath(".")) { logOutput->append("Failed to create build directory " + buildDirPath); continue; } } - - QProcess cmakeProcess(this); - cmakeProcess.setWorkingDirectory(buildDirPath); - cmakeProcess.start("cmake", QStringList() << ".."); - if (!cmakeProcess.waitForFinished()) { + // Clean the build directory + QProcess cleanProcess(this); + cleanProcess.setWorkingDirectory(buildDirPath); + cleanProcess.start("rm", QStringList() << "-rf" << "*"); + if (!cleanProcess.waitForFinished()) { + logOutput->append("Failed to clean build directory " + buildDirPath); + continue; + } + QProcess* cmakeProcess = new QProcess(this); + cmakeProcess->setWorkingDirectory(buildDirPath); + cmakeProcess->start("cmake", QStringList() << ".."); + if (!cmakeProcess->waitForFinished()) { logOutput->append("Failed to run cmake in " + buildDirPath); + delete cmakeProcess; continue; } - logOutput->append(cmakeProcess.readAllStandardOutput()); - logOutput->append(cmakeProcess.readAllStandardError()); - - QProcess makeProcess(this); - makeProcess.setWorkingDirectory(buildDirPath); - makeProcess.start("make", QStringList()); - if (!makeProcess.waitForFinished()) { + logOutput->append(cmakeProcess->readAllStandardOutput()); + logOutput->append(cmakeProcess->readAllStandardError()); + delete cmakeProcess; + + QProcess* makeProcess = new QProcess(this); + makeProcess->setWorkingDirectory(buildDirPath); + makeProcess->start("make", QStringList()); + if (!makeProcess->waitForFinished()) { logOutput->append("Failed to compile " + buildDirPath); + delete makeProcess; continue; } - logOutput->append(makeProcess.readAllStandardOutput()); - logOutput->append(makeProcess.readAllStandardError()); - + logOutput->append(makeProcess->readAllStandardOutput()); + logOutput->append(makeProcess->readAllStandardError()); + delete makeProcess; logOutput->append("Successfully compiled " + buildDirPath); - // Run the compiled program - QString exeFile=getExecutableName(buildDirPath); + QString exeFile = getExecutableName(buildDirPath); QString executablePath = buildDir.absoluteFilePath(exeFile); - QProcess runProcess(this); - runProcess.setWorkingDirectory(buildDirPath); - runProcess.start(executablePath, QStringList()); - if (!runProcess.waitForFinished()) { - logOutput->append("Failed to run the program in " + buildDirPath); - continue; - } - logOutput->append(runProcess.readAllStandardOutput()); - logOutput->append(runProcess.readAllStandardError()); + QProcess* runProcess = new QProcess(this); + runProcess->setWorkingDirectory(buildDirPath); + + connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() { + logOutput->append(runProcess->readAllStandardOutput()); + }); + + connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() { + logOutput->append(runProcess->readAllStandardError()); + }); + + runProcess->start(executablePath, QStringList()); + runningProcesses.append(runProcess); } } diff --git a/src/main_window.h b/src/main_window.h index 6ee3472a..2fdb454b 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -64,6 +64,8 @@ private slots: QProcess *process2; QTimer *timer; QLabel *imageLabel; + QVector runningProcesses; + }; #endif // MAIN_WINDOW_H From ef7feeec811d1acb5ce5b6aac61c5c45d7901b03 Mon Sep 17 00:00:00 2001 From: chaniweisblum Date: Sun, 4 Aug 2024 12:47:01 +0300 Subject: [PATCH 05/33] GUI: Background completion on the entire window --- src/main_window.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main_window.cpp b/src/main_window.cpp index f68ec721..f6e170b3 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -229,14 +229,33 @@ void MainWindow::openImageDialog() if (!imagePath.isEmpty()) { QPixmap pixmap(imagePath); if (!pixmap.isNull()) { - QPalette palette; - palette.setBrush(this->backgroundRole(), QBrush(pixmap.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation))); - this->setPalette(palette); - this->setAutoFillBackground(true); + // Clear the workspace before adding the new image + QLayout *layout = workspace->layout(); + if (layout) { + QLayoutItem *item; + while ((item = layout->takeAt(0)) != nullptr) { + delete item->widget(); // Delete the widget + delete item; // Delete the layout item + } + } + + // Create a new QLabel to display the image as background + QLabel *backgroundLabel = new QLabel(workspace); + backgroundLabel->setPixmap(pixmap.scaled(workspace->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + backgroundLabel->setGeometry(workspace->rect()); // Fit QLabel to the size of the workspace + backgroundLabel->setScaledContents(true); + backgroundLabel->setAttribute(Qt::WA_TranslucentBackground); // Ensure the image appears only as background + backgroundLabel->lower(); // Move QLabel below other content in the workspace + backgroundLabel->show(); + + // Add a new layout to the workspace + QVBoxLayout *newLayout = new QVBoxLayout(workspace); + workspace->setLayout(newLayout); } } } + QString MainWindow::getExecutableName(const QString &buildDirPath) { QDir buildDir(buildDirPath); From 86515f30abe61190fc30beceef10571a95b7709e Mon Sep 17 00:00:00 2001 From: Dvora Novogrotzki Date: Sun, 4 Aug 2024 14:25:35 +0300 Subject: [PATCH 06/33] GUI: Connect the Binary Json to the GUI --- CMakeLists.txt | 25 +++++++--- src/draggable_square.cpp | 5 ++ src/draggable_square.h | 1 + src/main_window.cpp | 5 ++ src/main_window.h | 5 +- src/simulation_data_manager.cpp | 86 ++++++++++++++++----------------- src/simulation_data_manager.h | 46 +++++------------- 7 files changed, 89 insertions(+), 84 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70b30005..80e79e70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,11 +12,22 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) -# Add the main application files - -add_executable(DraggableSquares src/main.cpp src/draggable_square.cpp src/process.cpp src/process_dialog.cpp src/main_window.cpp) - -# Use the Qt5 Widgets module -target_link_libraries(DraggableSquares Qt5::Core Qt5::Gui Qt5::Widgets) - +# Find the BSON library +find_package(PkgConfig REQUIRED) +pkg_check_modules(BSON REQUIRED libbson-1.0) +# Add the main application files +add_executable(DraggableSquares + src/main.cpp + src/draggable_square.cpp + src/process.cpp + src/process_dialog.cpp + src/main_window.cpp + src/simulation_data_manager.cpp +) + +# Include BSON directories +target_include_directories(DraggableSquares PRIVATE ${BSON_INCLUDE_DIRS}) + +# Link the BSON library +target_link_libraries(DraggableSquares ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index 1eb7dadb..7cbc4256 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -35,6 +35,11 @@ const Process DraggableSquare::getProcess() const return process; } +const QPoint DraggableSquare::getDragStartPosition() const +{ + return dragStartPosition; +} + void DraggableSquare::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { diff --git a/src/draggable_square.h b/src/draggable_square.h index 958a9e4f..52dd4cc6 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -14,6 +14,7 @@ class DraggableSquare : public QWidget explicit DraggableSquare(QWidget *parent = nullptr,const QString &color = "background-color: green;",int width=100,int height=100); void setProcess(const Process &process); const Process getProcess() const; + const QPoint getDragStartPosition() const; protected: void mousePressEvent(QMouseEvent *event) override; diff --git a/src/main_window.cpp b/src/main_window.cpp index f6e170b3..5382b6ae 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -58,6 +58,8 @@ MainWindow::MainWindow(QWidget *parent) mainLayout->addWidget(workspace); centralWidget->setLayout(mainLayout); + dataManager = new SimulationDataManager(this); + int id = 0; Process mainProcess(id, "Main", "../src/dummy_program1", "QEMUPlatform"); addProcessSquare(mainProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); @@ -190,6 +192,8 @@ void MainWindow::endProcesses() { timeLabel->show(); timeInput->clear(); + dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); + for (QProcess* process : runningProcesses) { if (process->state() != QProcess::NotRunning) { logOutput->append("Ending process..."); @@ -227,6 +231,7 @@ void MainWindow::openImageDialog() { QString imagePath = QFileDialog::getOpenFileName(this, tr("Select Image"), "", tr("Image Files (*.png *.jpg *.jpeg)")); if (!imagePath.isEmpty()) { + currentImagePath = imagePath; QPixmap pixmap(imagePath); if (!pixmap.isNull()) { // Clear the workspace before adding the new image diff --git a/src/main_window.h b/src/main_window.h index 2fdb454b..872393cf 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -21,6 +21,7 @@ #include "process.h" #include "draggable_square.h" #include "process_dialog.h" +#include "simulation_data_manager.h" class MainWindow : public QMainWindow { @@ -50,7 +51,7 @@ private slots: QString getExecutableName(const QString &buildDirPath); QVBoxLayout *toolboxLayout; QWidget *workspace; - std::vector squares; + QVector squares; QMap squarePositions; QSet usedIds; QSize originalSize; @@ -65,6 +66,8 @@ private slots: QTimer *timer; QLabel *imageLabel; QVector runningProcesses; + QString currentImagePath; + SimulationDataManager *dataManager; }; diff --git a/src/simulation_data_manager.cpp b/src/simulation_data_manager.cpp index cadee0d8..e491dd13 100644 --- a/src/simulation_data_manager.cpp +++ b/src/simulation_data_manager.cpp @@ -1,38 +1,34 @@ #include "simulation_data_manager.h" #include #include +#include +#include #include #include +#include SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) { - QVBoxLayout *layout = new QVBoxLayout(this); - saveButton = new QPushButton("Save Simulation Data", this); - loadButton = new QPushButton("Load Simulation Data", this); - layout->addWidget(saveButton); - layout->addWidget(loadButton); - - connect(saveButton, &QPushButton::clicked, this, &SimulationDataManager::on_save_button_clicked); - connect(loadButton, &QPushButton::clicked, this, &SimulationDataManager::on_load_button_clicked); - - // Initialize simulation data (for demonstration) - data.processes = { {1, "Process1", "Code1", "Platform1", {10, 20}, {5, 5}}, - {2, "Process2", "Code2", "Platform2", {20, 30}, {5, 5}}}; - data.user = { 1, "User1", "./img" }; } -void SimulationDataManager::on_save_button_clicked() +void SimulationDataManager::readSimulationData(QVector squares, QString img) { - save_simulation_data("simulation_data.bson"); -} + for(int i = 0; i < squares.size(); i++) { + if(squares[i] != nullptr) + data.processes.append(squares[i]); + else + qWarning() << "Warning: Null pointer at index" << i; + } -void SimulationDataManager::on_load_button_clicked() -{ - load_simulation_data("simulation_data.bson"); + data.user.id = 1; + data.user.name = "default user"; + data.user.img = img; } -void SimulationDataManager::save_simulation_data(const std::string &fileName) +void SimulationDataManager::saveSimulationData(const std::string &fileName, QVector squares, QString img) { + readSimulationData(squares, img); + bson_t *document = bson_new(); bson_t processes; @@ -40,24 +36,21 @@ void SimulationDataManager::save_simulation_data(const std::string &fileName) for (const auto &process : data.processes) { bson_t proc; char key[16]; - snprintf(key, sizeof(key), "%d", process.id); + snprintf(key, sizeof(key), "%d", process->getProcess().getId()); BSON_APPEND_DOCUMENT_BEGIN(&processes, key, &proc); - BSON_APPEND_INT32(&proc, "id", process.id); - BSON_APPEND_UTF8(&proc, "name", process.name.c_str()); - BSON_APPEND_UTF8(&proc, "code", process.code.c_str()); - BSON_APPEND_UTF8(&proc, "platform", process.platform.c_str()); + BSON_APPEND_INT32(&proc, "id", process->getProcess().getId()); + BSON_APPEND_UTF8(&proc, "name", process->getProcess().getName().toStdString().c_str()); + BSON_APPEND_UTF8(&proc, "CMakeProject", process->getProcess().getCMakeProject().toStdString().c_str()); + BSON_APPEND_UTF8(&proc, "QEMUPlatform", process->getProcess().getQEMUPlatform().toStdString().c_str()); bson_t coordinate; BSON_APPEND_DOCUMENT_BEGIN(&proc, "coordinate", &coordinate); - BSON_APPEND_INT32(&coordinate, "x", process.coordinate.x); - BSON_APPEND_INT32(&coordinate, "y", process.coordinate.y); + BSON_APPEND_INT32(&coordinate, "x", process->getDragStartPosition().x()); + BSON_APPEND_INT32(&coordinate, "y", process->getDragStartPosition().y()); bson_append_document_end(&proc, &coordinate); - bson_t size; - BSON_APPEND_DOCUMENT_BEGIN(&proc, "size", &size); - BSON_APPEND_INT32(&size, "x", process.size.x); - BSON_APPEND_INT32(&size, "y", process.size.y); - bson_append_document_end(&proc, &size); + BSON_APPEND_INT32(&proc, "width", process->width()); + BSON_APPEND_INT32(&proc, "height", process->height()); bson_append_document_end(&processes, &proc); } @@ -66,13 +59,10 @@ void SimulationDataManager::save_simulation_data(const std::string &fileName) bson_t user; BSON_APPEND_DOCUMENT_BEGIN(document, "user", &user); BSON_APPEND_INT32(&user, "id", data.user.id); - BSON_APPEND_UTF8(&user, "name", data.user.name.c_str()); - BSON_APPEND_UTF8(&user, "img", data.user.img.c_str()); + BSON_APPEND_UTF8(&user, "name", data.user.name.toStdString().c_str()); + BSON_APPEND_UTF8(&user, "img", data.user.img.toStdString().c_str()); bson_append_document_end(document, &user); - // Convert BSON to JSON and print - print_json(document); - uint32_t length; uint8_t *buf = bson_destroy_with_steal(document, true, &length); @@ -88,12 +78,12 @@ void SimulationDataManager::save_simulation_data(const std::string &fileName) bson_free(buf); } -void SimulationDataManager::load_simulation_data(const std::string &fileName) +QJsonObject SimulationDataManager::loadSimulationData(const std::string &fileName) { std::ifstream file(fileName, std::ios::binary | std::ios::ate); if (!file.is_open()) { std::cerr << "Failed to open file: " << fileName << std::endl; - return; + return QJsonObject(); // Return an empty QJsonObject } std::streamsize size = file.tellg(); @@ -104,19 +94,29 @@ void SimulationDataManager::load_simulation_data(const std::string &fileName) const uint8_t *data = reinterpret_cast(buffer.data()); bson_t *document = bson_new_from_data(data, size); if (document) { - print_json(document); - bson_destroy(document); + QJsonObject jsonObject = bsonToJsonObject(document); + bson_destroy(document); // Clean up BSON document + return jsonObject; } else { std::cerr << "Failed to parse BSON document" << std::endl; } } else { std::cerr << "Failed to read file: " << fileName << std::endl; } + return QJsonObject(); // Return an empty QJsonObject } -void SimulationDataManager::print_json(const bson_t *document) +QJsonObject SimulationDataManager::bsonToJsonObject(const bson_t *document) { char *json = bson_as_json(document, nullptr); - std::cout << json << std::endl; + QJsonDocument jsonDoc = QJsonDocument::fromJson(QByteArray::fromRawData(json, strlen(json))); bson_free(json); + return jsonDoc.object(); } + +void SimulationDataManager::printJson(QJsonObject jsonObject) +{ + QJsonDocument jsonDoc(jsonObject); + QByteArray jsonBytes = jsonDoc.toJson(); + std::cout << jsonBytes.toStdString() << std::endl; +} \ No newline at end of file diff --git a/src/simulation_data_manager.h b/src/simulation_data_manager.h index dbb5e62f..b0d88b4b 100644 --- a/src/simulation_data_manager.h +++ b/src/simulation_data_manager.h @@ -3,9 +3,11 @@ #include #include +#include +#include +#include #include -#include -#include +#include "draggable_square.h" class SimulationDataManager : public QWidget { Q_OBJECT @@ -13,50 +15,28 @@ class SimulationDataManager : public QWidget { public: SimulationDataManager(QWidget *parent = nullptr); virtual ~SimulationDataManager() = default; - void save_simulation_data(const std::string &fileName); - void load_simulation_data(const std::string &fileName); - -private slots: - void on_save_button_clicked(); - void on_load_button_clicked(); + void saveSimulationData(const std::string &fileName, QVector squares, QString img); + QJsonObject loadSimulationData(const std::string &fileName); + + void printJson(QJsonObject jsonObject); private: - QPushButton *saveButton; - QPushButton *loadButton; - - struct Coordinate { - int x; - int y; - }; - - struct Size { - int x; - int y; - }; - - struct Process { - int id; - std::string name; - std::string code; - std::string platform; - Coordinate coordinate; - Size size; - }; struct User { int id; - std::string name; - std::string img; + QString name; + QString img; }; struct SimulationData { - std::vector processes; + QVector processes; User user; }; SimulationData data; - void print_json(const bson_t *document); + QJsonObject bsonToJsonObject(const bson_t *document); + void readSimulationData(QVector squares, QString img); }; #endif // SIMULATION_DATA_MANAGER_H From 644faf24f8a77d7af31a1de7bc7657631ceea241 Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Sun, 4 Aug 2024 18:17:34 +0300 Subject: [PATCH 07/33] GUI: Log handler with update about this in mainWindow --- .gitignore | 4 +- CMakeLists.txt | 2 + src/log_file.log | 6 ++ src/log_handler.cpp | 140 ++++++++++++++++++++++++++++++++ src/log_handler.h | 38 +++++++++ src/main_window.cpp | 4 + src/main_window.h | 3 +- src/my_widget.cpp | 98 ++++++++++++++++++++++ src/my_widget.h | 36 ++++++++ src/simulation_data_manager.cpp | 38 ++++++++- src/simulation_data_manager.h | 1 + 11 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 src/log_file.log create mode 100644 src/log_handler.cpp create mode 100644 src/log_handler.h create mode 100644 src/my_widget.cpp create mode 100644 src/my_widget.h diff --git a/.gitignore b/.gitignore index a0dfacd9..dbb8d71c 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,6 @@ src/process_dialog.cpp src/process_dialog.h src/process.h src/simulation_data_manager.cpp -src/simulation_data_manager.h \ No newline at end of file +src/simulation_data_manager.h +src/my_widget.h +src/my_widget.cpp \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 80e79e70..86630020 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,8 @@ add_executable(DraggableSquares src/process_dialog.cpp src/main_window.cpp src/simulation_data_manager.cpp + src/log_handler.cpp + src/my_widget.cpp ) # Include BSON directories diff --git a/src/log_file.log b/src/log_file.log new file mode 100644 index 00000000..9101f644 --- /dev/null +++ b/src/log_file.log @@ -0,0 +1,6 @@ +2024-07-30 12:00:00 1 2 100 SEND +2024-07-30 12:00:01 1 3 101 RECEIVE +2024-07-30 12:00:02 2 4 102 SEND +2024-07-30 12:00:03 3 4 103 RECEIVE +2024-07-30 12:00:04 4 5 104 SEND +2024-07-30 12:00:05 5 6 105 RECEIVE \ No newline at end of file diff --git a/src/log_handler.cpp b/src/log_handler.cpp new file mode 100644 index 00000000..259ad74c --- /dev/null +++ b/src/log_handler.cpp @@ -0,0 +1,140 @@ +#include "log_handler.h" +#include +#include +#include +#include +#include +#include +//#include "my_widget.h" +#include +#include +#include +#include +#include +#include + +// קריאת נתונים מקובץ +void LogHandler::readLogFile(const QString &fileName) { + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "Cannot open file:" << fileName; + return; + } + + QTextStream in(&file); + while (!in.atEnd()) { + QString line = in.readLine().trimmed(); // Trim the entire line + QStringList fields = line.split(' '); + + if (fields.size() < 6) { + qWarning() << "Skipping malformed line:" << line; + continue; + } + + LogEntry entry; + QString dateString = fields[0].trimmed(); // Trim each field + QString timeString = fields[1].trimmed(); + + QString dateTimeString = dateString + " " + timeString; + entry.timestamp = QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss"); + if (!entry.timestamp.isValid()) { + qWarning() << "Skipping line with invalid timestamp:" << line; + continue; + } + + entry.srcId = fields[2].trimmed().toInt(); + entry.dstId = fields[3].trimmed().toInt(); + entry.payload = fields[4].trimmed(); + entry.status = fields[5].trimmed(); + + logEntries.append(entry); + } + + file.close(); +} + + +// מיון רשומות הלוג +void LogHandler::sortLogEntries() { + std::sort(logEntries.begin(), logEntries.end()); +} + +void LogHandler::analyzeLogEntries(QMainWindow *mainWindow,const QString &fileName) { +// // יצירת חלון להציג את זמן הלוג +// QWidget *timeWidget = new QWidget(mainWindow); +// QVBoxLayout *layout = new QVBoxLayout(timeWidget); +// QLabel *timeLabel = new QLabel("Timestamp: ", timeWidget); +// layout->addWidget(timeLabel); +// timeWidget->setLayout(layout); +// timeWidget->setWindowTitle("Current Log Timestamp"); +// timeWidget->resize(200, 100); +// timeWidget->setAttribute(Qt::WA_QuitOnClose, false); // לוודא שהחלון לא יסגור את האפליקציה +// timeWidget->show(); + +// // יצירת חלון להציג את תרשים הזרימה +// MyWidget *flowWidget = new MyWidget(mainWindow, 100); // קצב עדכון של 100 מ"ל +// QDockWidget *dockWidget = new QDockWidget("Flow Diagram", mainWindow); +// dockWidget->setWidget(flowWidget); +// mainWindow->addDockWidget(Qt::RightDockWidgetArea, dockWidget); + +// // טיפול בכל רשומות הלוג +// for (const auto &log_entry : logEntries) { +// // עדכון התווית בחלון הזמן עם הת timestamp הנוכחי +// timeLabel->setText("Timestamp: " + log_entry.timestamp.toString("yyyy-MM-dd HH:mm:ss")); +// QCoreApplication::processEvents(); // עדכון ה-UI + +// // הוספת חץ בין הנקודות +// QString status = log_entry.status == "sent" ? "sending" : "received"; +// // read the place from json +// int xsrcId = 0, ysrcId = 0, xdstId = 0, ydstId = 0; + +// QVector coordinatesSrc = findProcessCoordinatesById(log_entry.srcId,fileName); +// if (!coordinatesSrc.isEmpty()) { +// qDebug() << "Coordinates for process ID" << log_entry.srcId << ":" << coordinatesSrc[0] << "," << coordinatesSrc[1]; +// xsrcId=coordinatesSrc[0]; +// ysrcId=coordinatesSrc[1]; +// } else { +// qDebug() << "Process not found or error occurred."; +// } +// QVector coordinatesDst = findProcessCoordinatesById(log_entry.dstId,fileName); +// if (!coordinatesDst.isEmpty()) { +// qDebug() << "Coordinates for process ID" << log_entry.dstId << ":" << coordinatesDst[0] << "," << coordinatesDst[1]; +// xdstId=coordinatesDst[0]; +// ydstId=coordinatesDst[1]; +// } else { +// qDebug() << "Process not found or error occurred."; +// } +// flowWidget->addConnection(xsrcId, ysrcId, xdstId, ydstId, log_entry.payload, status); +// } + +// qDebug() << "Analyzing log entries"; +} + +QVector LogHandler::findProcessCoordinatesById(int processId, const QString &fileName) { + QVector coordinates; + + // טעינת JSON מהקובץ + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning("Could not open file"); + return coordinates; + } + QByteArray jsonData = file.readAll(); + file.close(); + + QJsonDocument document = QJsonDocument::fromJson(jsonData); + QJsonObject rootObject = document.object(); + QJsonArray processesArray = rootObject["processes"].toArray(); + + // חיפוש ID התהליך ומציאת הקואורדינטות שלו + for (const QJsonValue &value : processesArray) { + QJsonObject processObject = value.toObject(); + if (processObject["id"].toInt() == processId) { + coordinates.append(processObject["x"].toInt()); + coordinates.append(processObject["y"].toInt()); + break; + } + } + + return coordinates; +} diff --git a/src/log_handler.h b/src/log_handler.h new file mode 100644 index 00000000..4510276e --- /dev/null +++ b/src/log_handler.h @@ -0,0 +1,38 @@ + +#ifndef LOGHANDLER_H +#define LOGHANDLER_H + +#include +#include +#include +#include +#include +#include +#include + + +class LogHandler { +public: + struct LogEntry { + QDateTime timestamp; + int srcId; + int dstId; + QString payload; + QString status; // SEND/RECEIVE + + bool operator<(const LogEntry& other) const { + return timestamp < other.timestamp; + } + + }; + + void readLogFile(const QString &fileName); + void sortLogEntries(); + void analyzeLogEntries(QMainWindow *mainWindow,const QString &fileName); + void draw(int xSrc, int ySrc, int xDest, int yDest); + QVector findProcessCoordinatesById(int processId, const QString &fileName); +private: + QVector logEntries; +}; + +#endif // LOGHANDLER_H diff --git a/src/main_window.cpp b/src/main_window.cpp index 5382b6ae..8fa040eb 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -194,6 +194,10 @@ void MainWindow::endProcesses() { dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); + QString filePath = "log_file.log"; + logHandler.readLogFile(filePath); + logHandler.analyzeLogEntries(this,"simulation_data.bson"); + for (QProcess* process : runningProcesses) { if (process->state() != QProcess::NotRunning) { logOutput->append("Ending process..."); diff --git a/src/main_window.h b/src/main_window.h index 872393cf..5e8461dc 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -22,6 +22,7 @@ #include "draggable_square.h" #include "process_dialog.h" #include "simulation_data_manager.h" +#include "log_handler.h" class MainWindow : public QMainWindow { @@ -68,7 +69,7 @@ private slots: QVector runningProcesses; QString currentImagePath; SimulationDataManager *dataManager; - + LogHandler logHandler; }; #endif // MAIN_WINDOW_H diff --git a/src/my_widget.cpp b/src/my_widget.cpp new file mode 100644 index 00000000..3fad8a82 --- /dev/null +++ b/src/my_widget.cpp @@ -0,0 +1,98 @@ +#include "my_widget.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + + +MyWidget::MyWidget(QWidget *parent, int speed) + : QWidget(parent), currentPointIndex(0), animationStep(0) { + timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &MyWidget::updateDrawing); + timer->setInterval(speed); // קצב עדכון של 100 מ"ל או לפי הצורך + + // התחלת אנימציה לא פעילה + isAnimating = false; +} +void MyWidget::addConnection(int xSrc, int ySrc, int xDest, int yDest, const QString &messageId, const QString &status) { + this->xSrc = xSrc; + this->ySrc = ySrc; + this->xDest = xDest; + this->yDest = yDest; + this->messageId = messageId; + this->status = status; + + // ניקוי נקודות ישנות + points.clear(); + animationStep = 0; + + // מחשב נקודות בין הנקודות מקור ויעד לציור קו מקווקו + int numDashes = 20; + double deltaX = (xDest - xSrc) / static_cast(numDashes); + double deltaY = (yDest - ySrc) / static_cast(numDashes); + + for (int i = 0; i <= numDashes; ++i) { + if (i % 2 == 0) { // קו בכל מקטע + points.append(QPoint(xSrc + static_cast(i * deltaX), ySrc + static_cast(i * deltaY))); + } + } + points.append(QPoint(xDest, yDest)); + + currentPointIndex = 0; + isAnimating = true; + + timer->start(); // מתחיל את הציור האיטי + + update(); // מעדכן את הווידג'ט לציור הקו +} + +void MyWidget::paintEvent(QPaintEvent *event) { + QPainter painter(this); + + // הגדרת עט לציור קו עבה ומקווקו + QPen pen(Qt::black, 4); // קו עבה בצבע שחור + pen.setStyle(Qt::DashLine); // תבנית מקווקו + pen.setDashPattern({5, 5}); // תבנית של 10 פיקסלים קו, 5 פיקסלים רווח + painter.setPen(pen); + + // ציור הקו + if (!points.isEmpty()) { + painter.drawPolyline(points.data(), points.size()); + } +} + +void MyWidget::updateDrawing() { + if (isAnimating) { + animationStep = (animationStep + 1) % 30; // מניחים 30 שלבים באנימציה + update(); // גורם לציור מחדש של הווידג'ט + } +} + +void MyWidget::drawArrow(QPainter &painter, const QPoint &src, const QPoint &dst, const QColor &color) { + QPen pen(color); + pen.setWidth(2); + painter.setPen(pen); + + QLine line(src, dst); + painter.drawLine(line); + + // ציור ראש החץ + double angle = std::atan2(-line.dy(), line.dx()); + double arrowSize = 10; + QPointF arrowP1 = dst - QPointF(sin(angle + M_PI / 3) * arrowSize, cos(angle + M_PI / 3) * arrowSize); + QPointF arrowP2 = dst - QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize, cos(angle + M_PI - M_PI / 3) * arrowSize); + + QPolygon arrowHead; + // arrowHead << dst.toPoint() << arrowP1.toPoint() << arrowP2.toPoint(); + arrowHead << dst << arrowP1.toPoint() << arrowP2.toPoint(); + + painter.drawPolygon(arrowHead); +} diff --git a/src/my_widget.h b/src/my_widget.h new file mode 100644 index 00000000..c61a56e4 --- /dev/null +++ b/src/my_widget.h @@ -0,0 +1,36 @@ +#ifndef MY_WIDGET_H +#define MY_WIDGET_H + +#include +#include +#include +#include + +class MyWidget : public QWidget { + Q_OBJECT + +public: + explicit MyWidget(QWidget *parent = nullptr, int speed = 100); // קצב ברירת מחדל הוא 100 מ"ל + void addConnection(int xSrc, int ySrc, int xDest, int yDest, const QString &messageId, const QString &status); + +protected: + void paintEvent(QPaintEvent *event) override; + +private slots: + void updateDrawing(); + +private: + void drawArrow(QPainter &painter, const QPoint &src, const QPoint &dst, const QColor &color); + + QTimer *timer; + int currentPointIndex; + int animationStep; + bool isAnimating; + + int xSrc, ySrc, xDest, yDest; + QString messageId; + QString status; + QVector points; +}; + +#endif // MY_WIDGET_H diff --git a/src/simulation_data_manager.cpp b/src/simulation_data_manager.cpp index e491dd13..aedd06a5 100644 --- a/src/simulation_data_manager.cpp +++ b/src/simulation_data_manager.cpp @@ -6,6 +6,9 @@ #include #include #include +#include +#include +#include SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) { @@ -119,4 +122,37 @@ void SimulationDataManager::printJson(QJsonObject jsonObject) QJsonDocument jsonDoc(jsonObject); QByteArray jsonBytes = jsonDoc.toJson(); std::cout << jsonBytes.toStdString() << std::endl; -} \ No newline at end of file +} + +// QVector SimulationDataManager::findProcessCoordinatesById(int processId, const QString &fileName) { +// QFile file(fileName); +// if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { +// qWarning() << "Cannot open file:" << fileName; +// return {}; +// } + +// QByteArray jsonData = file.readAll(); +// file.close(); + +// QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); +// if (jsonDoc.isNull()) { +// qWarning() << "Invalid JSON document"; +// return {}; +// } + +// QJsonObject rootObject = jsonDoc.object(); +// QJsonArray processesArray = rootObject["processes"].toArray(); + +// for (const QJsonValue &processValue : processesArray) { +// QJsonObject processObject = processValue.toObject(); +// if (processObject["id"].toInt() == processId) { +// QJsonObject coordinateObject = processObject["coordinate"].toObject(); +// int x = coordinateObject["x"].toInt(); +// int y = coordinateObject["y"].toInt(); +// return {x, y}; +// } +// } + +// qWarning() << "Process ID not found:" << processId; +// return {}; +// } diff --git a/src/simulation_data_manager.h b/src/simulation_data_manager.h index b0d88b4b..a3a4e472 100644 --- a/src/simulation_data_manager.h +++ b/src/simulation_data_manager.h @@ -19,6 +19,7 @@ class SimulationDataManager : public QWidget { QJsonObject loadSimulationData(const std::string &fileName); void printJson(QJsonObject jsonObject); + // QVector findProcessCoordinatesById(int processId, const QString &fileName); private: From 4d44f07954de7040b0792b2ed8f2f9e9834e2468 Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Tue, 6 Aug 2024 01:06:34 +0300 Subject: [PATCH 08/33] GUI: Add copy ctor's dragbleSquer and Process. Add members to log_handler --- log_file.log | 6 ++ src/draggable_square.cpp | 32 +++++++++ src/draggable_square.h | 5 ++ src/log_handler.cpp | 144 +++++++++++++++++++++++---------------- src/log_handler.h | 12 ++-- src/main_window.cpp | 3 +- src/process.cpp | 4 ++ src/process.h | 1 + 8 files changed, 143 insertions(+), 64 deletions(-) create mode 100644 log_file.log diff --git a/log_file.log b/log_file.log new file mode 100644 index 00000000..9101f644 --- /dev/null +++ b/log_file.log @@ -0,0 +1,6 @@ +2024-07-30 12:00:00 1 2 100 SEND +2024-07-30 12:00:01 1 3 101 RECEIVE +2024-07-30 12:00:02 2 4 102 SEND +2024-07-30 12:00:03 3 4 103 RECEIVE +2024-07-30 12:00:04 4 5 104 SEND +2024-07-30 12:00:05 5 6 105 RECEIVE \ No newline at end of file diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index 7cbc4256..74738883 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -9,6 +9,9 @@ #include #include +void DraggableSquare::setSquareColor(const QString &color) { + setStyleSheet(color); +} // Update the constructor definition to match the declaration DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, int width, int height) : QWidget(parent), label(new QLabel(this)) @@ -20,6 +23,35 @@ DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, int widt setLayout(layout); } + +// Copy constructor +DraggableSquare::DraggableSquare(const DraggableSquare &other) + : QWidget(other.parentWidget()), dragStartPosition(other.dragStartPosition), initialPosition(other.initialPosition), + label(new QLabel(other.label->text(), this)), process(other.process) // Copy QLabel's text +{ + setFixedSize(other.width(), other.height()); + setStyleSheet(other.styleSheet()); +} + +// Copy assignment operator +DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) +{ + if (this == &other) { + return *this; + } + + dragStartPosition = other.dragStartPosition; + initialPosition = other.initialPosition; + delete label; + label = new QLabel(other.label->text(), this); // Copy QLabel's text + process = other.process; + + setFixedSize(other.width(), other.height()); + setStyleSheet(other.styleSheet()); + + return *this; +} + void DraggableSquare::setProcess(const Process &process) { this->process = process; diff --git a/src/draggable_square.h b/src/draggable_square.h index 52dd4cc6..c554843d 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -12,9 +12,14 @@ class DraggableSquare : public QWidget public: explicit DraggableSquare(QWidget *parent = nullptr,const QString &color = "background-color: green;",int width=100,int height=100); + DraggableSquare(const DraggableSquare &other); // Copy constructor + DraggableSquare &operator=(const DraggableSquare &other); // Copy assignment operator + void setProcess(const Process &process); const Process getProcess() const; const QPoint getDragStartPosition() const; + void setSquareColor(const QString &color); + protected: void mousePressEvent(QMouseEvent *event) override; diff --git a/src/log_handler.cpp b/src/log_handler.cpp index 259ad74c..43c2f1ed 100644 --- a/src/log_handler.cpp +++ b/src/log_handler.cpp @@ -12,15 +12,16 @@ #include #include #include +#include "draggable_square.h" +#include // קריאת נתונים מקובץ -void LogHandler::readLogFile(const QString &fileName) { +void LogHandler::readLogFile(const QString& fileName) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qWarning() << "Cannot open file:" << fileName; + qDebug() << "Cannot open file:" << fileName; return; } - QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine().trimmed(); // Trim the entire line @@ -46,71 +47,98 @@ void LogHandler::readLogFile(const QString &fileName) { entry.dstId = fields[3].trimmed().toInt(); entry.payload = fields[4].trimmed(); entry.status = fields[5].trimmed(); - - logEntries.append(entry); + logEntries.push_back(entry); } file.close(); + qDebug() << "succesfull read LogFile"; } - -// מיון רשומות הלוג void LogHandler::sortLogEntries() { std::sort(logEntries.begin(), logEntries.end()); } -void LogHandler::analyzeLogEntries(QMainWindow *mainWindow,const QString &fileName) { -// // יצירת חלון להציג את זמן הלוג -// QWidget *timeWidget = new QWidget(mainWindow); -// QVBoxLayout *layout = new QVBoxLayout(timeWidget); -// QLabel *timeLabel = new QLabel("Timestamp: ", timeWidget); -// layout->addWidget(timeLabel); -// timeWidget->setLayout(layout); -// timeWidget->setWindowTitle("Current Log Timestamp"); -// timeWidget->resize(200, 100); -// timeWidget->setAttribute(Qt::WA_QuitOnClose, false); // לוודא שהחלון לא יסגור את האפליקציה -// timeWidget->show(); - -// // יצירת חלון להציג את תרשים הזרימה -// MyWidget *flowWidget = new MyWidget(mainWindow, 100); // קצב עדכון של 100 מ"ל -// QDockWidget *dockWidget = new QDockWidget("Flow Diagram", mainWindow); -// dockWidget->setWidget(flowWidget); -// mainWindow->addDockWidget(Qt::RightDockWidgetArea, dockWidget); - -// // טיפול בכל רשומות הלוג -// for (const auto &log_entry : logEntries) { -// // עדכון התווית בחלון הזמן עם הת timestamp הנוכחי -// timeLabel->setText("Timestamp: " + log_entry.timestamp.toString("yyyy-MM-dd HH:mm:ss")); -// QCoreApplication::processEvents(); // עדכון ה-UI - -// // הוספת חץ בין הנקודות -// QString status = log_entry.status == "sent" ? "sending" : "received"; -// // read the place from json -// int xsrcId = 0, ysrcId = 0, xdstId = 0, ydstId = 0; - -// QVector coordinatesSrc = findProcessCoordinatesById(log_entry.srcId,fileName); -// if (!coordinatesSrc.isEmpty()) { -// qDebug() << "Coordinates for process ID" << log_entry.srcId << ":" << coordinatesSrc[0] << "," << coordinatesSrc[1]; -// xsrcId=coordinatesSrc[0]; -// ysrcId=coordinatesSrc[1]; -// } else { -// qDebug() << "Process not found or error occurred."; -// } -// QVector coordinatesDst = findProcessCoordinatesById(log_entry.dstId,fileName); -// if (!coordinatesDst.isEmpty()) { -// qDebug() << "Coordinates for process ID" << log_entry.dstId << ":" << coordinatesDst[0] << "," << coordinatesDst[1]; -// xdstId=coordinatesDst[0]; -// ydstId=coordinatesDst[1]; -// } else { -// qDebug() << "Process not found or error occurred."; -// } -// flowWidget->addConnection(xsrcId, ysrcId, xdstId, ydstId, log_entry.payload, status); -// } - -// qDebug() << "Analyzing log entries"; +void LogHandler::analyzeLogEntries(QMainWindow* mainWindow, const QString& fileName) { + // // יצירת חלון להציג את זמן הלוג + // QWidget *timeWidget = new QWidget(mainWindow); + // QVBoxLayout *layout = new QVBoxLayout(timeWidget); + // QLabel *timeLabel = new QLabel("Timestamp: ", timeWidget); + // layout->addWidget(timeLabel); + // timeWidget->setLayout(layout); + // timeWidget->setWindowTitle("Current Log Timestamp"); + // timeWidget->resize(200, 100); + // timeWidget->setAttribute(Qt::WA_QuitOnClose, false); // לוודא שהחלון לא יסגור את האפליקציה + // timeWidget->show(); + + // // יצירת חלון להציג את תרשים הזרימה + // MyWidget *flowWidget = new MyWidget(mainWindow, 100); // קצב עדכון של 100 מ"ל + // QDockWidget *dockWidget = new QDockWidget("Flow Diagram", mainWindow); + // dockWidget->setWidget(flowWidget); + // mainWindow->addDockWidget(Qt::RightDockWidgetArea, dockWidget); + + // // טיפול בכל רשומות הלוג + // for (const auto &log_entry : logEntries) { + // // עדכון התווית בחלון הזמן עם הת timestamp הנוכחי + // timeLabel->setText("Timestamp: " + log_entry.timestamp.toString("yyyy-MM-dd HH:mm:ss")); + // QCoreApplication::processEvents(); // עדכון ה-UI + + // // הוספת חץ בין הנקודות + // QString status = log_entry.status == "sent" ? "sending" : "received"; + // // read the place from json + // int xsrcId = 0, ysrcId = 0, xdstId = 0, ydstId = 0; + + // QVector coordinatesSrc = findProcessCoordinatesById(log_entry.srcId,fileName); + // if (!coordinatesSrc.isEmpty()) { + // qDebug() << "Coordinates for process ID" << log_entry.srcId << ":" << coordinatesSrc[0] << "," << coordinatesSrc[1]; + // xsrcId=coordinatesSrc[0]; + // ysrcId=coordinatesSrc[1]; + // } else { + // qDebug() << "Process not found or error occurred."; + // } + // QVector coordinatesDst = findProcessCoordinatesById(log_entry.dstId,fileName); + // if (!coordinatesDst.isEmpty()) { + // qDebug() << "Coordinates for process ID" << log_entry.dstId << ":" << coordinatesDst[0] << "," << coordinatesDst[1]; + // xdstId=coordinatesDst[0]; + // ydstId=coordinatesDst[1]; + // } else { + // qDebug() << "Process not found or error occurred."; + // } + // flowWidget->addConnection(xsrcId, ysrcId, xdstId, ydstId, log_entry.payload, status); + // } + + // qDebug() << "Analyzing log entries"; + + // Iterate through log entries and update colors based on communication + qDebug() << "befor the loop"; + qDebug() << "Size of logEntries:" << logEntries.size(); + for (const auto& logEntry : logEntries) { + qDebug() << "in the loop- line_113"; + int srcId = logEntry.srcId; + int dstId = logEntry.dstId; + + if (!processSquares.contains(srcId) || !processSquares.contains(dstId)) continue; + + DraggableSquare* srcSquare = processSquares[srcId]; + DraggableSquare* dstSquare = processSquares[dstId]; + + QString color = "background-color: yellow;"; // Default color + if (communicationCounts.contains(srcId) && communicationCounts[srcId].contains(dstId)) { + qDebug() << "in the loop-if- 124"; + int count = communicationCounts[srcId][dstId]; + int colorIntensity = qMin(count * 25, 255); // Increase color intensity based on count + color = QString("background-color: rgb(%1, %1, 255);").arg(colorIntensity); + qDebug() << "in for in analiesEntiers"; + } + + srcSquare->setSquareColor(color); + dstSquare->setSquareColor(color); + + // Increase communication count + communicationCounts[srcId][dstId]++; + } } -QVector LogHandler::findProcessCoordinatesById(int processId, const QString &fileName) { +QVector LogHandler::findProcessCoordinatesById(int processId, const QString& fileName) { QVector coordinates; // טעינת JSON מהקובץ @@ -127,7 +155,7 @@ QVector LogHandler::findProcessCoordinatesById(int processId, const QString QJsonArray processesArray = rootObject["processes"].toArray(); // חיפוש ID התהליך ומציאת הקואורדינטות שלו - for (const QJsonValue &value : processesArray) { + for (const QJsonValue& value : processesArray) { QJsonObject processObject = value.toObject(); if (processObject["id"].toInt() == processId) { coordinates.append(processObject["x"].toInt()); diff --git a/src/log_handler.h b/src/log_handler.h index 4510276e..a5bf7f59 100644 --- a/src/log_handler.h +++ b/src/log_handler.h @@ -1,4 +1,3 @@ - #ifndef LOGHANDLER_H #define LOGHANDLER_H @@ -9,6 +8,7 @@ #include #include #include +#include "draggable_square.h" class LogHandler { @@ -26,13 +26,15 @@ class LogHandler { }; - void readLogFile(const QString &fileName); + void readLogFile(const QString& fileName); void sortLogEntries(); - void analyzeLogEntries(QMainWindow *mainWindow,const QString &fileName); + void analyzeLogEntries(QMainWindow* mainWindow, const QString& fileName); void draw(int xSrc, int ySrc, int xDest, int yDest); - QVector findProcessCoordinatesById(int processId, const QString &fileName); + QVector findProcessCoordinatesById(int processId, const QString& fileName); private: QVector logEntries; + QMap processSquares; // Track process squares by their IDs + QMap> communicationCounts; // Track communication counts between process pairs }; -#endif // LOGHANDLER_H +#endif // LOGHANDLER_H \ No newline at end of file diff --git a/src/main_window.cpp b/src/main_window.cpp index 8fa040eb..136f9d3e 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -194,7 +194,8 @@ void MainWindow::endProcesses() { dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); - QString filePath = "log_file.log"; + + QString filePath = "../log_file.log"; logHandler.readLogFile(filePath); logHandler.analyzeLogEntries(this,"simulation_data.bson"); diff --git a/src/process.cpp b/src/process.cpp index 9f1a904e..213848bf 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -5,6 +5,10 @@ Process::Process(int id, const QString &name, const QString &cmakeProject, const { } +// Copy constructor +Process::Process(const Process &other) + : id(other.id), name(other.name), cmakeProject(other.cmakeProject), qemuPlatform(other.qemuPlatform) {} + Process::Process() : id(-1), name(""), cmakeProject(""), qemuPlatform("") { diff --git a/src/process.h b/src/process.h index 18401f9e..309faa31 100644 --- a/src/process.h +++ b/src/process.h @@ -8,6 +8,7 @@ class Process public: Process(int id, const QString &name, const QString &cmakeProject, const QString &qemuPlatform); Process(); + Process(const Process &other); // Copy constructor int getId() const; QString getName() const; From 23b2c9a13ef1523d49715409ce1a5d0aac1592fa Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Tue, 6 Aug 2024 01:59:33 +0300 Subject: [PATCH 09/33] GUI: Update the process map according to information from the JSON file --- src/log_handler.cpp | 32 +++++++++++++++++++++++++++++++- src/log_handler.h | 2 +- src/simulation_data_manager.cpp | 32 -------------------------------- src/simulation_data_manager.h | 1 - 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/log_handler.cpp b/src/log_handler.cpp index 43c2f1ed..0a3c358a 100644 --- a/src/log_handler.cpp +++ b/src/log_handler.cpp @@ -13,6 +13,7 @@ #include #include #include "draggable_square.h" +#include "simulation_data_manager.h" #include // קריאת נתונים מקובץ @@ -58,7 +59,7 @@ void LogHandler::sortLogEntries() { std::sort(logEntries.begin(), logEntries.end()); } -void LogHandler::analyzeLogEntries(QMainWindow* mainWindow, const QString& fileName) { +void LogHandler::analyzeLogEntries(QMainWindow* mainWindow, const QString& jsonFileName) { // // יצירת חלון להציג את זמן הלוג // QWidget *timeWidget = new QWidget(mainWindow); // QVBoxLayout *layout = new QVBoxLayout(timeWidget); @@ -109,6 +110,35 @@ void LogHandler::analyzeLogEntries(QMainWindow* mainWindow, const QString& fileN // qDebug() << "Analyzing log entries"; // Iterate through log entries and update colors based on communication + // קריאה מהקובץ JSON כדי לקבל מידע על תהליכים + SimulationDataManager dataManager; + QJsonObject jsonObject = dataManager.loadSimulationData(jsonFileName.toStdString()); + + if (jsonObject.isEmpty()) { + qWarning() << "Failed to load JSON data"; + return; + } + + // עדכון מפת התהליכים לפי מידע מהקובץ JSON + QJsonArray processesArray = jsonObject["processes"].toArray(); + for (const QJsonValue& value : processesArray) { + QJsonObject processObject = value.toObject(); + int id = processObject["id"].toInt(); + QString name = processObject["name"].toString(); + QString cmakeProject = processObject["CMakeProject"].toString(); + QString qemuPlatform = processObject["QEMUPlatform"].toString(); + int x = processObject["coordinate"].toObject()["x"].toInt(); + int y = processObject["coordinate"].toObject()["y"].toInt(); + int width = processObject["width"].toInt(); + int height = processObject["height"].toInt(); + + Process process(id, name, cmakeProject, qemuPlatform); + DraggableSquare* square = new DraggableSquare(mainWindow, "", width, height); + square->setProcess(process); + square->move(x, y); + processSquares[id] = square; + } + ///////////////////////////////////-----------------------------\\\\\\\\\\\\\\\\\\\\\\\\\\\ qDebug() << "befor the loop"; qDebug() << "Size of logEntries:" << logEntries.size(); for (const auto& logEntry : logEntries) { diff --git a/src/log_handler.h b/src/log_handler.h index a5bf7f59..b8d7dab6 100644 --- a/src/log_handler.h +++ b/src/log_handler.h @@ -28,7 +28,7 @@ class LogHandler { void readLogFile(const QString& fileName); void sortLogEntries(); - void analyzeLogEntries(QMainWindow* mainWindow, const QString& fileName); + void analyzeLogEntries(QMainWindow* mainWindow, const QString& jsonFileName); void draw(int xSrc, int ySrc, int xDest, int yDest); QVector findProcessCoordinatesById(int processId, const QString& fileName); private: diff --git a/src/simulation_data_manager.cpp b/src/simulation_data_manager.cpp index aedd06a5..70d82c3f 100644 --- a/src/simulation_data_manager.cpp +++ b/src/simulation_data_manager.cpp @@ -124,35 +124,3 @@ void SimulationDataManager::printJson(QJsonObject jsonObject) std::cout << jsonBytes.toStdString() << std::endl; } -// QVector SimulationDataManager::findProcessCoordinatesById(int processId, const QString &fileName) { -// QFile file(fileName); -// if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { -// qWarning() << "Cannot open file:" << fileName; -// return {}; -// } - -// QByteArray jsonData = file.readAll(); -// file.close(); - -// QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); -// if (jsonDoc.isNull()) { -// qWarning() << "Invalid JSON document"; -// return {}; -// } - -// QJsonObject rootObject = jsonDoc.object(); -// QJsonArray processesArray = rootObject["processes"].toArray(); - -// for (const QJsonValue &processValue : processesArray) { -// QJsonObject processObject = processValue.toObject(); -// if (processObject["id"].toInt() == processId) { -// QJsonObject coordinateObject = processObject["coordinate"].toObject(); -// int x = coordinateObject["x"].toInt(); -// int y = coordinateObject["y"].toInt(); -// return {x, y}; -// } -// } - -// qWarning() << "Process ID not found:" << processId; -// return {}; -// } diff --git a/src/simulation_data_manager.h b/src/simulation_data_manager.h index a3a4e472..b0d88b4b 100644 --- a/src/simulation_data_manager.h +++ b/src/simulation_data_manager.h @@ -19,7 +19,6 @@ class SimulationDataManager : public QWidget { QJsonObject loadSimulationData(const std::string &fileName); void printJson(QJsonObject jsonObject); - // QVector findProcessCoordinatesById(int processId, const QString &fileName); private: From 4e63353c3f543aeff4421b0e8bd96c63e35ad23f Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Sun, 11 Aug 2024 15:11:41 +0300 Subject: [PATCH 10/33] GUI: Completing the log handler and creating frames --- CMakeLists.txt | 1 + src/draggable_square.cpp | 11 ++ src/draggable_square.h | 2 +- src/frames.cpp | 125 ++++++++++++++++ src/frames.h | 47 ++++++ src/log_handler.cpp | 303 +++++++++++++++++---------------------- src/log_handler.h | 7 +- src/main_window.cpp | 3 - 8 files changed, 324 insertions(+), 175 deletions(-) create mode 100644 src/frames.cpp create mode 100644 src/frames.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 86630020..f96e8afe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ add_executable(DraggableSquares src/simulation_data_manager.cpp src/log_handler.cpp src/my_widget.cpp + src/frames.cpp ) # Include BSON directories diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index 74738883..b88ce273 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -8,6 +8,17 @@ #include #include #include +#include + +// Add this function to your DraggableSquare class +void DraggableSquare::print() const { + std::cout << "DraggableSquare:" << std::endl; + std::cout << " Process ID: " << process.getId() << std::endl; + std::cout << " Drag Start Position: (" << dragStartPosition.x() << ", " << dragStartPosition.y() << ")" << std::endl; + std::cout << " Initial Position: (" << initialPosition.x() << ", " << initialPosition.y() << ")" << std::endl; + std::cout << " Color: " << label->styleSheet().toStdString() << std::endl; + std::cout << " Size: (" << this->width() << ", " << this->height() << ")" << std::endl; +} void DraggableSquare::setSquareColor(const QString &color) { setStyleSheet(color); diff --git a/src/draggable_square.h b/src/draggable_square.h index c554843d..88dfa1cd 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -19,8 +19,8 @@ class DraggableSquare : public QWidget const Process getProcess() const; const QPoint getDragStartPosition() const; void setSquareColor(const QString &color); + void print() const; - protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; diff --git a/src/frames.cpp b/src/frames.cpp new file mode 100644 index 00000000..291ffa53 --- /dev/null +++ b/src/frames.cpp @@ -0,0 +1,125 @@ +#include +#include +#include +#include "frames.h" + +// Constructor to initialize Frames with a LogHandler reference +Frames::Frames(LogHandler& logHandler) + : logHandler(logHandler) { // Initialize the logHandler member variable directly + createSequentialIds(); + fillFramesMat(); + // Initialize currentTime with the first log entry's timestamp, if available + if (!logHandler.getLogEntries().isEmpty()) { + currentTime = logHandler.getLogEntries().first().timestamp; + } else { + // Handle case where there are no log entries + currentTime = QDateTime::currentDateTime(); // Default to current time + } +} + +void Frames::initialFramesMat(int size) { + framesMat.resize(size); + for (int i = 0; i < size; ++i) { + framesMat[i].resize(i + 1); // Resize each row to i+1 elements + } +} + +// Update frames with logs within a 5-second window around currentTime +void Frames::updateFrames(const QDateTime ¤tTime) { + // Delete logs that have gone beyond the 5 second range + auto it = std::remove_if(activeLogEntriesVector.begin(), activeLogEntriesVector.end(), + [&](const LogHandler::LogEntry &entry) { + return entry.timestamp < currentTime.addSecs(-5); + }); + activeLogEntriesVector.erase(it, activeLogEntriesVector.end()); + + // Add new logs within the 5-second range + const auto &allLogEntries = logHandler.getLogEntries(); + for (const auto &entry : allLogEntries) { + if (entry.timestamp >= currentTime && entry.timestamp < currentTime.addSecs(5)) { + activeLogEntriesVector.push_back(entry); + } + } +} + +// Create a mapping of original IDs to new sequential IDs +void Frames::createSequentialIds() { + int newId = 0; + for (auto it = logHandler.getProcessSquares().begin(); + it != logHandler.getProcessSquares().end(); ++it) { + int originalId = it.key(); + idMapping.insert(originalId, newId); + ++newId; + } + initialFramesMat(newId); +} + +// Fill the frames matrix with random colors +void Frames::fillFramesMat() { + QSet usedColors; + srand(static_cast(time(0))); // Seed for random color generation + + for (int i = 0; i < framesMat.size(); ++i) { + for (int j = 0; j <= i; ++j) { // Fill only the lower triangle (including diagonal) + QString randomColor; + do { + randomColor = generateRandomColor(); + } while (usedColors.contains(randomColor)); + + usedColors.insert(randomColor); + framesMat[i][j].color = randomColor; + } + } +} + +// Generate a random color in hexadecimal format +QString Frames::generateRandomColor() { + QString color = QString("#%1%2%3") + .arg(rand() % 256, 2, 16, QChar('0')) + .arg(rand() % 256, 2, 16, QChar('0')) + .arg(rand() % 256, 2, 16, QChar('0')); + return color; +} + +// Implementation of getters +const LogHandler& Frames::getLogHandler() const { + return logHandler; +} + +const std::vector>& Frames::getFramesMat() const { + return framesMat; +} + +const std::vector& Frames::getLogEntriesVector() const { + return activeLogEntriesVector; +} + +const QHash Frames::getIdMapping() const { + return idMapping; +} + +const QDateTime Frames::getCurrentTime() const { + return currentTime; +} + +// Setters +void Frames::setLogHandler(LogHandler &logHandler) { + this->logHandler = logHandler; + // Optionally update other fields based on the new logHandler if needed +} + +void Frames::setFramesMat(const std::vector>& framesMat) { + this->framesMat = framesMat; +} + +void Frames::setLogEntriesVector(const std::vector& logEntriesVector) { + this->activeLogEntriesVector = logEntriesVector; +} + +void Frames::setIdMapping(QHash &idMapping) { + this->idMapping = idMapping; +} + +void Frames::setCurrentTime(const QDateTime ¤tTime) { + this->currentTime = currentTime; +} \ No newline at end of file diff --git a/src/frames.h b/src/frames.h new file mode 100644 index 00000000..bd63a736 --- /dev/null +++ b/src/frames.h @@ -0,0 +1,47 @@ +#ifndef FRAMES_H +#define FRAMES_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "log_handler.h" + +class Frames { +public: + struct Frame { + QString color; + int thickness; + }; + LogHandler logHandler; + std::vector> framesMat; + std::vector activeLogEntriesVector; + QHash idMapping; + QDateTime currentTime; + Frames(LogHandler &logHandler); + + void updateFrames(const QDateTime ¤tTime); + void fillFramesMat(); + // Getters + const LogHandler& getLogHandler() const; + const std::vector>& getFramesMat() const; + const std::vector& getLogEntriesVector() const; + const QHash getIdMapping() const; + const QDateTime getCurrentTime() const; + // Setters + void setLogHandler(LogHandler &logHandler); + void setFramesMat(const std::vector>& framesMat); + void setLogEntriesVector(const std::vector& logEntriesVector); + void setIdMapping(QHash &idMapping); + void setCurrentTime(const QDateTime ¤tTime); +private: + void initialFramesMat(int size); + void createSequentialIds(); + QString generateRandomColor(); +}; + +#endif // FRAMES_H \ No newline at end of file diff --git a/src/log_handler.cpp b/src/log_handler.cpp index 0a3c358a..762c5424 100644 --- a/src/log_handler.cpp +++ b/src/log_handler.cpp @@ -1,198 +1,165 @@ -#include "log_handler.h" -#include -#include #include +#include #include -#include +#include #include -//#include "my_widget.h" -#include -#include +#include #include +#include +#include #include #include -#include +#include +#include #include "draggable_square.h" -#include "simulation_data_manager.h" -#include +#include "simulation_data_manager.h" +#include "log_handler.h" -// קריאת נתונים מקובץ -void LogHandler::readLogFile(const QString& fileName) { - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qDebug() << "Cannot open file:" << fileName; - return; + +QVector LogHandler::getLogEntries() { return logEntries; } +// Reading data from a file +void LogHandler::readLogFile(const QString &fileName) { + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug() << "Cannot open file:" << fileName; + return; + } + QTextStream in(&file); + while (!in.atEnd()) { + QString line = in.readLine().trimmed(); // Trim the entire line + QStringList fields = line.split(' '); + + if (fields.size() < 6) { + qWarning() << "Skipping malformed line:" << line; + continue; } - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine().trimmed(); // Trim the entire line - QStringList fields = line.split(' '); - - if (fields.size() < 6) { - qWarning() << "Skipping malformed line:" << line; - continue; - } - - LogEntry entry; - QString dateString = fields[0].trimmed(); // Trim each field - QString timeString = fields[1].trimmed(); - - QString dateTimeString = dateString + " " + timeString; - entry.timestamp = QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss"); - if (!entry.timestamp.isValid()) { - qWarning() << "Skipping line with invalid timestamp:" << line; - continue; - } - - entry.srcId = fields[2].trimmed().toInt(); - entry.dstId = fields[3].trimmed().toInt(); - entry.payload = fields[4].trimmed(); - entry.status = fields[5].trimmed(); - logEntries.push_back(entry); + + LogEntry entry; + QString dateString = fields[0].trimmed(); // Trim each field + QString timeString = fields[1].trimmed(); + + QString dateTimeString = dateString + " " + timeString; + entry.timestamp = + QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss"); + if (!entry.timestamp.isValid()) { + qWarning() << "Skipping line with invalid timestamp:" << line; + continue; } - file.close(); - qDebug() << "succesfull read LogFile"; + entry.srcId = fields[2].trimmed().toInt(); + entry.dstId = fields[3].trimmed().toInt(); + entry.payload = fields[4].trimmed(); + entry.status = fields[5].trimmed(); + logEntries.push_back(entry); + } + + file.close(); + qDebug() << "succesfull read LogFile"; } void LogHandler::sortLogEntries() { - std::sort(logEntries.begin(), logEntries.end()); + std::sort(logEntries.begin(), logEntries.end()); } -void LogHandler::analyzeLogEntries(QMainWindow* mainWindow, const QString& jsonFileName) { - // // יצירת חלון להציג את זמן הלוג - // QWidget *timeWidget = new QWidget(mainWindow); - // QVBoxLayout *layout = new QVBoxLayout(timeWidget); - // QLabel *timeLabel = new QLabel("Timestamp: ", timeWidget); - // layout->addWidget(timeLabel); - // timeWidget->setLayout(layout); - // timeWidget->setWindowTitle("Current Log Timestamp"); - // timeWidget->resize(200, 100); - // timeWidget->setAttribute(Qt::WA_QuitOnClose, false); // לוודא שהחלון לא יסגור את האפליקציה - // timeWidget->show(); - - // // יצירת חלון להציג את תרשים הזרימה - // MyWidget *flowWidget = new MyWidget(mainWindow, 100); // קצב עדכון של 100 מ"ל - // QDockWidget *dockWidget = new QDockWidget("Flow Diagram", mainWindow); - // dockWidget->setWidget(flowWidget); - // mainWindow->addDockWidget(Qt::RightDockWidgetArea, dockWidget); - - // // טיפול בכל רשומות הלוג - // for (const auto &log_entry : logEntries) { - // // עדכון התווית בחלון הזמן עם הת timestamp הנוכחי - // timeLabel->setText("Timestamp: " + log_entry.timestamp.toString("yyyy-MM-dd HH:mm:ss")); - // QCoreApplication::processEvents(); // עדכון ה-UI - - // // הוספת חץ בין הנקודות - // QString status = log_entry.status == "sent" ? "sending" : "received"; - // // read the place from json - // int xsrcId = 0, ysrcId = 0, xdstId = 0, ydstId = 0; - - // QVector coordinatesSrc = findProcessCoordinatesById(log_entry.srcId,fileName); - // if (!coordinatesSrc.isEmpty()) { - // qDebug() << "Coordinates for process ID" << log_entry.srcId << ":" << coordinatesSrc[0] << "," << coordinatesSrc[1]; - // xsrcId=coordinatesSrc[0]; - // ysrcId=coordinatesSrc[1]; - // } else { - // qDebug() << "Process not found or error occurred."; - // } - // QVector coordinatesDst = findProcessCoordinatesById(log_entry.dstId,fileName); - // if (!coordinatesDst.isEmpty()) { - // qDebug() << "Coordinates for process ID" << log_entry.dstId << ":" << coordinatesDst[0] << "," << coordinatesDst[1]; - // xdstId=coordinatesDst[0]; - // ydstId=coordinatesDst[1]; - // } else { - // qDebug() << "Process not found or error occurred."; - // } - // flowWidget->addConnection(xsrcId, ysrcId, xdstId, ydstId, log_entry.payload, status); - // } - - // qDebug() << "Analyzing log entries"; - - // Iterate through log entries and update colors based on communication - // קריאה מהקובץ JSON כדי לקבל מידע על תהליכים +void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, + const QString &jsonFileName, bool realTime) { + if (realTime) { + // if the simulation runs time the squares are present on the window + /// Otherwise, quarters are reloaded according to the data in Gison + } else { SimulationDataManager dataManager; - QJsonObject jsonObject = dataManager.loadSimulationData(jsonFileName.toStdString()); - + QJsonObject jsonObject = + dataManager.loadSimulationData(jsonFileName.toStdString()); if (jsonObject.isEmpty()) { - qWarning() << "Failed to load JSON data"; - return; + qWarning() << "Failed to load JSON data"; + return; } // עדכון מפת התהליכים לפי מידע מהקובץ JSON QJsonArray processesArray = jsonObject["processes"].toArray(); - for (const QJsonValue& value : processesArray) { - QJsonObject processObject = value.toObject(); - int id = processObject["id"].toInt(); - QString name = processObject["name"].toString(); - QString cmakeProject = processObject["CMakeProject"].toString(); - QString qemuPlatform = processObject["QEMUPlatform"].toString(); - int x = processObject["coordinate"].toObject()["x"].toInt(); - int y = processObject["coordinate"].toObject()["y"].toInt(); - int width = processObject["width"].toInt(); - int height = processObject["height"].toInt(); - - Process process(id, name, cmakeProject, qemuPlatform); - DraggableSquare* square = new DraggableSquare(mainWindow, "", width, height); - square->setProcess(process); - square->move(x, y); - processSquares[id] = square; + for (const QJsonValue &value : processesArray) { + QJsonObject processObject = value.toObject(); + int id = processObject["id"].toInt(); + QString name = processObject["name"].toString(); + QString cmakeProject = processObject["CMakeProject"].toString(); + QString qemuPlatform = processObject["QEMUPlatform"].toString(); + int x = processObject["coordinate"].toObject()["x"].toInt(); + int y = processObject["coordinate"].toObject()["y"].toInt(); + int width = processObject["width"].toInt(); + int height = processObject["height"].toInt(); + + Process process(id, name, cmakeProject, qemuPlatform); + DraggableSquare *square = + new DraggableSquare(mainWindow, "", width, height); + square->setProcess(process); + square->move(x, y); + processSquares.insert(id, square); } - ///////////////////////////////////-----------------------------\\\\\\\\\\\\\\\\\\\\\\\\\\\ - qDebug() << "befor the loop"; - qDebug() << "Size of logEntries:" << logEntries.size(); - for (const auto& logEntry : logEntries) { - qDebug() << "in the loop- line_113"; - int srcId = logEntry.srcId; - int dstId = logEntry.dstId; - - if (!processSquares.contains(srcId) || !processSquares.contains(dstId)) continue; - - DraggableSquare* srcSquare = processSquares[srcId]; - DraggableSquare* dstSquare = processSquares[dstId]; - - QString color = "background-color: yellow;"; // Default color - if (communicationCounts.contains(srcId) && communicationCounts[srcId].contains(dstId)) { - qDebug() << "in the loop-if- 124"; - int count = communicationCounts[srcId][dstId]; - int colorIntensity = qMin(count * 25, 255); // Increase color intensity based on count - color = QString("background-color: rgb(%1, %1, 255);").arg(colorIntensity); - qDebug() << "in for in analiesEntiers"; - } - - srcSquare->setSquareColor(color); - dstSquare->setSquareColor(color); - - // Increase communication count - communicationCounts[srcId][dstId]++; + } + + qDebug() << "Size of logEntries:" << logEntries.size(); + for (const auto &logEntry : logEntries) { + int srcId = logEntry.srcId; + int dstId = logEntry.dstId; + + if (!processSquares.contains(srcId) || !processSquares.contains(dstId)) + continue; + + DraggableSquare *srcSquare = processSquares[srcId]; + DraggableSquare *dstSquare = processSquares[dstId]; + + QString color = "background-color: yellow;"; // Default color + if (communicationCounts.contains(srcId) && + communicationCounts[srcId].contains(dstId)) { + int count = communicationCounts[srcId][dstId]; + int colorIntensity = + qMin(count * 25, 255); // Increase color intensity based on count + color = + QString("background-color: rgb(%1, %1, 255);").arg(colorIntensity); } + + srcSquare->setSquareColor(color); + dstSquare->setSquareColor(color); + + // Increase communication count + communicationCounts[srcId][dstId]++; + } + for (QMap::iterator it = processSquares.begin(); + it != processSquares.end(); ++it) { + // Access key and value + int key = it.key(); + DraggableSquare *square = it.value(); + square->print(); // For example, a call to the print function we defined + } } -QVector LogHandler::findProcessCoordinatesById(int processId, const QString& fileName) { - QVector coordinates; +QVector LogHandler::findProcessCoordinatesById(int processId, const QString &fileName) { + QVector coordinates; - // טעינת JSON מהקובץ - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qWarning("Could not open file"); - return coordinates; - } - QByteArray jsonData = file.readAll(); - file.close(); - - QJsonDocument document = QJsonDocument::fromJson(jsonData); - QJsonObject rootObject = document.object(); - QJsonArray processesArray = rootObject["processes"].toArray(); - - // חיפוש ID התהליך ומציאת הקואורדינטות שלו - for (const QJsonValue& value : processesArray) { - QJsonObject processObject = value.toObject(); - if (processObject["id"].toInt() == processId) { - coordinates.append(processObject["x"].toInt()); - coordinates.append(processObject["y"].toInt()); - break; - } + // Load JSON from file + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning("Could not open file"); + return coordinates; + } + QByteArray jsonData = file.readAll(); + file.close(); + + QJsonDocument document = QJsonDocument::fromJson(jsonData); + QJsonObject rootObject = document.object(); + QJsonArray processesArray = rootObject["processes"].toArray(); + + // Searching for the process ID and finding its coordinatesFi + for (const QJsonValue &value : processesArray) { + QJsonObject processObject = value.toObject(); + if (processObject["id"].toInt() == processId) { + coordinates.append(processObject["x"].toInt()); + coordinates.append(processObject["y"].toInt()); + break; } + } - return coordinates; + return coordinates; } + +const QMap& LogHandler::getProcessSquares() const { return processSquares; } \ No newline at end of file diff --git a/src/log_handler.h b/src/log_handler.h index b8d7dab6..03778d41 100644 --- a/src/log_handler.h +++ b/src/log_handler.h @@ -10,7 +10,6 @@ #include #include "draggable_square.h" - class LogHandler { public: struct LogEntry { @@ -23,14 +22,16 @@ class LogHandler { bool operator<(const LogEntry& other) const { return timestamp < other.timestamp; } - }; void readLogFile(const QString& fileName); void sortLogEntries(); - void analyzeLogEntries(QMainWindow* mainWindow, const QString& jsonFileName); + void analyzeLogEntries(QMainWindow* mainWindow, const QString& jsonFileName, bool realTime=false); void draw(int xSrc, int ySrc, int xDest, int yDest); QVector findProcessCoordinatesById(int processId, const QString& fileName); + QVector getLogEntries(); + const QMap& getProcessSquares() const; + private: QVector logEntries; QMap processSquares; // Track process squares by their IDs diff --git a/src/main_window.cpp b/src/main_window.cpp index 136f9d3e..66c81863 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -173,9 +173,6 @@ void MainWindow::startProcesses() timeLabel->hide(); timeInput->hide(); } - - - compileBoxes(); } From 816e251d7ff67df26fcacb8ef14bd16ea9977a27 Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Mon, 5 Aug 2024 17:53:45 +0300 Subject: [PATCH 11/33] GUI: Refactored MainWindow: Add deletion functionality --- CMakeLists.txt | 2 +- src/draggable_square.cpp | 107 +++++++++++++++++++++++++------- src/draggable_square.h | 12 ++++ src/main_window.cpp | 131 +++++++++++++++++++++++++-------------- src/main_window.h | 16 ++--- 5 files changed, 191 insertions(+), 77 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f96e8afe..6eda1d41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,4 +33,4 @@ add_executable(DraggableSquares target_include_directories(DraggableSquares PRIVATE ${BSON_INCLUDE_DIRS}) # Link the BSON library -target_link_libraries(DraggableSquares ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) +target_link_libraries(DraggableSquares ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) \ No newline at end of file diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index b88ce273..f023e37c 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -1,34 +1,24 @@ #include -#include #include +#include +#include +#include +#include +#include #include #include #include #include "draggable_square.h" -#include -#include -#include -#include - -// Add this function to your DraggableSquare class -void DraggableSquare::print() const { - std::cout << "DraggableSquare:" << std::endl; - std::cout << " Process ID: " << process.getId() << std::endl; - std::cout << " Drag Start Position: (" << dragStartPosition.x() << ", " << dragStartPosition.y() << ")" << std::endl; - std::cout << " Initial Position: (" << initialPosition.x() << ", " << initialPosition.y() << ")" << std::endl; - std::cout << " Color: " << label->styleSheet().toStdString() << std::endl; - std::cout << " Size: (" << this->width() << ", " << this->height() << ")" << std::endl; -} +#include "process.h" +#include "main_window.h" -void DraggableSquare::setSquareColor(const QString &color) { - setStyleSheet(color); -} -// Update the constructor definition to match the declaration -DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, int width, int height) - : QWidget(parent), label(new QLabel(this)) +DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, + int width, int height) + : QWidget(parent), label(new QLabel(this)), dragging(false) { setFixedSize(width, height); setStyleSheet(color); + QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(label); setLayout(layout); @@ -63,9 +53,24 @@ DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) return *this; } +void DraggableSquare::print() const { + std::cout << "DraggableSquare:" << std::endl; + std::cout << " Process ID: " << process.getId() << std::endl; + std::cout << " Drag Start Position: (" << dragStartPosition.x() << ", " << dragStartPosition.y() << ")" << std::endl; + std::cout << " Initial Position: (" << initialPosition.x() << ", " << initialPosition.y() << ")" << std::endl; + std::cout << " Color: " << label->styleSheet().toStdString() << std::endl; + std::cout << " Size: (" << this->width() << ", " << this->height() << ")" << std::endl; +} + +void DraggableSquare::setSquareColor(const QString &color) { + setStyleSheet(color); +} + void DraggableSquare::setProcess(const Process &process) { this->process = process; + this->id = process.getId(); + label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") .arg(process.getId()) .arg(process.getName()) @@ -83,19 +88,77 @@ const QPoint DraggableSquare::getDragStartPosition() const return dragStartPosition; } +DraggableSquare::~DraggableSquare() +{ + if (label) { + delete label; + label = nullptr; + } + + qDebug() << "DraggableSquare with ID" << id << "is being destroyed."; +} + void DraggableSquare::mousePressEvent(QMouseEvent *event) { - if (event->button() == Qt::LeftButton) { + if (event->button() == Qt::RightButton) { + if (id < 0 || id > 4) { // Prevent menu for IDs 1 to 4 + QMenu contextMenu(this); + + QAction *editAction = contextMenu.addAction("Edit"); + QAction *deleteAction = contextMenu.addAction("Delete"); + + QAction *selectedAction = contextMenu.exec(event->globalPos()); + + if (selectedAction == editAction) { + editSquare(id); + } else if (selectedAction == deleteAction) { + deleteSquare(id); + } + } + } else if (event->button() == Qt::LeftButton) { dragStartPosition = event->pos(); initialPosition = pos(); + dragging = true; + } else { + QWidget::mousePressEvent(event); } } void DraggableSquare::mouseMoveEvent(QMouseEvent *event) { + if (!dragging) { + return; + } if (!(event->buttons() & Qt::LeftButton)) return; + QPoint newPos = mapToParent(event->pos() - dragStartPosition); newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); + move(newPos); +} + +void DraggableSquare::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + dragging = false; + } + + QWidget::mouseReleaseEvent(event); +} + +void DraggableSquare::editSquare(int id) +{ + MainWindow *mainWindow = qobject_cast(parentWidget()->window()); + if (mainWindow) { + mainWindow->editSquare(id); + } +} + +void DraggableSquare::deleteSquare(int id) +{ + MainWindow *mainWindow = qobject_cast(parentWidget()->window()); + if (mainWindow) { + mainWindow->deleteSquare(id); + } } \ No newline at end of file diff --git a/src/draggable_square.h b/src/draggable_square.h index 88dfa1cd..cb04424e 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -4,8 +4,10 @@ #include #include #include +#include #include "process.h" + class DraggableSquare : public QWidget { Q_OBJECT @@ -20,16 +22,26 @@ class DraggableSquare : public QWidget const QPoint getDragStartPosition() const; void setSquareColor(const QString &color); void print() const; + int getId() const { return id; } + void setId(int _id) { id = _id; } + ~DraggableSquare() override; protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; private: QPoint dragStartPosition; QPoint initialPosition; QLabel *label; Process process; + int id; + bool dragging; + +private slots: + void editSquare(int id); + void deleteSquare(int id); }; #endif // __DRAGGABLE_SQUARE_H__ diff --git a/src/main_window.cpp b/src/main_window.cpp index 66c81863..d1e4613f 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -1,12 +1,17 @@ #include #include -#include "process.h" -#include "main_window.h" #include #include +#include +#include +#include +#include "process.h" +#include "main_window.h" +#include "draggable_square.h" +#include "process_dialog.h" MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), process1(nullptr), process2(nullptr), timer(nullptr) + : QMainWindow(parent), timer(nullptr) { QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); @@ -21,7 +26,7 @@ MainWindow::MainWindow(QWidget *parent) timeInput = new QLineEdit(this); timeLabel = new QLabel("Enter time in seconds:", this); logOutput = new QTextEdit(this); - QPushButton *chooseButton = new QPushButton("choose img", this); + QPushButton *chooseButton = new QPushButton("Choose Image", this); timeLabel->hide(); timeInput->hide(); @@ -32,6 +37,7 @@ MainWindow::MainWindow(QWidget *parent) QPushButton *addProcessButton = new QPushButton("Add Process", toolbox); toolboxLayout->addWidget(addProcessButton); toolboxLayout->addStretch(); + connect(addProcessButton, &QPushButton::clicked, this, &MainWindow::createNewProcess); connect(startButton, &QPushButton::clicked, this, &MainWindow::startProcesses); connect(endButton, &QPushButton::clicked, this, &MainWindow::endProcesses); @@ -62,25 +68,26 @@ MainWindow::MainWindow(QWidget *parent) int id = 0; Process mainProcess(id, "Main", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(mainProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(mainProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); Process hsmProcess(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(hsmProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(hsmProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); Process logsDbProcess(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(logsDbProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(logsDbProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); Process busManagerProcess(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(busManagerProcess, id,"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(busManagerProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); } + MainWindow::~MainWindow() { qDeleteAll(squares); - if (process1) delete process1; - if (process2) delete process2; - if (timer) delete timer; + if (timer) { + delete timer; + } } void MainWindow::createNewProcess() @@ -89,7 +96,7 @@ void MainWindow::createNewProcess() if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { int id = dialog.getId(); - if (id <= 10) { + if (id <= 4) { QMessageBox::warning(this, "Invalid ID", "The ID must be greater than 10."); return; } @@ -103,11 +110,11 @@ void MainWindow::createNewProcess() } } -void MainWindow::addProcessSquare(const Process& process) +void MainWindow::addProcessSquare(const Process &process) { DraggableSquare *square = new DraggableSquare(workspace); square->setProcess(process); - + square->setId(process.getId()); QPoint pos = squarePositions.value(process.getId(), QPoint(0, 0)); square->move(pos); square->show(); @@ -116,11 +123,13 @@ void MainWindow::addProcessSquare(const Process& process) squares.push_back(square); } -void MainWindow::addProcessSquare(const Process& process, int index,const QString &color) +void MainWindow::addProcessSquare(const Process &process, int index, const QString &color) { + DraggableSquare *square = new DraggableSquare(workspace,color,sizeSquare,sizeSquare); + DraggableSquare *square = new DraggableSquare(workspace,color,120,120); square->setProcess(process); - + square->setId(process.getId()); int x = (index % 2) * (square->width() + 10); int y = (index / 2) * (square->height() + 10); QPoint pos = squarePositions.value(process.getId(), QPoint(x, y)); @@ -129,7 +138,6 @@ void MainWindow::addProcessSquare(const Process& process, int index,const QStrin squarePositions[process.getId()] = pos; squares.push_back(square); - } bool MainWindow::isUniqueId(int id) @@ -176,7 +184,8 @@ void MainWindow::startProcesses() compileBoxes(); } -void MainWindow::endProcesses() { +void MainWindow::endProcesses() +{ logOutput->append("Ending processes..."); if (timer) { @@ -219,16 +228,6 @@ void MainWindow::timerTimeout() endProcesses(); } -void MainWindow::readProcess1Output() -{ - logOutput->append("Process1: " + process1->readAllStandardOutput()); -} - -void MainWindow::readProcess2Output() -{ - logOutput->append("Process2: " + process2->readAllStandardOutput()); -} - void MainWindow::openImageDialog() { QString imagePath = QFileDialog::getOpenFileName(this, tr("Select Image"), "", tr("Image Files (*.png *.jpg *.jpeg)")); @@ -241,18 +240,18 @@ void MainWindow::openImageDialog() if (layout) { QLayoutItem *item; while ((item = layout->takeAt(0)) != nullptr) { - delete item->widget(); // Delete the widget - delete item; // Delete the layout item + delete item->widget(); + delete item; } } // Create a new QLabel to display the image as background QLabel *backgroundLabel = new QLabel(workspace); backgroundLabel->setPixmap(pixmap.scaled(workspace->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); - backgroundLabel->setGeometry(workspace->rect()); // Fit QLabel to the size of the workspace + backgroundLabel->setGeometry(workspace->rect()); backgroundLabel->setScaledContents(true); - backgroundLabel->setAttribute(Qt::WA_TranslucentBackground); // Ensure the image appears only as background - backgroundLabel->lower(); // Move QLabel below other content in the workspace + backgroundLabel->setAttribute(Qt::WA_TranslucentBackground); + backgroundLabel->lower(); backgroundLabel->show(); // Add a new layout to the workspace @@ -262,28 +261,41 @@ void MainWindow::openImageDialog() } } - QString MainWindow::getExecutableName(const QString &buildDirPath) { QDir buildDir(buildDirPath); - // List all files in the build directory + // Check if the directory exists + if (!buildDir.exists()) { + qWarning() << "Error: The directory" << buildDirPath << "does not exist."; + QMessageBox::critical(this, "Directory Error", "The specified build directory does not exist."); + return QString(); + } + QStringList files = buildDir.entryList(QDir::Files | QDir::NoSymLinks); - // Iterate over the files to find the executable + // If the directory is empty or has no files + if (files.isEmpty()) { + qWarning() << "Error: No files found in the directory" << buildDirPath << "."; + QMessageBox::critical(this, "File Error", "No files found in the specified build directory."); + return QString(); + } + foreach (const QString &file, files) { QFileInfo fileInfo(buildDir.filePath(file)); - - // Check if the file has no extension (common on Linux) or is an executable (on Windows) + + // Skip files with a suffix (i.e., non-executables) if (!fileInfo.suffix().isEmpty()) continue; - // Check if the file has execute permissions (Unix-based systems) + // If the file is executable, return its name if (fileInfo.isExecutable()) { return fileInfo.fileName(); } } - // If no executable file is found, return an empty string + // No executable found + qWarning() << "Error: No executable file found in the directory" << buildDirPath << "."; + QMessageBox::critical(this, "Executable Not Found", "No executable file found in the specified build directory."); return QString(); } @@ -292,20 +304,15 @@ void MainWindow::compileBoxes() { for (QProcess* process : runningProcesses) { process->terminate(); process->waitForFinished(); - delete process; } runningProcesses.clear(); - // Iterate over each directory and compile - for (const DraggableSquare* square : squares) { + for (const DraggableSquare *square : squares) { QString cmakePath = square->getProcess().getCMakeProject(); logOutput->append("Compiling " + cmakePath); - // Define the build directory path QDir cmakeDir(cmakePath); QString buildDirPath = cmakeDir.absoluteFilePath("build"); - - // Create the build directory if it doesn't exist QDir buildDir(buildDirPath); if (!buildDir.exists()) { if (!buildDir.mkpath(".")) { @@ -350,7 +357,7 @@ void MainWindow::compileBoxes() { // Run the compiled program QString exeFile = getExecutableName(buildDirPath); QString executablePath = buildDir.absoluteFilePath(exeFile); - QProcess* runProcess = new QProcess(this); + QProcess *runProcess = new QProcess(this); runProcess->setWorkingDirectory(buildDirPath); connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() { @@ -366,6 +373,36 @@ void MainWindow::compileBoxes() { } } +void MainWindow::editSquare(int id) +{ + logOutput->append(QString("Edit square with ID: %1").arg(id)); +} + +void MainWindow::deleteSquare(int id) +{ + qDebug() << "Deleting square with ID:" << id; + + auto it = std::find_if(squares.begin(), squares.end(), [id](DraggableSquare *square) { + return square && square->getProcess().getId() == id; + }); + + if (it != squares.end()) { + DraggableSquare *toDelete = *it; + it = squares.erase(it); + + if (toDelete) { + toDelete->deleteLater(); + qDebug() << "Square with ID:" << id << "deleted."; + } + } else { + qDebug() << "Square with ID:" << id << "not found."; + } + + usedIds.remove(id); + squarePositions.remove(id); +} + + // Include the generated moc file #include "moc_main_window.cpp" \ No newline at end of file diff --git a/src/main_window.h b/src/main_window.h index 5e8461dc..b1a09748 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -18,6 +17,9 @@ #include #include #include +#include +#include + #include "process.h" #include "draggable_square.h" #include "process_dialog.h" @@ -36,34 +38,34 @@ class MainWindow : public QMainWindow void endProcesses(); void showTimerInput(); void timerTimeout(); - void readProcess1Output(); - void readProcess2Output(); void openImageDialog(); private slots: void createNewProcess(); +public slots: + void editSquare(int id); + void deleteSquare(int id); + private: void addProcessSquare(const Process &process); bool isUniqueId(int id); void addId(int id); - void addProcessSquare(const Process& process, int index,const QString &color = "background-color: green;"); + void addProcessSquare(const Process &process, int index, const QString &color = "background-color: green;"); void compileBoxes(); QString getExecutableName(const QString &buildDirPath); + QVBoxLayout *toolboxLayout; QWidget *workspace; QVector squares; QMap squarePositions; QSet usedIds; - QSize originalSize; QPushButton *startButton; QPushButton *endButton; QPushButton *timerButton; QLineEdit *timeInput; QLabel *timeLabel; QTextEdit *logOutput; - QProcess *process1; - QProcess *process2; QTimer *timer; QLabel *imageLabel; QVector runningProcesses; From 5ea4a58cbbec32b1dd3e3c38507eb200946b4700 Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Wed, 7 Aug 2024 17:38:09 +0300 Subject: [PATCH 12/33] GUI: Add editing functionality --- src/main_window.cpp | 39 ++++++++++++++++++++++++--------------- src/process_dialog.cpp | 22 ++++++++++++++++++++++ src/process_dialog.h | 4 ++++ 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/main_window.cpp b/src/main_window.cpp index d1e4613f..6c88d6af 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -299,7 +299,9 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) return QString(); } -void MainWindow::compileBoxes() { + +void MainWindow::compileBoxes() +{ // Clear previous running processes for (QProcess* process : runningProcesses) { process->terminate(); @@ -319,15 +321,9 @@ void MainWindow::compileBoxes() { logOutput->append("Failed to create build directory " + buildDirPath); continue; } + } - // Clean the build directory - QProcess cleanProcess(this); - cleanProcess.setWorkingDirectory(buildDirPath); - cleanProcess.start("rm", QStringList() << "-rf" << "*"); - if (!cleanProcess.waitForFinished()) { - logOutput->append("Failed to clean build directory " + buildDirPath); - continue; - } + // Run cmake QProcess* cmakeProcess = new QProcess(this); cmakeProcess->setWorkingDirectory(buildDirPath); cmakeProcess->start("cmake", QStringList() << ".."); @@ -350,32 +346,45 @@ void MainWindow::compileBoxes() { } logOutput->append(makeProcess->readAllStandardOutput()); logOutput->append(makeProcess->readAllStandardError()); + logOutput->append("Successfully compiled " + buildDirPath); delete makeProcess; - logOutput->append("Successfully compiled " + buildDirPath); // Run the compiled program QString exeFile = getExecutableName(buildDirPath); QString executablePath = buildDir.absoluteFilePath(exeFile); - QProcess *runProcess = new QProcess(this); + QProcess* runProcess = new QProcess(this); runProcess->setWorkingDirectory(buildDirPath); connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() { logOutput->append(runProcess->readAllStandardOutput()); }); - connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() { logOutput->append(runProcess->readAllStandardError()); }); - runProcess->start(executablePath, QStringList()); runningProcesses.append(runProcess); } } -void MainWindow::editSquare(int id) +void MainWindow::editSquare(int id) { - logOutput->append(QString("Edit square with ID: %1").arg(id)); + for (DraggableSquare *square : squares) + { + if (square->getProcess().getId() == id) { + ProcessDialog dialog(this); + dialog.setId(square->getProcess().getId()); + dialog.setName(square->getProcess().getName()); + dialog.setCMakeProject(square->getProcess().getCMakeProject()); + dialog.setQEMUPlatform(square->getProcess().getQEMUPlatform()); + + if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { + // Update the process details + square->setProcess(Process(dialog.getId(), dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform())); + } + break; + } + } } void MainWindow::deleteSquare(int id) diff --git a/src/process_dialog.cpp b/src/process_dialog.cpp index 2020424b..41895d34 100644 --- a/src/process_dialog.cpp +++ b/src/process_dialog.cpp @@ -91,3 +91,25 @@ void ProcessDialog::validateAndAccept() QMessageBox::warning(this, "Input Error", "Please fill in all fields correctly."); } } +void ProcessDialog::setId(int id) +{ + idEdit->setText(QString::number(id)); +} + +void ProcessDialog::setName(const QString &name) +{ + nameEdit->setText(name); +} + +void ProcessDialog::setCMakeProject(const QString &cmakeProject) +{ + cmakeProjectEdit->setText(cmakeProject); +} + +void ProcessDialog::setQEMUPlatform(const QString &qemuPlatform) +{ + int index = qemuPlatformCombo->findText(qemuPlatform); + if (index != -1) { + qemuPlatformCombo->setCurrentIndex(index); + } +} \ No newline at end of file diff --git a/src/process_dialog.h b/src/process_dialog.h index 88623070..5c7e470f 100644 --- a/src/process_dialog.h +++ b/src/process_dialog.h @@ -20,6 +20,10 @@ class ProcessDialog : public QDialog QString getCMakeProject() const; QString getQEMUPlatform() const; bool isValid() const; + void setId(int id); + void setName(const QString &name); + void setCMakeProject(const QString &cmakeProject); + void setQEMUPlatform(const QString &qemuPlatform); private slots: void validateAndAccept(); From 33a4199f9c87e48f7a5b6f2e88109c4d0f291503 Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Wed, 7 Aug 2024 17:39:19 +0300 Subject: [PATCH 13/33] GUI: Enable running script files --- src/dummy_script/hello_script.sh | 3 + src/main_window.cpp | 152 +++++++++++++++++++++---------- 2 files changed, 105 insertions(+), 50 deletions(-) create mode 100755 src/dummy_script/hello_script.sh diff --git a/src/dummy_script/hello_script.sh b/src/dummy_script/hello_script.sh new file mode 100755 index 00000000..177ce789 --- /dev/null +++ b/src/dummy_script/hello_script.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "hello, $USER! " diff --git a/src/main_window.cpp b/src/main_window.cpp index 6c88d6af..56af3b21 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -299,11 +299,10 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) return QString(); } - -void MainWindow::compileBoxes() +void MainWindow::compileBoxes() { // Clear previous running processes - for (QProcess* process : runningProcesses) { + for (QProcess *process : runningProcesses) { process->terminate(); process->waitForFinished(); } @@ -311,59 +310,112 @@ void MainWindow::compileBoxes() for (const DraggableSquare *square : squares) { QString cmakePath = square->getProcess().getCMakeProject(); - logOutput->append("Compiling " + cmakePath); - - QDir cmakeDir(cmakePath); - QString buildDirPath = cmakeDir.absoluteFilePath("build"); - QDir buildDir(buildDirPath); - if (!buildDir.exists()) { - if (!buildDir.mkpath(".")) { - logOutput->append("Failed to create build directory " + buildDirPath); + if (cmakePath.endsWith(".sh")) { + // Check if it's a shell script + QFile scriptFile(cmakePath); + if (!scriptFile.exists()) { + logOutput->append("Shell script file does not exist: " + cmakePath); continue; } - } - // Run cmake - QProcess* cmakeProcess = new QProcess(this); - cmakeProcess->setWorkingDirectory(buildDirPath); - cmakeProcess->start("cmake", QStringList() << ".."); - if (!cmakeProcess->waitForFinished()) { - logOutput->append("Failed to run cmake in " + buildDirPath); + // Check if the script has executable permissions + if ((scriptFile.permissions() & QFileDevice::ExeUser) == 0) { + // Make the script executable using chmod command (Linux specific) + QProcess makeExecutableProcess; + makeExecutableProcess.start("chmod", QStringList() << "+x" << cmakePath); + if (!makeExecutableProcess.waitForFinished()) { + logOutput->append("Failed to make the script executable: " + cmakePath); + continue; + } + logOutput->append("Script is now executable: " + cmakePath); + } + + // Run the shell script + QProcess *scriptProcess = new QProcess(this); + scriptProcess->start("bash", QStringList() << cmakePath); + connect(scriptProcess, &QProcess::readyReadStandardOutput, [this, scriptProcess]() + { logOutput->append(scriptProcess->readAllStandardOutput()); }); + connect(scriptProcess, &QProcess::readyReadStandardError, [this, scriptProcess]() + { logOutput->append(scriptProcess->readAllStandardError()); }); + } else { + logOutput->append("Compiling " + cmakePath); + + QDir cmakeDir(cmakePath); + QString buildDirPath = cmakeDir.absoluteFilePath("build"); + QDir buildDir(buildDirPath); + if (buildDir.exists()) { + // Remove all files and subdirectories in the build directory + QFileInfoList fileList = buildDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); + foreach (const QFileInfo &fileInfo, fileList) { + if (fileInfo.isDir()) { + QDir dir(fileInfo.absoluteFilePath()); + if (!dir.removeRecursively()) { + logOutput->append("Failed to remove directory: " + fileInfo.absoluteFilePath()); + continue; + } + } else { + if (!QFile::remove(fileInfo.absoluteFilePath())) { + logOutput->append("Failed to remove file: " + fileInfo.absoluteFilePath()); + continue; + } + } + } + } else { + // Create the build directory if it doesn't exist + if (!buildDir.mkpath(".")) { + logOutput->append("Failed to create build directory " + buildDirPath); + continue; + } + } + // Run cmake + QProcess *cmakeProcess = new QProcess(this); + cmakeProcess->setWorkingDirectory(buildDirPath); + cmakeProcess->start("cmake", QStringList() << ".."); + if (!cmakeProcess->waitForFinished()) { + logOutput->append("Failed to run cmake in " + buildDirPath); + logOutput->append(cmakeProcess->readAllStandardError()); + delete cmakeProcess; + continue; + } + logOutput->append(cmakeProcess->readAllStandardOutput()); + logOutput->append(cmakeProcess->readAllStandardError()); delete cmakeProcess; - continue; - } - logOutput->append(cmakeProcess->readAllStandardOutput()); - logOutput->append(cmakeProcess->readAllStandardError()); - delete cmakeProcess; - - QProcess* makeProcess = new QProcess(this); - makeProcess->setWorkingDirectory(buildDirPath); - makeProcess->start("make", QStringList()); - if (!makeProcess->waitForFinished()) { - logOutput->append("Failed to compile " + buildDirPath); + + // Run make + QProcess *makeProcess = new QProcess(this); + makeProcess->setWorkingDirectory(buildDirPath); + makeProcess->start("make", QStringList()); + if (!makeProcess->waitForFinished()) { + logOutput->append("Failed to compile in " + buildDirPath); + logOutput->append(makeProcess->readAllStandardError()); + delete makeProcess; + continue; + } + logOutput->append(makeProcess->readAllStandardOutput()); + logOutput->append(makeProcess->readAllStandardError()); + logOutput->append("Successfully compiled " + buildDirPath); delete makeProcess; - continue; + logOutput->append("Successfully compiled " + buildDirPath); + + // Run the compiled program + QString exeFile = getExecutableName(buildDirPath); + QString executablePath = buildDir.absoluteFilePath(exeFile); + QProcess *runProcess = new QProcess(this); + runProcess->setWorkingDirectory(buildDirPath); + + connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() + { logOutput->append(runProcess->readAllStandardOutput()); }); + connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() + { logOutput->append(runProcess->readAllStandardError()); }); + runProcess->start(executablePath, QStringList()); + if (!runProcess->waitForStarted()) { + logOutput->append("Failed to start the program in " + buildDirPath); + logOutput->append(runProcess->readAllStandardError()); + delete runProcess; + continue; + } + runningProcesses.append(runProcess); } - logOutput->append(makeProcess->readAllStandardOutput()); - logOutput->append(makeProcess->readAllStandardError()); - logOutput->append("Successfully compiled " + buildDirPath); - delete makeProcess; - logOutput->append("Successfully compiled " + buildDirPath); - - // Run the compiled program - QString exeFile = getExecutableName(buildDirPath); - QString executablePath = buildDir.absoluteFilePath(exeFile); - QProcess* runProcess = new QProcess(this); - runProcess->setWorkingDirectory(buildDirPath); - - connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() { - logOutput->append(runProcess->readAllStandardOutput()); - }); - connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() { - logOutput->append(runProcess->readAllStandardError()); - }); - runProcess->start(executablePath, QStringList()); - runningProcesses.append(runProcess); } } From ca2e514413a11b48793f15427a12a3103aa060bc Mon Sep 17 00:00:00 2001 From: Dvora Novogrotzki Date: Wed, 14 Aug 2024 23:29:56 +0300 Subject: [PATCH 14/33] GUI: Dynamic frames with information from log file --- .clang-format | 43 + .gitignore | 4 +- CMakeLists.txt | 1 - log_file.log | 10006 +++++++++++++++++++++++++++++- src/draggable_square.cpp | 80 +- src/draggable_square.h | 21 +- src/dummy_program1/main.cpp | 5 +- src/dummy_program2/main.cpp | 5 +- src/frames.cpp | 194 +- src/frames.h | 66 +- src/log_file.log | 6 - src/log_handler.cpp | 289 +- src/log_handler.h | 31 +- src/main.cpp | 2 +- src/main_window.cpp | 111 +- src/main_window.h | 35 +- src/my_widget.cpp | 98 - src/my_widget.h | 36 - src/process.cpp | 13 +- src/process.h | 10 +- src/process_dialog.cpp | 27 +- src/process_dialog.h | 10 +- src/simulation_data_manager.cpp | 67 +- src/simulation_data_manager.h | 16 +- 24 files changed, 10625 insertions(+), 551 deletions(-) create mode 100644 .clang-format delete mode 100644 src/log_file.log delete mode 100644 src/my_widget.cpp delete mode 100644 src/my_widget.h diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..83df20e6 --- /dev/null +++ b/.clang-format @@ -0,0 +1,43 @@ +BasedOnStyle: Google +IndentWidth: 4 +TabWidth: 4 +UseTab: Never +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: true + AfterNamespace: false + AfterStruct: false + BeforeCatch: true + BeforeElse: true + IndentBraces: false +ColumnLimit: 80 +IndentCaseLabels: true +SortIncludes: false +SpaceBeforeParens: ControlStatements +SpacesInParentheses: false +SpacesInSquareBrackets: false +IncludeBlocks: Preserve +IncludeIsMainSourceRegex: '$' +AllowShortFunctionsOnASingleLine: Empty +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignOperands: true +AlignTrailingComments: true +BreakConstructorInitializersBeforeComma: false +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +DerivePointerAlignment: false +PointerAlignment: Right +NamespaceIndentation: None +ReflowComments: false +IndentPPDirectives: None +MaxEmptyLinesToKeep: 1 +AccessModifierOffset: -4 +IndentAccessModifiers: false diff --git a/.gitignore b/.gitignore index dbb8d71c..a0dfacd9 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,4 @@ src/process_dialog.cpp src/process_dialog.h src/process.h src/simulation_data_manager.cpp -src/simulation_data_manager.h -src/my_widget.h -src/my_widget.cpp \ No newline at end of file +src/simulation_data_manager.h \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eda1d41..7cd6ad6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,6 @@ add_executable(DraggableSquares src/main_window.cpp src/simulation_data_manager.cpp src/log_handler.cpp - src/my_widget.cpp src/frames.cpp ) diff --git a/log_file.log b/log_file.log index 9101f644..0b0a1f46 100644 --- a/log_file.log +++ b/log_file.log @@ -1,6 +1,10000 @@ -2024-07-30 12:00:00 1 2 100 SEND -2024-07-30 12:00:01 1 3 101 RECEIVE -2024-07-30 12:00:02 2 4 102 SEND -2024-07-30 12:00:03 3 4 103 RECEIVE -2024-07-30 12:00:04 4 5 104 SEND -2024-07-30 12:00:05 5 6 105 RECEIVE \ No newline at end of file +2024-07-30 12:00:00.000 0 1 100 SEND +2024-07-30 12:00:00.001 0 1 102 RECEIVE +2024-07-30 12:00:00.002 0 1 104 SEND +2024-07-30 12:00:00.003 0 1 106 RECEIVE +2024-07-30 12:00:00.004 0 1 108 SEND +2024-07-30 12:00:00.005 0 1 110 RECEIVE +2024-07-30 12:00:00.006 0 1 112 SEND +2024-07-30 12:00:00.007 0 1 114 RECEIVE +2024-07-30 12:00:00.008 0 1 116 SEND +2024-07-30 12:00:00.009 0 1 118 RECEIVE +2024-07-30 12:00:00.010 0 1 120 SEND +2024-07-30 12:00:00.011 0 1 122 RECEIVE +2024-07-30 12:00:00.012 0 1 124 SEND +2024-07-30 12:00:00.013 0 1 126 RECEIVE +2024-07-30 12:00:00.014 0 1 128 SEND +2024-07-30 12:00:00.015 0 1 130 RECEIVE +2024-07-30 12:00:00.016 0 1 116 SEND +2024-07-30 12:00:00.017 0 1 118 RECEIVE +2024-07-30 12:00:00.018 0 1 120 SEND +2024-07-30 12:00:00.019 0 1 122 RECEIVE +2024-07-30 12:00:00.020 0 1 124 SEND +2024-07-30 12:00:00.021 0 1 126 RECEIVE +2024-07-30 12:00:00.022 0 1 128 SEND +2024-07-30 12:00:00.023 0 1 130 RECEIVE +2024-07-30 12:00:00.024 0 1 132 SEND +2024-07-30 12:00:00.025 0 1 134 RECEIVE +2024-07-30 12:00:00.026 0 1 136 SEND +2024-07-30 12:00:00.027 0 1 138 RECEIVE +2024-07-30 12:00:00.028 0 1 140 SEND +2024-07-30 12:00:00.029 0 1 142 RECEIVE +2024-07-30 12:00:00.030 0 1 144 SEND +2024-07-30 12:00:00.031 0 1 146 RECEIVE +2024-07-30 12:00:00.032 0 1 132 SEND +2024-07-30 12:00:00.033 0 1 134 RECEIVE +2024-07-30 12:00:00.034 0 1 136 SEND +2024-07-30 12:00:00.035 0 1 138 RECEIVE +2024-07-30 12:00:00.036 0 1 140 SEND +2024-07-30 12:00:00.037 0 1 142 RECEIVE +2024-07-30 12:00:00.038 0 1 144 SEND +2024-07-30 12:00:00.039 0 1 146 RECEIVE +2024-07-30 12:00:00.040 0 1 148 SEND +2024-07-30 12:00:00.041 0 1 150 RECEIVE +2024-07-30 12:00:00.042 0 1 152 SEND +2024-07-30 12:00:00.043 0 1 154 RECEIVE +2024-07-30 12:00:00.044 0 1 156 SEND +2024-07-30 12:00:00.045 0 1 158 RECEIVE +2024-07-30 12:00:00.046 0 1 160 SEND +2024-07-30 12:00:00.047 0 1 162 RECEIVE +2024-07-30 12:00:00.048 0 1 148 SEND +2024-07-30 12:00:00.049 0 1 150 RECEIVE +2024-07-30 12:00:00.050 0 1 152 SEND +2024-07-30 12:00:00.051 0 1 154 RECEIVE +2024-07-30 12:00:00.052 0 1 156 SEND +2024-07-30 12:00:00.053 0 1 158 RECEIVE +2024-07-30 12:00:00.054 0 1 160 SEND +2024-07-30 12:00:00.055 0 1 162 RECEIVE +2024-07-30 12:00:00.056 0 1 164 SEND +2024-07-30 12:00:00.057 0 1 166 RECEIVE +2024-07-30 12:00:00.058 0 1 168 SEND +2024-07-30 12:00:00.059 0 1 170 RECEIVE +2024-07-30 12:00:00.060 0 1 172 SEND +2024-07-30 12:00:00.061 0 1 174 RECEIVE +2024-07-30 12:00:00.062 0 1 176 SEND +2024-07-30 12:00:00.063 0 1 178 RECEIVE +2024-07-30 12:00:00.064 0 1 164 SEND +2024-07-30 12:00:00.065 0 1 166 RECEIVE +2024-07-30 12:00:00.066 0 1 168 SEND +2024-07-30 12:00:00.067 0 1 170 RECEIVE +2024-07-30 12:00:00.068 0 1 172 SEND +2024-07-30 12:00:00.069 0 1 174 RECEIVE +2024-07-30 12:00:00.070 0 1 176 SEND +2024-07-30 12:00:00.071 0 1 178 RECEIVE +2024-07-30 12:00:00.072 0 1 180 SEND +2024-07-30 12:00:00.073 0 1 182 RECEIVE +2024-07-30 12:00:00.074 0 1 184 SEND +2024-07-30 12:00:00.075 0 1 186 RECEIVE +2024-07-30 12:00:00.076 0 1 188 SEND +2024-07-30 12:00:00.077 0 1 190 RECEIVE +2024-07-30 12:00:00.078 0 1 192 SEND +2024-07-30 12:00:00.079 0 1 194 RECEIVE +2024-07-30 12:00:00.080 0 1 180 SEND +2024-07-30 12:00:00.081 0 1 182 RECEIVE +2024-07-30 12:00:00.082 0 1 184 SEND +2024-07-30 12:00:00.083 0 1 186 RECEIVE +2024-07-30 12:00:00.084 0 1 188 SEND +2024-07-30 12:00:00.085 0 1 190 RECEIVE +2024-07-30 12:00:00.086 0 1 192 SEND +2024-07-30 12:00:00.087 0 1 194 RECEIVE +2024-07-30 12:00:00.088 0 1 196 SEND +2024-07-30 12:00:00.089 0 1 198 RECEIVE +2024-07-30 12:00:00.090 0 1 200 SEND +2024-07-30 12:00:00.091 0 1 202 RECEIVE +2024-07-30 12:00:00.092 0 1 204 SEND +2024-07-30 12:00:00.093 0 1 206 RECEIVE +2024-07-30 12:00:00.094 0 1 208 SEND +2024-07-30 12:00:00.095 0 1 210 RECEIVE +2024-07-30 12:00:00.096 0 1 196 SEND +2024-07-30 12:00:00.097 0 1 198 RECEIVE +2024-07-30 12:00:00.098 0 1 200 SEND +2024-07-30 12:00:00.099 0 1 202 RECEIVE +2024-07-30 12:00:00.100 0 1 204 SEND +2024-07-30 12:00:00.101 0 1 206 RECEIVE +2024-07-30 12:00:00.102 0 1 208 SEND +2024-07-30 12:00:00.103 0 1 210 RECEIVE +2024-07-30 12:00:00.104 0 1 212 SEND +2024-07-30 12:00:00.105 0 1 214 RECEIVE +2024-07-30 12:00:00.106 0 1 216 SEND +2024-07-30 12:00:00.107 0 1 218 RECEIVE +2024-07-30 12:00:00.108 0 1 220 SEND +2024-07-30 12:00:00.109 0 1 222 RECEIVE +2024-07-30 12:00:00.110 0 1 224 SEND +2024-07-30 12:00:00.111 0 1 226 RECEIVE +2024-07-30 12:00:00.112 0 1 212 SEND +2024-07-30 12:00:00.113 0 1 214 RECEIVE +2024-07-30 12:00:00.114 0 1 216 SEND +2024-07-30 12:00:00.115 0 1 218 RECEIVE +2024-07-30 12:00:00.116 0 1 220 SEND +2024-07-30 12:00:00.117 0 1 222 RECEIVE +2024-07-30 12:00:00.118 0 1 224 SEND +2024-07-30 12:00:00.119 0 1 226 RECEIVE +2024-07-30 12:00:00.120 0 1 228 SEND +2024-07-30 12:00:00.121 0 1 230 RECEIVE +2024-07-30 12:00:00.122 0 1 232 SEND +2024-07-30 12:00:00.123 0 1 234 RECEIVE +2024-07-30 12:00:00.124 0 1 236 SEND +2024-07-30 12:00:00.125 0 1 238 RECEIVE +2024-07-30 12:00:00.126 0 1 240 SEND +2024-07-30 12:00:00.127 0 1 242 RECEIVE +2024-07-30 12:00:00.128 0 1 228 SEND +2024-07-30 12:00:00.129 0 1 230 RECEIVE +2024-07-30 12:00:00.130 0 1 232 SEND +2024-07-30 12:00:00.131 0 1 234 RECEIVE +2024-07-30 12:00:00.132 0 1 236 SEND +2024-07-30 12:00:00.133 0 1 238 RECEIVE +2024-07-30 12:00:00.134 0 1 240 SEND +2024-07-30 12:00:00.135 0 1 242 RECEIVE +2024-07-30 12:00:00.136 0 1 244 SEND +2024-07-30 12:00:00.137 0 1 246 RECEIVE +2024-07-30 12:00:00.138 0 1 248 SEND +2024-07-30 12:00:00.139 0 1 250 RECEIVE +2024-07-30 12:00:00.140 0 1 252 SEND +2024-07-30 12:00:00.141 0 1 254 RECEIVE +2024-07-30 12:00:00.142 0 1 256 SEND +2024-07-30 12:00:00.143 0 1 258 RECEIVE +2024-07-30 12:00:00.144 0 1 244 SEND +2024-07-30 12:00:00.145 0 1 246 RECEIVE +2024-07-30 12:00:00.146 0 1 248 SEND +2024-07-30 12:00:00.147 0 1 250 RECEIVE +2024-07-30 12:00:00.148 0 1 252 SEND +2024-07-30 12:00:00.149 0 1 254 RECEIVE +2024-07-30 12:00:00.150 0 1 256 SEND +2024-07-30 12:00:00.151 0 1 258 RECEIVE +2024-07-30 12:00:00.152 0 1 260 SEND +2024-07-30 12:00:00.153 0 1 262 RECEIVE +2024-07-30 12:00:00.154 0 1 264 SEND +2024-07-30 12:00:00.155 0 1 266 RECEIVE +2024-07-30 12:00:00.156 0 1 268 SEND +2024-07-30 12:00:00.157 0 1 270 RECEIVE +2024-07-30 12:00:00.158 0 1 272 SEND +2024-07-30 12:00:00.159 0 1 274 RECEIVE +2024-07-30 12:00:00.160 0 1 260 SEND +2024-07-30 12:00:00.161 0 1 262 RECEIVE +2024-07-30 12:00:00.162 0 1 264 SEND +2024-07-30 12:00:00.163 0 1 266 RECEIVE +2024-07-30 12:00:00.164 0 1 268 SEND +2024-07-30 12:00:00.165 0 1 270 RECEIVE +2024-07-30 12:00:00.166 0 1 272 SEND +2024-07-30 12:00:00.167 0 1 274 RECEIVE +2024-07-30 12:00:00.168 0 1 276 SEND +2024-07-30 12:00:00.169 0 1 278 RECEIVE +2024-07-30 12:00:00.170 0 1 280 SEND +2024-07-30 12:00:00.171 0 1 282 RECEIVE +2024-07-30 12:00:00.172 0 1 284 SEND +2024-07-30 12:00:00.173 0 1 286 RECEIVE +2024-07-30 12:00:00.174 0 1 288 SEND +2024-07-30 12:00:00.175 0 1 290 RECEIVE +2024-07-30 12:00:00.176 0 1 276 SEND +2024-07-30 12:00:00.177 0 1 278 RECEIVE +2024-07-30 12:00:00.178 0 1 280 SEND +2024-07-30 12:00:00.179 0 1 282 RECEIVE +2024-07-30 12:00:00.180 0 1 284 SEND +2024-07-30 12:00:00.181 0 1 286 RECEIVE +2024-07-30 12:00:00.182 0 1 288 SEND +2024-07-30 12:00:00.183 0 1 290 RECEIVE +2024-07-30 12:00:00.184 0 1 292 SEND +2024-07-30 12:00:00.185 0 1 294 RECEIVE +2024-07-30 12:00:00.186 0 1 296 SEND +2024-07-30 12:00:00.187 0 1 298 RECEIVE +2024-07-30 12:00:00.188 0 1 300 SEND +2024-07-30 12:00:00.189 0 1 302 RECEIVE +2024-07-30 12:00:00.190 0 1 304 SEND +2024-07-30 12:00:00.191 0 1 306 RECEIVE +2024-07-30 12:00:00.192 0 1 292 SEND +2024-07-30 12:00:00.193 0 1 294 RECEIVE +2024-07-30 12:00:00.194 0 1 296 SEND +2024-07-30 12:00:00.195 0 1 298 RECEIVE +2024-07-30 12:00:00.196 0 1 300 SEND +2024-07-30 12:00:00.197 0 1 302 RECEIVE +2024-07-30 12:00:00.198 0 1 304 SEND +2024-07-30 12:00:00.199 0 1 306 RECEIVE +2024-07-30 12:00:00.200 0 1 308 SEND +2024-07-30 12:00:00.201 0 1 310 RECEIVE +2024-07-30 12:00:00.202 0 1 312 SEND +2024-07-30 12:00:00.203 0 1 314 RECEIVE +2024-07-30 12:00:00.204 0 1 316 SEND +2024-07-30 12:00:00.205 0 1 318 RECEIVE +2024-07-30 12:00:00.206 0 1 320 SEND +2024-07-30 12:00:00.207 0 1 322 RECEIVE +2024-07-30 12:00:00.208 0 1 308 SEND +2024-07-30 12:00:00.209 0 1 310 RECEIVE +2024-07-30 12:00:00.210 0 1 312 SEND +2024-07-30 12:00:00.211 0 1 314 RECEIVE +2024-07-30 12:00:00.212 0 1 316 SEND +2024-07-30 12:00:00.213 0 1 318 RECEIVE +2024-07-30 12:00:00.214 0 1 320 SEND +2024-07-30 12:00:00.215 0 1 322 RECEIVE +2024-07-30 12:00:00.216 0 1 324 SEND +2024-07-30 12:00:00.217 0 1 326 RECEIVE +2024-07-30 12:00:00.218 0 1 328 SEND +2024-07-30 12:00:00.219 0 1 330 RECEIVE +2024-07-30 12:00:00.220 0 1 332 SEND +2024-07-30 12:00:00.221 0 1 334 RECEIVE +2024-07-30 12:00:00.222 0 1 336 SEND +2024-07-30 12:00:00.223 0 1 338 RECEIVE +2024-07-30 12:00:00.224 0 1 324 SEND +2024-07-30 12:00:00.225 0 1 326 RECEIVE +2024-07-30 12:00:00.226 0 1 328 SEND +2024-07-30 12:00:00.227 0 1 330 RECEIVE +2024-07-30 12:00:00.228 0 1 332 SEND +2024-07-30 12:00:00.229 0 1 334 RECEIVE +2024-07-30 12:00:00.230 0 1 336 SEND +2024-07-30 12:00:00.231 0 1 338 RECEIVE +2024-07-30 12:00:00.232 0 1 340 SEND +2024-07-30 12:00:00.233 0 1 342 RECEIVE +2024-07-30 12:00:00.234 0 1 344 SEND +2024-07-30 12:00:00.235 0 1 346 RECEIVE +2024-07-30 12:00:00.236 0 1 348 SEND +2024-07-30 12:00:00.237 0 1 350 RECEIVE +2024-07-30 12:00:00.238 0 1 352 SEND +2024-07-30 12:00:00.239 0 1 354 RECEIVE +2024-07-30 12:00:00.240 0 1 340 SEND +2024-07-30 12:00:00.241 0 1 342 RECEIVE +2024-07-30 12:00:00.242 0 1 344 SEND +2024-07-30 12:00:00.243 0 1 346 RECEIVE +2024-07-30 12:00:00.244 0 1 348 SEND +2024-07-30 12:00:00.245 0 1 350 RECEIVE +2024-07-30 12:00:00.246 0 1 352 SEND +2024-07-30 12:00:00.247 0 1 354 RECEIVE +2024-07-30 12:00:00.248 0 1 356 SEND +2024-07-30 12:00:00.249 0 1 358 RECEIVE +2024-07-30 12:00:00.250 0 1 360 SEND +2024-07-30 12:00:00.251 0 1 362 RECEIVE +2024-07-30 12:00:00.252 0 1 364 SEND +2024-07-30 12:00:00.253 0 1 366 RECEIVE +2024-07-30 12:00:00.254 0 1 368 SEND +2024-07-30 12:00:00.255 0 1 370 RECEIVE +2024-07-30 12:00:00.256 0 1 356 SEND +2024-07-30 12:00:00.257 0 1 358 RECEIVE +2024-07-30 12:00:00.258 0 1 360 SEND +2024-07-30 12:00:00.259 0 1 362 RECEIVE +2024-07-30 12:00:00.260 0 1 364 SEND +2024-07-30 12:00:00.261 0 1 366 RECEIVE +2024-07-30 12:00:00.262 0 1 368 SEND +2024-07-30 12:00:00.263 0 1 370 RECEIVE +2024-07-30 12:00:00.264 0 1 372 SEND +2024-07-30 12:00:00.265 0 1 374 RECEIVE +2024-07-30 12:00:00.266 0 1 376 SEND +2024-07-30 12:00:00.267 0 1 378 RECEIVE +2024-07-30 12:00:00.268 0 1 380 SEND +2024-07-30 12:00:00.269 0 1 382 RECEIVE +2024-07-30 12:00:00.270 0 1 384 SEND +2024-07-30 12:00:00.271 0 1 386 RECEIVE +2024-07-30 12:00:00.272 0 1 372 SEND +2024-07-30 12:00:00.273 0 1 374 RECEIVE +2024-07-30 12:00:00.274 0 1 376 SEND +2024-07-30 12:00:00.275 0 1 378 RECEIVE +2024-07-30 12:00:00.276 0 1 380 SEND +2024-07-30 12:00:00.277 0 1 382 RECEIVE +2024-07-30 12:00:00.278 0 1 384 SEND +2024-07-30 12:00:00.279 0 1 386 RECEIVE +2024-07-30 12:00:00.280 0 1 388 SEND +2024-07-30 12:00:00.281 0 1 390 RECEIVE +2024-07-30 12:00:00.282 0 1 392 SEND +2024-07-30 12:00:00.283 0 1 394 RECEIVE +2024-07-30 12:00:00.284 0 1 396 SEND +2024-07-30 12:00:00.285 0 1 398 RECEIVE +2024-07-30 12:00:00.286 0 1 400 SEND +2024-07-30 12:00:00.287 0 1 402 RECEIVE +2024-07-30 12:00:00.288 0 1 388 SEND +2024-07-30 12:00:00.289 0 1 390 RECEIVE +2024-07-30 12:00:00.290 0 1 392 SEND +2024-07-30 12:00:00.291 0 1 394 RECEIVE +2024-07-30 12:00:00.292 0 1 396 SEND +2024-07-30 12:00:00.293 0 1 398 RECEIVE +2024-07-30 12:00:00.294 0 1 400 SEND +2024-07-30 12:00:00.295 0 1 402 RECEIVE +2024-07-30 12:00:00.296 0 1 404 SEND +2024-07-30 12:00:00.297 0 1 406 RECEIVE +2024-07-30 12:00:00.298 0 1 408 SEND +2024-07-30 12:00:00.299 0 1 410 RECEIVE +2024-07-30 12:00:00.300 0 1 412 SEND +2024-07-30 12:00:00.301 0 1 414 RECEIVE +2024-07-30 12:00:00.302 0 1 416 SEND +2024-07-30 12:00:00.303 0 1 418 RECEIVE +2024-07-30 12:00:00.304 0 1 404 SEND +2024-07-30 12:00:00.305 0 1 406 RECEIVE +2024-07-30 12:00:00.306 0 1 408 SEND +2024-07-30 12:00:00.307 0 1 410 RECEIVE +2024-07-30 12:00:00.308 0 1 412 SEND +2024-07-30 12:00:00.309 0 1 414 RECEIVE +2024-07-30 12:00:00.310 0 1 416 SEND +2024-07-30 12:00:00.311 0 1 418 RECEIVE +2024-07-30 12:00:00.312 0 1 420 SEND +2024-07-30 12:00:00.313 0 1 422 RECEIVE +2024-07-30 12:00:00.314 0 1 424 SEND +2024-07-30 12:00:00.315 0 1 426 RECEIVE +2024-07-30 12:00:00.316 0 1 428 SEND +2024-07-30 12:00:00.317 0 1 430 RECEIVE +2024-07-30 12:00:00.318 0 1 432 SEND +2024-07-30 12:00:00.319 0 1 434 RECEIVE +2024-07-30 12:00:00.320 0 1 420 SEND +2024-07-30 12:00:00.321 0 1 422 RECEIVE +2024-07-30 12:00:00.322 0 1 424 SEND +2024-07-30 12:00:00.323 0 1 426 RECEIVE +2024-07-30 12:00:00.324 0 1 428 SEND +2024-07-30 12:00:00.325 0 1 430 RECEIVE +2024-07-30 12:00:00.326 0 1 432 SEND +2024-07-30 12:00:00.327 0 1 434 RECEIVE +2024-07-30 12:00:00.328 0 1 436 SEND +2024-07-30 12:00:00.329 0 1 438 RECEIVE +2024-07-30 12:00:00.330 0 1 440 SEND +2024-07-30 12:00:00.331 0 1 442 RECEIVE +2024-07-30 12:00:00.332 0 1 444 SEND +2024-07-30 12:00:00.333 0 1 446 RECEIVE +2024-07-30 12:00:00.334 0 1 448 SEND +2024-07-30 12:00:00.335 0 1 450 RECEIVE +2024-07-30 12:00:00.336 0 1 436 SEND +2024-07-30 12:00:00.337 0 1 438 RECEIVE +2024-07-30 12:00:00.338 0 1 440 SEND +2024-07-30 12:00:00.339 0 1 442 RECEIVE +2024-07-30 12:00:00.340 0 1 444 SEND +2024-07-30 12:00:00.341 0 1 446 RECEIVE +2024-07-30 12:00:00.342 0 1 448 SEND +2024-07-30 12:00:00.343 0 1 450 RECEIVE +2024-07-30 12:00:00.344 0 1 452 SEND +2024-07-30 12:00:00.345 0 1 454 RECEIVE +2024-07-30 12:00:00.346 0 1 456 SEND +2024-07-30 12:00:00.347 0 1 458 RECEIVE +2024-07-30 12:00:00.348 0 1 460 SEND +2024-07-30 12:00:00.349 0 1 462 RECEIVE +2024-07-30 12:00:00.350 0 1 464 SEND +2024-07-30 12:00:00.351 0 1 466 RECEIVE +2024-07-30 12:00:00.352 0 1 452 SEND +2024-07-30 12:00:00.353 0 1 454 RECEIVE +2024-07-30 12:00:00.354 0 1 456 SEND +2024-07-30 12:00:00.355 0 1 458 RECEIVE +2024-07-30 12:00:00.356 0 1 460 SEND +2024-07-30 12:00:00.357 0 1 462 RECEIVE +2024-07-30 12:00:00.358 0 1 464 SEND +2024-07-30 12:00:00.359 0 1 466 RECEIVE +2024-07-30 12:00:00.360 0 1 468 SEND +2024-07-30 12:00:00.361 0 1 470 RECEIVE +2024-07-30 12:00:00.362 0 1 472 SEND +2024-07-30 12:00:00.363 0 1 474 RECEIVE +2024-07-30 12:00:00.364 0 1 476 SEND +2024-07-30 12:00:00.365 0 1 478 RECEIVE +2024-07-30 12:00:00.366 0 1 480 SEND +2024-07-30 12:00:00.367 0 1 482 RECEIVE +2024-07-30 12:00:00.368 0 1 468 SEND +2024-07-30 12:00:00.369 0 1 470 RECEIVE +2024-07-30 12:00:00.370 0 1 472 SEND +2024-07-30 12:00:00.371 0 1 474 RECEIVE +2024-07-30 12:00:00.372 0 1 476 SEND +2024-07-30 12:00:00.373 0 1 478 RECEIVE +2024-07-30 12:00:00.374 0 1 480 SEND +2024-07-30 12:00:00.375 0 1 482 RECEIVE +2024-07-30 12:00:00.376 0 1 484 SEND +2024-07-30 12:00:00.377 0 1 486 RECEIVE +2024-07-30 12:00:00.378 0 1 488 SEND +2024-07-30 12:00:00.379 0 1 490 RECEIVE +2024-07-30 12:00:00.380 0 1 492 SEND +2024-07-30 12:00:00.381 0 1 494 RECEIVE +2024-07-30 12:00:00.382 0 1 496 SEND +2024-07-30 12:00:00.383 0 1 498 RECEIVE +2024-07-30 12:00:00.384 0 1 484 SEND +2024-07-30 12:00:00.385 0 1 486 RECEIVE +2024-07-30 12:00:00.386 0 1 488 SEND +2024-07-30 12:00:00.387 0 1 490 RECEIVE +2024-07-30 12:00:00.388 0 1 492 SEND +2024-07-30 12:00:00.389 0 1 494 RECEIVE +2024-07-30 12:00:00.390 0 1 496 SEND +2024-07-30 12:00:00.391 0 1 498 RECEIVE +2024-07-30 12:00:00.392 0 1 500 SEND +2024-07-30 12:00:00.393 0 1 502 RECEIVE +2024-07-30 12:00:00.394 0 1 504 SEND +2024-07-30 12:00:00.395 0 1 506 RECEIVE +2024-07-30 12:00:00.396 0 1 508 SEND +2024-07-30 12:00:00.397 0 1 510 RECEIVE +2024-07-30 12:00:00.398 0 1 512 SEND +2024-07-30 12:00:00.399 0 1 514 RECEIVE +2024-07-30 12:00:00.400 0 1 500 SEND +2024-07-30 12:00:00.401 0 1 502 RECEIVE +2024-07-30 12:00:00.402 0 1 504 SEND +2024-07-30 12:00:00.403 0 1 506 RECEIVE +2024-07-30 12:00:00.404 0 1 508 SEND +2024-07-30 12:00:00.405 0 1 510 RECEIVE +2024-07-30 12:00:00.406 0 1 512 SEND +2024-07-30 12:00:00.407 0 1 514 RECEIVE +2024-07-30 12:00:00.408 0 1 516 SEND +2024-07-30 12:00:00.409 0 1 518 RECEIVE +2024-07-30 12:00:00.410 0 1 520 SEND +2024-07-30 12:00:00.411 0 1 522 RECEIVE +2024-07-30 12:00:00.412 0 1 524 SEND +2024-07-30 12:00:00.413 0 1 526 RECEIVE +2024-07-30 12:00:00.414 0 1 528 SEND +2024-07-30 12:00:00.415 0 1 530 RECEIVE +2024-07-30 12:00:00.416 0 1 516 SEND +2024-07-30 12:00:00.417 0 1 518 RECEIVE +2024-07-30 12:00:00.418 0 1 520 SEND +2024-07-30 12:00:00.419 0 1 522 RECEIVE +2024-07-30 12:00:00.420 0 1 524 SEND +2024-07-30 12:00:00.421 0 1 526 RECEIVE +2024-07-30 12:00:00.422 0 1 528 SEND +2024-07-30 12:00:00.423 0 1 530 RECEIVE +2024-07-30 12:00:00.424 0 1 532 SEND +2024-07-30 12:00:00.425 0 1 534 RECEIVE +2024-07-30 12:00:00.426 0 1 536 SEND +2024-07-30 12:00:00.427 0 1 538 RECEIVE +2024-07-30 12:00:00.428 0 1 540 SEND +2024-07-30 12:00:00.429 0 1 542 RECEIVE +2024-07-30 12:00:00.430 0 1 544 SEND +2024-07-30 12:00:00.431 0 1 546 RECEIVE +2024-07-30 12:00:00.432 0 1 532 SEND +2024-07-30 12:00:00.433 0 1 534 RECEIVE +2024-07-30 12:00:00.434 0 1 536 SEND +2024-07-30 12:00:00.435 0 1 538 RECEIVE +2024-07-30 12:00:00.436 0 1 540 SEND +2024-07-30 12:00:00.437 0 1 542 RECEIVE +2024-07-30 12:00:00.438 0 1 544 SEND +2024-07-30 12:00:00.439 0 1 546 RECEIVE +2024-07-30 12:00:00.440 0 1 548 SEND +2024-07-30 12:00:00.441 0 1 550 RECEIVE +2024-07-30 12:00:00.442 0 1 552 SEND +2024-07-30 12:00:00.443 0 1 554 RECEIVE +2024-07-30 12:00:00.444 0 1 556 SEND +2024-07-30 12:00:00.445 0 1 558 RECEIVE +2024-07-30 12:00:00.446 0 1 560 SEND +2024-07-30 12:00:00.447 0 1 562 RECEIVE +2024-07-30 12:00:00.448 0 1 548 SEND +2024-07-30 12:00:00.449 0 1 550 RECEIVE +2024-07-30 12:00:00.450 0 1 552 SEND +2024-07-30 12:00:00.451 0 1 554 RECEIVE +2024-07-30 12:00:00.452 0 1 556 SEND +2024-07-30 12:00:00.453 0 1 558 RECEIVE +2024-07-30 12:00:00.454 0 1 560 SEND +2024-07-30 12:00:00.455 0 1 562 RECEIVE +2024-07-30 12:00:00.456 0 1 564 SEND +2024-07-30 12:00:00.457 0 1 566 RECEIVE +2024-07-30 12:00:00.458 0 1 568 SEND +2024-07-30 12:00:00.459 0 1 570 RECEIVE +2024-07-30 12:00:00.460 0 1 572 SEND +2024-07-30 12:00:00.461 0 1 574 RECEIVE +2024-07-30 12:00:00.462 0 1 576 SEND +2024-07-30 12:00:00.463 0 1 578 RECEIVE +2024-07-30 12:00:00.464 0 1 564 SEND +2024-07-30 12:00:00.465 0 1 566 RECEIVE +2024-07-30 12:00:00.466 0 1 568 SEND +2024-07-30 12:00:00.467 0 1 570 RECEIVE +2024-07-30 12:00:00.468 0 1 572 SEND +2024-07-30 12:00:00.469 0 1 574 RECEIVE +2024-07-30 12:00:00.470 0 1 576 SEND +2024-07-30 12:00:00.471 0 1 578 RECEIVE +2024-07-30 12:00:00.472 0 1 580 SEND +2024-07-30 12:00:00.473 0 1 582 RECEIVE +2024-07-30 12:00:00.474 0 1 584 SEND +2024-07-30 12:00:00.475 0 1 586 RECEIVE +2024-07-30 12:00:00.476 0 1 588 SEND +2024-07-30 12:00:00.477 0 1 590 RECEIVE +2024-07-30 12:00:00.478 0 1 592 SEND +2024-07-30 12:00:00.479 0 1 594 RECEIVE +2024-07-30 12:00:00.480 0 1 580 SEND +2024-07-30 12:00:00.481 0 1 582 RECEIVE +2024-07-30 12:00:00.482 0 1 584 SEND +2024-07-30 12:00:00.483 0 1 586 RECEIVE +2024-07-30 12:00:00.484 0 1 588 SEND +2024-07-30 12:00:00.485 0 1 590 RECEIVE +2024-07-30 12:00:00.486 0 1 592 SEND +2024-07-30 12:00:00.487 0 1 594 RECEIVE +2024-07-30 12:00:00.488 0 1 596 SEND +2024-07-30 12:00:00.489 0 1 598 RECEIVE +2024-07-30 12:00:00.490 0 1 600 SEND +2024-07-30 12:00:00.491 0 1 602 RECEIVE +2024-07-30 12:00:00.492 0 1 604 SEND +2024-07-30 12:00:00.493 0 1 606 RECEIVE +2024-07-30 12:00:00.494 0 1 608 SEND +2024-07-30 12:00:00.495 0 1 610 RECEIVE +2024-07-30 12:00:00.496 0 1 596 SEND +2024-07-30 12:00:00.497 0 1 598 RECEIVE +2024-07-30 12:00:00.498 0 1 600 SEND +2024-07-30 12:00:00.499 0 1 602 RECEIVE +2024-07-30 12:00:00.500 0 1 604 SEND +2024-07-30 12:00:00.501 0 1 606 RECEIVE +2024-07-30 12:00:00.502 0 1 608 SEND +2024-07-30 12:00:00.503 0 1 610 RECEIVE +2024-07-30 12:00:00.504 0 1 612 SEND +2024-07-30 12:00:00.505 0 1 614 RECEIVE +2024-07-30 12:00:00.506 0 1 616 SEND +2024-07-30 12:00:00.507 0 1 618 RECEIVE +2024-07-30 12:00:00.508 0 1 620 SEND +2024-07-30 12:00:00.509 0 1 622 RECEIVE +2024-07-30 12:00:00.510 0 1 624 SEND +2024-07-30 12:00:00.511 0 1 626 RECEIVE +2024-07-30 12:00:00.512 0 1 612 SEND +2024-07-30 12:00:00.513 0 1 614 RECEIVE +2024-07-30 12:00:00.514 0 1 616 SEND +2024-07-30 12:00:00.515 0 1 618 RECEIVE +2024-07-30 12:00:00.516 0 1 620 SEND +2024-07-30 12:00:00.517 0 1 622 RECEIVE +2024-07-30 12:00:00.518 0 1 624 SEND +2024-07-30 12:00:00.519 0 1 626 RECEIVE +2024-07-30 12:00:00.520 0 1 628 SEND +2024-07-30 12:00:00.521 0 1 630 RECEIVE +2024-07-30 12:00:00.522 0 1 632 SEND +2024-07-30 12:00:00.523 0 1 634 RECEIVE +2024-07-30 12:00:00.524 0 1 636 SEND +2024-07-30 12:00:00.525 0 1 638 RECEIVE +2024-07-30 12:00:00.526 0 1 640 SEND +2024-07-30 12:00:00.527 0 1 642 RECEIVE +2024-07-30 12:00:00.528 0 1 628 SEND +2024-07-30 12:00:00.529 0 1 630 RECEIVE +2024-07-30 12:00:00.530 0 1 632 SEND +2024-07-30 12:00:00.531 0 1 634 RECEIVE +2024-07-30 12:00:00.532 0 1 636 SEND +2024-07-30 12:00:00.533 0 1 638 RECEIVE +2024-07-30 12:00:00.534 0 1 640 SEND +2024-07-30 12:00:00.535 0 1 642 RECEIVE +2024-07-30 12:00:00.536 0 1 644 SEND +2024-07-30 12:00:00.537 0 1 646 RECEIVE +2024-07-30 12:00:00.538 0 1 648 SEND +2024-07-30 12:00:00.539 0 1 650 RECEIVE +2024-07-30 12:00:00.540 0 1 652 SEND +2024-07-30 12:00:00.541 0 1 654 RECEIVE +2024-07-30 12:00:00.542 0 1 656 SEND +2024-07-30 12:00:00.543 0 1 658 RECEIVE +2024-07-30 12:00:00.544 0 1 644 SEND +2024-07-30 12:00:00.545 0 1 646 RECEIVE +2024-07-30 12:00:00.546 0 1 648 SEND +2024-07-30 12:00:00.547 0 1 650 RECEIVE +2024-07-30 12:00:00.548 0 1 652 SEND +2024-07-30 12:00:00.549 0 1 654 RECEIVE +2024-07-30 12:00:00.550 0 1 656 SEND +2024-07-30 12:00:00.551 0 1 658 RECEIVE +2024-07-30 12:00:00.552 0 1 660 SEND +2024-07-30 12:00:00.553 0 1 662 RECEIVE +2024-07-30 12:00:00.554 0 1 664 SEND +2024-07-30 12:00:00.555 0 1 666 RECEIVE +2024-07-30 12:00:00.556 0 1 668 SEND +2024-07-30 12:00:00.557 0 1 670 RECEIVE +2024-07-30 12:00:00.558 0 1 672 SEND +2024-07-30 12:00:00.559 0 1 674 RECEIVE +2024-07-30 12:00:00.560 0 1 660 SEND +2024-07-30 12:00:00.561 0 1 662 RECEIVE +2024-07-30 12:00:00.562 0 1 664 SEND +2024-07-30 12:00:00.563 0 1 666 RECEIVE +2024-07-30 12:00:00.564 0 1 668 SEND +2024-07-30 12:00:00.565 0 1 670 RECEIVE +2024-07-30 12:00:00.566 0 1 672 SEND +2024-07-30 12:00:00.567 0 1 674 RECEIVE +2024-07-30 12:00:00.568 0 1 676 SEND +2024-07-30 12:00:00.569 0 1 678 RECEIVE +2024-07-30 12:00:00.570 0 1 680 SEND +2024-07-30 12:00:00.571 0 1 682 RECEIVE +2024-07-30 12:00:00.572 0 1 684 SEND +2024-07-30 12:00:00.573 0 1 686 RECEIVE +2024-07-30 12:00:00.574 0 1 688 SEND +2024-07-30 12:00:00.575 0 1 690 RECEIVE +2024-07-30 12:00:00.576 0 1 676 SEND +2024-07-30 12:00:00.577 0 1 678 RECEIVE +2024-07-30 12:00:00.578 0 1 680 SEND +2024-07-30 12:00:00.579 0 1 682 RECEIVE +2024-07-30 12:00:00.580 0 1 684 SEND +2024-07-30 12:00:00.581 0 1 686 RECEIVE +2024-07-30 12:00:00.582 0 1 688 SEND +2024-07-30 12:00:00.583 0 1 690 RECEIVE +2024-07-30 12:00:00.584 0 1 692 SEND +2024-07-30 12:00:00.585 0 1 694 RECEIVE +2024-07-30 12:00:00.586 0 1 696 SEND +2024-07-30 12:00:00.587 0 1 698 RECEIVE +2024-07-30 12:00:00.588 0 1 700 SEND +2024-07-30 12:00:00.589 0 1 702 RECEIVE +2024-07-30 12:00:00.590 0 1 704 SEND +2024-07-30 12:00:00.591 0 1 706 RECEIVE +2024-07-30 12:00:00.592 0 1 692 SEND +2024-07-30 12:00:00.593 0 1 694 RECEIVE +2024-07-30 12:00:00.594 0 1 696 SEND +2024-07-30 12:00:00.595 0 1 698 RECEIVE +2024-07-30 12:00:00.596 0 1 700 SEND +2024-07-30 12:00:00.597 0 1 702 RECEIVE +2024-07-30 12:00:00.598 0 1 704 SEND +2024-07-30 12:00:00.599 0 1 706 RECEIVE +2024-07-30 12:00:00.600 0 1 708 SEND +2024-07-30 12:00:00.601 0 1 710 RECEIVE +2024-07-30 12:00:00.602 0 1 712 SEND +2024-07-30 12:00:00.603 0 1 714 RECEIVE +2024-07-30 12:00:00.604 0 1 716 SEND +2024-07-30 12:00:00.605 0 1 718 RECEIVE +2024-07-30 12:00:00.606 0 1 720 SEND +2024-07-30 12:00:00.607 0 1 722 RECEIVE +2024-07-30 12:00:00.608 0 1 708 SEND +2024-07-30 12:00:00.609 0 1 710 RECEIVE +2024-07-30 12:00:00.610 0 1 712 SEND +2024-07-30 12:00:00.611 0 1 714 RECEIVE +2024-07-30 12:00:00.612 0 1 716 SEND +2024-07-30 12:00:00.613 0 1 718 RECEIVE +2024-07-30 12:00:00.614 0 1 720 SEND +2024-07-30 12:00:00.615 0 1 722 RECEIVE +2024-07-30 12:00:00.616 0 1 724 SEND +2024-07-30 12:00:00.617 0 1 726 RECEIVE +2024-07-30 12:00:00.618 0 1 728 SEND +2024-07-30 12:00:00.619 0 1 730 RECEIVE +2024-07-30 12:00:00.620 0 1 732 SEND +2024-07-30 12:00:00.621 0 1 734 RECEIVE +2024-07-30 12:00:00.622 0 1 736 SEND +2024-07-30 12:00:00.623 0 1 738 RECEIVE +2024-07-30 12:00:00.624 0 1 724 SEND +2024-07-30 12:00:00.625 0 1 726 RECEIVE +2024-07-30 12:00:00.626 0 1 728 SEND +2024-07-30 12:00:00.627 0 1 730 RECEIVE +2024-07-30 12:00:00.628 0 1 732 SEND +2024-07-30 12:00:00.629 0 1 734 RECEIVE +2024-07-30 12:00:00.630 0 1 736 SEND +2024-07-30 12:00:00.631 0 1 738 RECEIVE +2024-07-30 12:00:00.632 0 1 740 SEND +2024-07-30 12:00:00.633 0 1 742 RECEIVE +2024-07-30 12:00:00.634 0 1 744 SEND +2024-07-30 12:00:00.635 0 1 746 RECEIVE +2024-07-30 12:00:00.636 0 1 748 SEND +2024-07-30 12:00:00.637 0 1 750 RECEIVE +2024-07-30 12:00:00.638 0 1 752 SEND +2024-07-30 12:00:00.639 0 1 754 RECEIVE +2024-07-30 12:00:00.640 0 1 740 SEND +2024-07-30 12:00:00.641 0 1 742 RECEIVE +2024-07-30 12:00:00.642 0 1 744 SEND +2024-07-30 12:00:00.643 0 1 746 RECEIVE +2024-07-30 12:00:00.644 0 1 748 SEND +2024-07-30 12:00:00.645 0 1 750 RECEIVE +2024-07-30 12:00:00.646 0 1 752 SEND +2024-07-30 12:00:00.647 0 1 754 RECEIVE +2024-07-30 12:00:00.648 0 1 756 SEND +2024-07-30 12:00:00.649 0 1 758 RECEIVE +2024-07-30 12:00:00.650 0 1 760 SEND +2024-07-30 12:00:00.651 0 1 762 RECEIVE +2024-07-30 12:00:00.652 0 1 764 SEND +2024-07-30 12:00:00.653 0 1 766 RECEIVE +2024-07-30 12:00:00.654 0 1 768 SEND +2024-07-30 12:00:00.655 0 1 770 RECEIVE +2024-07-30 12:00:00.656 0 1 756 SEND +2024-07-30 12:00:00.657 0 1 758 RECEIVE +2024-07-30 12:00:00.658 0 1 760 SEND +2024-07-30 12:00:00.659 0 1 762 RECEIVE +2024-07-30 12:00:00.660 0 1 764 SEND +2024-07-30 12:00:00.661 0 1 766 RECEIVE +2024-07-30 12:00:00.662 0 1 768 SEND +2024-07-30 12:00:00.663 0 1 770 RECEIVE +2024-07-30 12:00:00.664 0 1 772 SEND +2024-07-30 12:00:00.665 0 1 774 RECEIVE +2024-07-30 12:00:00.666 0 1 776 SEND +2024-07-30 12:00:00.667 0 1 778 RECEIVE +2024-07-30 12:00:00.668 0 1 780 SEND +2024-07-30 12:00:00.669 0 1 782 RECEIVE +2024-07-30 12:00:00.670 0 1 784 SEND +2024-07-30 12:00:00.671 0 1 786 RECEIVE +2024-07-30 12:00:00.672 0 1 772 SEND +2024-07-30 12:00:00.673 0 1 774 RECEIVE +2024-07-30 12:00:00.674 0 1 776 SEND +2024-07-30 12:00:00.675 0 1 778 RECEIVE +2024-07-30 12:00:00.676 0 1 780 SEND +2024-07-30 12:00:00.677 0 1 782 RECEIVE +2024-07-30 12:00:00.678 0 1 784 SEND +2024-07-30 12:00:00.679 0 1 786 RECEIVE +2024-07-30 12:00:00.680 0 1 788 SEND +2024-07-30 12:00:00.681 0 1 790 RECEIVE +2024-07-30 12:00:00.682 0 1 792 SEND +2024-07-30 12:00:00.683 0 1 794 RECEIVE +2024-07-30 12:00:00.684 0 1 796 SEND +2024-07-30 12:00:00.685 0 1 798 RECEIVE +2024-07-30 12:00:00.686 0 1 800 SEND +2024-07-30 12:00:00.687 0 1 802 RECEIVE +2024-07-30 12:00:00.688 0 1 788 SEND +2024-07-30 12:00:00.689 0 1 790 RECEIVE +2024-07-30 12:00:00.690 0 1 792 SEND +2024-07-30 12:00:00.691 0 1 794 RECEIVE +2024-07-30 12:00:00.692 0 1 796 SEND +2024-07-30 12:00:00.693 0 1 798 RECEIVE +2024-07-30 12:00:00.694 0 1 800 SEND +2024-07-30 12:00:00.695 0 1 802 RECEIVE +2024-07-30 12:00:00.696 0 1 804 SEND +2024-07-30 12:00:00.697 0 1 806 RECEIVE +2024-07-30 12:00:00.698 0 1 808 SEND +2024-07-30 12:00:00.699 0 1 810 RECEIVE +2024-07-30 12:00:00.700 0 1 812 SEND +2024-07-30 12:00:00.701 0 1 814 RECEIVE +2024-07-30 12:00:00.702 0 1 816 SEND +2024-07-30 12:00:00.703 0 1 818 RECEIVE +2024-07-30 12:00:00.704 0 1 804 SEND +2024-07-30 12:00:00.705 0 1 806 RECEIVE +2024-07-30 12:00:00.706 0 1 808 SEND +2024-07-30 12:00:00.707 0 1 810 RECEIVE +2024-07-30 12:00:00.708 0 1 812 SEND +2024-07-30 12:00:00.709 0 1 814 RECEIVE +2024-07-30 12:00:00.710 0 1 816 SEND +2024-07-30 12:00:00.711 0 1 818 RECEIVE +2024-07-30 12:00:00.712 0 1 820 SEND +2024-07-30 12:00:00.713 0 1 822 RECEIVE +2024-07-30 12:00:00.714 0 1 824 SEND +2024-07-30 12:00:00.715 0 1 826 RECEIVE +2024-07-30 12:00:00.716 0 1 828 SEND +2024-07-30 12:00:00.717 0 1 830 RECEIVE +2024-07-30 12:00:00.718 0 1 832 SEND +2024-07-30 12:00:00.719 0 1 834 RECEIVE +2024-07-30 12:00:00.720 0 1 820 SEND +2024-07-30 12:00:00.721 0 1 822 RECEIVE +2024-07-30 12:00:00.722 0 1 824 SEND +2024-07-30 12:00:00.723 0 1 826 RECEIVE +2024-07-30 12:00:00.724 0 1 828 SEND +2024-07-30 12:00:00.725 0 1 830 RECEIVE +2024-07-30 12:00:00.726 0 1 832 SEND +2024-07-30 12:00:00.727 0 1 834 RECEIVE +2024-07-30 12:00:00.728 0 1 836 SEND +2024-07-30 12:00:00.729 0 1 838 RECEIVE +2024-07-30 12:00:00.730 0 1 840 SEND +2024-07-30 12:00:00.731 0 1 842 RECEIVE +2024-07-30 12:00:00.732 0 1 844 SEND +2024-07-30 12:00:00.733 0 1 846 RECEIVE +2024-07-30 12:00:00.734 0 1 848 SEND +2024-07-30 12:00:00.735 0 1 850 RECEIVE +2024-07-30 12:00:00.736 0 1 836 SEND +2024-07-30 12:00:00.737 0 1 838 RECEIVE +2024-07-30 12:00:00.738 0 1 840 SEND +2024-07-30 12:00:00.739 0 1 842 RECEIVE +2024-07-30 12:00:00.740 0 1 844 SEND +2024-07-30 12:00:00.741 0 1 846 RECEIVE +2024-07-30 12:00:00.742 0 1 848 SEND +2024-07-30 12:00:00.743 0 1 850 RECEIVE +2024-07-30 12:00:00.744 0 1 852 SEND +2024-07-30 12:00:00.745 0 1 854 RECEIVE +2024-07-30 12:00:00.746 0 1 856 SEND +2024-07-30 12:00:00.747 0 1 858 RECEIVE +2024-07-30 12:00:00.748 0 1 860 SEND +2024-07-30 12:00:00.749 0 1 862 RECEIVE +2024-07-30 12:00:00.750 0 1 864 SEND +2024-07-30 12:00:00.751 0 1 866 RECEIVE +2024-07-30 12:00:00.752 0 1 852 SEND +2024-07-30 12:00:00.753 0 1 854 RECEIVE +2024-07-30 12:00:00.754 0 1 856 SEND +2024-07-30 12:00:00.755 0 1 858 RECEIVE +2024-07-30 12:00:00.756 0 1 860 SEND +2024-07-30 12:00:00.757 0 1 862 RECEIVE +2024-07-30 12:00:00.758 0 1 864 SEND +2024-07-30 12:00:00.759 0 1 866 RECEIVE +2024-07-30 12:00:00.760 0 1 868 SEND +2024-07-30 12:00:00.761 0 1 870 RECEIVE +2024-07-30 12:00:00.762 0 1 872 SEND +2024-07-30 12:00:00.763 0 1 874 RECEIVE +2024-07-30 12:00:00.764 0 1 876 SEND +2024-07-30 12:00:00.765 0 1 878 RECEIVE +2024-07-30 12:00:00.766 0 1 880 SEND +2024-07-30 12:00:00.767 0 1 882 RECEIVE +2024-07-30 12:00:00.768 0 1 868 SEND +2024-07-30 12:00:00.769 0 1 870 RECEIVE +2024-07-30 12:00:00.770 0 1 872 SEND +2024-07-30 12:00:00.771 0 1 874 RECEIVE +2024-07-30 12:00:00.772 0 1 876 SEND +2024-07-30 12:00:00.773 0 1 878 RECEIVE +2024-07-30 12:00:00.774 0 1 880 SEND +2024-07-30 12:00:00.775 0 1 882 RECEIVE +2024-07-30 12:00:00.776 0 1 884 SEND +2024-07-30 12:00:00.777 0 1 886 RECEIVE +2024-07-30 12:00:00.778 0 1 888 SEND +2024-07-30 12:00:00.779 0 1 890 RECEIVE +2024-07-30 12:00:00.780 0 1 892 SEND +2024-07-30 12:00:00.781 0 1 894 RECEIVE +2024-07-30 12:00:00.782 0 1 896 SEND +2024-07-30 12:00:00.783 0 1 898 RECEIVE +2024-07-30 12:00:00.784 0 1 884 SEND +2024-07-30 12:00:00.785 0 1 886 RECEIVE +2024-07-30 12:00:00.786 0 1 888 SEND +2024-07-30 12:00:00.787 0 1 890 RECEIVE +2024-07-30 12:00:00.788 0 1 892 SEND +2024-07-30 12:00:00.789 0 1 894 RECEIVE +2024-07-30 12:00:00.790 0 1 896 SEND +2024-07-30 12:00:00.791 0 1 898 RECEIVE +2024-07-30 12:00:00.792 0 1 900 SEND +2024-07-30 12:00:00.793 0 1 902 RECEIVE +2024-07-30 12:00:00.794 0 1 904 SEND +2024-07-30 12:00:00.795 0 1 906 RECEIVE +2024-07-30 12:00:00.796 0 1 908 SEND +2024-07-30 12:00:00.797 0 1 910 RECEIVE +2024-07-30 12:00:00.798 0 1 912 SEND +2024-07-30 12:00:00.799 0 1 914 RECEIVE +2024-07-30 12:00:00.800 0 1 900 SEND +2024-07-30 12:00:00.801 0 1 902 RECEIVE +2024-07-30 12:00:00.802 0 1 904 SEND +2024-07-30 12:00:00.803 0 1 906 RECEIVE +2024-07-30 12:00:00.804 0 1 908 SEND +2024-07-30 12:00:00.805 0 1 910 RECEIVE +2024-07-30 12:00:00.806 0 1 912 SEND +2024-07-30 12:00:00.807 0 1 914 RECEIVE +2024-07-30 12:00:00.808 0 1 916 SEND +2024-07-30 12:00:00.809 0 1 918 RECEIVE +2024-07-30 12:00:00.810 0 1 920 SEND +2024-07-30 12:00:00.811 0 1 922 RECEIVE +2024-07-30 12:00:00.812 0 1 924 SEND +2024-07-30 12:00:00.813 0 1 926 RECEIVE +2024-07-30 12:00:00.814 0 1 928 SEND +2024-07-30 12:00:00.815 0 1 930 RECEIVE +2024-07-30 12:00:00.816 0 1 916 SEND +2024-07-30 12:00:00.817 0 1 918 RECEIVE +2024-07-30 12:00:00.818 0 1 920 SEND +2024-07-30 12:00:00.819 0 1 922 RECEIVE +2024-07-30 12:00:00.820 0 1 924 SEND +2024-07-30 12:00:00.821 0 1 926 RECEIVE +2024-07-30 12:00:00.822 0 1 928 SEND +2024-07-30 12:00:00.823 0 1 930 RECEIVE +2024-07-30 12:00:00.824 0 1 932 SEND +2024-07-30 12:00:00.825 0 1 934 RECEIVE +2024-07-30 12:00:00.826 0 1 936 SEND +2024-07-30 12:00:00.827 0 1 938 RECEIVE +2024-07-30 12:00:00.828 0 1 940 SEND +2024-07-30 12:00:00.829 0 1 942 RECEIVE +2024-07-30 12:00:00.830 0 1 944 SEND +2024-07-30 12:00:00.831 0 1 946 RECEIVE +2024-07-30 12:00:00.832 0 1 932 SEND +2024-07-30 12:00:00.833 0 1 934 RECEIVE +2024-07-30 12:00:00.834 0 1 936 SEND +2024-07-30 12:00:00.835 0 1 938 RECEIVE +2024-07-30 12:00:00.836 0 1 940 SEND +2024-07-30 12:00:00.837 0 1 942 RECEIVE +2024-07-30 12:00:00.838 0 1 944 SEND +2024-07-30 12:00:00.839 0 1 946 RECEIVE +2024-07-30 12:00:00.840 0 1 948 SEND +2024-07-30 12:00:00.841 0 1 950 RECEIVE +2024-07-30 12:00:00.842 0 1 952 SEND +2024-07-30 12:00:00.843 0 1 954 RECEIVE +2024-07-30 12:00:00.844 0 1 956 SEND +2024-07-30 12:00:00.845 0 1 958 RECEIVE +2024-07-30 12:00:00.846 0 1 960 SEND +2024-07-30 12:00:00.847 0 1 962 RECEIVE +2024-07-30 12:00:00.848 0 1 948 SEND +2024-07-30 12:00:00.849 0 1 950 RECEIVE +2024-07-30 12:00:00.850 0 1 952 SEND +2024-07-30 12:00:00.851 0 1 954 RECEIVE +2024-07-30 12:00:00.852 0 1 956 SEND +2024-07-30 12:00:00.853 0 1 958 RECEIVE +2024-07-30 12:00:00.854 0 1 960 SEND +2024-07-30 12:00:00.855 0 1 962 RECEIVE +2024-07-30 12:00:00.856 0 1 964 SEND +2024-07-30 12:00:00.857 0 1 966 RECEIVE +2024-07-30 12:00:00.858 0 1 968 SEND +2024-07-30 12:00:00.859 0 1 970 RECEIVE +2024-07-30 12:00:00.860 0 1 972 SEND +2024-07-30 12:00:00.861 0 1 974 RECEIVE +2024-07-30 12:00:00.862 0 1 976 SEND +2024-07-30 12:00:00.863 0 1 978 RECEIVE +2024-07-30 12:00:00.864 0 1 964 SEND +2024-07-30 12:00:00.865 0 1 966 RECEIVE +2024-07-30 12:00:00.866 0 1 968 SEND +2024-07-30 12:00:00.867 0 1 970 RECEIVE +2024-07-30 12:00:00.868 0 1 972 SEND +2024-07-30 12:00:00.869 0 1 974 RECEIVE +2024-07-30 12:00:00.870 0 1 976 SEND +2024-07-30 12:00:00.871 0 1 978 RECEIVE +2024-07-30 12:00:00.872 0 1 980 SEND +2024-07-30 12:00:00.873 0 1 982 RECEIVE +2024-07-30 12:00:00.874 0 1 984 SEND +2024-07-30 12:00:00.875 0 1 986 RECEIVE +2024-07-30 12:00:00.876 0 1 988 SEND +2024-07-30 12:00:00.877 0 1 990 RECEIVE +2024-07-30 12:00:00.878 0 1 992 SEND +2024-07-30 12:00:00.879 0 1 994 RECEIVE +2024-07-30 12:00:00.880 0 1 980 SEND +2024-07-30 12:00:00.881 0 1 982 RECEIVE +2024-07-30 12:00:00.882 0 1 984 SEND +2024-07-30 12:00:00.883 0 1 986 RECEIVE +2024-07-30 12:00:00.884 0 1 988 SEND +2024-07-30 12:00:00.885 0 1 990 RECEIVE +2024-07-30 12:00:00.886 0 1 992 SEND +2024-07-30 12:00:00.887 0 1 994 RECEIVE +2024-07-30 12:00:00.888 0 1 996 SEND +2024-07-30 12:00:00.889 0 1 998 RECEIVE +2024-07-30 12:00:00.890 0 1 1000 SEND +2024-07-30 12:00:00.891 0 1 1002 RECEIVE +2024-07-30 12:00:00.892 0 1 1004 SEND +2024-07-30 12:00:00.893 0 1 1006 RECEIVE +2024-07-30 12:00:00.894 0 1 1008 SEND +2024-07-30 12:00:00.895 0 1 1010 RECEIVE +2024-07-30 12:00:00.896 0 1 996 SEND +2024-07-30 12:00:00.897 0 1 998 RECEIVE +2024-07-30 12:00:00.898 0 1 1000 SEND +2024-07-30 12:00:00.899 0 1 1002 RECEIVE +2024-07-30 12:00:00.900 0 1 1004 SEND +2024-07-30 12:00:00.901 0 1 1006 RECEIVE +2024-07-30 12:00:00.902 0 1 1008 SEND +2024-07-30 12:00:00.903 0 1 1010 RECEIVE +2024-07-30 12:00:00.904 0 1 1012 SEND +2024-07-30 12:00:00.905 0 1 1014 RECEIVE +2024-07-30 12:00:00.906 0 1 1016 SEND +2024-07-30 12:00:00.907 0 1 1018 RECEIVE +2024-07-30 12:00:00.908 0 1 1020 SEND +2024-07-30 12:00:00.909 0 1 1022 RECEIVE +2024-07-30 12:00:00.910 0 1 1024 SEND +2024-07-30 12:00:00.911 0 1 1026 RECEIVE +2024-07-30 12:00:00.912 0 1 1012 SEND +2024-07-30 12:00:00.913 0 1 1014 RECEIVE +2024-07-30 12:00:00.914 0 1 1016 SEND +2024-07-30 12:00:00.915 0 1 1018 RECEIVE +2024-07-30 12:00:00.916 0 1 1020 SEND +2024-07-30 12:00:00.917 0 1 1022 RECEIVE +2024-07-30 12:00:00.918 0 1 1024 SEND +2024-07-30 12:00:00.919 0 1 1026 RECEIVE +2024-07-30 12:00:00.920 0 1 1028 SEND +2024-07-30 12:00:00.921 0 1 1030 RECEIVE +2024-07-30 12:00:00.922 0 1 1032 SEND +2024-07-30 12:00:00.923 0 1 1034 RECEIVE +2024-07-30 12:00:00.924 0 1 1036 SEND +2024-07-30 12:00:00.925 0 1 1038 RECEIVE +2024-07-30 12:00:00.926 0 1 1040 SEND +2024-07-30 12:00:00.927 0 1 1042 RECEIVE +2024-07-30 12:00:00.928 0 1 1028 SEND +2024-07-30 12:00:00.929 0 1 1030 RECEIVE +2024-07-30 12:00:00.930 0 1 1032 SEND +2024-07-30 12:00:00.931 0 1 1034 RECEIVE +2024-07-30 12:00:00.932 0 1 1036 SEND +2024-07-30 12:00:00.933 0 1 1038 RECEIVE +2024-07-30 12:00:00.934 0 1 1040 SEND +2024-07-30 12:00:00.935 0 1 1042 RECEIVE +2024-07-30 12:00:00.936 0 1 1044 SEND +2024-07-30 12:00:00.937 0 1 1046 RECEIVE +2024-07-30 12:00:00.938 0 1 1048 SEND +2024-07-30 12:00:00.939 0 1 1050 RECEIVE +2024-07-30 12:00:00.940 0 1 1052 SEND +2024-07-30 12:00:00.941 0 1 1054 RECEIVE +2024-07-30 12:00:00.942 0 1 1056 SEND +2024-07-30 12:00:00.943 0 1 1058 RECEIVE +2024-07-30 12:00:00.944 0 1 1044 SEND +2024-07-30 12:00:00.945 0 1 1046 RECEIVE +2024-07-30 12:00:00.946 0 1 1048 SEND +2024-07-30 12:00:00.947 0 1 1050 RECEIVE +2024-07-30 12:00:00.948 0 1 1052 SEND +2024-07-30 12:00:00.949 0 1 1054 RECEIVE +2024-07-30 12:00:00.950 0 1 1056 SEND +2024-07-30 12:00:00.951 0 1 1058 RECEIVE +2024-07-30 12:00:00.952 0 1 1060 SEND +2024-07-30 12:00:00.953 0 1 1062 RECEIVE +2024-07-30 12:00:00.954 0 1 1064 SEND +2024-07-30 12:00:00.955 0 1 1066 RECEIVE +2024-07-30 12:00:00.956 0 1 1068 SEND +2024-07-30 12:00:00.957 0 1 1070 RECEIVE +2024-07-30 12:00:00.958 0 1 1072 SEND +2024-07-30 12:00:00.959 0 1 1074 RECEIVE +2024-07-30 12:00:00.960 0 1 1060 SEND +2024-07-30 12:00:00.961 0 1 1062 RECEIVE +2024-07-30 12:00:00.962 0 1 1064 SEND +2024-07-30 12:00:00.963 0 1 1066 RECEIVE +2024-07-30 12:00:00.964 0 1 1068 SEND +2024-07-30 12:00:00.965 0 1 1070 RECEIVE +2024-07-30 12:00:00.966 0 1 1072 SEND +2024-07-30 12:00:00.967 0 1 1074 RECEIVE +2024-07-30 12:00:00.968 0 1 1076 SEND +2024-07-30 12:00:00.969 0 1 1078 RECEIVE +2024-07-30 12:00:00.970 0 1 1080 SEND +2024-07-30 12:00:00.971 0 1 1082 RECEIVE +2024-07-30 12:00:00.972 0 1 1084 SEND +2024-07-30 12:00:00.973 0 1 1086 RECEIVE +2024-07-30 12:00:00.974 0 1 1088 SEND +2024-07-30 12:00:00.975 0 1 1090 RECEIVE +2024-07-30 12:00:00.976 0 1 1076 SEND +2024-07-30 12:00:00.977 0 1 1078 RECEIVE +2024-07-30 12:00:00.978 0 1 1080 SEND +2024-07-30 12:00:00.979 0 1 1082 RECEIVE +2024-07-30 12:00:00.980 0 1 1084 SEND +2024-07-30 12:00:00.981 0 1 1086 RECEIVE +2024-07-30 12:00:00.982 0 1 1088 SEND +2024-07-30 12:00:00.983 0 1 1090 RECEIVE +2024-07-30 12:00:00.984 0 1 1092 SEND +2024-07-30 12:00:00.985 0 1 1094 RECEIVE +2024-07-30 12:00:00.986 0 1 1096 SEND +2024-07-30 12:00:00.987 0 1 1098 RECEIVE +2024-07-30 12:00:00.988 0 1 1100 SEND +2024-07-30 12:00:00.989 0 1 1102 RECEIVE +2024-07-30 12:00:00.990 0 1 1104 SEND +2024-07-30 12:00:00.991 0 1 1106 RECEIVE +2024-07-30 12:00:00.992 0 1 1092 SEND +2024-07-30 12:00:00.993 0 1 1094 RECEIVE +2024-07-30 12:00:00.994 0 1 1096 SEND +2024-07-30 12:00:00.995 0 1 1098 RECEIVE +2024-07-30 12:00:00.996 0 1 1100 SEND +2024-07-30 12:00:00.997 0 1 1102 RECEIVE +2024-07-30 12:00:00.998 0 1 1104 SEND +2024-07-30 12:00:00.999 0 1 1106 RECEIVE +2024-07-30 12:00:01.000 0 1 1108 SEND +2024-07-30 12:00:01.001 0 1 1110 RECEIVE +2024-07-30 12:00:01.002 0 1 1112 SEND +2024-07-30 12:00:01.003 0 1 1114 RECEIVE +2024-07-30 12:00:01.004 0 1 1116 SEND +2024-07-30 12:00:01.005 0 1 1118 RECEIVE +2024-07-30 12:00:01.006 0 1 1120 SEND +2024-07-30 12:00:01.007 0 1 1122 RECEIVE +2024-07-30 12:00:01.008 0 1 1108 SEND +2024-07-30 12:00:01.009 0 1 1110 RECEIVE +2024-07-30 12:00:01.010 0 1 1112 SEND +2024-07-30 12:00:01.011 0 1 1114 RECEIVE +2024-07-30 12:00:01.012 0 1 1116 SEND +2024-07-30 12:00:01.013 0 1 1118 RECEIVE +2024-07-30 12:00:01.014 0 1 1120 SEND +2024-07-30 12:00:01.015 0 1 1122 RECEIVE +2024-07-30 12:00:01.016 0 1 1124 SEND +2024-07-30 12:00:01.017 0 1 1126 RECEIVE +2024-07-30 12:00:01.018 0 1 1128 SEND +2024-07-30 12:00:01.019 0 1 1130 RECEIVE +2024-07-30 12:00:01.020 0 1 1132 SEND +2024-07-30 12:00:01.021 0 1 1134 RECEIVE +2024-07-30 12:00:01.022 0 1 1136 SEND +2024-07-30 12:00:01.023 0 1 1138 RECEIVE +2024-07-30 12:00:01.024 0 1 1124 SEND +2024-07-30 12:00:01.025 0 1 1126 RECEIVE +2024-07-30 12:00:01.026 0 1 1128 SEND +2024-07-30 12:00:01.027 0 1 1130 RECEIVE +2024-07-30 12:00:01.028 0 1 1132 SEND +2024-07-30 12:00:01.029 0 1 1134 RECEIVE +2024-07-30 12:00:01.030 0 1 1136 SEND +2024-07-30 12:00:01.031 0 1 1138 RECEIVE +2024-07-30 12:00:01.032 0 1 1140 SEND +2024-07-30 12:00:01.033 0 1 1142 RECEIVE +2024-07-30 12:00:01.034 0 1 1144 SEND +2024-07-30 12:00:01.035 0 1 1146 RECEIVE +2024-07-30 12:00:01.036 0 1 1148 SEND +2024-07-30 12:00:01.037 0 1 1150 RECEIVE +2024-07-30 12:00:01.038 0 1 1152 SEND +2024-07-30 12:00:01.039 0 1 1154 RECEIVE +2024-07-30 12:00:01.040 0 1 1140 SEND +2024-07-30 12:00:01.041 0 1 1142 RECEIVE +2024-07-30 12:00:01.042 0 1 1144 SEND +2024-07-30 12:00:01.043 0 1 1146 RECEIVE +2024-07-30 12:00:01.044 0 1 1148 SEND +2024-07-30 12:00:01.045 0 1 1150 RECEIVE +2024-07-30 12:00:01.046 0 1 1152 SEND +2024-07-30 12:00:01.047 0 1 1154 RECEIVE +2024-07-30 12:00:01.048 0 1 1156 SEND +2024-07-30 12:00:01.049 0 1 1158 RECEIVE +2024-07-30 12:00:01.050 0 1 1160 SEND +2024-07-30 12:00:01.051 0 1 1162 RECEIVE +2024-07-30 12:00:01.052 0 1 1164 SEND +2024-07-30 12:00:01.053 0 1 1166 RECEIVE +2024-07-30 12:00:01.054 0 1 1168 SEND +2024-07-30 12:00:01.055 0 1 1170 RECEIVE +2024-07-30 12:00:01.056 0 1 1156 SEND +2024-07-30 12:00:01.057 0 1 1158 RECEIVE +2024-07-30 12:00:01.058 0 1 1160 SEND +2024-07-30 12:00:01.059 0 1 1162 RECEIVE +2024-07-30 12:00:01.060 0 1 1164 SEND +2024-07-30 12:00:01.061 0 1 1166 RECEIVE +2024-07-30 12:00:01.062 0 1 1168 SEND +2024-07-30 12:00:01.063 0 1 1170 RECEIVE +2024-07-30 12:00:01.064 0 1 1172 SEND +2024-07-30 12:00:01.065 0 1 1174 RECEIVE +2024-07-30 12:00:01.066 0 1 1176 SEND +2024-07-30 12:00:01.067 0 1 1178 RECEIVE +2024-07-30 12:00:01.068 0 1 1180 SEND +2024-07-30 12:00:01.069 0 1 1182 RECEIVE +2024-07-30 12:00:01.070 0 1 1184 SEND +2024-07-30 12:00:01.071 0 1 1186 RECEIVE +2024-07-30 12:00:01.072 0 1 1172 SEND +2024-07-30 12:00:01.073 0 1 1174 RECEIVE +2024-07-30 12:00:01.074 0 1 1176 SEND +2024-07-30 12:00:01.075 0 1 1178 RECEIVE +2024-07-30 12:00:01.076 0 1 1180 SEND +2024-07-30 12:00:01.077 0 1 1182 RECEIVE +2024-07-30 12:00:01.078 0 1 1184 SEND +2024-07-30 12:00:01.079 0 1 1186 RECEIVE +2024-07-30 12:00:01.080 0 1 1188 SEND +2024-07-30 12:00:01.081 0 1 1190 RECEIVE +2024-07-30 12:00:01.082 0 1 1192 SEND +2024-07-30 12:00:01.083 0 1 1194 RECEIVE +2024-07-30 12:00:01.084 0 1 1196 SEND +2024-07-30 12:00:01.085 0 1 1198 RECEIVE +2024-07-30 12:00:01.086 0 1 1200 SEND +2024-07-30 12:00:01.087 0 1 1202 RECEIVE +2024-07-30 12:00:01.088 0 1 1188 SEND +2024-07-30 12:00:01.089 0 1 1190 RECEIVE +2024-07-30 12:00:01.090 0 1 1192 SEND +2024-07-30 12:00:01.091 0 1 1194 RECEIVE +2024-07-30 12:00:01.092 0 1 1196 SEND +2024-07-30 12:00:01.093 0 1 1198 RECEIVE +2024-07-30 12:00:01.094 0 1 1200 SEND +2024-07-30 12:00:01.095 0 1 1202 RECEIVE +2024-07-30 12:00:01.096 0 1 1204 SEND +2024-07-30 12:00:01.097 0 1 1206 RECEIVE +2024-07-30 12:00:01.098 0 1 1208 SEND +2024-07-30 12:00:01.099 0 1 1210 RECEIVE +2024-07-30 12:00:01.100 0 1 1212 SEND +2024-07-30 12:00:01.101 0 1 1214 RECEIVE +2024-07-30 12:00:01.102 0 1 1216 SEND +2024-07-30 12:00:01.103 0 1 1218 RECEIVE +2024-07-30 12:00:01.104 0 1 1204 SEND +2024-07-30 12:00:01.105 0 1 1206 RECEIVE +2024-07-30 12:00:01.106 0 1 1208 SEND +2024-07-30 12:00:01.107 0 1 1210 RECEIVE +2024-07-30 12:00:01.108 0 1 1212 SEND +2024-07-30 12:00:01.109 0 1 1214 RECEIVE +2024-07-30 12:00:01.110 0 1 1216 SEND +2024-07-30 12:00:01.111 0 1 1218 RECEIVE +2024-07-30 12:00:01.112 0 1 1220 SEND +2024-07-30 12:00:01.113 0 1 1222 RECEIVE +2024-07-30 12:00:01.114 0 1 1224 SEND +2024-07-30 12:00:01.115 0 1 1226 RECEIVE +2024-07-30 12:00:01.116 0 1 1228 SEND +2024-07-30 12:00:01.117 0 1 1230 RECEIVE +2024-07-30 12:00:01.118 0 1 1232 SEND +2024-07-30 12:00:01.119 0 1 1234 RECEIVE +2024-07-30 12:00:01.120 0 1 1220 SEND +2024-07-30 12:00:01.121 0 1 1222 RECEIVE +2024-07-30 12:00:01.122 0 1 1224 SEND +2024-07-30 12:00:01.123 0 1 1226 RECEIVE +2024-07-30 12:00:01.124 0 1 1228 SEND +2024-07-30 12:00:01.125 0 1 1230 RECEIVE +2024-07-30 12:00:01.126 0 1 1232 SEND +2024-07-30 12:00:01.127 0 1 1234 RECEIVE +2024-07-30 12:00:01.128 0 1 1236 SEND +2024-07-30 12:00:01.129 0 1 1238 RECEIVE +2024-07-30 12:00:01.130 0 1 1240 SEND +2024-07-30 12:00:01.131 0 1 1242 RECEIVE +2024-07-30 12:00:01.132 0 1 1244 SEND +2024-07-30 12:00:01.133 0 1 1246 RECEIVE +2024-07-30 12:00:01.134 0 1 1248 SEND +2024-07-30 12:00:01.135 0 1 1250 RECEIVE +2024-07-30 12:00:01.136 0 1 1236 SEND +2024-07-30 12:00:01.137 0 1 1238 RECEIVE +2024-07-30 12:00:01.138 0 1 1240 SEND +2024-07-30 12:00:01.139 0 1 1242 RECEIVE +2024-07-30 12:00:01.140 0 1 1244 SEND +2024-07-30 12:00:01.141 0 1 1246 RECEIVE +2024-07-30 12:00:01.142 0 1 1248 SEND +2024-07-30 12:00:01.143 0 1 1250 RECEIVE +2024-07-30 12:00:01.144 0 1 1252 SEND +2024-07-30 12:00:01.145 0 1 1254 RECEIVE +2024-07-30 12:00:01.146 0 1 1256 SEND +2024-07-30 12:00:01.147 0 1 1258 RECEIVE +2024-07-30 12:00:01.148 0 1 1260 SEND +2024-07-30 12:00:01.149 0 1 1262 RECEIVE +2024-07-30 12:00:01.150 0 1 1264 SEND +2024-07-30 12:00:01.151 0 1 1266 RECEIVE +2024-07-30 12:00:01.152 0 1 1252 SEND +2024-07-30 12:00:01.153 0 1 1254 RECEIVE +2024-07-30 12:00:01.154 0 1 1256 SEND +2024-07-30 12:00:01.155 0 1 1258 RECEIVE +2024-07-30 12:00:01.156 0 1 1260 SEND +2024-07-30 12:00:01.157 0 1 1262 RECEIVE +2024-07-30 12:00:01.158 0 1 1264 SEND +2024-07-30 12:00:01.159 0 1 1266 RECEIVE +2024-07-30 12:00:01.160 0 1 1268 SEND +2024-07-30 12:00:01.161 0 1 1270 RECEIVE +2024-07-30 12:00:01.162 0 1 1272 SEND +2024-07-30 12:00:01.163 0 1 1274 RECEIVE +2024-07-30 12:00:01.164 0 1 1276 SEND +2024-07-30 12:00:01.165 0 1 1278 RECEIVE +2024-07-30 12:00:01.166 0 1 1280 SEND +2024-07-30 12:00:01.167 0 1 1282 RECEIVE +2024-07-30 12:00:01.168 0 1 1268 SEND +2024-07-30 12:00:01.169 0 1 1270 RECEIVE +2024-07-30 12:00:01.170 0 1 1272 SEND +2024-07-30 12:00:01.171 0 1 1274 RECEIVE +2024-07-30 12:00:01.172 0 1 1276 SEND +2024-07-30 12:00:01.173 0 1 1278 RECEIVE +2024-07-30 12:00:01.174 0 1 1280 SEND +2024-07-30 12:00:01.175 0 1 1282 RECEIVE +2024-07-30 12:00:01.176 0 1 1284 SEND +2024-07-30 12:00:01.177 0 1 1286 RECEIVE +2024-07-30 12:00:01.178 0 1 1288 SEND +2024-07-30 12:00:01.179 0 1 1290 RECEIVE +2024-07-30 12:00:01.180 0 1 1292 SEND +2024-07-30 12:00:01.181 0 1 1294 RECEIVE +2024-07-30 12:00:01.182 0 1 1296 SEND +2024-07-30 12:00:01.183 0 1 1298 RECEIVE +2024-07-30 12:00:01.184 0 1 1284 SEND +2024-07-30 12:00:01.185 0 1 1286 RECEIVE +2024-07-30 12:00:01.186 0 1 1288 SEND +2024-07-30 12:00:01.187 0 1 1290 RECEIVE +2024-07-30 12:00:01.188 0 1 1292 SEND +2024-07-30 12:00:01.189 0 1 1294 RECEIVE +2024-07-30 12:00:01.190 0 1 1296 SEND +2024-07-30 12:00:01.191 0 1 1298 RECEIVE +2024-07-30 12:00:01.192 0 1 1300 SEND +2024-07-30 12:00:01.193 0 1 1302 RECEIVE +2024-07-30 12:00:01.194 0 1 1304 SEND +2024-07-30 12:00:01.195 0 1 1306 RECEIVE +2024-07-30 12:00:01.196 0 1 1308 SEND +2024-07-30 12:00:01.197 0 1 1310 RECEIVE +2024-07-30 12:00:01.198 0 1 1312 SEND +2024-07-30 12:00:01.199 0 1 1314 RECEIVE +2024-07-30 12:00:01.200 0 1 1300 SEND +2024-07-30 12:00:01.201 0 1 1302 RECEIVE +2024-07-30 12:00:01.202 0 1 1304 SEND +2024-07-30 12:00:01.203 0 1 1306 RECEIVE +2024-07-30 12:00:01.204 0 1 1308 SEND +2024-07-30 12:00:01.205 0 1 1310 RECEIVE +2024-07-30 12:00:01.206 0 1 1312 SEND +2024-07-30 12:00:01.207 0 1 1314 RECEIVE +2024-07-30 12:00:01.208 0 1 1316 SEND +2024-07-30 12:00:01.209 0 1 1318 RECEIVE +2024-07-30 12:00:01.210 0 1 1320 SEND +2024-07-30 12:00:01.211 0 1 1322 RECEIVE +2024-07-30 12:00:01.212 0 1 1324 SEND +2024-07-30 12:00:01.213 0 1 1326 RECEIVE +2024-07-30 12:00:01.214 0 1 1328 SEND +2024-07-30 12:00:01.215 0 1 1330 RECEIVE +2024-07-30 12:00:01.216 0 1 1316 SEND +2024-07-30 12:00:01.217 0 1 1318 RECEIVE +2024-07-30 12:00:01.218 0 1 1320 SEND +2024-07-30 12:00:01.219 0 1 1322 RECEIVE +2024-07-30 12:00:01.220 0 1 1324 SEND +2024-07-30 12:00:01.221 0 1 1326 RECEIVE +2024-07-30 12:00:01.222 0 1 1328 SEND +2024-07-30 12:00:01.223 0 1 1330 RECEIVE +2024-07-30 12:00:01.224 0 1 1332 SEND +2024-07-30 12:00:01.225 0 1 1334 RECEIVE +2024-07-30 12:00:01.226 0 1 1336 SEND +2024-07-30 12:00:01.227 0 1 1338 RECEIVE +2024-07-30 12:00:01.228 0 1 1340 SEND +2024-07-30 12:00:01.229 0 1 1342 RECEIVE +2024-07-30 12:00:01.230 0 1 1344 SEND +2024-07-30 12:00:01.231 0 1 1346 RECEIVE +2024-07-30 12:00:01.232 0 1 1332 SEND +2024-07-30 12:00:01.233 0 1 1334 RECEIVE +2024-07-30 12:00:01.234 0 1 1336 SEND +2024-07-30 12:00:01.235 0 1 1338 RECEIVE +2024-07-30 12:00:01.236 0 1 1340 SEND +2024-07-30 12:00:01.237 0 1 1342 RECEIVE +2024-07-30 12:00:01.238 0 1 1344 SEND +2024-07-30 12:00:01.239 0 1 1346 RECEIVE +2024-07-30 12:00:01.240 0 1 1348 SEND +2024-07-30 12:00:01.241 0 1 1350 RECEIVE +2024-07-30 12:00:01.242 0 1 1352 SEND +2024-07-30 12:00:01.243 0 1 1354 RECEIVE +2024-07-30 12:00:01.244 0 1 1356 SEND +2024-07-30 12:00:01.245 0 1 1358 RECEIVE +2024-07-30 12:00:01.246 0 1 1360 SEND +2024-07-30 12:00:01.247 0 1 1362 RECEIVE +2024-07-30 12:00:01.248 0 1 1348 SEND +2024-07-30 12:00:01.249 0 1 1350 RECEIVE +2024-07-30 12:00:01.250 0 1 1352 SEND +2024-07-30 12:00:01.251 0 1 1354 RECEIVE +2024-07-30 12:00:01.252 0 1 1356 SEND +2024-07-30 12:00:01.253 0 1 1358 RECEIVE +2024-07-30 12:00:01.254 0 1 1360 SEND +2024-07-30 12:00:01.255 0 1 1362 RECEIVE +2024-07-30 12:00:01.256 0 1 1364 SEND +2024-07-30 12:00:01.257 0 1 1366 RECEIVE +2024-07-30 12:00:01.258 0 1 1368 SEND +2024-07-30 12:00:01.259 0 1 1370 RECEIVE +2024-07-30 12:00:01.260 0 1 1372 SEND +2024-07-30 12:00:01.261 0 1 1374 RECEIVE +2024-07-30 12:00:01.262 0 1 1376 SEND +2024-07-30 12:00:01.263 0 1 1378 RECEIVE +2024-07-30 12:00:01.264 0 1 1364 SEND +2024-07-30 12:00:01.265 0 1 1366 RECEIVE +2024-07-30 12:00:01.266 0 1 1368 SEND +2024-07-30 12:00:01.267 0 1 1370 RECEIVE +2024-07-30 12:00:01.268 0 1 1372 SEND +2024-07-30 12:00:01.269 0 1 1374 RECEIVE +2024-07-30 12:00:01.270 0 1 1376 SEND +2024-07-30 12:00:01.271 0 1 1378 RECEIVE +2024-07-30 12:00:01.272 0 1 1380 SEND +2024-07-30 12:00:01.273 0 1 1382 RECEIVE +2024-07-30 12:00:01.274 0 1 1384 SEND +2024-07-30 12:00:01.275 0 1 1386 RECEIVE +2024-07-30 12:00:01.276 0 1 1388 SEND +2024-07-30 12:00:01.277 0 1 1390 RECEIVE +2024-07-30 12:00:01.278 0 1 1392 SEND +2024-07-30 12:00:01.279 0 1 1394 RECEIVE +2024-07-30 12:00:01.280 0 1 1380 SEND +2024-07-30 12:00:01.281 0 1 1382 RECEIVE +2024-07-30 12:00:01.282 0 1 1384 SEND +2024-07-30 12:00:01.283 0 1 1386 RECEIVE +2024-07-30 12:00:01.284 0 1 1388 SEND +2024-07-30 12:00:01.285 0 1 1390 RECEIVE +2024-07-30 12:00:01.286 0 1 1392 SEND +2024-07-30 12:00:01.287 0 1 1394 RECEIVE +2024-07-30 12:00:01.288 0 1 1396 SEND +2024-07-30 12:00:01.289 0 1 1398 RECEIVE +2024-07-30 12:00:01.290 0 1 1400 SEND +2024-07-30 12:00:01.291 0 1 1402 RECEIVE +2024-07-30 12:00:01.292 0 1 1404 SEND +2024-07-30 12:00:01.293 0 1 1406 RECEIVE +2024-07-30 12:00:01.294 0 1 1408 SEND +2024-07-30 12:00:01.295 0 1 1410 RECEIVE +2024-07-30 12:00:01.296 0 1 1396 SEND +2024-07-30 12:00:01.297 0 1 1398 RECEIVE +2024-07-30 12:00:01.298 0 1 1400 SEND +2024-07-30 12:00:01.299 0 1 1402 RECEIVE +2024-07-30 12:00:01.300 0 1 1404 SEND +2024-07-30 12:00:01.301 0 1 1406 RECEIVE +2024-07-30 12:00:01.302 0 1 1408 SEND +2024-07-30 12:00:01.303 0 1 1410 RECEIVE +2024-07-30 12:00:01.304 0 1 1412 SEND +2024-07-30 12:00:01.305 0 1 1414 RECEIVE +2024-07-30 12:00:01.306 0 1 1416 SEND +2024-07-30 12:00:01.307 0 1 1418 RECEIVE +2024-07-30 12:00:01.308 0 1 1420 SEND +2024-07-30 12:00:01.309 0 1 1422 RECEIVE +2024-07-30 12:00:01.310 0 1 1424 SEND +2024-07-30 12:00:01.311 0 1 1426 RECEIVE +2024-07-30 12:00:01.312 0 1 1412 SEND +2024-07-30 12:00:01.313 0 1 1414 RECEIVE +2024-07-30 12:00:01.314 0 1 1416 SEND +2024-07-30 12:00:01.315 0 1 1418 RECEIVE +2024-07-30 12:00:01.316 0 1 1420 SEND +2024-07-30 12:00:01.317 0 1 1422 RECEIVE +2024-07-30 12:00:01.318 0 1 1424 SEND +2024-07-30 12:00:01.319 0 1 1426 RECEIVE +2024-07-30 12:00:01.320 0 1 1428 SEND +2024-07-30 12:00:01.321 0 1 1430 RECEIVE +2024-07-30 12:00:01.322 0 1 1432 SEND +2024-07-30 12:00:01.323 0 1 1434 RECEIVE +2024-07-30 12:00:01.324 0 1 1436 SEND +2024-07-30 12:00:01.325 0 1 1438 RECEIVE +2024-07-30 12:00:01.326 0 1 1440 SEND +2024-07-30 12:00:01.327 0 1 1442 RECEIVE +2024-07-30 12:00:01.328 0 1 1428 SEND +2024-07-30 12:00:01.329 0 1 1430 RECEIVE +2024-07-30 12:00:01.330 0 1 1432 SEND +2024-07-30 12:00:01.331 0 1 1434 RECEIVE +2024-07-30 12:00:01.332 0 1 1436 SEND +2024-07-30 12:00:01.333 0 1 1438 RECEIVE +2024-07-30 12:00:01.334 0 1 1440 SEND +2024-07-30 12:00:01.335 0 1 1442 RECEIVE +2024-07-30 12:00:01.336 0 1 1444 SEND +2024-07-30 12:00:01.337 0 1 1446 RECEIVE +2024-07-30 12:00:01.338 0 1 1448 SEND +2024-07-30 12:00:01.339 0 1 1450 RECEIVE +2024-07-30 12:00:01.340 0 1 1452 SEND +2024-07-30 12:00:01.341 0 1 1454 RECEIVE +2024-07-30 12:00:01.342 0 1 1456 SEND +2024-07-30 12:00:01.343 0 1 1458 RECEIVE +2024-07-30 12:00:01.344 0 1 1444 SEND +2024-07-30 12:00:01.345 0 1 1446 RECEIVE +2024-07-30 12:00:01.346 0 1 1448 SEND +2024-07-30 12:00:01.347 0 1 1450 RECEIVE +2024-07-30 12:00:01.348 0 1 1452 SEND +2024-07-30 12:00:01.349 0 1 1454 RECEIVE +2024-07-30 12:00:01.350 0 1 1456 SEND +2024-07-30 12:00:01.351 0 1 1458 RECEIVE +2024-07-30 12:00:01.352 0 1 1460 SEND +2024-07-30 12:00:01.353 0 1 1462 RECEIVE +2024-07-30 12:00:01.354 0 1 1464 SEND +2024-07-30 12:00:01.355 0 1 1466 RECEIVE +2024-07-30 12:00:01.356 0 1 1468 SEND +2024-07-30 12:00:01.357 0 1 1470 RECEIVE +2024-07-30 12:00:01.358 0 1 1472 SEND +2024-07-30 12:00:01.359 0 1 1474 RECEIVE +2024-07-30 12:00:01.360 0 1 1460 SEND +2024-07-30 12:00:01.361 0 1 1462 RECEIVE +2024-07-30 12:00:01.362 0 1 1464 SEND +2024-07-30 12:00:01.363 0 1 1466 RECEIVE +2024-07-30 12:00:01.364 0 1 1468 SEND +2024-07-30 12:00:01.365 0 1 1470 RECEIVE +2024-07-30 12:00:01.366 0 1 1472 SEND +2024-07-30 12:00:01.367 0 1 1474 RECEIVE +2024-07-30 12:00:01.368 0 1 1476 SEND +2024-07-30 12:00:01.369 0 1 1478 RECEIVE +2024-07-30 12:00:01.370 0 1 1480 SEND +2024-07-30 12:00:01.371 0 1 1482 RECEIVE +2024-07-30 12:00:01.372 0 1 1484 SEND +2024-07-30 12:00:01.373 0 1 1486 RECEIVE +2024-07-30 12:00:01.374 0 1 1488 SEND +2024-07-30 12:00:01.375 0 1 1490 RECEIVE +2024-07-30 12:00:01.376 0 1 1476 SEND +2024-07-30 12:00:01.377 0 1 1478 RECEIVE +2024-07-30 12:00:01.378 0 1 1480 SEND +2024-07-30 12:00:01.379 0 1 1482 RECEIVE +2024-07-30 12:00:01.380 0 1 1484 SEND +2024-07-30 12:00:01.381 0 1 1486 RECEIVE +2024-07-30 12:00:01.382 0 1 1488 SEND +2024-07-30 12:00:01.383 0 1 1490 RECEIVE +2024-07-30 12:00:01.384 0 1 1492 SEND +2024-07-30 12:00:01.385 0 1 1494 RECEIVE +2024-07-30 12:00:01.386 0 1 1496 SEND +2024-07-30 12:00:01.387 0 1 1498 RECEIVE +2024-07-30 12:00:01.388 0 1 1500 SEND +2024-07-30 12:00:01.389 0 1 1502 RECEIVE +2024-07-30 12:00:01.390 0 1 1504 SEND +2024-07-30 12:00:01.391 0 1 1506 RECEIVE +2024-07-30 12:00:01.392 0 1 1492 SEND +2024-07-30 12:00:01.393 0 1 1494 RECEIVE +2024-07-30 12:00:01.394 0 1 1496 SEND +2024-07-30 12:00:01.395 0 1 1498 RECEIVE +2024-07-30 12:00:01.396 0 1 1500 SEND +2024-07-30 12:00:01.397 0 1 1502 RECEIVE +2024-07-30 12:00:01.398 0 1 1504 SEND +2024-07-30 12:00:01.399 0 1 1506 RECEIVE +2024-07-30 12:00:01.400 0 1 1508 SEND +2024-07-30 12:00:01.401 0 1 1510 RECEIVE +2024-07-30 12:00:01.402 0 1 1512 SEND +2024-07-30 12:00:01.403 0 1 1514 RECEIVE +2024-07-30 12:00:01.404 0 1 1516 SEND +2024-07-30 12:00:01.405 0 1 1518 RECEIVE +2024-07-30 12:00:01.406 0 1 1520 SEND +2024-07-30 12:00:01.407 0 1 1522 RECEIVE +2024-07-30 12:00:01.408 0 1 1508 SEND +2024-07-30 12:00:01.409 0 1 1510 RECEIVE +2024-07-30 12:00:01.410 0 1 1512 SEND +2024-07-30 12:00:01.411 0 1 1514 RECEIVE +2024-07-30 12:00:01.412 0 1 1516 SEND +2024-07-30 12:00:01.413 0 1 1518 RECEIVE +2024-07-30 12:00:01.414 0 1 1520 SEND +2024-07-30 12:00:01.415 0 1 1522 RECEIVE +2024-07-30 12:00:01.416 0 1 1524 SEND +2024-07-30 12:00:01.417 0 1 1526 RECEIVE +2024-07-30 12:00:01.418 0 1 1528 SEND +2024-07-30 12:00:01.419 0 1 1530 RECEIVE +2024-07-30 12:00:01.420 0 1 1532 SEND +2024-07-30 12:00:01.421 0 1 1534 RECEIVE +2024-07-30 12:00:01.422 0 1 1536 SEND +2024-07-30 12:00:01.423 0 1 1538 RECEIVE +2024-07-30 12:00:01.424 0 1 1524 SEND +2024-07-30 12:00:01.425 0 1 1526 RECEIVE +2024-07-30 12:00:01.426 0 1 1528 SEND +2024-07-30 12:00:01.427 0 1 1530 RECEIVE +2024-07-30 12:00:01.428 0 1 1532 SEND +2024-07-30 12:00:01.429 0 1 1534 RECEIVE +2024-07-30 12:00:01.430 0 1 1536 SEND +2024-07-30 12:00:01.431 0 1 1538 RECEIVE +2024-07-30 12:00:01.432 0 1 1540 SEND +2024-07-30 12:00:01.433 0 1 1542 RECEIVE +2024-07-30 12:00:01.434 0 1 1544 SEND +2024-07-30 12:00:01.435 0 1 1546 RECEIVE +2024-07-30 12:00:01.436 0 1 1548 SEND +2024-07-30 12:00:01.437 0 1 1550 RECEIVE +2024-07-30 12:00:01.438 0 1 1552 SEND +2024-07-30 12:00:01.439 0 1 1554 RECEIVE +2024-07-30 12:00:01.440 0 1 1540 SEND +2024-07-30 12:00:01.441 0 1 1542 RECEIVE +2024-07-30 12:00:01.442 0 1 1544 SEND +2024-07-30 12:00:01.443 0 1 1546 RECEIVE +2024-07-30 12:00:01.444 0 1 1548 SEND +2024-07-30 12:00:01.445 0 1 1550 RECEIVE +2024-07-30 12:00:01.446 0 1 1552 SEND +2024-07-30 12:00:01.447 0 1 1554 RECEIVE +2024-07-30 12:00:01.448 0 1 1556 SEND +2024-07-30 12:00:01.449 0 1 1558 RECEIVE +2024-07-30 12:00:01.450 0 1 1560 SEND +2024-07-30 12:00:01.451 0 1 1562 RECEIVE +2024-07-30 12:00:01.452 0 1 1564 SEND +2024-07-30 12:00:01.453 0 1 1566 RECEIVE +2024-07-30 12:00:01.454 0 1 1568 SEND +2024-07-30 12:00:01.455 0 1 1570 RECEIVE +2024-07-30 12:00:01.456 0 1 1556 SEND +2024-07-30 12:00:01.457 0 1 1558 RECEIVE +2024-07-30 12:00:01.458 0 1 1560 SEND +2024-07-30 12:00:01.459 0 1 1562 RECEIVE +2024-07-30 12:00:01.460 0 1 1564 SEND +2024-07-30 12:00:01.461 0 1 1566 RECEIVE +2024-07-30 12:00:01.462 0 1 1568 SEND +2024-07-30 12:00:01.463 0 1 1570 RECEIVE +2024-07-30 12:00:01.464 0 1 1572 SEND +2024-07-30 12:00:01.465 0 1 1574 RECEIVE +2024-07-30 12:00:01.466 0 1 1576 SEND +2024-07-30 12:00:01.467 0 1 1578 RECEIVE +2024-07-30 12:00:01.468 0 1 1580 SEND +2024-07-30 12:00:01.469 0 1 1582 RECEIVE +2024-07-30 12:00:01.470 0 1 1584 SEND +2024-07-30 12:00:01.471 0 1 1586 RECEIVE +2024-07-30 12:00:01.472 0 1 1572 SEND +2024-07-30 12:00:01.473 0 1 1574 RECEIVE +2024-07-30 12:00:01.474 0 1 1576 SEND +2024-07-30 12:00:01.475 0 1 1578 RECEIVE +2024-07-30 12:00:01.476 0 1 1580 SEND +2024-07-30 12:00:01.477 0 1 1582 RECEIVE +2024-07-30 12:00:01.478 0 1 1584 SEND +2024-07-30 12:00:01.479 0 1 1586 RECEIVE +2024-07-30 12:00:01.480 0 1 1588 SEND +2024-07-30 12:00:01.481 0 1 1590 RECEIVE +2024-07-30 12:00:01.482 0 1 1592 SEND +2024-07-30 12:00:01.483 0 1 1594 RECEIVE +2024-07-30 12:00:01.484 0 1 1596 SEND +2024-07-30 12:00:01.485 0 1 1598 RECEIVE +2024-07-30 12:00:01.486 0 1 1600 SEND +2024-07-30 12:00:01.487 0 1 1602 RECEIVE +2024-07-30 12:00:01.488 0 1 1588 SEND +2024-07-30 12:00:01.489 0 1 1590 RECEIVE +2024-07-30 12:00:01.490 0 1 1592 SEND +2024-07-30 12:00:01.491 0 1 1594 RECEIVE +2024-07-30 12:00:01.492 0 1 1596 SEND +2024-07-30 12:00:01.493 0 1 1598 RECEIVE +2024-07-30 12:00:01.494 0 1 1600 SEND +2024-07-30 12:00:01.495 0 1 1602 RECEIVE +2024-07-30 12:00:01.496 0 1 1604 SEND +2024-07-30 12:00:01.497 0 1 1606 RECEIVE +2024-07-30 12:00:01.498 0 1 1608 SEND +2024-07-30 12:00:01.499 0 1 1610 RECEIVE +2024-07-30 12:00:01.500 0 1 1612 SEND +2024-07-30 12:00:01.501 0 1 1614 RECEIVE +2024-07-30 12:00:01.502 0 1 1616 SEND +2024-07-30 12:00:01.503 0 1 1618 RECEIVE +2024-07-30 12:00:01.504 0 1 1604 SEND +2024-07-30 12:00:01.505 0 1 1606 RECEIVE +2024-07-30 12:00:01.506 0 1 1608 SEND +2024-07-30 12:00:01.507 0 1 1610 RECEIVE +2024-07-30 12:00:01.508 0 1 1612 SEND +2024-07-30 12:00:01.509 0 1 1614 RECEIVE +2024-07-30 12:00:01.510 0 1 1616 SEND +2024-07-30 12:00:01.511 0 1 1618 RECEIVE +2024-07-30 12:00:01.512 0 1 1620 SEND +2024-07-30 12:00:01.513 0 1 1622 RECEIVE +2024-07-30 12:00:01.514 0 1 1624 SEND +2024-07-30 12:00:01.515 0 1 1626 RECEIVE +2024-07-30 12:00:01.516 0 1 1628 SEND +2024-07-30 12:00:01.517 0 1 1630 RECEIVE +2024-07-30 12:00:01.518 0 1 1632 SEND +2024-07-30 12:00:01.519 0 1 1634 RECEIVE +2024-07-30 12:00:01.520 0 1 1620 SEND +2024-07-30 12:00:01.521 0 1 1622 RECEIVE +2024-07-30 12:00:01.522 0 1 1624 SEND +2024-07-30 12:00:01.523 0 1 1626 RECEIVE +2024-07-30 12:00:01.524 0 1 1628 SEND +2024-07-30 12:00:01.525 0 1 1630 RECEIVE +2024-07-30 12:00:01.526 0 1 1632 SEND +2024-07-30 12:00:01.527 0 1 1634 RECEIVE +2024-07-30 12:00:01.528 0 1 1636 SEND +2024-07-30 12:00:01.529 0 1 1638 RECEIVE +2024-07-30 12:00:01.530 0 1 1640 SEND +2024-07-30 12:00:01.531 0 1 1642 RECEIVE +2024-07-30 12:00:01.532 0 1 1644 SEND +2024-07-30 12:00:01.533 0 1 1646 RECEIVE +2024-07-30 12:00:01.534 0 1 1648 SEND +2024-07-30 12:00:01.535 0 1 1650 RECEIVE +2024-07-30 12:00:01.536 0 1 1636 SEND +2024-07-30 12:00:01.537 0 1 1638 RECEIVE +2024-07-30 12:00:01.538 0 1 1640 SEND +2024-07-30 12:00:01.539 0 1 1642 RECEIVE +2024-07-30 12:00:01.540 0 1 1644 SEND +2024-07-30 12:00:01.541 0 1 1646 RECEIVE +2024-07-30 12:00:01.542 0 1 1648 SEND +2024-07-30 12:00:01.543 0 1 1650 RECEIVE +2024-07-30 12:00:01.544 0 1 1652 SEND +2024-07-30 12:00:01.545 0 1 1654 RECEIVE +2024-07-30 12:00:01.546 0 1 1656 SEND +2024-07-30 12:00:01.547 0 1 1658 RECEIVE +2024-07-30 12:00:01.548 0 1 1660 SEND +2024-07-30 12:00:01.549 0 1 1662 RECEIVE +2024-07-30 12:00:01.550 0 1 1664 SEND +2024-07-30 12:00:01.551 0 1 1666 RECEIVE +2024-07-30 12:00:01.552 0 1 1652 SEND +2024-07-30 12:00:01.553 0 1 1654 RECEIVE +2024-07-30 12:00:01.554 0 1 1656 SEND +2024-07-30 12:00:01.555 0 1 1658 RECEIVE +2024-07-30 12:00:01.556 0 1 1660 SEND +2024-07-30 12:00:01.557 0 1 1662 RECEIVE +2024-07-30 12:00:01.558 0 1 1664 SEND +2024-07-30 12:00:01.559 0 1 1666 RECEIVE +2024-07-30 12:00:01.560 0 1 1668 SEND +2024-07-30 12:00:01.561 0 1 1670 RECEIVE +2024-07-30 12:00:01.562 0 1 1672 SEND +2024-07-30 12:00:01.563 0 1 1674 RECEIVE +2024-07-30 12:00:01.564 0 1 1676 SEND +2024-07-30 12:00:01.565 0 1 1678 RECEIVE +2024-07-30 12:00:01.566 0 1 1680 SEND +2024-07-30 12:00:01.567 0 1 1682 RECEIVE +2024-07-30 12:00:01.568 0 1 1668 SEND +2024-07-30 12:00:01.569 0 1 1670 RECEIVE +2024-07-30 12:00:01.570 0 1 1672 SEND +2024-07-30 12:00:01.571 0 1 1674 RECEIVE +2024-07-30 12:00:01.572 0 1 1676 SEND +2024-07-30 12:00:01.573 0 1 1678 RECEIVE +2024-07-30 12:00:01.574 0 1 1680 SEND +2024-07-30 12:00:01.575 0 1 1682 RECEIVE +2024-07-30 12:00:01.576 0 1 1684 SEND +2024-07-30 12:00:01.577 0 1 1686 RECEIVE +2024-07-30 12:00:01.578 0 1 1688 SEND +2024-07-30 12:00:01.579 0 1 1690 RECEIVE +2024-07-30 12:00:01.580 0 1 1692 SEND +2024-07-30 12:00:01.581 0 1 1694 RECEIVE +2024-07-30 12:00:01.582 0 1 1696 SEND +2024-07-30 12:00:01.583 0 1 1698 RECEIVE +2024-07-30 12:00:01.584 0 1 1684 SEND +2024-07-30 12:00:01.585 0 1 1686 RECEIVE +2024-07-30 12:00:01.586 0 1 1688 SEND +2024-07-30 12:00:01.587 0 1 1690 RECEIVE +2024-07-30 12:00:01.588 0 1 1692 SEND +2024-07-30 12:00:01.589 0 1 1694 RECEIVE +2024-07-30 12:00:01.590 0 1 1696 SEND +2024-07-30 12:00:01.591 0 1 1698 RECEIVE +2024-07-30 12:00:01.592 0 1 1700 SEND +2024-07-30 12:00:01.593 0 1 1702 RECEIVE +2024-07-30 12:00:01.594 0 1 1704 SEND +2024-07-30 12:00:01.595 0 1 1706 RECEIVE +2024-07-30 12:00:01.596 0 1 1708 SEND +2024-07-30 12:00:01.597 0 1 1710 RECEIVE +2024-07-30 12:00:01.598 0 1 1712 SEND +2024-07-30 12:00:01.599 0 1 1714 RECEIVE +2024-07-30 12:00:01.600 0 1 1700 SEND +2024-07-30 12:00:01.601 0 1 1702 RECEIVE +2024-07-30 12:00:01.602 0 1 1704 SEND +2024-07-30 12:00:01.603 0 1 1706 RECEIVE +2024-07-30 12:00:01.604 0 1 1708 SEND +2024-07-30 12:00:01.605 0 1 1710 RECEIVE +2024-07-30 12:00:01.606 0 1 1712 SEND +2024-07-30 12:00:01.607 0 1 1714 RECEIVE +2024-07-30 12:00:01.608 0 1 1716 SEND +2024-07-30 12:00:01.609 0 1 1718 RECEIVE +2024-07-30 12:00:01.610 0 1 1720 SEND +2024-07-30 12:00:01.611 0 1 1722 RECEIVE +2024-07-30 12:00:01.612 0 1 1724 SEND +2024-07-30 12:00:01.613 0 1 1726 RECEIVE +2024-07-30 12:00:01.614 0 1 1728 SEND +2024-07-30 12:00:01.615 0 1 1730 RECEIVE +2024-07-30 12:00:01.616 0 1 1716 SEND +2024-07-30 12:00:01.617 0 1 1718 RECEIVE +2024-07-30 12:00:01.618 0 1 1720 SEND +2024-07-30 12:00:01.619 0 1 1722 RECEIVE +2024-07-30 12:00:01.620 0 1 1724 SEND +2024-07-30 12:00:01.621 0 1 1726 RECEIVE +2024-07-30 12:00:01.622 0 1 1728 SEND +2024-07-30 12:00:01.623 0 1 1730 RECEIVE +2024-07-30 12:00:01.624 0 1 1732 SEND +2024-07-30 12:00:01.625 0 1 1734 RECEIVE +2024-07-30 12:00:01.626 0 1 1736 SEND +2024-07-30 12:00:01.627 0 1 1738 RECEIVE +2024-07-30 12:00:01.628 0 1 1740 SEND +2024-07-30 12:00:01.629 0 1 1742 RECEIVE +2024-07-30 12:00:01.630 0 1 1744 SEND +2024-07-30 12:00:01.631 0 1 1746 RECEIVE +2024-07-30 12:00:01.632 0 1 1732 SEND +2024-07-30 12:00:01.633 0 1 1734 RECEIVE +2024-07-30 12:00:01.634 0 1 1736 SEND +2024-07-30 12:00:01.635 0 1 1738 RECEIVE +2024-07-30 12:00:01.636 0 1 1740 SEND +2024-07-30 12:00:01.637 0 1 1742 RECEIVE +2024-07-30 12:00:01.638 0 1 1744 SEND +2024-07-30 12:00:01.639 0 1 1746 RECEIVE +2024-07-30 12:00:01.640 0 1 1748 SEND +2024-07-30 12:00:01.641 0 1 1750 RECEIVE +2024-07-30 12:00:01.642 0 1 1752 SEND +2024-07-30 12:00:01.643 0 1 1754 RECEIVE +2024-07-30 12:00:01.644 0 1 1756 SEND +2024-07-30 12:00:01.645 0 1 1758 RECEIVE +2024-07-30 12:00:01.646 0 1 1760 SEND +2024-07-30 12:00:01.647 0 1 1762 RECEIVE +2024-07-30 12:00:01.648 0 1 1748 SEND +2024-07-30 12:00:01.649 0 1 1750 RECEIVE +2024-07-30 12:00:01.650 0 1 1752 SEND +2024-07-30 12:00:01.651 0 1 1754 RECEIVE +2024-07-30 12:00:01.652 0 1 1756 SEND +2024-07-30 12:00:01.653 0 1 1758 RECEIVE +2024-07-30 12:00:01.654 0 1 1760 SEND +2024-07-30 12:00:01.655 0 1 1762 RECEIVE +2024-07-30 12:00:01.656 0 1 1764 SEND +2024-07-30 12:00:01.657 0 1 1766 RECEIVE +2024-07-30 12:00:01.658 0 1 1768 SEND +2024-07-30 12:00:01.659 0 1 1770 RECEIVE +2024-07-30 12:00:01.660 0 1 1772 SEND +2024-07-30 12:00:01.661 0 1 1774 RECEIVE +2024-07-30 12:00:01.662 0 1 1776 SEND +2024-07-30 12:00:01.663 0 1 1778 RECEIVE +2024-07-30 12:00:01.664 0 1 1764 SEND +2024-07-30 12:00:01.665 0 1 1766 RECEIVE +2024-07-30 12:00:01.666 0 1 1768 SEND +2024-07-30 12:00:01.667 0 1 1770 RECEIVE +2024-07-30 12:00:01.668 0 1 1772 SEND +2024-07-30 12:00:01.669 0 1 1774 RECEIVE +2024-07-30 12:00:01.670 0 1 1776 SEND +2024-07-30 12:00:01.671 0 1 1778 RECEIVE +2024-07-30 12:00:01.672 0 1 1780 SEND +2024-07-30 12:00:01.673 0 1 1782 RECEIVE +2024-07-30 12:00:01.674 0 1 1784 SEND +2024-07-30 12:00:01.675 0 1 1786 RECEIVE +2024-07-30 12:00:01.676 0 1 1788 SEND +2024-07-30 12:00:01.677 0 1 1790 RECEIVE +2024-07-30 12:00:01.678 0 1 1792 SEND +2024-07-30 12:00:01.679 0 1 1794 RECEIVE +2024-07-30 12:00:01.680 0 1 1780 SEND +2024-07-30 12:00:01.681 0 1 1782 RECEIVE +2024-07-30 12:00:01.682 0 1 1784 SEND +2024-07-30 12:00:01.683 0 1 1786 RECEIVE +2024-07-30 12:00:01.684 0 1 1788 SEND +2024-07-30 12:00:01.685 0 1 1790 RECEIVE +2024-07-30 12:00:01.686 0 1 1792 SEND +2024-07-30 12:00:01.687 0 1 1794 RECEIVE +2024-07-30 12:00:01.688 0 1 1796 SEND +2024-07-30 12:00:01.689 0 1 1798 RECEIVE +2024-07-30 12:00:01.690 0 1 1800 SEND +2024-07-30 12:00:01.691 0 1 1802 RECEIVE +2024-07-30 12:00:01.692 0 1 1804 SEND +2024-07-30 12:00:01.693 0 1 1806 RECEIVE +2024-07-30 12:00:01.694 0 1 1808 SEND +2024-07-30 12:00:01.695 0 1 1810 RECEIVE +2024-07-30 12:00:01.696 0 1 1796 SEND +2024-07-30 12:00:01.697 0 1 1798 RECEIVE +2024-07-30 12:00:01.698 0 1 1800 SEND +2024-07-30 12:00:01.699 0 1 1802 RECEIVE +2024-07-30 12:00:01.700 0 1 1804 SEND +2024-07-30 12:00:01.701 0 1 1806 RECEIVE +2024-07-30 12:00:01.702 0 1 1808 SEND +2024-07-30 12:00:01.703 0 1 1810 RECEIVE +2024-07-30 12:00:01.704 0 1 1812 SEND +2024-07-30 12:00:01.705 0 1 1814 RECEIVE +2024-07-30 12:00:01.706 0 1 1816 SEND +2024-07-30 12:00:01.707 0 1 1818 RECEIVE +2024-07-30 12:00:01.708 0 1 1820 SEND +2024-07-30 12:00:01.709 0 1 1822 RECEIVE +2024-07-30 12:00:01.710 0 1 1824 SEND +2024-07-30 12:00:01.711 0 1 1826 RECEIVE +2024-07-30 12:00:01.712 0 1 1812 SEND +2024-07-30 12:00:01.713 0 1 1814 RECEIVE +2024-07-30 12:00:01.714 0 1 1816 SEND +2024-07-30 12:00:01.715 0 1 1818 RECEIVE +2024-07-30 12:00:01.716 0 1 1820 SEND +2024-07-30 12:00:01.717 0 1 1822 RECEIVE +2024-07-30 12:00:01.718 0 1 1824 SEND +2024-07-30 12:00:01.719 0 1 1826 RECEIVE +2024-07-30 12:00:01.720 0 1 1828 SEND +2024-07-30 12:00:01.721 0 1 1830 RECEIVE +2024-07-30 12:00:01.722 0 1 1832 SEND +2024-07-30 12:00:01.723 0 1 1834 RECEIVE +2024-07-30 12:00:01.724 0 1 1836 SEND +2024-07-30 12:00:01.725 0 1 1838 RECEIVE +2024-07-30 12:00:01.726 0 1 1840 SEND +2024-07-30 12:00:01.727 0 1 1842 RECEIVE +2024-07-30 12:00:01.728 0 1 1828 SEND +2024-07-30 12:00:01.729 0 1 1830 RECEIVE +2024-07-30 12:00:01.730 0 1 1832 SEND +2024-07-30 12:00:01.731 0 1 1834 RECEIVE +2024-07-30 12:00:01.732 0 1 1836 SEND +2024-07-30 12:00:01.733 0 1 1838 RECEIVE +2024-07-30 12:00:01.734 0 1 1840 SEND +2024-07-30 12:00:01.735 0 1 1842 RECEIVE +2024-07-30 12:00:01.736 0 1 1844 SEND +2024-07-30 12:00:01.737 0 1 1846 RECEIVE +2024-07-30 12:00:01.738 0 1 1848 SEND +2024-07-30 12:00:01.739 0 1 1850 RECEIVE +2024-07-30 12:00:01.740 0 1 1852 SEND +2024-07-30 12:00:01.741 0 1 1854 RECEIVE +2024-07-30 12:00:01.742 0 1 1856 SEND +2024-07-30 12:00:01.743 0 1 1858 RECEIVE +2024-07-30 12:00:01.744 0 1 1844 SEND +2024-07-30 12:00:01.745 0 1 1846 RECEIVE +2024-07-30 12:00:01.746 0 1 1848 SEND +2024-07-30 12:00:01.747 0 1 1850 RECEIVE +2024-07-30 12:00:01.748 0 1 1852 SEND +2024-07-30 12:00:01.749 0 1 1854 RECEIVE +2024-07-30 12:00:01.750 0 1 1856 SEND +2024-07-30 12:00:01.751 0 1 1858 RECEIVE +2024-07-30 12:00:01.752 0 1 1860 SEND +2024-07-30 12:00:01.753 0 1 1862 RECEIVE +2024-07-30 12:00:01.754 0 1 1864 SEND +2024-07-30 12:00:01.755 0 1 1866 RECEIVE +2024-07-30 12:00:01.756 0 1 1868 SEND +2024-07-30 12:00:01.757 0 1 1870 RECEIVE +2024-07-30 12:00:01.758 0 1 1872 SEND +2024-07-30 12:00:01.759 0 1 1874 RECEIVE +2024-07-30 12:00:01.760 0 1 1860 SEND +2024-07-30 12:00:01.761 0 1 1862 RECEIVE +2024-07-30 12:00:01.762 0 1 1864 SEND +2024-07-30 12:00:01.763 0 1 1866 RECEIVE +2024-07-30 12:00:01.764 0 1 1868 SEND +2024-07-30 12:00:01.765 0 1 1870 RECEIVE +2024-07-30 12:00:01.766 0 1 1872 SEND +2024-07-30 12:00:01.767 0 1 1874 RECEIVE +2024-07-30 12:00:01.768 0 1 1876 SEND +2024-07-30 12:00:01.769 0 1 1878 RECEIVE +2024-07-30 12:00:01.770 0 1 1880 SEND +2024-07-30 12:00:01.771 0 1 1882 RECEIVE +2024-07-30 12:00:01.772 0 1 1884 SEND +2024-07-30 12:00:01.773 0 1 1886 RECEIVE +2024-07-30 12:00:01.774 0 1 1888 SEND +2024-07-30 12:00:01.775 0 1 1890 RECEIVE +2024-07-30 12:00:01.776 0 1 1876 SEND +2024-07-30 12:00:01.777 0 1 1878 RECEIVE +2024-07-30 12:00:01.778 0 1 1880 SEND +2024-07-30 12:00:01.779 0 1 1882 RECEIVE +2024-07-30 12:00:01.780 0 1 1884 SEND +2024-07-30 12:00:01.781 0 1 1886 RECEIVE +2024-07-30 12:00:01.782 0 1 1888 SEND +2024-07-30 12:00:01.783 0 1 1890 RECEIVE +2024-07-30 12:00:01.784 0 1 1892 SEND +2024-07-30 12:00:01.785 0 1 1894 RECEIVE +2024-07-30 12:00:01.786 0 1 1896 SEND +2024-07-30 12:00:01.787 0 1 1898 RECEIVE +2024-07-30 12:00:01.788 0 1 1900 SEND +2024-07-30 12:00:01.789 0 1 1902 RECEIVE +2024-07-30 12:00:01.790 0 1 1904 SEND +2024-07-30 12:00:01.791 0 1 1906 RECEIVE +2024-07-30 12:00:01.792 0 1 1892 SEND +2024-07-30 12:00:01.793 0 1 1894 RECEIVE +2024-07-30 12:00:01.794 0 1 1896 SEND +2024-07-30 12:00:01.795 0 1 1898 RECEIVE +2024-07-30 12:00:01.796 0 1 1900 SEND +2024-07-30 12:00:01.797 0 1 1902 RECEIVE +2024-07-30 12:00:01.798 0 1 1904 SEND +2024-07-30 12:00:01.799 0 1 1906 RECEIVE +2024-07-30 12:00:01.800 0 1 1908 SEND +2024-07-30 12:00:01.801 0 1 1910 RECEIVE +2024-07-30 12:00:01.802 0 1 1912 SEND +2024-07-30 12:00:01.803 0 1 1914 RECEIVE +2024-07-30 12:00:01.804 0 1 1916 SEND +2024-07-30 12:00:01.805 0 1 1918 RECEIVE +2024-07-30 12:00:01.806 0 1 1920 SEND +2024-07-30 12:00:01.807 0 1 1922 RECEIVE +2024-07-30 12:00:01.808 0 1 1908 SEND +2024-07-30 12:00:01.809 0 1 1910 RECEIVE +2024-07-30 12:00:01.810 0 1 1912 SEND +2024-07-30 12:00:01.811 0 1 1914 RECEIVE +2024-07-30 12:00:01.812 1 3 1916 SEND +2024-07-30 12:00:01.813 2 0 1918 RECEIVE +2024-07-30 12:00:01.814 0 2 1920 SEND +2024-07-30 12:00:01.815 3 1 1922 RECEIVE +2024-07-30 12:00:01.816 1 0 1924 SEND +2024-07-30 12:00:01.817 2 1 1926 RECEIVE +2024-07-30 12:00:01.818 3 2 1928 SEND +2024-07-30 12:00:01.819 0 3 1930 RECEIVE +2024-07-30 12:00:01.820 2 0 1932 SEND +2024-07-30 12:00:01.821 1 3 1934 RECEIVE +2024-07-30 12:00:01.822 0 1 1936 SEND +2024-07-30 12:00:01.823 3 2 1938 RECEIVE +2024-07-30 12:00:01.824 0 1 1924 SEND +2024-07-30 12:00:01.825 1 2 1926 RECEIVE +2024-07-30 12:00:01.826 2 3 1928 SEND +2024-07-30 12:00:01.827 3 0 1930 RECEIVE +2024-07-30 12:00:01.828 1 3 1932 SEND +2024-07-30 12:00:01.829 2 0 1934 RECEIVE +2024-07-30 12:00:01.830 0 2 1936 SEND +2024-07-30 12:00:01.831 3 1 1938 RECEIVE +2024-07-30 12:00:01.832 1 0 1940 SEND +2024-07-30 12:00:01.833 2 1 1942 RECEIVE +2024-07-30 12:00:01.834 3 2 1944 SEND +2024-07-30 12:00:01.835 0 3 1946 RECEIVE +2024-07-30 12:00:01.836 2 0 1948 SEND +2024-07-30 12:00:01.837 1 3 1950 RECEIVE +2024-07-30 12:00:01.838 0 1 1952 SEND +2024-07-30 12:00:01.839 3 2 1954 RECEIVE +2024-07-30 12:00:01.840 0 1 1940 SEND +2024-07-30 12:00:01.841 1 2 1942 RECEIVE +2024-07-30 12:00:01.842 2 3 1944 SEND +2024-07-30 12:00:01.843 3 0 1946 RECEIVE +2024-07-30 12:00:01.844 1 3 1948 SEND +2024-07-30 12:00:01.845 2 0 1950 RECEIVE +2024-07-30 12:00:01.846 0 2 1952 SEND +2024-07-30 12:00:01.847 3 1 1954 RECEIVE +2024-07-30 12:00:01.848 1 0 1956 SEND +2024-07-30 12:00:01.849 2 1 1958 RECEIVE +2024-07-30 12:00:01.850 3 2 1960 SEND +2024-07-30 12:00:01.851 0 3 1962 RECEIVE +2024-07-30 12:00:01.852 2 0 1964 SEND +2024-07-30 12:00:01.853 1 3 1966 RECEIVE +2024-07-30 12:00:01.854 0 1 1968 SEND +2024-07-30 12:00:01.855 3 2 1970 RECEIVE +2024-07-30 12:00:01.856 0 1 1956 SEND +2024-07-30 12:00:01.857 1 2 1958 RECEIVE +2024-07-30 12:00:01.858 2 3 1960 SEND +2024-07-30 12:00:01.859 3 0 1962 RECEIVE +2024-07-30 12:00:01.860 1 3 1964 SEND +2024-07-30 12:00:01.861 2 0 1966 RECEIVE +2024-07-30 12:00:01.862 0 2 1968 SEND +2024-07-30 12:00:01.863 3 1 1970 RECEIVE +2024-07-30 12:00:01.864 1 0 1972 SEND +2024-07-30 12:00:01.865 2 1 1974 RECEIVE +2024-07-30 12:00:01.866 3 2 1976 SEND +2024-07-30 12:00:01.867 0 3 1978 RECEIVE +2024-07-30 12:00:01.868 2 0 1980 SEND +2024-07-30 12:00:01.869 1 3 1982 RECEIVE +2024-07-30 12:00:01.870 0 1 1984 SEND +2024-07-30 12:00:01.871 3 2 1986 RECEIVE +2024-07-30 12:00:01.872 0 1 1972 SEND +2024-07-30 12:00:01.873 1 2 1974 RECEIVE +2024-07-30 12:00:01.874 2 3 1976 SEND +2024-07-30 12:00:01.875 3 0 1978 RECEIVE +2024-07-30 12:00:01.876 1 3 1980 SEND +2024-07-30 12:00:01.877 2 0 1982 RECEIVE +2024-07-30 12:00:01.878 0 2 1984 SEND +2024-07-30 12:00:01.879 3 1 1986 RECEIVE +2024-07-30 12:00:01.880 1 0 1988 SEND +2024-07-30 12:00:01.881 2 1 1990 RECEIVE +2024-07-30 12:00:01.882 3 2 1992 SEND +2024-07-30 12:00:01.883 0 3 1994 RECEIVE +2024-07-30 12:00:01.884 2 0 1996 SEND +2024-07-30 12:00:01.885 1 3 1998 RECEIVE +2024-07-30 12:00:01.886 0 1 2000 SEND +2024-07-30 12:00:01.887 3 2 2002 RECEIVE +2024-07-30 12:00:01.888 0 1 1988 SEND +2024-07-30 12:00:01.889 1 2 1990 RECEIVE +2024-07-30 12:00:01.890 2 3 1992 SEND +2024-07-30 12:00:01.891 3 0 1994 RECEIVE +2024-07-30 12:00:01.892 1 3 1996 SEND +2024-07-30 12:00:01.893 2 0 1998 RECEIVE +2024-07-30 12:00:01.894 0 2 2000 SEND +2024-07-30 12:00:01.895 3 1 2002 RECEIVE +2024-07-30 12:00:01.896 1 0 2004 SEND +2024-07-30 12:00:01.897 2 1 2006 RECEIVE +2024-07-30 12:00:01.898 3 2 2008 SEND +2024-07-30 12:00:01.899 0 3 2010 RECEIVE +2024-07-30 12:00:01.900 2 0 2012 SEND +2024-07-30 12:00:01.901 1 3 2014 RECEIVE +2024-07-30 12:00:01.902 0 1 2016 SEND +2024-07-30 12:00:01.903 3 2 2018 RECEIVE +2024-07-30 12:00:01.904 0 1 2004 SEND +2024-07-30 12:00:01.905 1 2 2006 RECEIVE +2024-07-30 12:00:01.906 2 3 2008 SEND +2024-07-30 12:00:01.907 3 0 2010 RECEIVE +2024-07-30 12:00:01.908 1 3 2012 SEND +2024-07-30 12:00:01.909 2 0 2014 RECEIVE +2024-07-30 12:00:01.910 0 2 2016 SEND +2024-07-30 12:00:01.911 3 1 2018 RECEIVE +2024-07-30 12:00:01.912 1 0 2020 SEND +2024-07-30 12:00:01.913 2 1 2022 RECEIVE +2024-07-30 12:00:01.914 3 2 2024 SEND +2024-07-30 12:00:01.915 0 3 2026 RECEIVE +2024-07-30 12:00:01.916 2 0 2028 SEND +2024-07-30 12:00:01.917 1 3 2030 RECEIVE +2024-07-30 12:00:01.918 0 1 2032 SEND +2024-07-30 12:00:01.919 3 2 2034 RECEIVE +2024-07-30 12:00:01.920 0 1 2020 SEND +2024-07-30 12:00:01.921 1 2 2022 RECEIVE +2024-07-30 12:00:01.922 2 3 2024 SEND +2024-07-30 12:00:01.923 3 0 2026 RECEIVE +2024-07-30 12:00:01.924 1 3 2028 SEND +2024-07-30 12:00:01.925 2 0 2030 RECEIVE +2024-07-30 12:00:01.926 0 2 2032 SEND +2024-07-30 12:00:01.927 3 1 2034 RECEIVE +2024-07-30 12:00:01.928 1 0 2036 SEND +2024-07-30 12:00:01.929 2 1 2038 RECEIVE +2024-07-30 12:00:01.930 3 2 2040 SEND +2024-07-30 12:00:01.931 0 3 2042 RECEIVE +2024-07-30 12:00:01.932 2 0 2044 SEND +2024-07-30 12:00:01.933 1 3 2046 RECEIVE +2024-07-30 12:00:01.934 0 1 2048 SEND +2024-07-30 12:00:01.935 3 2 2050 RECEIVE +2024-07-30 12:00:01.936 0 1 2036 SEND +2024-07-30 12:00:01.937 1 2 2038 RECEIVE +2024-07-30 12:00:01.938 2 3 2040 SEND +2024-07-30 12:00:01.939 3 0 2042 RECEIVE +2024-07-30 12:00:01.940 1 3 2044 SEND +2024-07-30 12:00:01.941 2 0 2046 RECEIVE +2024-07-30 12:00:01.942 0 2 2048 SEND +2024-07-30 12:00:01.943 3 1 2050 RECEIVE +2024-07-30 12:00:01.944 1 0 2052 SEND +2024-07-30 12:00:01.945 2 1 2054 RECEIVE +2024-07-30 12:00:01.946 3 2 2056 SEND +2024-07-30 12:00:01.947 0 3 2058 RECEIVE +2024-07-30 12:00:01.948 2 0 2060 SEND +2024-07-30 12:00:01.949 1 3 2062 RECEIVE +2024-07-30 12:00:01.950 0 1 2064 SEND +2024-07-30 12:00:01.951 3 2 2066 RECEIVE +2024-07-30 12:00:01.952 0 1 2052 SEND +2024-07-30 12:00:01.953 1 2 2054 RECEIVE +2024-07-30 12:00:01.954 2 3 2056 SEND +2024-07-30 12:00:01.955 3 0 2058 RECEIVE +2024-07-30 12:00:01.956 1 3 2060 SEND +2024-07-30 12:00:01.957 2 0 2062 RECEIVE +2024-07-30 12:00:01.958 0 2 2064 SEND +2024-07-30 12:00:01.959 3 1 2066 RECEIVE +2024-07-30 12:00:01.960 1 0 2068 SEND +2024-07-30 12:00:01.961 2 1 2070 RECEIVE +2024-07-30 12:00:01.962 3 2 2072 SEND +2024-07-30 12:00:01.963 0 3 2074 RECEIVE +2024-07-30 12:00:01.964 2 0 2076 SEND +2024-07-30 12:00:01.965 1 3 2078 RECEIVE +2024-07-30 12:00:01.966 0 1 2080 SEND +2024-07-30 12:00:01.967 3 2 2082 RECEIVE +2024-07-30 12:00:01.968 0 1 2068 SEND +2024-07-30 12:00:01.969 1 2 2070 RECEIVE +2024-07-30 12:00:01.970 2 3 2072 SEND +2024-07-30 12:00:01.971 3 0 2074 RECEIVE +2024-07-30 12:00:01.972 1 3 2076 SEND +2024-07-30 12:00:01.973 2 0 2078 RECEIVE +2024-07-30 12:00:01.974 0 2 2080 SEND +2024-07-30 12:00:01.975 3 1 2082 RECEIVE +2024-07-30 12:00:01.976 1 0 2084 SEND +2024-07-30 12:00:01.977 2 1 2086 RECEIVE +2024-07-30 12:00:01.978 3 2 2088 SEND +2024-07-30 12:00:01.979 0 3 2090 RECEIVE +2024-07-30 12:00:01.980 2 0 2092 SEND +2024-07-30 12:00:01.981 1 3 2094 RECEIVE +2024-07-30 12:00:01.982 0 1 2096 SEND +2024-07-30 12:00:01.983 3 2 2098 RECEIVE +2024-07-30 12:00:01.984 0 1 2084 SEND +2024-07-30 12:00:01.985 1 2 2086 RECEIVE +2024-07-30 12:00:01.986 2 3 2088 SEND +2024-07-30 12:00:01.987 3 0 2090 RECEIVE +2024-07-30 12:00:01.988 1 3 2092 SEND +2024-07-30 12:00:01.989 2 0 2094 RECEIVE +2024-07-30 12:00:01.990 0 2 2096 SEND +2024-07-30 12:00:01.991 3 1 2098 RECEIVE +2024-07-30 12:00:01.992 1 0 2100 SEND +2024-07-30 12:00:01.993 2 1 2102 RECEIVE +2024-07-30 12:00:01.994 3 2 2104 SEND +2024-07-30 12:00:01.995 0 3 2106 RECEIVE +2024-07-30 12:00:01.996 2 0 2108 SEND +2024-07-30 12:00:01.997 1 3 2110 RECEIVE +2024-07-30 12:00:01.998 0 1 2112 SEND +2024-07-30 12:00:01.999 3 2 2114 RECEIVE +2024-07-30 12:00:02.000 0 1 2100 SEND +2024-07-30 12:00:02.001 1 2 2102 RECEIVE +2024-07-30 12:00:02.002 2 3 2104 SEND +2024-07-30 12:00:02.003 3 0 2106 RECEIVE +2024-07-30 12:00:02.004 1 3 2108 SEND +2024-07-30 12:00:02.005 2 0 2110 RECEIVE +2024-07-30 12:00:02.006 0 2 2112 SEND +2024-07-30 12:00:02.007 3 1 2114 RECEIVE +2024-07-30 12:00:02.008 1 0 2116 SEND +2024-07-30 12:00:02.009 2 1 2118 RECEIVE +2024-07-30 12:00:02.010 3 2 2120 SEND +2024-07-30 12:00:02.011 0 3 2122 RECEIVE +2024-07-30 12:00:02.012 2 0 2124 SEND +2024-07-30 12:00:02.013 1 3 2126 RECEIVE +2024-07-30 12:00:02.014 0 1 2128 SEND +2024-07-30 12:00:02.015 3 2 2130 RECEIVE +2024-07-30 12:00:02.016 0 1 2116 SEND +2024-07-30 12:00:02.017 1 2 2118 RECEIVE +2024-07-30 12:00:02.018 2 3 2120 SEND +2024-07-30 12:00:02.019 3 0 2122 RECEIVE +2024-07-30 12:00:02.020 1 3 2124 SEND +2024-07-30 12:00:02.021 2 0 2126 RECEIVE +2024-07-30 12:00:02.022 0 2 2128 SEND +2024-07-30 12:00:02.023 3 1 2130 RECEIVE +2024-07-30 12:00:02.024 1 0 2132 SEND +2024-07-30 12:00:02.025 2 1 2134 RECEIVE +2024-07-30 12:00:02.026 3 2 2136 SEND +2024-07-30 12:00:02.027 0 3 2138 RECEIVE +2024-07-30 12:00:02.028 2 0 2140 SEND +2024-07-30 12:00:02.029 1 3 2142 RECEIVE +2024-07-30 12:00:02.030 0 1 2144 SEND +2024-07-30 12:00:02.031 3 2 2146 RECEIVE +2024-07-30 12:00:02.032 0 1 2132 SEND +2024-07-30 12:00:02.033 1 2 2134 RECEIVE +2024-07-30 12:00:02.034 2 3 2136 SEND +2024-07-30 12:00:02.035 3 0 2138 RECEIVE +2024-07-30 12:00:02.036 1 3 2140 SEND +2024-07-30 12:00:02.037 2 0 2142 RECEIVE +2024-07-30 12:00:02.038 0 2 2144 SEND +2024-07-30 12:00:02.039 3 1 2146 RECEIVE +2024-07-30 12:00:02.040 1 0 2148 SEND +2024-07-30 12:00:02.041 2 1 2150 RECEIVE +2024-07-30 12:00:02.042 3 2 2152 SEND +2024-07-30 12:00:02.043 0 3 2154 RECEIVE +2024-07-30 12:00:02.044 2 0 2156 SEND +2024-07-30 12:00:02.045 1 3 2158 RECEIVE +2024-07-30 12:00:02.046 0 1 2160 SEND +2024-07-30 12:00:02.047 3 2 2162 RECEIVE +2024-07-30 12:00:02.048 0 1 2148 SEND +2024-07-30 12:00:02.049 1 2 2150 RECEIVE +2024-07-30 12:00:02.050 2 3 2152 SEND +2024-07-30 12:00:02.051 3 0 2154 RECEIVE +2024-07-30 12:00:02.052 1 3 2156 SEND +2024-07-30 12:00:02.053 2 0 2158 RECEIVE +2024-07-30 12:00:02.054 0 2 2160 SEND +2024-07-30 12:00:02.055 3 1 2162 RECEIVE +2024-07-30 12:00:02.056 1 0 2164 SEND +2024-07-30 12:00:02.057 2 1 2166 RECEIVE +2024-07-30 12:00:02.058 3 2 2168 SEND +2024-07-30 12:00:02.059 0 3 2170 RECEIVE +2024-07-30 12:00:02.060 2 0 2172 SEND +2024-07-30 12:00:02.061 1 3 2174 RECEIVE +2024-07-30 12:00:02.062 0 1 2176 SEND +2024-07-30 12:00:02.063 3 2 2178 RECEIVE +2024-07-30 12:00:02.064 0 1 2164 SEND +2024-07-30 12:00:02.065 1 2 2166 RECEIVE +2024-07-30 12:00:02.066 2 3 2168 SEND +2024-07-30 12:00:02.067 3 0 2170 RECEIVE +2024-07-30 12:00:02.068 1 3 2172 SEND +2024-07-30 12:00:02.069 2 0 2174 RECEIVE +2024-07-30 12:00:02.070 0 2 2176 SEND +2024-07-30 12:00:02.071 3 1 2178 RECEIVE +2024-07-30 12:00:02.072 1 0 2180 SEND +2024-07-30 12:00:02.073 2 1 2182 RECEIVE +2024-07-30 12:00:02.074 3 2 2184 SEND +2024-07-30 12:00:02.075 0 3 2186 RECEIVE +2024-07-30 12:00:02.076 2 0 2188 SEND +2024-07-30 12:00:02.077 1 3 2190 RECEIVE +2024-07-30 12:00:02.078 0 1 2192 SEND +2024-07-30 12:00:02.079 3 2 2194 RECEIVE +2024-07-30 12:00:02.080 0 1 2180 SEND +2024-07-30 12:00:02.081 1 2 2182 RECEIVE +2024-07-30 12:00:02.082 2 3 2184 SEND +2024-07-30 12:00:02.083 3 0 2186 RECEIVE +2024-07-30 12:00:02.084 1 3 2188 SEND +2024-07-30 12:00:02.085 2 0 2190 RECEIVE +2024-07-30 12:00:02.086 0 2 2192 SEND +2024-07-30 12:00:02.087 3 1 2194 RECEIVE +2024-07-30 12:00:02.088 1 0 2196 SEND +2024-07-30 12:00:02.089 2 1 2198 RECEIVE +2024-07-30 12:00:02.090 3 2 2200 SEND +2024-07-30 12:00:02.091 0 3 2202 RECEIVE +2024-07-30 12:00:02.092 2 0 2204 SEND +2024-07-30 12:00:02.093 1 3 2206 RECEIVE +2024-07-30 12:00:02.094 0 1 2208 SEND +2024-07-30 12:00:02.095 3 2 2210 RECEIVE +2024-07-30 12:00:02.096 0 1 2196 SEND +2024-07-30 12:00:02.097 1 2 2198 RECEIVE +2024-07-30 12:00:02.098 2 3 2200 SEND +2024-07-30 12:00:02.099 3 0 2202 RECEIVE +2024-07-30 12:00:02.100 1 3 2204 SEND +2024-07-30 12:00:02.101 2 0 2206 RECEIVE +2024-07-30 12:00:02.102 0 2 2208 SEND +2024-07-30 12:00:02.103 3 1 2210 RECEIVE +2024-07-30 12:00:02.104 1 0 2212 SEND +2024-07-30 12:00:02.105 2 1 2214 RECEIVE +2024-07-30 12:00:02.106 3 2 2216 SEND +2024-07-30 12:00:02.107 0 3 2218 RECEIVE +2024-07-30 12:00:02.108 2 0 2220 SEND +2024-07-30 12:00:02.109 1 3 2222 RECEIVE +2024-07-30 12:00:02.110 0 1 2224 SEND +2024-07-30 12:00:02.111 3 2 2226 RECEIVE +2024-07-30 12:00:02.112 0 1 2212 SEND +2024-07-30 12:00:02.113 1 2 2214 RECEIVE +2024-07-30 12:00:02.114 2 3 2216 SEND +2024-07-30 12:00:02.115 3 0 2218 RECEIVE +2024-07-30 12:00:02.116 1 3 2220 SEND +2024-07-30 12:00:02.117 2 0 2222 RECEIVE +2024-07-30 12:00:02.118 0 2 2224 SEND +2024-07-30 12:00:02.119 3 1 2226 RECEIVE +2024-07-30 12:00:02.120 1 0 2228 SEND +2024-07-30 12:00:02.121 2 1 2230 RECEIVE +2024-07-30 12:00:02.122 3 2 2232 SEND +2024-07-30 12:00:02.123 0 3 2234 RECEIVE +2024-07-30 12:00:02.124 2 0 2236 SEND +2024-07-30 12:00:02.125 1 3 2238 RECEIVE +2024-07-30 12:00:02.126 0 1 2240 SEND +2024-07-30 12:00:02.127 3 2 2242 RECEIVE +2024-07-30 12:00:02.128 0 1 2228 SEND +2024-07-30 12:00:02.129 1 2 2230 RECEIVE +2024-07-30 12:00:02.130 2 3 2232 SEND +2024-07-30 12:00:02.131 3 0 2234 RECEIVE +2024-07-30 12:00:02.132 1 3 2236 SEND +2024-07-30 12:00:02.133 2 0 2238 RECEIVE +2024-07-30 12:00:02.134 0 2 2240 SEND +2024-07-30 12:00:02.135 3 1 2242 RECEIVE +2024-07-30 12:00:02.136 1 0 2244 SEND +2024-07-30 12:00:02.137 2 1 2246 RECEIVE +2024-07-30 12:00:02.138 3 2 2248 SEND +2024-07-30 12:00:02.139 0 3 2250 RECEIVE +2024-07-30 12:00:02.140 2 0 2252 SEND +2024-07-30 12:00:02.141 1 3 2254 RECEIVE +2024-07-30 12:00:02.142 0 1 2256 SEND +2024-07-30 12:00:02.143 3 2 2258 RECEIVE +2024-07-30 12:00:02.144 0 1 2244 SEND +2024-07-30 12:00:02.145 1 2 2246 RECEIVE +2024-07-30 12:00:02.146 2 3 2248 SEND +2024-07-30 12:00:02.147 3 0 2250 RECEIVE +2024-07-30 12:00:02.148 1 3 2252 SEND +2024-07-30 12:00:02.149 2 0 2254 RECEIVE +2024-07-30 12:00:02.150 0 2 2256 SEND +2024-07-30 12:00:02.151 3 1 2258 RECEIVE +2024-07-30 12:00:02.152 1 0 2260 SEND +2024-07-30 12:00:02.153 2 1 2262 RECEIVE +2024-07-30 12:00:02.154 3 2 2264 SEND +2024-07-30 12:00:02.155 0 3 2266 RECEIVE +2024-07-30 12:00:02.156 2 0 2268 SEND +2024-07-30 12:00:02.157 1 3 2270 RECEIVE +2024-07-30 12:00:02.158 0 1 2272 SEND +2024-07-30 12:00:02.159 3 2 2274 RECEIVE +2024-07-30 12:00:02.160 0 1 2260 SEND +2024-07-30 12:00:02.161 1 2 2262 RECEIVE +2024-07-30 12:00:02.162 2 3 2264 SEND +2024-07-30 12:00:02.163 3 0 2266 RECEIVE +2024-07-30 12:00:02.164 1 3 2268 SEND +2024-07-30 12:00:02.165 2 0 2270 RECEIVE +2024-07-30 12:00:02.166 0 2 2272 SEND +2024-07-30 12:00:02.167 3 1 2274 RECEIVE +2024-07-30 12:00:02.168 1 0 2276 SEND +2024-07-30 12:00:02.169 2 1 2278 RECEIVE +2024-07-30 12:00:02.170 3 2 2280 SEND +2024-07-30 12:00:02.171 0 3 2282 RECEIVE +2024-07-30 12:00:02.172 2 0 2284 SEND +2024-07-30 12:00:02.173 1 3 2286 RECEIVE +2024-07-30 12:00:02.174 0 1 2288 SEND +2024-07-30 12:00:02.175 3 2 2290 RECEIVE +2024-07-30 12:00:02.176 0 1 2276 SEND +2024-07-30 12:00:02.177 1 2 2278 RECEIVE +2024-07-30 12:00:02.178 2 3 2280 SEND +2024-07-30 12:00:02.179 3 0 2282 RECEIVE +2024-07-30 12:00:02.180 1 3 2284 SEND +2024-07-30 12:00:02.181 2 0 2286 RECEIVE +2024-07-30 12:00:02.182 0 2 2288 SEND +2024-07-30 12:00:02.183 3 1 2290 RECEIVE +2024-07-30 12:00:02.184 1 0 2292 SEND +2024-07-30 12:00:02.185 2 1 2294 RECEIVE +2024-07-30 12:00:02.186 3 2 2296 SEND +2024-07-30 12:00:02.187 0 3 2298 RECEIVE +2024-07-30 12:00:02.188 2 0 2300 SEND +2024-07-30 12:00:02.189 1 3 2302 RECEIVE +2024-07-30 12:00:02.190 0 1 2304 SEND +2024-07-30 12:00:02.191 3 2 2306 RECEIVE +2024-07-30 12:00:02.192 0 1 2292 SEND +2024-07-30 12:00:02.193 1 2 2294 RECEIVE +2024-07-30 12:00:02.194 2 3 2296 SEND +2024-07-30 12:00:02.195 3 0 2298 RECEIVE +2024-07-30 12:00:02.196 1 3 2300 SEND +2024-07-30 12:00:02.197 2 0 2302 RECEIVE +2024-07-30 12:00:02.198 0 2 2304 SEND +2024-07-30 12:00:02.199 3 1 2306 RECEIVE +2024-07-30 12:00:02.200 1 0 2308 SEND +2024-07-30 12:00:02.201 2 1 2310 RECEIVE +2024-07-30 12:00:02.202 3 2 2312 SEND +2024-07-30 12:00:02.203 0 3 2314 RECEIVE +2024-07-30 12:00:02.204 2 0 2316 SEND +2024-07-30 12:00:02.205 1 3 2318 RECEIVE +2024-07-30 12:00:02.206 0 1 2320 SEND +2024-07-30 12:00:02.207 3 2 2322 RECEIVE +2024-07-30 12:00:02.208 0 1 2308 SEND +2024-07-30 12:00:02.209 1 2 2310 RECEIVE +2024-07-30 12:00:02.210 2 3 2312 SEND +2024-07-30 12:00:02.211 3 0 2314 RECEIVE +2024-07-30 12:00:02.212 1 3 2316 SEND +2024-07-30 12:00:02.213 2 0 2318 RECEIVE +2024-07-30 12:00:02.214 0 2 2320 SEND +2024-07-30 12:00:02.215 3 1 2322 RECEIVE +2024-07-30 12:00:02.216 1 0 2324 SEND +2024-07-30 12:00:02.217 2 1 2326 RECEIVE +2024-07-30 12:00:02.218 3 2 2328 SEND +2024-07-30 12:00:02.219 0 3 2330 RECEIVE +2024-07-30 12:00:02.220 2 0 2332 SEND +2024-07-30 12:00:02.221 1 3 2334 RECEIVE +2024-07-30 12:00:02.222 0 1 2336 SEND +2024-07-30 12:00:02.223 3 2 2338 RECEIVE +2024-07-30 12:00:02.224 0 1 2324 SEND +2024-07-30 12:00:02.225 1 2 2326 RECEIVE +2024-07-30 12:00:02.226 2 3 2328 SEND +2024-07-30 12:00:02.227 3 0 2330 RECEIVE +2024-07-30 12:00:02.228 1 3 2332 SEND +2024-07-30 12:00:02.229 2 0 2334 RECEIVE +2024-07-30 12:00:02.230 0 2 2336 SEND +2024-07-30 12:00:02.231 3 1 2338 RECEIVE +2024-07-30 12:00:02.232 1 0 2340 SEND +2024-07-30 12:00:02.233 2 1 2342 RECEIVE +2024-07-30 12:00:02.234 3 2 2344 SEND +2024-07-30 12:00:02.235 0 3 2346 RECEIVE +2024-07-30 12:00:02.236 2 0 2348 SEND +2024-07-30 12:00:02.237 1 3 2350 RECEIVE +2024-07-30 12:00:02.238 0 1 2352 SEND +2024-07-30 12:00:02.239 3 2 2354 RECEIVE +2024-07-30 12:00:02.240 0 1 2340 SEND +2024-07-30 12:00:02.241 1 2 2342 RECEIVE +2024-07-30 12:00:02.242 2 3 2344 SEND +2024-07-30 12:00:02.243 3 0 2346 RECEIVE +2024-07-30 12:00:02.244 1 3 2348 SEND +2024-07-30 12:00:02.245 2 0 2350 RECEIVE +2024-07-30 12:00:02.246 0 2 2352 SEND +2024-07-30 12:00:02.247 3 1 2354 RECEIVE +2024-07-30 12:00:02.248 1 0 2356 SEND +2024-07-30 12:00:02.249 2 1 2358 RECEIVE +2024-07-30 12:00:02.250 3 2 2360 SEND +2024-07-30 12:00:02.251 0 3 2362 RECEIVE +2024-07-30 12:00:02.252 2 0 2364 SEND +2024-07-30 12:00:02.253 1 3 2366 RECEIVE +2024-07-30 12:00:02.254 0 1 2368 SEND +2024-07-30 12:00:02.255 3 2 2370 RECEIVE +2024-07-30 12:00:02.256 0 1 2356 SEND +2024-07-30 12:00:02.257 1 2 2358 RECEIVE +2024-07-30 12:00:02.258 2 3 2360 SEND +2024-07-30 12:00:02.259 3 0 2362 RECEIVE +2024-07-30 12:00:02.260 1 3 2364 SEND +2024-07-30 12:00:02.261 2 0 2366 RECEIVE +2024-07-30 12:00:02.262 0 2 2368 SEND +2024-07-30 12:00:02.263 3 1 2370 RECEIVE +2024-07-30 12:00:02.264 1 0 2372 SEND +2024-07-30 12:00:02.265 2 1 2374 RECEIVE +2024-07-30 12:00:02.266 3 2 2376 SEND +2024-07-30 12:00:02.267 0 3 2378 RECEIVE +2024-07-30 12:00:02.268 2 0 2380 SEND +2024-07-30 12:00:02.269 1 3 2382 RECEIVE +2024-07-30 12:00:02.270 0 1 2384 SEND +2024-07-30 12:00:02.271 3 2 2386 RECEIVE +2024-07-30 12:00:02.272 0 1 2372 SEND +2024-07-30 12:00:02.273 1 2 2374 RECEIVE +2024-07-30 12:00:02.274 2 3 2376 SEND +2024-07-30 12:00:02.275 3 0 2378 RECEIVE +2024-07-30 12:00:02.276 1 3 2380 SEND +2024-07-30 12:00:02.277 2 0 2382 RECEIVE +2024-07-30 12:00:02.278 0 2 2384 SEND +2024-07-30 12:00:02.279 3 1 2386 RECEIVE +2024-07-30 12:00:02.280 1 0 2388 SEND +2024-07-30 12:00:02.281 2 1 2390 RECEIVE +2024-07-30 12:00:02.282 3 2 2392 SEND +2024-07-30 12:00:02.283 0 3 2394 RECEIVE +2024-07-30 12:00:02.284 2 0 2396 SEND +2024-07-30 12:00:02.285 1 3 2398 RECEIVE +2024-07-30 12:00:02.286 0 1 2400 SEND +2024-07-30 12:00:02.287 3 2 2402 RECEIVE +2024-07-30 12:00:02.288 0 1 2388 SEND +2024-07-30 12:00:02.289 1 2 2390 RECEIVE +2024-07-30 12:00:02.290 2 3 2392 SEND +2024-07-30 12:00:02.291 3 0 2394 RECEIVE +2024-07-30 12:00:02.292 1 3 2396 SEND +2024-07-30 12:00:02.293 2 0 2398 RECEIVE +2024-07-30 12:00:02.294 0 2 2400 SEND +2024-07-30 12:00:02.295 3 1 2402 RECEIVE +2024-07-30 12:00:02.296 1 0 2404 SEND +2024-07-30 12:00:02.297 2 1 2406 RECEIVE +2024-07-30 12:00:02.298 3 2 2408 SEND +2024-07-30 12:00:02.299 0 3 2410 RECEIVE +2024-07-30 12:00:02.300 2 0 2412 SEND +2024-07-30 12:00:02.301 1 3 2414 RECEIVE +2024-07-30 12:00:02.302 0 1 2416 SEND +2024-07-30 12:00:02.303 3 2 2418 RECEIVE +2024-07-30 12:00:02.304 0 1 2404 SEND +2024-07-30 12:00:02.305 1 2 2406 RECEIVE +2024-07-30 12:00:02.306 2 3 2408 SEND +2024-07-30 12:00:02.307 3 0 2410 RECEIVE +2024-07-30 12:00:02.308 1 3 2412 SEND +2024-07-30 12:00:02.309 2 0 2414 RECEIVE +2024-07-30 12:00:02.310 0 2 2416 SEND +2024-07-30 12:00:02.311 3 1 2418 RECEIVE +2024-07-30 12:00:02.312 1 0 2420 SEND +2024-07-30 12:00:02.313 2 1 2422 RECEIVE +2024-07-30 12:00:02.314 3 2 2424 SEND +2024-07-30 12:00:02.315 0 3 2426 RECEIVE +2024-07-30 12:00:02.316 2 0 2428 SEND +2024-07-30 12:00:02.317 1 3 2430 RECEIVE +2024-07-30 12:00:02.318 0 1 2432 SEND +2024-07-30 12:00:02.319 3 2 2434 RECEIVE +2024-07-30 12:00:02.320 0 1 2420 SEND +2024-07-30 12:00:02.321 1 2 2422 RECEIVE +2024-07-30 12:00:02.322 2 3 2424 SEND +2024-07-30 12:00:02.323 3 0 2426 RECEIVE +2024-07-30 12:00:02.324 1 3 2428 SEND +2024-07-30 12:00:02.325 2 0 2430 RECEIVE +2024-07-30 12:00:02.326 0 2 2432 SEND +2024-07-30 12:00:02.327 3 1 2434 RECEIVE +2024-07-30 12:00:02.328 1 0 2436 SEND +2024-07-30 12:00:02.329 2 1 2438 RECEIVE +2024-07-30 12:00:02.330 3 2 2440 SEND +2024-07-30 12:00:02.331 0 3 2442 RECEIVE +2024-07-30 12:00:02.332 2 0 2444 SEND +2024-07-30 12:00:02.333 1 3 2446 RECEIVE +2024-07-30 12:00:02.334 0 1 2448 SEND +2024-07-30 12:00:02.335 3 2 2450 RECEIVE +2024-07-30 12:00:02.336 0 1 2436 SEND +2024-07-30 12:00:02.337 1 2 2438 RECEIVE +2024-07-30 12:00:02.338 2 3 2440 SEND +2024-07-30 12:00:02.339 3 0 2442 RECEIVE +2024-07-30 12:00:02.340 1 3 2444 SEND +2024-07-30 12:00:02.341 2 0 2446 RECEIVE +2024-07-30 12:00:02.342 0 2 2448 SEND +2024-07-30 12:00:02.343 3 1 2450 RECEIVE +2024-07-30 12:00:02.344 1 0 2452 SEND +2024-07-30 12:00:02.345 2 1 2454 RECEIVE +2024-07-30 12:00:02.346 3 2 2456 SEND +2024-07-30 12:00:02.347 0 3 2458 RECEIVE +2024-07-30 12:00:02.348 2 0 2460 SEND +2024-07-30 12:00:02.349 1 3 2462 RECEIVE +2024-07-30 12:00:02.350 0 1 2464 SEND +2024-07-30 12:00:02.351 3 2 2466 RECEIVE +2024-07-30 12:00:02.352 0 1 2452 SEND +2024-07-30 12:00:02.353 1 2 2454 RECEIVE +2024-07-30 12:00:02.354 2 3 2456 SEND +2024-07-30 12:00:02.355 3 0 2458 RECEIVE +2024-07-30 12:00:02.356 1 3 2460 SEND +2024-07-30 12:00:02.357 2 0 2462 RECEIVE +2024-07-30 12:00:02.358 0 2 2464 SEND +2024-07-30 12:00:02.359 3 1 2466 RECEIVE +2024-07-30 12:00:02.360 1 0 2468 SEND +2024-07-30 12:00:02.361 2 1 2470 RECEIVE +2024-07-30 12:00:02.362 3 2 2472 SEND +2024-07-30 12:00:02.363 0 3 2474 RECEIVE +2024-07-30 12:00:02.364 2 0 2476 SEND +2024-07-30 12:00:02.365 1 3 2478 RECEIVE +2024-07-30 12:00:02.366 0 1 2480 SEND +2024-07-30 12:00:02.367 3 2 2482 RECEIVE +2024-07-30 12:00:02.368 0 1 2468 SEND +2024-07-30 12:00:02.369 1 2 2470 RECEIVE +2024-07-30 12:00:02.370 2 3 2472 SEND +2024-07-30 12:00:02.371 3 0 2474 RECEIVE +2024-07-30 12:00:02.372 1 3 2476 SEND +2024-07-30 12:00:02.373 2 0 2478 RECEIVE +2024-07-30 12:00:02.374 0 2 2480 SEND +2024-07-30 12:00:02.375 3 1 2482 RECEIVE +2024-07-30 12:00:02.376 1 0 2484 SEND +2024-07-30 12:00:02.377 2 1 2486 RECEIVE +2024-07-30 12:00:02.378 3 2 2488 SEND +2024-07-30 12:00:02.379 0 3 2490 RECEIVE +2024-07-30 12:00:02.380 2 0 2492 SEND +2024-07-30 12:00:02.381 1 3 2494 RECEIVE +2024-07-30 12:00:02.382 0 1 2496 SEND +2024-07-30 12:00:02.383 3 2 2498 RECEIVE +2024-07-30 12:00:02.384 0 1 2484 SEND +2024-07-30 12:00:02.385 1 2 2486 RECEIVE +2024-07-30 12:00:02.386 2 3 2488 SEND +2024-07-30 12:00:02.387 3 0 2490 RECEIVE +2024-07-30 12:00:02.388 1 3 2492 SEND +2024-07-30 12:00:02.389 2 0 2494 RECEIVE +2024-07-30 12:00:02.390 0 2 2496 SEND +2024-07-30 12:00:02.391 3 1 2498 RECEIVE +2024-07-30 12:00:02.392 1 0 2500 SEND +2024-07-30 12:00:02.393 2 1 2502 RECEIVE +2024-07-30 12:00:02.394 3 2 2504 SEND +2024-07-30 12:00:02.395 0 3 2506 RECEIVE +2024-07-30 12:00:02.396 2 0 2508 SEND +2024-07-30 12:00:02.397 1 3 2510 RECEIVE +2024-07-30 12:00:02.398 0 1 2512 SEND +2024-07-30 12:00:02.399 3 2 2514 RECEIVE +2024-07-30 12:00:02.400 0 1 2500 SEND +2024-07-30 12:00:02.401 1 2 2502 RECEIVE +2024-07-30 12:00:02.402 2 3 2504 SEND +2024-07-30 12:00:02.403 3 0 2506 RECEIVE +2024-07-30 12:00:02.404 1 3 2508 SEND +2024-07-30 12:00:02.405 2 0 2510 RECEIVE +2024-07-30 12:00:02.406 0 2 2512 SEND +2024-07-30 12:00:02.407 3 1 2514 RECEIVE +2024-07-30 12:00:02.408 1 0 2516 SEND +2024-07-30 12:00:02.409 2 1 2518 RECEIVE +2024-07-30 12:00:02.410 3 2 2520 SEND +2024-07-30 12:00:02.411 0 3 2522 RECEIVE +2024-07-30 12:00:02.412 2 0 2524 SEND +2024-07-30 12:00:02.413 1 3 2526 RECEIVE +2024-07-30 12:00:02.414 0 1 2528 SEND +2024-07-30 12:00:02.415 3 2 2530 RECEIVE +2024-07-30 12:00:02.416 0 1 2516 SEND +2024-07-30 12:00:02.417 1 2 2518 RECEIVE +2024-07-30 12:00:02.418 2 3 2520 SEND +2024-07-30 12:00:02.419 3 0 2522 RECEIVE +2024-07-30 12:00:02.420 1 3 2524 SEND +2024-07-30 12:00:02.421 2 0 2526 RECEIVE +2024-07-30 12:00:02.422 0 2 2528 SEND +2024-07-30 12:00:02.423 3 1 2530 RECEIVE +2024-07-30 12:00:02.424 1 0 2532 SEND +2024-07-30 12:00:02.425 2 1 2534 RECEIVE +2024-07-30 12:00:02.426 3 2 2536 SEND +2024-07-30 12:00:02.427 0 3 2538 RECEIVE +2024-07-30 12:00:02.428 2 0 2540 SEND +2024-07-30 12:00:02.429 1 3 2542 RECEIVE +2024-07-30 12:00:02.430 0 1 2544 SEND +2024-07-30 12:00:02.431 3 2 2546 RECEIVE +2024-07-30 12:00:02.432 0 1 2532 SEND +2024-07-30 12:00:02.433 1 2 2534 RECEIVE +2024-07-30 12:00:02.434 2 3 2536 SEND +2024-07-30 12:00:02.435 3 0 2538 RECEIVE +2024-07-30 12:00:02.436 1 3 2540 SEND +2024-07-30 12:00:02.437 2 0 2542 RECEIVE +2024-07-30 12:00:02.438 0 2 2544 SEND +2024-07-30 12:00:02.439 3 1 2546 RECEIVE +2024-07-30 12:00:02.440 1 0 2548 SEND +2024-07-30 12:00:02.441 2 1 2550 RECEIVE +2024-07-30 12:00:02.442 3 2 2552 SEND +2024-07-30 12:00:02.443 0 3 2554 RECEIVE +2024-07-30 12:00:02.444 2 0 2556 SEND +2024-07-30 12:00:02.445 1 3 2558 RECEIVE +2024-07-30 12:00:02.446 0 1 2560 SEND +2024-07-30 12:00:02.447 3 2 2562 RECEIVE +2024-07-30 12:00:02.448 0 1 2548 SEND +2024-07-30 12:00:02.449 1 2 2550 RECEIVE +2024-07-30 12:00:02.450 2 3 2552 SEND +2024-07-30 12:00:02.451 3 0 2554 RECEIVE +2024-07-30 12:00:02.452 1 3 2556 SEND +2024-07-30 12:00:02.453 2 0 2558 RECEIVE +2024-07-30 12:00:02.454 0 2 2560 SEND +2024-07-30 12:00:02.455 3 1 2562 RECEIVE +2024-07-30 12:00:02.456 1 0 2564 SEND +2024-07-30 12:00:02.457 2 1 2566 RECEIVE +2024-07-30 12:00:02.458 3 2 2568 SEND +2024-07-30 12:00:02.459 0 3 2570 RECEIVE +2024-07-30 12:00:02.460 2 0 2572 SEND +2024-07-30 12:00:02.461 1 3 2574 RECEIVE +2024-07-30 12:00:02.462 0 1 2576 SEND +2024-07-30 12:00:02.463 3 2 2578 RECEIVE +2024-07-30 12:00:02.464 0 1 2564 SEND +2024-07-30 12:00:02.465 1 2 2566 RECEIVE +2024-07-30 12:00:02.466 2 3 2568 SEND +2024-07-30 12:00:02.467 3 0 2570 RECEIVE +2024-07-30 12:00:02.468 1 3 2572 SEND +2024-07-30 12:00:02.469 2 0 2574 RECEIVE +2024-07-30 12:00:02.470 0 2 2576 SEND +2024-07-30 12:00:02.471 3 1 2578 RECEIVE +2024-07-30 12:00:02.472 1 0 2580 SEND +2024-07-30 12:00:02.473 2 1 2582 RECEIVE +2024-07-30 12:00:02.474 3 2 2584 SEND +2024-07-30 12:00:02.475 0 3 2586 RECEIVE +2024-07-30 12:00:02.476 2 0 2588 SEND +2024-07-30 12:00:02.477 1 3 2590 RECEIVE +2024-07-30 12:00:02.478 0 1 2592 SEND +2024-07-30 12:00:02.479 3 2 2594 RECEIVE +2024-07-30 12:00:02.480 0 1 2580 SEND +2024-07-30 12:00:02.481 1 2 2582 RECEIVE +2024-07-30 12:00:02.482 2 3 2584 SEND +2024-07-30 12:00:02.483 3 0 2586 RECEIVE +2024-07-30 12:00:02.484 1 3 2588 SEND +2024-07-30 12:00:02.485 2 0 2590 RECEIVE +2024-07-30 12:00:02.486 0 2 2592 SEND +2024-07-30 12:00:02.487 3 1 2594 RECEIVE +2024-07-30 12:00:02.488 1 0 2596 SEND +2024-07-30 12:00:02.489 2 1 2598 RECEIVE +2024-07-30 12:00:02.490 3 2 2600 SEND +2024-07-30 12:00:02.491 0 3 2602 RECEIVE +2024-07-30 12:00:02.492 2 0 2604 SEND +2024-07-30 12:00:02.493 1 3 2606 RECEIVE +2024-07-30 12:00:02.494 0 1 2608 SEND +2024-07-30 12:00:02.495 3 2 2610 RECEIVE +2024-07-30 12:00:02.496 0 1 2596 SEND +2024-07-30 12:00:02.497 1 2 2598 RECEIVE +2024-07-30 12:00:02.498 2 3 2600 SEND +2024-07-30 12:00:02.499 3 0 2602 RECEIVE +2024-07-30 12:00:02.500 1 3 2604 SEND +2024-07-30 12:00:02.501 2 0 2606 RECEIVE +2024-07-30 12:00:02.502 0 2 2608 SEND +2024-07-30 12:00:02.503 3 1 2610 RECEIVE +2024-07-30 12:00:02.504 1 0 2612 SEND +2024-07-30 12:00:02.505 2 1 2614 RECEIVE +2024-07-30 12:00:02.506 3 2 2616 SEND +2024-07-30 12:00:02.507 0 3 2618 RECEIVE +2024-07-30 12:00:02.508 2 0 2620 SEND +2024-07-30 12:00:02.509 1 3 2622 RECEIVE +2024-07-30 12:00:02.510 0 1 2624 SEND +2024-07-30 12:00:02.511 3 2 2626 RECEIVE +2024-07-30 12:00:02.512 0 1 2612 SEND +2024-07-30 12:00:02.513 1 2 2614 RECEIVE +2024-07-30 12:00:02.514 2 3 2616 SEND +2024-07-30 12:00:02.515 3 0 2618 RECEIVE +2024-07-30 12:00:02.516 1 3 2620 SEND +2024-07-30 12:00:02.517 2 0 2622 RECEIVE +2024-07-30 12:00:02.518 0 2 2624 SEND +2024-07-30 12:00:02.519 3 1 2626 RECEIVE +2024-07-30 12:00:02.520 1 0 2628 SEND +2024-07-30 12:00:02.521 2 1 2630 RECEIVE +2024-07-30 12:00:02.522 3 2 2632 SEND +2024-07-30 12:00:02.523 0 3 2634 RECEIVE +2024-07-30 12:00:02.524 2 0 2636 SEND +2024-07-30 12:00:02.525 1 3 2638 RECEIVE +2024-07-30 12:00:02.526 0 1 2640 SEND +2024-07-30 12:00:02.527 3 2 2642 RECEIVE +2024-07-30 12:00:02.528 0 1 2628 SEND +2024-07-30 12:00:02.529 1 2 2630 RECEIVE +2024-07-30 12:00:02.530 2 3 2632 SEND +2024-07-30 12:00:02.531 3 0 2634 RECEIVE +2024-07-30 12:00:02.532 1 3 2636 SEND +2024-07-30 12:00:02.533 2 0 2638 RECEIVE +2024-07-30 12:00:02.534 0 2 2640 SEND +2024-07-30 12:00:02.535 3 1 2642 RECEIVE +2024-07-30 12:00:02.536 1 0 2644 SEND +2024-07-30 12:00:02.537 2 1 2646 RECEIVE +2024-07-30 12:00:02.538 3 2 2648 SEND +2024-07-30 12:00:02.539 0 3 2650 RECEIVE +2024-07-30 12:00:02.540 2 0 2652 SEND +2024-07-30 12:00:02.541 1 3 2654 RECEIVE +2024-07-30 12:00:02.542 0 1 2656 SEND +2024-07-30 12:00:02.543 3 2 2658 RECEIVE +2024-07-30 12:00:02.544 0 1 2644 SEND +2024-07-30 12:00:02.545 1 2 2646 RECEIVE +2024-07-30 12:00:02.546 2 3 2648 SEND +2024-07-30 12:00:02.547 3 0 2650 RECEIVE +2024-07-30 12:00:02.548 1 3 2652 SEND +2024-07-30 12:00:02.549 2 0 2654 RECEIVE +2024-07-30 12:00:02.550 0 2 2656 SEND +2024-07-30 12:00:02.551 3 1 2658 RECEIVE +2024-07-30 12:00:02.552 1 0 2660 SEND +2024-07-30 12:00:02.553 2 1 2662 RECEIVE +2024-07-30 12:00:02.554 3 2 2664 SEND +2024-07-30 12:00:02.555 0 3 2666 RECEIVE +2024-07-30 12:00:02.556 2 0 2668 SEND +2024-07-30 12:00:02.557 1 3 2670 RECEIVE +2024-07-30 12:00:02.558 0 1 2672 SEND +2024-07-30 12:00:02.559 3 2 2674 RECEIVE +2024-07-30 12:00:02.560 0 1 2660 SEND +2024-07-30 12:00:02.561 1 2 2662 RECEIVE +2024-07-30 12:00:02.562 2 3 2664 SEND +2024-07-30 12:00:02.563 3 0 2666 RECEIVE +2024-07-30 12:00:02.564 1 3 2668 SEND +2024-07-30 12:00:02.565 2 0 2670 RECEIVE +2024-07-30 12:00:02.566 0 2 2672 SEND +2024-07-30 12:00:02.567 3 1 2674 RECEIVE +2024-07-30 12:00:02.568 1 0 2676 SEND +2024-07-30 12:00:02.569 2 1 2678 RECEIVE +2024-07-30 12:00:02.570 3 2 2680 SEND +2024-07-30 12:00:02.571 0 3 2682 RECEIVE +2024-07-30 12:00:02.572 2 0 2684 SEND +2024-07-30 12:00:02.573 1 3 2686 RECEIVE +2024-07-30 12:00:02.574 0 1 2688 SEND +2024-07-30 12:00:02.575 3 2 2690 RECEIVE +2024-07-30 12:00:02.576 0 1 2676 SEND +2024-07-30 12:00:02.577 1 2 2678 RECEIVE +2024-07-30 12:00:02.578 2 3 2680 SEND +2024-07-30 12:00:02.579 3 0 2682 RECEIVE +2024-07-30 12:00:02.580 1 3 2684 SEND +2024-07-30 12:00:02.581 2 0 2686 RECEIVE +2024-07-30 12:00:02.582 0 2 2688 SEND +2024-07-30 12:00:02.583 3 1 2690 RECEIVE +2024-07-30 12:00:02.584 1 0 2692 SEND +2024-07-30 12:00:02.585 2 1 2694 RECEIVE +2024-07-30 12:00:02.586 3 2 2696 SEND +2024-07-30 12:00:02.587 0 3 2698 RECEIVE +2024-07-30 12:00:02.588 2 0 2700 SEND +2024-07-30 12:00:02.589 1 3 2702 RECEIVE +2024-07-30 12:00:02.590 0 1 2704 SEND +2024-07-30 12:00:02.591 3 2 2706 RECEIVE +2024-07-30 12:00:02.592 0 1 2692 SEND +2024-07-30 12:00:02.593 1 2 2694 RECEIVE +2024-07-30 12:00:02.594 2 3 2696 SEND +2024-07-30 12:00:02.595 3 0 2698 RECEIVE +2024-07-30 12:00:02.596 1 3 2700 SEND +2024-07-30 12:00:02.597 2 0 2702 RECEIVE +2024-07-30 12:00:02.598 0 2 2704 SEND +2024-07-30 12:00:02.599 3 1 2706 RECEIVE +2024-07-30 12:00:02.600 1 0 2708 SEND +2024-07-30 12:00:02.601 2 1 2710 RECEIVE +2024-07-30 12:00:02.602 3 2 2712 SEND +2024-07-30 12:00:02.603 0 3 2714 RECEIVE +2024-07-30 12:00:02.604 2 0 2716 SEND +2024-07-30 12:00:02.605 1 3 2718 RECEIVE +2024-07-30 12:00:02.606 0 1 2720 SEND +2024-07-30 12:00:02.607 3 2 2722 RECEIVE +2024-07-30 12:00:02.608 0 1 2708 SEND +2024-07-30 12:00:02.609 1 2 2710 RECEIVE +2024-07-30 12:00:02.610 2 3 2712 SEND +2024-07-30 12:00:02.611 3 0 2714 RECEIVE +2024-07-30 12:00:02.612 1 3 2716 SEND +2024-07-30 12:00:02.613 2 0 2718 RECEIVE +2024-07-30 12:00:02.614 0 2 2720 SEND +2024-07-30 12:00:02.615 3 1 2722 RECEIVE +2024-07-30 12:00:02.616 1 0 2724 SEND +2024-07-30 12:00:02.617 2 1 2726 RECEIVE +2024-07-30 12:00:02.618 3 2 2728 SEND +2024-07-30 12:00:02.619 0 3 2730 RECEIVE +2024-07-30 12:00:02.620 2 0 2732 SEND +2024-07-30 12:00:02.621 1 3 2734 RECEIVE +2024-07-30 12:00:02.622 0 1 2736 SEND +2024-07-30 12:00:02.623 3 2 2738 RECEIVE +2024-07-30 12:00:02.624 0 1 2724 SEND +2024-07-30 12:00:02.625 1 2 2726 RECEIVE +2024-07-30 12:00:02.626 2 3 2728 SEND +2024-07-30 12:00:02.627 3 0 2730 RECEIVE +2024-07-30 12:00:02.628 1 3 2732 SEND +2024-07-30 12:00:02.629 2 0 2734 RECEIVE +2024-07-30 12:00:02.630 0 2 2736 SEND +2024-07-30 12:00:02.631 3 1 2738 RECEIVE +2024-07-30 12:00:02.632 1 0 2740 SEND +2024-07-30 12:00:02.633 2 1 2742 RECEIVE +2024-07-30 12:00:02.634 3 2 2744 SEND +2024-07-30 12:00:02.635 0 3 2746 RECEIVE +2024-07-30 12:00:02.636 2 0 2748 SEND +2024-07-30 12:00:02.637 1 3 2750 RECEIVE +2024-07-30 12:00:02.638 0 1 2752 SEND +2024-07-30 12:00:02.639 3 2 2754 RECEIVE +2024-07-30 12:00:02.640 0 1 2740 SEND +2024-07-30 12:00:02.641 1 2 2742 RECEIVE +2024-07-30 12:00:02.642 2 3 2744 SEND +2024-07-30 12:00:02.643 3 0 2746 RECEIVE +2024-07-30 12:00:02.644 1 3 2748 SEND +2024-07-30 12:00:02.645 2 0 2750 RECEIVE +2024-07-30 12:00:02.646 0 2 2752 SEND +2024-07-30 12:00:02.647 3 1 2754 RECEIVE +2024-07-30 12:00:02.648 1 0 2756 SEND +2024-07-30 12:00:02.649 2 1 2758 RECEIVE +2024-07-30 12:00:02.650 3 2 2760 SEND +2024-07-30 12:00:02.651 0 3 2762 RECEIVE +2024-07-30 12:00:02.652 2 0 2764 SEND +2024-07-30 12:00:02.653 1 3 2766 RECEIVE +2024-07-30 12:00:02.654 0 1 2768 SEND +2024-07-30 12:00:02.655 3 2 2770 RECEIVE +2024-07-30 12:00:02.656 0 1 2756 SEND +2024-07-30 12:00:02.657 1 2 2758 RECEIVE +2024-07-30 12:00:02.658 2 3 2760 SEND +2024-07-30 12:00:02.659 3 0 2762 RECEIVE +2024-07-30 12:00:02.660 1 3 2764 SEND +2024-07-30 12:00:02.661 2 0 2766 RECEIVE +2024-07-30 12:00:02.662 0 2 2768 SEND +2024-07-30 12:00:02.663 3 1 2770 RECEIVE +2024-07-30 12:00:02.664 1 0 2772 SEND +2024-07-30 12:00:02.665 2 1 2774 RECEIVE +2024-07-30 12:00:02.666 3 2 2776 SEND +2024-07-30 12:00:02.667 0 3 2778 RECEIVE +2024-07-30 12:00:02.668 2 0 2780 SEND +2024-07-30 12:00:02.669 1 3 2782 RECEIVE +2024-07-30 12:00:02.670 0 1 2784 SEND +2024-07-30 12:00:02.671 3 2 2786 RECEIVE +2024-07-30 12:00:02.672 0 1 2772 SEND +2024-07-30 12:00:02.673 1 2 2774 RECEIVE +2024-07-30 12:00:02.674 2 3 2776 SEND +2024-07-30 12:00:02.675 3 0 2778 RECEIVE +2024-07-30 12:00:02.676 1 3 2780 SEND +2024-07-30 12:00:02.677 2 0 2782 RECEIVE +2024-07-30 12:00:02.678 0 2 2784 SEND +2024-07-30 12:00:02.679 3 1 2786 RECEIVE +2024-07-30 12:00:02.680 1 0 2788 SEND +2024-07-30 12:00:02.681 2 1 2790 RECEIVE +2024-07-30 12:00:02.682 3 2 2792 SEND +2024-07-30 12:00:02.683 0 3 2794 RECEIVE +2024-07-30 12:00:02.684 2 0 2796 SEND +2024-07-30 12:00:02.685 1 3 2798 RECEIVE +2024-07-30 12:00:02.686 0 1 2800 SEND +2024-07-30 12:00:02.687 3 2 2802 RECEIVE +2024-07-30 12:00:02.688 0 1 2788 SEND +2024-07-30 12:00:02.689 1 2 2790 RECEIVE +2024-07-30 12:00:02.690 2 3 2792 SEND +2024-07-30 12:00:02.691 3 0 2794 RECEIVE +2024-07-30 12:00:02.692 1 3 2796 SEND +2024-07-30 12:00:02.693 2 0 2798 RECEIVE +2024-07-30 12:00:02.694 0 2 2800 SEND +2024-07-30 12:00:02.695 3 1 2802 RECEIVE +2024-07-30 12:00:02.696 1 0 2804 SEND +2024-07-30 12:00:02.697 2 1 2806 RECEIVE +2024-07-30 12:00:02.698 3 2 2808 SEND +2024-07-30 12:00:02.699 0 3 2810 RECEIVE +2024-07-30 12:00:02.700 2 0 2812 SEND +2024-07-30 12:00:02.701 1 3 2814 RECEIVE +2024-07-30 12:00:02.702 0 1 2816 SEND +2024-07-30 12:00:02.703 3 2 2818 RECEIVE +2024-07-30 12:00:02.704 0 1 2804 SEND +2024-07-30 12:00:02.705 1 2 2806 RECEIVE +2024-07-30 12:00:02.706 2 3 2808 SEND +2024-07-30 12:00:02.707 3 0 2810 RECEIVE +2024-07-30 12:00:02.708 1 3 2812 SEND +2024-07-30 12:00:02.709 2 0 2814 RECEIVE +2024-07-30 12:00:02.710 0 2 2816 SEND +2024-07-30 12:00:02.711 3 1 2818 RECEIVE +2024-07-30 12:00:02.712 1 0 2820 SEND +2024-07-30 12:00:02.713 2 1 2822 RECEIVE +2024-07-30 12:00:02.714 3 2 2824 SEND +2024-07-30 12:00:02.715 0 3 2826 RECEIVE +2024-07-30 12:00:02.716 2 0 2828 SEND +2024-07-30 12:00:02.717 1 3 2830 RECEIVE +2024-07-30 12:00:02.718 0 1 2832 SEND +2024-07-30 12:00:02.719 3 2 2834 RECEIVE +2024-07-30 12:00:02.720 0 1 2820 SEND +2024-07-30 12:00:02.721 1 2 2822 RECEIVE +2024-07-30 12:00:02.722 2 3 2824 SEND +2024-07-30 12:00:02.723 3 0 2826 RECEIVE +2024-07-30 12:00:02.724 1 3 2828 SEND +2024-07-30 12:00:02.725 2 0 2830 RECEIVE +2024-07-30 12:00:02.726 0 2 2832 SEND +2024-07-30 12:00:02.727 3 1 2834 RECEIVE +2024-07-30 12:00:02.728 1 0 2836 SEND +2024-07-30 12:00:02.729 2 1 2838 RECEIVE +2024-07-30 12:00:02.730 3 2 2840 SEND +2024-07-30 12:00:02.731 0 3 2842 RECEIVE +2024-07-30 12:00:02.732 2 0 2844 SEND +2024-07-30 12:00:02.733 1 3 2846 RECEIVE +2024-07-30 12:00:02.734 0 1 2848 SEND +2024-07-30 12:00:02.735 3 2 2850 RECEIVE +2024-07-30 12:00:02.736 0 1 2836 SEND +2024-07-30 12:00:02.737 1 2 2838 RECEIVE +2024-07-30 12:00:02.738 2 3 2840 SEND +2024-07-30 12:00:02.739 3 0 2842 RECEIVE +2024-07-30 12:00:02.740 1 3 2844 SEND +2024-07-30 12:00:02.741 2 0 2846 RECEIVE +2024-07-30 12:00:02.742 0 2 2848 SEND +2024-07-30 12:00:02.743 3 1 2850 RECEIVE +2024-07-30 12:00:02.744 1 0 2852 SEND +2024-07-30 12:00:02.745 2 1 2854 RECEIVE +2024-07-30 12:00:02.746 3 2 2856 SEND +2024-07-30 12:00:02.747 0 3 2858 RECEIVE +2024-07-30 12:00:02.748 2 0 2860 SEND +2024-07-30 12:00:02.749 1 3 2862 RECEIVE +2024-07-30 12:00:02.750 0 1 2864 SEND +2024-07-30 12:00:02.751 3 2 2866 RECEIVE +2024-07-30 12:00:02.752 0 1 2852 SEND +2024-07-30 12:00:02.753 1 2 2854 RECEIVE +2024-07-30 12:00:02.754 2 3 2856 SEND +2024-07-30 12:00:02.755 3 0 2858 RECEIVE +2024-07-30 12:00:02.756 1 3 2860 SEND +2024-07-30 12:00:02.757 2 0 2862 RECEIVE +2024-07-30 12:00:02.758 0 2 2864 SEND +2024-07-30 12:00:02.759 3 1 2866 RECEIVE +2024-07-30 12:00:02.760 1 0 2868 SEND +2024-07-30 12:00:02.761 2 1 2870 RECEIVE +2024-07-30 12:00:02.762 3 2 2872 SEND +2024-07-30 12:00:02.763 0 3 2874 RECEIVE +2024-07-30 12:00:02.764 2 0 2876 SEND +2024-07-30 12:00:02.765 1 3 2878 RECEIVE +2024-07-30 12:00:02.766 0 1 2880 SEND +2024-07-30 12:00:02.767 3 2 2882 RECEIVE +2024-07-30 12:00:02.768 0 1 2868 SEND +2024-07-30 12:00:02.769 1 2 2870 RECEIVE +2024-07-30 12:00:02.770 2 3 2872 SEND +2024-07-30 12:00:02.771 3 0 2874 RECEIVE +2024-07-30 12:00:02.772 1 3 2876 SEND +2024-07-30 12:00:02.773 2 0 2878 RECEIVE +2024-07-30 12:00:02.774 0 2 2880 SEND +2024-07-30 12:00:02.775 3 1 2882 RECEIVE +2024-07-30 12:00:02.776 1 0 2884 SEND +2024-07-30 12:00:02.777 2 1 2886 RECEIVE +2024-07-30 12:00:02.778 3 2 2888 SEND +2024-07-30 12:00:02.779 0 3 2890 RECEIVE +2024-07-30 12:00:02.780 2 0 2892 SEND +2024-07-30 12:00:02.781 1 3 2894 RECEIVE +2024-07-30 12:00:02.782 0 1 2896 SEND +2024-07-30 12:00:02.783 3 2 2898 RECEIVE +2024-07-30 12:00:02.784 0 1 2884 SEND +2024-07-30 12:00:02.785 1 2 2886 RECEIVE +2024-07-30 12:00:02.786 2 3 2888 SEND +2024-07-30 12:00:02.787 3 0 2890 RECEIVE +2024-07-30 12:00:02.788 1 3 2892 SEND +2024-07-30 12:00:02.789 2 0 2894 RECEIVE +2024-07-30 12:00:02.790 0 2 2896 SEND +2024-07-30 12:00:02.791 3 1 2898 RECEIVE +2024-07-30 12:00:02.792 1 0 2900 SEND +2024-07-30 12:00:02.793 2 1 2902 RECEIVE +2024-07-30 12:00:02.794 3 2 2904 SEND +2024-07-30 12:00:02.795 0 3 2906 RECEIVE +2024-07-30 12:00:02.796 2 0 2908 SEND +2024-07-30 12:00:02.797 1 3 2910 RECEIVE +2024-07-30 12:00:02.798 0 1 2912 SEND +2024-07-30 12:00:02.799 3 2 2914 RECEIVE +2024-07-30 12:00:02.800 0 1 2900 SEND +2024-07-30 12:00:02.801 1 2 2902 RECEIVE +2024-07-30 12:00:02.802 2 3 2904 SEND +2024-07-30 12:00:02.803 3 0 2906 RECEIVE +2024-07-30 12:00:02.804 1 3 2908 SEND +2024-07-30 12:00:02.805 2 0 2910 RECEIVE +2024-07-30 12:00:02.806 0 2 2912 SEND +2024-07-30 12:00:02.807 0 2 2914 RECEIVE +2024-07-30 12:00:02.808 0 2 2916 SEND +2024-07-30 12:00:02.809 0 2 2918 RECEIVE +2024-07-30 12:00:02.810 0 2 2920 SEND +2024-07-30 12:00:02.811 0 2 2922 RECEIVE +2024-07-30 12:00:02.812 0 2 2924 SEND +2024-07-30 12:00:02.813 0 2 2926 RECEIVE +2024-07-30 12:00:02.814 0 2 2928 SEND +2024-07-30 12:00:02.815 0 2 2930 RECEIVE +2024-07-30 12:00:02.816 0 2 2916 SEND +2024-07-30 12:00:02.817 0 2 2918 RECEIVE +2024-07-30 12:00:02.818 0 2 2920 SEND +2024-07-30 12:00:02.819 0 2 2922 RECEIVE +2024-07-30 12:00:02.820 0 2 2924 SEND +2024-07-30 12:00:02.821 0 2 2926 RECEIVE +2024-07-30 12:00:02.822 0 2 2928 SEND +2024-07-30 12:00:02.823 0 2 2930 RECEIVE +2024-07-30 12:00:02.824 0 2 2932 SEND +2024-07-30 12:00:02.825 0 2 2934 RECEIVE +2024-07-30 12:00:02.826 0 2 2936 SEND +2024-07-30 12:00:02.827 0 2 2938 RECEIVE +2024-07-30 12:00:02.828 0 2 2940 SEND +2024-07-30 12:00:02.829 0 2 2942 RECEIVE +2024-07-30 12:00:02.830 0 2 2944 SEND +2024-07-30 12:00:02.831 0 2 2946 RECEIVE +2024-07-30 12:00:02.832 0 2 2932 SEND +2024-07-30 12:00:02.833 0 2 2934 RECEIVE +2024-07-30 12:00:02.834 0 2 2936 SEND +2024-07-30 12:00:02.835 0 2 2938 RECEIVE +2024-07-30 12:00:02.836 0 2 2940 SEND +2024-07-30 12:00:02.837 0 2 2942 RECEIVE +2024-07-30 12:00:02.838 0 2 2944 SEND +2024-07-30 12:00:02.839 0 2 2946 RECEIVE +2024-07-30 12:00:02.840 0 2 2948 SEND +2024-07-30 12:00:02.841 0 2 2950 RECEIVE +2024-07-30 12:00:02.842 0 2 2952 SEND +2024-07-30 12:00:02.843 0 2 2954 RECEIVE +2024-07-30 12:00:02.844 0 2 2956 SEND +2024-07-30 12:00:02.845 0 2 2958 RECEIVE +2024-07-30 12:00:02.846 0 2 2960 SEND +2024-07-30 12:00:02.847 0 2 2962 RECEIVE +2024-07-30 12:00:02.848 0 2 2948 SEND +2024-07-30 12:00:02.849 0 2 2950 RECEIVE +2024-07-30 12:00:02.850 0 2 2952 SEND +2024-07-30 12:00:02.851 0 2 2954 RECEIVE +2024-07-30 12:00:02.852 0 2 2956 SEND +2024-07-30 12:00:02.853 0 2 2958 RECEIVE +2024-07-30 12:00:02.854 0 2 2960 SEND +2024-07-30 12:00:02.855 0 2 2962 RECEIVE +2024-07-30 12:00:02.856 0 2 2964 SEND +2024-07-30 12:00:02.857 0 2 2966 RECEIVE +2024-07-30 12:00:02.858 0 2 2968 SEND +2024-07-30 12:00:02.859 0 2 2970 RECEIVE +2024-07-30 12:00:02.860 0 2 2972 SEND +2024-07-30 12:00:02.861 0 2 2974 RECEIVE +2024-07-30 12:00:02.862 0 2 2976 SEND +2024-07-30 12:00:02.863 0 2 2978 RECEIVE +2024-07-30 12:00:02.864 0 2 2964 SEND +2024-07-30 12:00:02.865 0 2 2966 RECEIVE +2024-07-30 12:00:02.866 0 2 2968 SEND +2024-07-30 12:00:02.867 0 2 2970 RECEIVE +2024-07-30 12:00:02.868 0 2 2972 SEND +2024-07-30 12:00:02.869 0 2 2974 RECEIVE +2024-07-30 12:00:02.870 0 2 2976 SEND +2024-07-30 12:00:02.871 0 2 2978 RECEIVE +2024-07-30 12:00:02.872 0 2 2980 SEND +2024-07-30 12:00:02.873 0 2 2982 RECEIVE +2024-07-30 12:00:02.874 0 2 2984 SEND +2024-07-30 12:00:02.875 0 2 2986 RECEIVE +2024-07-30 12:00:02.876 0 2 2988 SEND +2024-07-30 12:00:02.877 0 2 2990 RECEIVE +2024-07-30 12:00:02.878 0 2 2992 SEND +2024-07-30 12:00:02.879 0 2 2994 RECEIVE +2024-07-30 12:00:02.880 0 2 2980 SEND +2024-07-30 12:00:02.881 0 2 2982 RECEIVE +2024-07-30 12:00:02.882 0 2 2984 SEND +2024-07-30 12:00:02.883 0 2 2986 RECEIVE +2024-07-30 12:00:02.884 0 2 2988 SEND +2024-07-30 12:00:02.885 0 2 2990 RECEIVE +2024-07-30 12:00:02.886 0 2 2992 SEND +2024-07-30 12:00:02.887 0 2 2994 RECEIVE +2024-07-30 12:00:02.888 0 2 2996 SEND +2024-07-30 12:00:02.889 0 2 2998 RECEIVE +2024-07-30 12:00:02.890 0 2 3000 SEND +2024-07-30 12:00:02.891 0 2 3002 RECEIVE +2024-07-30 12:00:02.892 0 2 3004 SEND +2024-07-30 12:00:02.893 0 2 3006 RECEIVE +2024-07-30 12:00:02.894 0 2 3008 SEND +2024-07-30 12:00:02.895 0 2 3010 RECEIVE +2024-07-30 12:00:02.896 0 2 2996 SEND +2024-07-30 12:00:02.897 0 2 2998 RECEIVE +2024-07-30 12:00:02.898 0 2 3000 SEND +2024-07-30 12:00:02.899 0 2 3002 RECEIVE +2024-07-30 12:00:02.900 0 2 3004 SEND +2024-07-30 12:00:02.901 0 2 3006 RECEIVE +2024-07-30 12:00:02.902 0 2 3008 SEND +2024-07-30 12:00:02.903 0 2 3010 RECEIVE +2024-07-30 12:00:02.904 0 2 3012 SEND +2024-07-30 12:00:02.905 0 2 3014 RECEIVE +2024-07-30 12:00:02.906 0 2 3016 SEND +2024-07-30 12:00:02.907 0 2 3018 RECEIVE +2024-07-30 12:00:02.908 0 2 3020 SEND +2024-07-30 12:00:02.909 0 2 3022 RECEIVE +2024-07-30 12:00:02.910 0 2 3024 SEND +2024-07-30 12:00:02.911 0 2 3026 RECEIVE +2024-07-30 12:00:02.912 0 2 3012 SEND +2024-07-30 12:00:02.913 0 2 3014 RECEIVE +2024-07-30 12:00:02.914 0 2 3016 SEND +2024-07-30 12:00:02.915 0 2 3018 RECEIVE +2024-07-30 12:00:02.916 0 2 3020 SEND +2024-07-30 12:00:02.917 0 2 3022 RECEIVE +2024-07-30 12:00:02.918 0 2 3024 SEND +2024-07-30 12:00:02.919 0 2 3026 RECEIVE +2024-07-30 12:00:02.920 0 2 3028 SEND +2024-07-30 12:00:02.921 0 2 3030 RECEIVE +2024-07-30 12:00:02.922 0 2 3032 SEND +2024-07-30 12:00:02.923 0 2 3034 RECEIVE +2024-07-30 12:00:02.924 0 2 3036 SEND +2024-07-30 12:00:02.925 0 2 3038 RECEIVE +2024-07-30 12:00:02.926 0 2 3040 SEND +2024-07-30 12:00:02.927 0 2 3042 RECEIVE +2024-07-30 12:00:02.928 0 2 3028 SEND +2024-07-30 12:00:02.929 0 2 3030 RECEIVE +2024-07-30 12:00:02.930 0 2 3032 SEND +2024-07-30 12:00:02.931 0 2 3034 RECEIVE +2024-07-30 12:00:02.932 0 2 3036 SEND +2024-07-30 12:00:02.933 0 2 3038 RECEIVE +2024-07-30 12:00:02.934 0 2 3040 SEND +2024-07-30 12:00:02.935 0 2 3042 RECEIVE +2024-07-30 12:00:02.936 0 2 3044 SEND +2024-07-30 12:00:02.937 0 2 3046 RECEIVE +2024-07-30 12:00:02.938 0 2 3048 SEND +2024-07-30 12:00:02.939 0 2 3050 RECEIVE +2024-07-30 12:00:02.940 0 2 3052 SEND +2024-07-30 12:00:02.941 0 2 3054 RECEIVE +2024-07-30 12:00:02.942 0 2 3056 SEND +2024-07-30 12:00:02.943 0 2 3058 RECEIVE +2024-07-30 12:00:02.944 0 2 3044 SEND +2024-07-30 12:00:02.945 0 2 3046 RECEIVE +2024-07-30 12:00:02.946 0 2 3048 SEND +2024-07-30 12:00:02.947 0 2 3050 RECEIVE +2024-07-30 12:00:02.948 0 2 3052 SEND +2024-07-30 12:00:02.949 0 2 3054 RECEIVE +2024-07-30 12:00:02.950 0 2 3056 SEND +2024-07-30 12:00:02.951 0 2 3058 RECEIVE +2024-07-30 12:00:02.952 0 2 3060 SEND +2024-07-30 12:00:02.953 0 2 3062 RECEIVE +2024-07-30 12:00:02.954 0 2 3064 SEND +2024-07-30 12:00:02.955 0 2 3066 RECEIVE +2024-07-30 12:00:02.956 0 2 3068 SEND +2024-07-30 12:00:02.957 0 2 3070 RECEIVE +2024-07-30 12:00:02.958 0 2 3072 SEND +2024-07-30 12:00:02.959 0 2 3074 RECEIVE +2024-07-30 12:00:02.960 0 2 3060 SEND +2024-07-30 12:00:02.961 0 2 3062 RECEIVE +2024-07-30 12:00:02.962 0 2 3064 SEND +2024-07-30 12:00:02.963 0 2 3066 RECEIVE +2024-07-30 12:00:02.964 0 2 3068 SEND +2024-07-30 12:00:02.965 0 2 3070 RECEIVE +2024-07-30 12:00:02.966 0 2 3072 SEND +2024-07-30 12:00:02.967 0 2 3074 RECEIVE +2024-07-30 12:00:02.968 0 2 3076 SEND +2024-07-30 12:00:02.969 0 2 3078 RECEIVE +2024-07-30 12:00:02.970 0 2 3080 SEND +2024-07-30 12:00:02.971 0 2 3082 RECEIVE +2024-07-30 12:00:02.972 0 2 3084 SEND +2024-07-30 12:00:02.973 0 2 3086 RECEIVE +2024-07-30 12:00:02.974 0 2 3088 SEND +2024-07-30 12:00:02.975 0 2 3090 RECEIVE +2024-07-30 12:00:02.976 0 2 3076 SEND +2024-07-30 12:00:02.977 0 2 3078 RECEIVE +2024-07-30 12:00:02.978 0 2 3080 SEND +2024-07-30 12:00:02.979 0 2 3082 RECEIVE +2024-07-30 12:00:02.980 0 2 3084 SEND +2024-07-30 12:00:02.981 0 2 3086 RECEIVE +2024-07-30 12:00:02.982 0 2 3088 SEND +2024-07-30 12:00:02.983 0 2 3090 RECEIVE +2024-07-30 12:00:02.984 0 2 3092 SEND +2024-07-30 12:00:02.985 0 2 3094 RECEIVE +2024-07-30 12:00:02.986 0 2 3096 SEND +2024-07-30 12:00:02.987 0 2 3098 RECEIVE +2024-07-30 12:00:02.988 0 2 3100 SEND +2024-07-30 12:00:02.989 0 2 3102 RECEIVE +2024-07-30 12:00:02.990 0 2 3104 SEND +2024-07-30 12:00:02.991 0 2 3106 RECEIVE +2024-07-30 12:00:02.992 0 2 3092 SEND +2024-07-30 12:00:02.993 0 2 3094 RECEIVE +2024-07-30 12:00:02.994 0 2 3096 SEND +2024-07-30 12:00:02.995 0 2 3098 RECEIVE +2024-07-30 12:00:02.996 0 2 3100 SEND +2024-07-30 12:00:02.997 0 2 3102 RECEIVE +2024-07-30 12:00:02.998 0 2 3104 SEND +2024-07-30 12:00:02.999 0 2 3106 RECEIVE +2024-07-30 12:00:03.000 0 2 3108 SEND +2024-07-30 12:00:03.001 0 2 3110 RECEIVE +2024-07-30 12:00:03.002 0 2 3112 SEND +2024-07-30 12:00:03.003 0 2 3114 RECEIVE +2024-07-30 12:00:03.004 0 2 3116 SEND +2024-07-30 12:00:03.005 0 2 3118 RECEIVE +2024-07-30 12:00:03.006 0 2 3120 SEND +2024-07-30 12:00:03.007 0 2 3122 RECEIVE +2024-07-30 12:00:03.008 0 2 3108 SEND +2024-07-30 12:00:03.009 0 2 3110 RECEIVE +2024-07-30 12:00:03.010 0 2 3112 SEND +2024-07-30 12:00:03.011 0 2 3114 RECEIVE +2024-07-30 12:00:03.012 0 2 3116 SEND +2024-07-30 12:00:03.013 0 2 3118 RECEIVE +2024-07-30 12:00:03.014 0 2 3120 SEND +2024-07-30 12:00:03.015 0 2 3122 RECEIVE +2024-07-30 12:00:03.016 0 2 3124 SEND +2024-07-30 12:00:03.017 0 2 3126 RECEIVE +2024-07-30 12:00:03.018 0 2 3128 SEND +2024-07-30 12:00:03.019 0 2 3130 RECEIVE +2024-07-30 12:00:03.020 0 2 3132 SEND +2024-07-30 12:00:03.021 0 2 3134 RECEIVE +2024-07-30 12:00:03.022 0 2 3136 SEND +2024-07-30 12:00:03.023 0 2 3138 RECEIVE +2024-07-30 12:00:03.024 0 2 3124 SEND +2024-07-30 12:00:03.025 0 2 3126 RECEIVE +2024-07-30 12:00:03.026 0 2 3128 SEND +2024-07-30 12:00:03.027 0 2 3130 RECEIVE +2024-07-30 12:00:03.028 0 2 3132 SEND +2024-07-30 12:00:03.029 0 2 3134 RECEIVE +2024-07-30 12:00:03.030 0 2 3136 SEND +2024-07-30 12:00:03.031 0 2 3138 RECEIVE +2024-07-30 12:00:03.032 0 2 3140 SEND +2024-07-30 12:00:03.033 0 2 3142 RECEIVE +2024-07-30 12:00:03.034 0 2 3144 SEND +2024-07-30 12:00:03.035 0 2 3146 RECEIVE +2024-07-30 12:00:03.036 0 2 3148 SEND +2024-07-30 12:00:03.037 0 2 3150 RECEIVE +2024-07-30 12:00:03.038 0 2 3152 SEND +2024-07-30 12:00:03.039 0 2 3154 RECEIVE +2024-07-30 12:00:03.040 0 2 3140 SEND +2024-07-30 12:00:03.041 0 2 3142 RECEIVE +2024-07-30 12:00:03.042 0 2 3144 SEND +2024-07-30 12:00:03.043 0 2 3146 RECEIVE +2024-07-30 12:00:03.044 0 2 3148 SEND +2024-07-30 12:00:03.045 0 2 3150 RECEIVE +2024-07-30 12:00:03.046 0 2 3152 SEND +2024-07-30 12:00:03.047 0 2 3154 RECEIVE +2024-07-30 12:00:03.048 0 2 3156 SEND +2024-07-30 12:00:03.049 0 2 3158 RECEIVE +2024-07-30 12:00:03.050 0 2 3160 SEND +2024-07-30 12:00:03.051 0 2 3162 RECEIVE +2024-07-30 12:00:03.052 0 2 3164 SEND +2024-07-30 12:00:03.053 0 2 3166 RECEIVE +2024-07-30 12:00:03.054 0 2 3168 SEND +2024-07-30 12:00:03.055 0 2 3170 RECEIVE +2024-07-30 12:00:03.056 0 2 3156 SEND +2024-07-30 12:00:03.057 0 2 3158 RECEIVE +2024-07-30 12:00:03.058 0 2 3160 SEND +2024-07-30 12:00:03.059 0 2 3162 RECEIVE +2024-07-30 12:00:03.060 0 2 3164 SEND +2024-07-30 12:00:03.061 0 2 3166 RECEIVE +2024-07-30 12:00:03.062 0 2 3168 SEND +2024-07-30 12:00:03.063 0 2 3170 RECEIVE +2024-07-30 12:00:03.064 0 2 3172 SEND +2024-07-30 12:00:03.065 0 2 3174 RECEIVE +2024-07-30 12:00:03.066 0 2 3176 SEND +2024-07-30 12:00:03.067 0 2 3178 RECEIVE +2024-07-30 12:00:03.068 0 2 3180 SEND +2024-07-30 12:00:03.069 0 2 3182 RECEIVE +2024-07-30 12:00:03.070 0 2 3184 SEND +2024-07-30 12:00:03.071 0 2 3186 RECEIVE +2024-07-30 12:00:03.072 0 2 3172 SEND +2024-07-30 12:00:03.073 0 2 3174 RECEIVE +2024-07-30 12:00:03.074 0 2 3176 SEND +2024-07-30 12:00:03.075 0 2 3178 RECEIVE +2024-07-30 12:00:03.076 0 2 3180 SEND +2024-07-30 12:00:03.077 0 2 3182 RECEIVE +2024-07-30 12:00:03.078 0 2 3184 SEND +2024-07-30 12:00:03.079 0 2 3186 RECEIVE +2024-07-30 12:00:03.080 0 2 3188 SEND +2024-07-30 12:00:03.081 0 2 3190 RECEIVE +2024-07-30 12:00:03.082 0 2 3192 SEND +2024-07-30 12:00:03.083 0 2 3194 RECEIVE +2024-07-30 12:00:03.084 0 2 3196 SEND +2024-07-30 12:00:03.085 0 2 3198 RECEIVE +2024-07-30 12:00:03.086 0 2 3200 SEND +2024-07-30 12:00:03.087 0 2 3202 RECEIVE +2024-07-30 12:00:03.088 0 2 3188 SEND +2024-07-30 12:00:03.089 0 2 3190 RECEIVE +2024-07-30 12:00:03.090 0 2 3192 SEND +2024-07-30 12:00:03.091 0 2 3194 RECEIVE +2024-07-30 12:00:03.092 0 2 3196 SEND +2024-07-30 12:00:03.093 0 2 3198 RECEIVE +2024-07-30 12:00:03.094 0 2 3200 SEND +2024-07-30 12:00:03.095 0 2 3202 RECEIVE +2024-07-30 12:00:03.096 0 2 3204 SEND +2024-07-30 12:00:03.097 0 2 3206 RECEIVE +2024-07-30 12:00:03.098 0 2 3208 SEND +2024-07-30 12:00:03.099 0 2 3210 RECEIVE +2024-07-30 12:00:03.100 0 2 3212 SEND +2024-07-30 12:00:03.101 0 2 3214 RECEIVE +2024-07-30 12:00:03.102 0 2 3216 SEND +2024-07-30 12:00:03.103 0 2 3218 RECEIVE +2024-07-30 12:00:03.104 0 2 3204 SEND +2024-07-30 12:00:03.105 0 2 3206 RECEIVE +2024-07-30 12:00:03.106 0 2 3208 SEND +2024-07-30 12:00:03.107 0 2 3210 RECEIVE +2024-07-30 12:00:03.108 0 2 3212 SEND +2024-07-30 12:00:03.109 0 2 3214 RECEIVE +2024-07-30 12:00:03.110 0 2 3216 SEND +2024-07-30 12:00:03.111 0 2 3218 RECEIVE +2024-07-30 12:00:03.112 0 2 3220 SEND +2024-07-30 12:00:03.113 0 2 3222 RECEIVE +2024-07-30 12:00:03.114 0 2 3224 SEND +2024-07-30 12:00:03.115 0 2 3226 RECEIVE +2024-07-30 12:00:03.116 0 2 3228 SEND +2024-07-30 12:00:03.117 0 2 3230 RECEIVE +2024-07-30 12:00:03.118 0 2 3232 SEND +2024-07-30 12:00:03.119 0 2 3234 RECEIVE +2024-07-30 12:00:03.120 0 2 3220 SEND +2024-07-30 12:00:03.121 0 2 3222 RECEIVE +2024-07-30 12:00:03.122 0 2 3224 SEND +2024-07-30 12:00:03.123 0 2 3226 RECEIVE +2024-07-30 12:00:03.124 0 2 3228 SEND +2024-07-30 12:00:03.125 0 2 3230 RECEIVE +2024-07-30 12:00:03.126 0 2 3232 SEND +2024-07-30 12:00:03.127 0 2 3234 RECEIVE +2024-07-30 12:00:03.128 0 2 3236 SEND +2024-07-30 12:00:03.129 0 2 3238 RECEIVE +2024-07-30 12:00:03.130 0 2 3240 SEND +2024-07-30 12:00:03.131 0 2 3242 RECEIVE +2024-07-30 12:00:03.132 0 2 3244 SEND +2024-07-30 12:00:03.133 0 2 3246 RECEIVE +2024-07-30 12:00:03.134 0 2 3248 SEND +2024-07-30 12:00:03.135 0 2 3250 RECEIVE +2024-07-30 12:00:03.136 0 2 3236 SEND +2024-07-30 12:00:03.137 0 2 3238 RECEIVE +2024-07-30 12:00:03.138 0 2 3240 SEND +2024-07-30 12:00:03.139 0 2 3242 RECEIVE +2024-07-30 12:00:03.140 0 2 3244 SEND +2024-07-30 12:00:03.141 0 2 3246 RECEIVE +2024-07-30 12:00:03.142 0 2 3248 SEND +2024-07-30 12:00:03.143 0 2 3250 RECEIVE +2024-07-30 12:00:03.144 0 2 3252 SEND +2024-07-30 12:00:03.145 0 2 3254 RECEIVE +2024-07-30 12:00:03.146 0 2 3256 SEND +2024-07-30 12:00:03.147 0 2 3258 RECEIVE +2024-07-30 12:00:03.148 0 2 3260 SEND +2024-07-30 12:00:03.149 0 2 3262 RECEIVE +2024-07-30 12:00:03.150 0 2 3264 SEND +2024-07-30 12:00:03.151 0 2 3266 RECEIVE +2024-07-30 12:00:03.152 0 2 3252 SEND +2024-07-30 12:00:03.153 0 2 3254 RECEIVE +2024-07-30 12:00:03.154 0 2 3256 SEND +2024-07-30 12:00:03.155 0 2 3258 RECEIVE +2024-07-30 12:00:03.156 0 2 3260 SEND +2024-07-30 12:00:03.157 0 2 3262 RECEIVE +2024-07-30 12:00:03.158 0 2 3264 SEND +2024-07-30 12:00:03.159 0 2 3266 RECEIVE +2024-07-30 12:00:03.160 0 2 3268 SEND +2024-07-30 12:00:03.161 0 2 3270 RECEIVE +2024-07-30 12:00:03.162 0 2 3272 SEND +2024-07-30 12:00:03.163 0 2 3274 RECEIVE +2024-07-30 12:00:03.164 0 2 3276 SEND +2024-07-30 12:00:03.165 0 2 3278 RECEIVE +2024-07-30 12:00:03.166 0 2 3280 SEND +2024-07-30 12:00:03.167 0 2 3282 RECEIVE +2024-07-30 12:00:03.168 0 2 3268 SEND +2024-07-30 12:00:03.169 0 2 3270 RECEIVE +2024-07-30 12:00:03.170 0 2 3272 SEND +2024-07-30 12:00:03.171 0 2 3274 RECEIVE +2024-07-30 12:00:03.172 0 2 3276 SEND +2024-07-30 12:00:03.173 0 2 3278 RECEIVE +2024-07-30 12:00:03.174 0 2 3280 SEND +2024-07-30 12:00:03.175 0 2 3282 RECEIVE +2024-07-30 12:00:03.176 0 2 3284 SEND +2024-07-30 12:00:03.177 0 2 3286 RECEIVE +2024-07-30 12:00:03.178 0 2 3288 SEND +2024-07-30 12:00:03.179 0 2 3290 RECEIVE +2024-07-30 12:00:03.180 0 2 3292 SEND +2024-07-30 12:00:03.181 0 2 3294 RECEIVE +2024-07-30 12:00:03.182 0 2 3296 SEND +2024-07-30 12:00:03.183 0 2 3298 RECEIVE +2024-07-30 12:00:03.184 0 2 3284 SEND +2024-07-30 12:00:03.185 0 2 3286 RECEIVE +2024-07-30 12:00:03.186 0 2 3288 SEND +2024-07-30 12:00:03.187 0 2 3290 RECEIVE +2024-07-30 12:00:03.188 0 2 3292 SEND +2024-07-30 12:00:03.189 0 2 3294 RECEIVE +2024-07-30 12:00:03.190 0 2 3296 SEND +2024-07-30 12:00:03.191 0 2 3298 RECEIVE +2024-07-30 12:00:03.192 0 2 3300 SEND +2024-07-30 12:00:03.193 0 2 3302 RECEIVE +2024-07-30 12:00:03.194 0 2 3304 SEND +2024-07-30 12:00:03.195 0 2 3306 RECEIVE +2024-07-30 12:00:03.196 0 2 3308 SEND +2024-07-30 12:00:03.197 0 2 3310 RECEIVE +2024-07-30 12:00:03.198 0 2 3312 SEND +2024-07-30 12:00:03.199 0 2 3314 RECEIVE +2024-07-30 12:00:03.200 0 2 3300 SEND +2024-07-30 12:00:03.201 0 2 3302 RECEIVE +2024-07-30 12:00:03.202 0 2 3304 SEND +2024-07-30 12:00:03.203 0 2 3306 RECEIVE +2024-07-30 12:00:03.204 0 2 3308 SEND +2024-07-30 12:00:03.205 0 2 3310 RECEIVE +2024-07-30 12:00:03.206 0 2 3312 SEND +2024-07-30 12:00:03.207 0 2 3314 RECEIVE +2024-07-30 12:00:03.208 0 2 3316 SEND +2024-07-30 12:00:03.209 0 2 3318 RECEIVE +2024-07-30 12:00:03.210 0 2 3320 SEND +2024-07-30 12:00:03.211 0 2 3322 RECEIVE +2024-07-30 12:00:03.212 0 2 3324 SEND +2024-07-30 12:00:03.213 0 2 3326 RECEIVE +2024-07-30 12:00:03.214 0 2 3328 SEND +2024-07-30 12:00:03.215 0 2 3330 RECEIVE +2024-07-30 12:00:03.216 0 2 3316 SEND +2024-07-30 12:00:03.217 0 2 3318 RECEIVE +2024-07-30 12:00:03.218 0 2 3320 SEND +2024-07-30 12:00:03.219 0 2 3322 RECEIVE +2024-07-30 12:00:03.220 0 2 3324 SEND +2024-07-30 12:00:03.221 0 2 3326 RECEIVE +2024-07-30 12:00:03.222 0 2 3328 SEND +2024-07-30 12:00:03.223 0 2 3330 RECEIVE +2024-07-30 12:00:03.224 0 2 3332 SEND +2024-07-30 12:00:03.225 0 2 3334 RECEIVE +2024-07-30 12:00:03.226 0 2 3336 SEND +2024-07-30 12:00:03.227 0 2 3338 RECEIVE +2024-07-30 12:00:03.228 0 2 3340 SEND +2024-07-30 12:00:03.229 0 2 3342 RECEIVE +2024-07-30 12:00:03.230 0 2 3344 SEND +2024-07-30 12:00:03.231 0 2 3346 RECEIVE +2024-07-30 12:00:03.232 0 2 3332 SEND +2024-07-30 12:00:03.233 0 2 3334 RECEIVE +2024-07-30 12:00:03.234 0 2 3336 SEND +2024-07-30 12:00:03.235 0 2 3338 RECEIVE +2024-07-30 12:00:03.236 0 2 3340 SEND +2024-07-30 12:00:03.237 0 2 3342 RECEIVE +2024-07-30 12:00:03.238 0 2 3344 SEND +2024-07-30 12:00:03.239 0 2 3346 RECEIVE +2024-07-30 12:00:03.240 0 2 3348 SEND +2024-07-30 12:00:03.241 0 2 3350 RECEIVE +2024-07-30 12:00:03.242 0 2 3352 SEND +2024-07-30 12:00:03.243 0 2 3354 RECEIVE +2024-07-30 12:00:03.244 0 2 3356 SEND +2024-07-30 12:00:03.245 0 2 3358 RECEIVE +2024-07-30 12:00:03.246 0 2 3360 SEND +2024-07-30 12:00:03.247 0 2 3362 RECEIVE +2024-07-30 12:00:03.248 0 2 3348 SEND +2024-07-30 12:00:03.249 0 2 3350 RECEIVE +2024-07-30 12:00:03.250 0 2 3352 SEND +2024-07-30 12:00:03.251 0 2 3354 RECEIVE +2024-07-30 12:00:03.252 0 2 3356 SEND +2024-07-30 12:00:03.253 0 2 3358 RECEIVE +2024-07-30 12:00:03.254 0 2 3360 SEND +2024-07-30 12:00:03.255 0 2 3362 RECEIVE +2024-07-30 12:00:03.256 0 2 3364 SEND +2024-07-30 12:00:03.257 0 2 3366 RECEIVE +2024-07-30 12:00:03.258 0 2 3368 SEND +2024-07-30 12:00:03.259 0 2 3370 RECEIVE +2024-07-30 12:00:03.260 0 2 3372 SEND +2024-07-30 12:00:03.261 0 2 3374 RECEIVE +2024-07-30 12:00:03.262 0 2 3376 SEND +2024-07-30 12:00:03.263 0 2 3378 RECEIVE +2024-07-30 12:00:03.264 0 2 3364 SEND +2024-07-30 12:00:03.265 0 2 3366 RECEIVE +2024-07-30 12:00:03.266 0 2 3368 SEND +2024-07-30 12:00:03.267 0 2 3370 RECEIVE +2024-07-30 12:00:03.268 0 2 3372 SEND +2024-07-30 12:00:03.269 0 2 3374 RECEIVE +2024-07-30 12:00:03.270 0 2 3376 SEND +2024-07-30 12:00:03.271 0 2 3378 RECEIVE +2024-07-30 12:00:03.272 0 2 3380 SEND +2024-07-30 12:00:03.273 0 2 3382 RECEIVE +2024-07-30 12:00:03.274 0 2 3384 SEND +2024-07-30 12:00:03.275 0 2 3386 RECEIVE +2024-07-30 12:00:03.276 0 2 3388 SEND +2024-07-30 12:00:03.277 0 2 3390 RECEIVE +2024-07-30 12:00:03.278 0 2 3392 SEND +2024-07-30 12:00:03.279 0 2 3394 RECEIVE +2024-07-30 12:00:03.280 0 2 3380 SEND +2024-07-30 12:00:03.281 0 2 3382 RECEIVE +2024-07-30 12:00:03.282 0 2 3384 SEND +2024-07-30 12:00:03.283 0 2 3386 RECEIVE +2024-07-30 12:00:03.284 0 2 3388 SEND +2024-07-30 12:00:03.285 0 2 3390 RECEIVE +2024-07-30 12:00:03.286 0 2 3392 SEND +2024-07-30 12:00:03.287 0 2 3394 RECEIVE +2024-07-30 12:00:03.288 0 2 3396 SEND +2024-07-30 12:00:03.289 0 2 3398 RECEIVE +2024-07-30 12:00:03.290 0 2 3400 SEND +2024-07-30 12:00:03.291 0 2 3402 RECEIVE +2024-07-30 12:00:03.292 0 2 3404 SEND +2024-07-30 12:00:03.293 0 2 3406 RECEIVE +2024-07-30 12:00:03.294 0 2 3408 SEND +2024-07-30 12:00:03.295 0 2 3410 RECEIVE +2024-07-30 12:00:03.296 0 2 3396 SEND +2024-07-30 12:00:03.297 0 2 3398 RECEIVE +2024-07-30 12:00:03.298 0 2 3400 SEND +2024-07-30 12:00:03.299 0 2 3402 RECEIVE +2024-07-30 12:00:03.300 0 2 3404 SEND +2024-07-30 12:00:03.301 0 2 3406 RECEIVE +2024-07-30 12:00:03.302 0 2 3408 SEND +2024-07-30 12:00:03.303 0 2 3410 RECEIVE +2024-07-30 12:00:03.304 0 2 3412 SEND +2024-07-30 12:00:03.305 0 2 3414 RECEIVE +2024-07-30 12:00:03.306 0 2 3416 SEND +2024-07-30 12:00:03.307 0 2 3418 RECEIVE +2024-07-30 12:00:03.308 0 2 3420 SEND +2024-07-30 12:00:03.309 0 2 3422 RECEIVE +2024-07-30 12:00:03.310 0 2 3424 SEND +2024-07-30 12:00:03.311 0 2 3426 RECEIVE +2024-07-30 12:00:03.312 0 2 3412 SEND +2024-07-30 12:00:03.313 0 2 3414 RECEIVE +2024-07-30 12:00:03.314 0 2 3416 SEND +2024-07-30 12:00:03.315 0 2 3418 RECEIVE +2024-07-30 12:00:03.316 0 2 3420 SEND +2024-07-30 12:00:03.317 0 2 3422 RECEIVE +2024-07-30 12:00:03.318 0 2 3424 SEND +2024-07-30 12:00:03.319 0 2 3426 RECEIVE +2024-07-30 12:00:03.320 0 2 3428 SEND +2024-07-30 12:00:03.321 0 2 3430 RECEIVE +2024-07-30 12:00:03.322 0 2 3432 SEND +2024-07-30 12:00:03.323 0 2 3434 RECEIVE +2024-07-30 12:00:03.324 0 2 3436 SEND +2024-07-30 12:00:03.325 0 2 3438 RECEIVE +2024-07-30 12:00:03.326 0 2 3440 SEND +2024-07-30 12:00:03.327 0 2 3442 RECEIVE +2024-07-30 12:00:03.328 0 2 3428 SEND +2024-07-30 12:00:03.329 0 2 3430 RECEIVE +2024-07-30 12:00:03.330 0 2 3432 SEND +2024-07-30 12:00:03.331 0 2 3434 RECEIVE +2024-07-30 12:00:03.332 0 2 3436 SEND +2024-07-30 12:00:03.333 0 2 3438 RECEIVE +2024-07-30 12:00:03.334 0 2 3440 SEND +2024-07-30 12:00:03.335 0 2 3442 RECEIVE +2024-07-30 12:00:03.336 0 2 3444 SEND +2024-07-30 12:00:03.337 0 2 3446 RECEIVE +2024-07-30 12:00:03.338 0 2 3448 SEND +2024-07-30 12:00:03.339 0 2 3450 RECEIVE +2024-07-30 12:00:03.340 0 2 3452 SEND +2024-07-30 12:00:03.341 0 2 3454 RECEIVE +2024-07-30 12:00:03.342 0 2 3456 SEND +2024-07-30 12:00:03.343 0 2 3458 RECEIVE +2024-07-30 12:00:03.344 0 2 3444 SEND +2024-07-30 12:00:03.345 0 2 3446 RECEIVE +2024-07-30 12:00:03.346 0 2 3448 SEND +2024-07-30 12:00:03.347 0 2 3450 RECEIVE +2024-07-30 12:00:03.348 0 2 3452 SEND +2024-07-30 12:00:03.349 0 2 3454 RECEIVE +2024-07-30 12:00:03.350 0 2 3456 SEND +2024-07-30 12:00:03.351 0 2 3458 RECEIVE +2024-07-30 12:00:03.352 0 2 3460 SEND +2024-07-30 12:00:03.353 0 2 3462 RECEIVE +2024-07-30 12:00:03.354 0 2 3464 SEND +2024-07-30 12:00:03.355 0 2 3466 RECEIVE +2024-07-30 12:00:03.356 0 2 3468 SEND +2024-07-30 12:00:03.357 0 2 3470 RECEIVE +2024-07-30 12:00:03.358 0 2 3472 SEND +2024-07-30 12:00:03.359 0 2 3474 RECEIVE +2024-07-30 12:00:03.360 0 2 3460 SEND +2024-07-30 12:00:03.361 0 2 3462 RECEIVE +2024-07-30 12:00:03.362 0 2 3464 SEND +2024-07-30 12:00:03.363 0 2 3466 RECEIVE +2024-07-30 12:00:03.364 0 2 3468 SEND +2024-07-30 12:00:03.365 0 2 3470 RECEIVE +2024-07-30 12:00:03.366 0 2 3472 SEND +2024-07-30 12:00:03.367 0 2 3474 RECEIVE +2024-07-30 12:00:03.368 0 2 3476 SEND +2024-07-30 12:00:03.369 0 2 3478 RECEIVE +2024-07-30 12:00:03.370 0 2 3480 SEND +2024-07-30 12:00:03.371 0 2 3482 RECEIVE +2024-07-30 12:00:03.372 0 2 3484 SEND +2024-07-30 12:00:03.373 0 2 3486 RECEIVE +2024-07-30 12:00:03.374 0 2 3488 SEND +2024-07-30 12:00:03.375 0 2 3490 RECEIVE +2024-07-30 12:00:03.376 0 2 3476 SEND +2024-07-30 12:00:03.377 0 2 3478 RECEIVE +2024-07-30 12:00:03.378 0 2 3480 SEND +2024-07-30 12:00:03.379 0 2 3482 RECEIVE +2024-07-30 12:00:03.380 0 2 3484 SEND +2024-07-30 12:00:03.381 0 2 3486 RECEIVE +2024-07-30 12:00:03.382 0 2 3488 SEND +2024-07-30 12:00:03.383 0 2 3490 RECEIVE +2024-07-30 12:00:03.384 0 2 3492 SEND +2024-07-30 12:00:03.385 0 2 3494 RECEIVE +2024-07-30 12:00:03.386 0 2 3496 SEND +2024-07-30 12:00:03.387 0 2 3498 RECEIVE +2024-07-30 12:00:03.388 0 2 3500 SEND +2024-07-30 12:00:03.389 0 2 3502 RECEIVE +2024-07-30 12:00:03.390 0 2 3504 SEND +2024-07-30 12:00:03.391 0 2 3506 RECEIVE +2024-07-30 12:00:03.392 0 2 3492 SEND +2024-07-30 12:00:03.393 0 2 3494 RECEIVE +2024-07-30 12:00:03.394 0 2 3496 SEND +2024-07-30 12:00:03.395 0 2 3498 RECEIVE +2024-07-30 12:00:03.396 0 2 3500 SEND +2024-07-30 12:00:03.397 0 2 3502 RECEIVE +2024-07-30 12:00:03.398 0 2 3504 SEND +2024-07-30 12:00:03.399 0 2 3506 RECEIVE +2024-07-30 12:00:03.400 0 2 3508 SEND +2024-07-30 12:00:03.401 0 2 3510 RECEIVE +2024-07-30 12:00:03.402 0 2 3512 SEND +2024-07-30 12:00:03.403 0 2 3514 RECEIVE +2024-07-30 12:00:03.404 0 2 3516 SEND +2024-07-30 12:00:03.405 0 2 3518 RECEIVE +2024-07-30 12:00:03.406 0 2 3520 SEND +2024-07-30 12:00:03.407 0 2 3522 RECEIVE +2024-07-30 12:00:03.408 0 2 3508 SEND +2024-07-30 12:00:03.409 0 2 3510 RECEIVE +2024-07-30 12:00:03.410 0 2 3512 SEND +2024-07-30 12:00:03.411 0 2 3514 RECEIVE +2024-07-30 12:00:03.412 0 2 3516 SEND +2024-07-30 12:00:03.413 0 2 3518 RECEIVE +2024-07-30 12:00:03.414 0 2 3520 SEND +2024-07-30 12:00:03.415 0 2 3522 RECEIVE +2024-07-30 12:00:03.416 0 2 3524 SEND +2024-07-30 12:00:03.417 0 2 3526 RECEIVE +2024-07-30 12:00:03.418 0 2 3528 SEND +2024-07-30 12:00:03.419 0 2 3530 RECEIVE +2024-07-30 12:00:03.420 0 2 3532 SEND +2024-07-30 12:00:03.421 0 2 3534 RECEIVE +2024-07-30 12:00:03.422 0 2 3536 SEND +2024-07-30 12:00:03.423 0 2 3538 RECEIVE +2024-07-30 12:00:03.424 0 2 3524 SEND +2024-07-30 12:00:03.425 0 2 3526 RECEIVE +2024-07-30 12:00:03.426 0 2 3528 SEND +2024-07-30 12:00:03.427 0 2 3530 RECEIVE +2024-07-30 12:00:03.428 0 2 3532 SEND +2024-07-30 12:00:03.429 0 2 3534 RECEIVE +2024-07-30 12:00:03.430 0 2 3536 SEND +2024-07-30 12:00:03.431 0 2 3538 RECEIVE +2024-07-30 12:00:03.432 0 2 3540 SEND +2024-07-30 12:00:03.433 0 2 3542 RECEIVE +2024-07-30 12:00:03.434 0 2 3544 SEND +2024-07-30 12:00:03.435 0 2 3546 RECEIVE +2024-07-30 12:00:03.436 0 2 3548 SEND +2024-07-30 12:00:03.437 0 2 3550 RECEIVE +2024-07-30 12:00:03.438 0 2 3552 SEND +2024-07-30 12:00:03.439 0 2 3554 RECEIVE +2024-07-30 12:00:03.440 0 2 3540 SEND +2024-07-30 12:00:03.441 0 2 3542 RECEIVE +2024-07-30 12:00:03.442 0 2 3544 SEND +2024-07-30 12:00:03.443 0 2 3546 RECEIVE +2024-07-30 12:00:03.444 0 2 3548 SEND +2024-07-30 12:00:03.445 0 2 3550 RECEIVE +2024-07-30 12:00:03.446 0 2 3552 SEND +2024-07-30 12:00:03.447 0 2 3554 RECEIVE +2024-07-30 12:00:03.448 0 2 3556 SEND +2024-07-30 12:00:03.449 0 2 3558 RECEIVE +2024-07-30 12:00:03.450 0 2 3560 SEND +2024-07-30 12:00:03.451 0 2 3562 RECEIVE +2024-07-30 12:00:03.452 0 2 3564 SEND +2024-07-30 12:00:03.453 0 2 3566 RECEIVE +2024-07-30 12:00:03.454 0 2 3568 SEND +2024-07-30 12:00:03.455 0 2 3570 RECEIVE +2024-07-30 12:00:03.456 0 2 3556 SEND +2024-07-30 12:00:03.457 0 2 3558 RECEIVE +2024-07-30 12:00:03.458 0 2 3560 SEND +2024-07-30 12:00:03.459 0 2 3562 RECEIVE +2024-07-30 12:00:03.460 0 2 3564 SEND +2024-07-30 12:00:03.461 0 2 3566 RECEIVE +2024-07-30 12:00:03.462 0 2 3568 SEND +2024-07-30 12:00:03.463 0 2 3570 RECEIVE +2024-07-30 12:00:03.464 0 2 3572 SEND +2024-07-30 12:00:03.465 0 2 3574 RECEIVE +2024-07-30 12:00:03.466 0 2 3576 SEND +2024-07-30 12:00:03.467 0 2 3578 RECEIVE +2024-07-30 12:00:03.468 0 2 3580 SEND +2024-07-30 12:00:03.469 0 2 3582 RECEIVE +2024-07-30 12:00:03.470 0 2 3584 SEND +2024-07-30 12:00:03.471 0 2 3586 RECEIVE +2024-07-30 12:00:03.472 0 2 3572 SEND +2024-07-30 12:00:03.473 0 2 3574 RECEIVE +2024-07-30 12:00:03.474 0 2 3576 SEND +2024-07-30 12:00:03.475 0 2 3578 RECEIVE +2024-07-30 12:00:03.476 0 2 3580 SEND +2024-07-30 12:00:03.477 0 2 3582 RECEIVE +2024-07-30 12:00:03.478 0 2 3584 SEND +2024-07-30 12:00:03.479 0 2 3586 RECEIVE +2024-07-30 12:00:03.480 0 2 3588 SEND +2024-07-30 12:00:03.481 0 2 3590 RECEIVE +2024-07-30 12:00:03.482 0 2 3592 SEND +2024-07-30 12:00:03.483 0 2 3594 RECEIVE +2024-07-30 12:00:03.484 0 2 3596 SEND +2024-07-30 12:00:03.485 0 2 3598 RECEIVE +2024-07-30 12:00:03.486 0 2 3600 SEND +2024-07-30 12:00:03.487 0 2 3602 RECEIVE +2024-07-30 12:00:03.488 0 2 3588 SEND +2024-07-30 12:00:03.489 0 2 3590 RECEIVE +2024-07-30 12:00:03.490 0 2 3592 SEND +2024-07-30 12:00:03.491 0 2 3594 RECEIVE +2024-07-30 12:00:03.492 0 2 3596 SEND +2024-07-30 12:00:03.493 0 2 3598 RECEIVE +2024-07-30 12:00:03.494 0 2 3600 SEND +2024-07-30 12:00:03.495 0 2 3602 RECEIVE +2024-07-30 12:00:03.496 0 2 3604 SEND +2024-07-30 12:00:03.497 0 2 3606 RECEIVE +2024-07-30 12:00:03.498 0 2 3608 SEND +2024-07-30 12:00:03.499 0 2 3610 RECEIVE +2024-07-30 12:00:03.500 0 2 3612 SEND +2024-07-30 12:00:03.501 0 2 3614 RECEIVE +2024-07-30 12:00:03.502 0 2 3616 SEND +2024-07-30 12:00:03.503 0 2 3618 RECEIVE +2024-07-30 12:00:03.504 0 2 3604 SEND +2024-07-30 12:00:03.505 0 2 3606 RECEIVE +2024-07-30 12:00:03.506 0 2 3608 SEND +2024-07-30 12:00:03.507 0 2 3610 RECEIVE +2024-07-30 12:00:03.508 0 2 3612 SEND +2024-07-30 12:00:03.509 0 2 3614 RECEIVE +2024-07-30 12:00:03.510 0 2 3616 SEND +2024-07-30 12:00:03.511 0 2 3618 RECEIVE +2024-07-30 12:00:03.512 0 2 3620 SEND +2024-07-30 12:00:03.513 0 2 3622 RECEIVE +2024-07-30 12:00:03.514 0 2 3624 SEND +2024-07-30 12:00:03.515 0 2 3626 RECEIVE +2024-07-30 12:00:03.516 0 2 3628 SEND +2024-07-30 12:00:03.517 0 2 3630 RECEIVE +2024-07-30 12:00:03.518 0 2 3632 SEND +2024-07-30 12:00:03.519 0 2 3634 RECEIVE +2024-07-30 12:00:03.520 0 2 3620 SEND +2024-07-30 12:00:03.521 0 2 3622 RECEIVE +2024-07-30 12:00:03.522 0 2 3624 SEND +2024-07-30 12:00:03.523 0 2 3626 RECEIVE +2024-07-30 12:00:03.524 0 2 3628 SEND +2024-07-30 12:00:03.525 0 2 3630 RECEIVE +2024-07-30 12:00:03.526 0 2 3632 SEND +2024-07-30 12:00:03.527 0 2 3634 RECEIVE +2024-07-30 12:00:03.528 0 2 3636 SEND +2024-07-30 12:00:03.529 0 2 3638 RECEIVE +2024-07-30 12:00:03.530 0 2 3640 SEND +2024-07-30 12:00:03.531 0 2 3642 RECEIVE +2024-07-30 12:00:03.532 0 2 3644 SEND +2024-07-30 12:00:03.533 0 2 3646 RECEIVE +2024-07-30 12:00:03.534 0 2 3648 SEND +2024-07-30 12:00:03.535 0 2 3650 RECEIVE +2024-07-30 12:00:03.536 0 2 3636 SEND +2024-07-30 12:00:03.537 0 2 3638 RECEIVE +2024-07-30 12:00:03.538 0 2 3640 SEND +2024-07-30 12:00:03.539 0 2 3642 RECEIVE +2024-07-30 12:00:03.540 0 2 3644 SEND +2024-07-30 12:00:03.541 0 2 3646 RECEIVE +2024-07-30 12:00:03.542 0 2 3648 SEND +2024-07-30 12:00:03.543 0 2 3650 RECEIVE +2024-07-30 12:00:03.544 0 2 3652 SEND +2024-07-30 12:00:03.545 0 2 3654 RECEIVE +2024-07-30 12:00:03.546 0 2 3656 SEND +2024-07-30 12:00:03.547 0 2 3658 RECEIVE +2024-07-30 12:00:03.548 0 2 3660 SEND +2024-07-30 12:00:03.549 0 2 3662 RECEIVE +2024-07-30 12:00:03.550 0 2 3664 SEND +2024-07-30 12:00:03.551 0 2 3666 RECEIVE +2024-07-30 12:00:03.552 0 2 3652 SEND +2024-07-30 12:00:03.553 0 2 3654 RECEIVE +2024-07-30 12:00:03.554 0 2 3656 SEND +2024-07-30 12:00:03.555 0 2 3658 RECEIVE +2024-07-30 12:00:03.556 0 2 3660 SEND +2024-07-30 12:00:03.557 0 2 3662 RECEIVE +2024-07-30 12:00:03.558 0 2 3664 SEND +2024-07-30 12:00:03.559 0 2 3666 RECEIVE +2024-07-30 12:00:03.560 0 2 3668 SEND +2024-07-30 12:00:03.561 0 2 3670 RECEIVE +2024-07-30 12:00:03.562 0 2 3672 SEND +2024-07-30 12:00:03.563 0 2 3674 RECEIVE +2024-07-30 12:00:03.564 0 2 3676 SEND +2024-07-30 12:00:03.565 0 2 3678 RECEIVE +2024-07-30 12:00:03.566 0 2 3680 SEND +2024-07-30 12:00:03.567 0 2 3682 RECEIVE +2024-07-30 12:00:03.568 0 2 3668 SEND +2024-07-30 12:00:03.569 0 2 3670 RECEIVE +2024-07-30 12:00:03.570 0 2 3672 SEND +2024-07-30 12:00:03.571 0 2 3674 RECEIVE +2024-07-30 12:00:03.572 0 2 3676 SEND +2024-07-30 12:00:03.573 0 2 3678 RECEIVE +2024-07-30 12:00:03.574 0 2 3680 SEND +2024-07-30 12:00:03.575 0 2 3682 RECEIVE +2024-07-30 12:00:03.576 0 2 3684 SEND +2024-07-30 12:00:03.577 0 2 3686 RECEIVE +2024-07-30 12:00:03.578 0 2 3688 SEND +2024-07-30 12:00:03.579 0 2 3690 RECEIVE +2024-07-30 12:00:03.580 0 2 3692 SEND +2024-07-30 12:00:03.581 0 2 3694 RECEIVE +2024-07-30 12:00:03.582 0 2 3696 SEND +2024-07-30 12:00:03.583 0 2 3698 RECEIVE +2024-07-30 12:00:03.584 0 2 3684 SEND +2024-07-30 12:00:03.585 0 2 3686 RECEIVE +2024-07-30 12:00:03.586 0 2 3688 SEND +2024-07-30 12:00:03.587 0 2 3690 RECEIVE +2024-07-30 12:00:03.588 0 2 3692 SEND +2024-07-30 12:00:03.589 0 2 3694 RECEIVE +2024-07-30 12:00:03.590 0 2 3696 SEND +2024-07-30 12:00:03.591 0 2 3698 RECEIVE +2024-07-30 12:00:03.592 0 2 3700 SEND +2024-07-30 12:00:03.593 0 2 3702 RECEIVE +2024-07-30 12:00:03.594 0 2 3704 SEND +2024-07-30 12:00:03.595 0 2 3706 RECEIVE +2024-07-30 12:00:03.596 0 2 3708 SEND +2024-07-30 12:00:03.597 0 2 3710 RECEIVE +2024-07-30 12:00:03.598 0 2 3712 SEND +2024-07-30 12:00:03.599 0 2 3714 RECEIVE +2024-07-30 12:00:03.600 0 2 3700 SEND +2024-07-30 12:00:03.601 0 2 3702 RECEIVE +2024-07-30 12:00:03.602 0 2 3704 SEND +2024-07-30 12:00:03.603 0 2 3706 RECEIVE +2024-07-30 12:00:03.604 0 2 3708 SEND +2024-07-30 12:00:03.605 0 2 3710 RECEIVE +2024-07-30 12:00:03.606 0 2 3712 SEND +2024-07-30 12:00:03.607 0 2 3714 RECEIVE +2024-07-30 12:00:03.608 0 2 3716 SEND +2024-07-30 12:00:03.609 0 2 3718 RECEIVE +2024-07-30 12:00:03.610 0 2 3720 SEND +2024-07-30 12:00:03.611 0 2 3722 RECEIVE +2024-07-30 12:00:03.612 0 2 3724 SEND +2024-07-30 12:00:03.613 0 2 3726 RECEIVE +2024-07-30 12:00:03.614 0 2 3728 SEND +2024-07-30 12:00:03.615 0 2 3730 RECEIVE +2024-07-30 12:00:03.616 0 2 3716 SEND +2024-07-30 12:00:03.617 0 2 3718 RECEIVE +2024-07-30 12:00:03.618 0 2 3720 SEND +2024-07-30 12:00:03.619 0 2 3722 RECEIVE +2024-07-30 12:00:03.620 0 2 3724 SEND +2024-07-30 12:00:03.621 0 2 3726 RECEIVE +2024-07-30 12:00:03.622 0 2 3728 SEND +2024-07-30 12:00:03.623 0 2 3730 RECEIVE +2024-07-30 12:00:03.624 0 2 3732 SEND +2024-07-30 12:00:03.625 0 2 3734 RECEIVE +2024-07-30 12:00:03.626 0 2 3736 SEND +2024-07-30 12:00:03.627 0 2 3738 RECEIVE +2024-07-30 12:00:03.628 0 2 3740 SEND +2024-07-30 12:00:03.629 0 2 3742 RECEIVE +2024-07-30 12:00:03.630 0 2 3744 SEND +2024-07-30 12:00:03.631 0 2 3746 RECEIVE +2024-07-30 12:00:03.632 0 2 3732 SEND +2024-07-30 12:00:03.633 0 2 3734 RECEIVE +2024-07-30 12:00:03.634 0 2 3736 SEND +2024-07-30 12:00:03.635 0 2 3738 RECEIVE +2024-07-30 12:00:03.636 0 2 3740 SEND +2024-07-30 12:00:03.637 0 2 3742 RECEIVE +2024-07-30 12:00:03.638 0 2 3744 SEND +2024-07-30 12:00:03.639 0 2 3746 RECEIVE +2024-07-30 12:00:03.640 0 2 3748 SEND +2024-07-30 12:00:03.641 0 2 3750 RECEIVE +2024-07-30 12:00:03.642 0 2 3752 SEND +2024-07-30 12:00:03.643 0 2 3754 RECEIVE +2024-07-30 12:00:03.644 0 2 3756 SEND +2024-07-30 12:00:03.645 0 2 3758 RECEIVE +2024-07-30 12:00:03.646 0 2 3760 SEND +2024-07-30 12:00:03.647 0 2 3762 RECEIVE +2024-07-30 12:00:03.648 0 2 3748 SEND +2024-07-30 12:00:03.649 0 2 3750 RECEIVE +2024-07-30 12:00:03.650 0 2 3752 SEND +2024-07-30 12:00:03.651 0 2 3754 RECEIVE +2024-07-30 12:00:03.652 0 2 3756 SEND +2024-07-30 12:00:03.653 0 2 3758 RECEIVE +2024-07-30 12:00:03.654 0 2 3760 SEND +2024-07-30 12:00:03.655 0 2 3762 RECEIVE +2024-07-30 12:00:03.656 0 2 3764 SEND +2024-07-30 12:00:03.657 0 2 3766 RECEIVE +2024-07-30 12:00:03.658 0 2 3768 SEND +2024-07-30 12:00:03.659 0 2 3770 RECEIVE +2024-07-30 12:00:03.660 0 2 3772 SEND +2024-07-30 12:00:03.661 0 2 3774 RECEIVE +2024-07-30 12:00:03.662 0 2 3776 SEND +2024-07-30 12:00:03.663 0 2 3778 RECEIVE +2024-07-30 12:00:03.664 0 2 3764 SEND +2024-07-30 12:00:03.665 0 2 3766 RECEIVE +2024-07-30 12:00:03.666 0 2 3768 SEND +2024-07-30 12:00:03.667 0 2 3770 RECEIVE +2024-07-30 12:00:03.668 0 2 3772 SEND +2024-07-30 12:00:03.669 0 2 3774 RECEIVE +2024-07-30 12:00:03.670 0 2 3776 SEND +2024-07-30 12:00:03.671 0 2 3778 RECEIVE +2024-07-30 12:00:03.672 0 2 3780 SEND +2024-07-30 12:00:03.673 0 2 3782 RECEIVE +2024-07-30 12:00:03.674 0 2 3784 SEND +2024-07-30 12:00:03.675 0 2 3786 RECEIVE +2024-07-30 12:00:03.676 0 2 3788 SEND +2024-07-30 12:00:03.677 0 2 3790 RECEIVE +2024-07-30 12:00:03.678 0 2 3792 SEND +2024-07-30 12:00:03.679 0 2 3794 RECEIVE +2024-07-30 12:00:03.680 0 2 3780 SEND +2024-07-30 12:00:03.681 0 2 3782 RECEIVE +2024-07-30 12:00:03.682 0 2 3784 SEND +2024-07-30 12:00:03.683 0 2 3786 RECEIVE +2024-07-30 12:00:03.684 0 2 3788 SEND +2024-07-30 12:00:03.685 0 2 3790 RECEIVE +2024-07-30 12:00:03.686 0 2 3792 SEND +2024-07-30 12:00:03.687 0 2 3794 RECEIVE +2024-07-30 12:00:03.688 0 2 3796 SEND +2024-07-30 12:00:03.689 0 2 3798 RECEIVE +2024-07-30 12:00:03.690 0 2 3800 SEND +2024-07-30 12:00:03.691 0 2 3802 RECEIVE +2024-07-30 12:00:03.692 0 2 3804 SEND +2024-07-30 12:00:03.693 0 2 3806 RECEIVE +2024-07-30 12:00:03.694 0 2 3808 SEND +2024-07-30 12:00:03.695 0 2 3810 RECEIVE +2024-07-30 12:00:03.696 0 2 3796 SEND +2024-07-30 12:00:03.697 0 2 3798 RECEIVE +2024-07-30 12:00:03.698 0 2 3800 SEND +2024-07-30 12:00:03.699 0 2 3802 RECEIVE +2024-07-30 12:00:03.700 0 2 3804 SEND +2024-07-30 12:00:03.701 0 2 3806 RECEIVE +2024-07-30 12:00:03.702 0 2 3808 SEND +2024-07-30 12:00:03.703 0 2 3810 RECEIVE +2024-07-30 12:00:03.704 0 2 3812 SEND +2024-07-30 12:00:03.705 0 2 3814 RECEIVE +2024-07-30 12:00:03.706 0 2 3816 SEND +2024-07-30 12:00:03.707 0 2 3818 RECEIVE +2024-07-30 12:00:03.708 0 2 3820 SEND +2024-07-30 12:00:03.709 0 2 3822 RECEIVE +2024-07-30 12:00:03.710 0 2 3824 SEND +2024-07-30 12:00:03.711 0 2 3826 RECEIVE +2024-07-30 12:00:03.712 0 2 3812 SEND +2024-07-30 12:00:03.713 0 2 3814 RECEIVE +2024-07-30 12:00:03.714 0 2 3816 SEND +2024-07-30 12:00:03.715 0 2 3818 RECEIVE +2024-07-30 12:00:03.716 0 2 3820 SEND +2024-07-30 12:00:03.717 0 2 3822 RECEIVE +2024-07-30 12:00:03.718 0 2 3824 SEND +2024-07-30 12:00:03.719 0 2 3826 RECEIVE +2024-07-30 12:00:03.720 0 2 3828 SEND +2024-07-30 12:00:03.721 0 2 3830 RECEIVE +2024-07-30 12:00:03.722 0 2 3832 SEND +2024-07-30 12:00:03.723 0 2 3834 RECEIVE +2024-07-30 12:00:03.724 0 2 3836 SEND +2024-07-30 12:00:03.725 0 2 3838 RECEIVE +2024-07-30 12:00:03.726 0 2 3840 SEND +2024-07-30 12:00:03.727 0 2 3842 RECEIVE +2024-07-30 12:00:03.728 0 2 3828 SEND +2024-07-30 12:00:03.729 0 2 3830 RECEIVE +2024-07-30 12:00:03.730 0 2 3832 SEND +2024-07-30 12:00:03.731 0 2 3834 RECEIVE +2024-07-30 12:00:03.732 0 2 3836 SEND +2024-07-30 12:00:03.733 0 2 3838 RECEIVE +2024-07-30 12:00:03.734 0 2 3840 SEND +2024-07-30 12:00:03.735 0 2 3842 RECEIVE +2024-07-30 12:00:03.736 0 2 3844 SEND +2024-07-30 12:00:03.737 0 2 3846 RECEIVE +2024-07-30 12:00:03.738 0 2 3848 SEND +2024-07-30 12:00:03.739 0 2 3850 RECEIVE +2024-07-30 12:00:03.740 0 2 3852 SEND +2024-07-30 12:00:03.741 0 2 3854 RECEIVE +2024-07-30 12:00:03.742 0 2 3856 SEND +2024-07-30 12:00:03.743 0 2 3858 RECEIVE +2024-07-30 12:00:03.744 0 2 3844 SEND +2024-07-30 12:00:03.745 0 2 3846 RECEIVE +2024-07-30 12:00:03.746 0 2 3848 SEND +2024-07-30 12:00:03.747 0 2 3850 RECEIVE +2024-07-30 12:00:03.748 0 2 3852 SEND +2024-07-30 12:00:03.749 0 2 3854 RECEIVE +2024-07-30 12:00:03.750 0 2 3856 SEND +2024-07-30 12:00:03.751 0 2 3858 RECEIVE +2024-07-30 12:00:03.752 0 2 3860 SEND +2024-07-30 12:00:03.753 0 2 3862 RECEIVE +2024-07-30 12:00:03.754 0 2 3864 SEND +2024-07-30 12:00:03.755 0 2 3866 RECEIVE +2024-07-30 12:00:03.756 0 2 3868 SEND +2024-07-30 12:00:03.757 0 2 3870 RECEIVE +2024-07-30 12:00:03.758 0 2 3872 SEND +2024-07-30 12:00:03.759 0 2 3874 RECEIVE +2024-07-30 12:00:03.760 0 2 3860 SEND +2024-07-30 12:00:03.761 0 2 3862 RECEIVE +2024-07-30 12:00:03.762 0 2 3864 SEND +2024-07-30 12:00:03.763 0 2 3866 RECEIVE +2024-07-30 12:00:03.764 0 2 3868 SEND +2024-07-30 12:00:03.765 0 2 3870 RECEIVE +2024-07-30 12:00:03.766 0 2 3872 SEND +2024-07-30 12:00:03.767 0 2 3874 RECEIVE +2024-07-30 12:00:03.768 0 2 3876 SEND +2024-07-30 12:00:03.769 0 2 3878 RECEIVE +2024-07-30 12:00:03.770 0 2 3880 SEND +2024-07-30 12:00:03.771 0 2 3882 RECEIVE +2024-07-30 12:00:03.772 0 2 3884 SEND +2024-07-30 12:00:03.773 0 2 3886 RECEIVE +2024-07-30 12:00:03.774 0 2 3888 SEND +2024-07-30 12:00:03.775 0 2 3890 RECEIVE +2024-07-30 12:00:03.776 0 2 3876 SEND +2024-07-30 12:00:03.777 0 2 3878 RECEIVE +2024-07-30 12:00:03.778 0 2 3880 SEND +2024-07-30 12:00:03.779 0 2 3882 RECEIVE +2024-07-30 12:00:03.780 0 2 3884 SEND +2024-07-30 12:00:03.781 0 2 3886 RECEIVE +2024-07-30 12:00:03.782 0 2 3888 SEND +2024-07-30 12:00:03.783 0 2 3890 RECEIVE +2024-07-30 12:00:03.784 0 2 3892 SEND +2024-07-30 12:00:03.785 0 2 3894 RECEIVE +2024-07-30 12:00:03.786 0 2 3896 SEND +2024-07-30 12:00:03.787 0 2 3898 RECEIVE +2024-07-30 12:00:03.788 0 2 3900 SEND +2024-07-30 12:00:03.789 0 2 3902 RECEIVE +2024-07-30 12:00:03.790 0 2 3904 SEND +2024-07-30 12:00:03.791 0 2 3906 RECEIVE +2024-07-30 12:00:03.792 0 2 3892 SEND +2024-07-30 12:00:03.793 0 2 3894 RECEIVE +2024-07-30 12:00:03.794 0 2 3896 SEND +2024-07-30 12:00:03.795 0 2 3898 RECEIVE +2024-07-30 12:00:03.796 0 2 3900 SEND +2024-07-30 12:00:03.797 0 2 3902 RECEIVE +2024-07-30 12:00:03.798 0 2 3904 SEND +2024-07-30 12:00:03.799 0 2 3906 RECEIVE +2024-07-30 12:00:03.800 0 2 3908 SEND +2024-07-30 12:00:03.801 0 2 3910 RECEIVE +2024-07-30 12:00:03.802 0 2 3912 SEND +2024-07-30 12:00:03.803 0 2 3914 RECEIVE +2024-07-30 12:00:03.804 0 2 3916 SEND +2024-07-30 12:00:03.805 0 2 3918 RECEIVE +2024-07-30 12:00:03.806 0 2 3920 SEND +2024-07-30 12:00:03.807 0 2 3922 RECEIVE +2024-07-30 12:00:03.808 0 2 3908 SEND +2024-07-30 12:00:03.809 0 2 3910 RECEIVE +2024-07-30 12:00:03.810 0 2 3912 SEND +2024-07-30 12:00:03.811 0 2 3914 RECEIVE +2024-07-30 12:00:03.812 0 2 3916 SEND +2024-07-30 12:00:03.813 0 2 3918 RECEIVE +2024-07-30 12:00:03.814 0 2 3920 SEND +2024-07-30 12:00:03.815 0 2 3922 RECEIVE +2024-07-30 12:00:03.816 0 2 3924 SEND +2024-07-30 12:00:03.817 0 2 3926 RECEIVE +2024-07-30 12:00:03.818 0 2 3928 SEND +2024-07-30 12:00:03.819 0 2 3930 RECEIVE +2024-07-30 12:00:03.820 0 2 3932 SEND +2024-07-30 12:00:03.821 0 2 3934 RECEIVE +2024-07-30 12:00:03.822 0 2 3936 SEND +2024-07-30 12:00:03.823 0 2 3938 RECEIVE +2024-07-30 12:00:03.824 0 2 3924 SEND +2024-07-30 12:00:03.825 0 2 3926 RECEIVE +2024-07-30 12:00:03.826 0 2 3928 SEND +2024-07-30 12:00:03.827 0 2 3930 RECEIVE +2024-07-30 12:00:03.828 0 2 3932 SEND +2024-07-30 12:00:03.829 0 2 3934 RECEIVE +2024-07-30 12:00:03.830 0 2 3936 SEND +2024-07-30 12:00:03.831 0 2 3938 RECEIVE +2024-07-30 12:00:03.832 0 2 3940 SEND +2024-07-30 12:00:03.833 0 2 3942 RECEIVE +2024-07-30 12:00:03.834 0 2 3944 SEND +2024-07-30 12:00:03.835 0 2 3946 RECEIVE +2024-07-30 12:00:03.836 0 2 3948 SEND +2024-07-30 12:00:03.837 0 2 3950 RECEIVE +2024-07-30 12:00:03.838 0 2 3952 SEND +2024-07-30 12:00:03.839 0 2 3954 RECEIVE +2024-07-30 12:00:03.840 0 2 3940 SEND +2024-07-30 12:00:03.841 0 2 3942 RECEIVE +2024-07-30 12:00:03.842 0 2 3944 SEND +2024-07-30 12:00:03.843 0 2 3946 RECEIVE +2024-07-30 12:00:03.844 0 2 3948 SEND +2024-07-30 12:00:03.845 0 2 3950 RECEIVE +2024-07-30 12:00:03.846 0 2 3952 SEND +2024-07-30 12:00:03.847 0 2 3954 RECEIVE +2024-07-30 12:00:03.848 0 2 3956 SEND +2024-07-30 12:00:03.849 0 2 3958 RECEIVE +2024-07-30 12:00:03.850 0 2 3960 SEND +2024-07-30 12:00:03.851 0 2 3962 RECEIVE +2024-07-30 12:00:03.852 0 2 3964 SEND +2024-07-30 12:00:03.853 0 2 3966 RECEIVE +2024-07-30 12:00:03.854 0 2 3968 SEND +2024-07-30 12:00:03.855 0 2 3970 RECEIVE +2024-07-30 12:00:03.856 0 2 3956 SEND +2024-07-30 12:00:03.857 0 2 3958 RECEIVE +2024-07-30 12:00:03.858 0 2 3960 SEND +2024-07-30 12:00:03.859 0 2 3962 RECEIVE +2024-07-30 12:00:03.860 0 2 3964 SEND +2024-07-30 12:00:03.861 0 2 3966 RECEIVE +2024-07-30 12:00:03.862 0 2 3968 SEND +2024-07-30 12:00:03.863 0 2 3970 RECEIVE +2024-07-30 12:00:03.864 0 2 3972 SEND +2024-07-30 12:00:03.865 0 2 3974 RECEIVE +2024-07-30 12:00:03.866 0 2 3976 SEND +2024-07-30 12:00:03.867 0 2 3978 RECEIVE +2024-07-30 12:00:03.868 0 2 3980 SEND +2024-07-30 12:00:03.869 0 2 3982 RECEIVE +2024-07-30 12:00:03.870 0 2 3984 SEND +2024-07-30 12:00:03.871 0 2 3986 RECEIVE +2024-07-30 12:00:03.872 0 2 3972 SEND +2024-07-30 12:00:03.873 0 2 3974 RECEIVE +2024-07-30 12:00:03.874 0 2 3976 SEND +2024-07-30 12:00:03.875 0 2 3978 RECEIVE +2024-07-30 12:00:03.876 0 2 3980 SEND +2024-07-30 12:00:03.877 0 2 3982 RECEIVE +2024-07-30 12:00:03.878 0 2 3984 SEND +2024-07-30 12:00:03.879 0 2 3986 RECEIVE +2024-07-30 12:00:03.880 0 2 3988 SEND +2024-07-30 12:00:03.881 0 2 3990 RECEIVE +2024-07-30 12:00:03.882 0 2 3992 SEND +2024-07-30 12:00:03.883 0 2 3994 RECEIVE +2024-07-30 12:00:03.884 0 2 3996 SEND +2024-07-30 12:00:03.885 0 2 3998 RECEIVE +2024-07-30 12:00:03.886 0 2 4000 SEND +2024-07-30 12:00:03.887 0 2 4002 RECEIVE +2024-07-30 12:00:03.888 0 2 3988 SEND +2024-07-30 12:00:03.889 0 2 3990 RECEIVE +2024-07-30 12:00:03.890 0 2 3992 SEND +2024-07-30 12:00:03.891 0 2 3994 RECEIVE +2024-07-30 12:00:03.892 0 2 3996 SEND +2024-07-30 12:00:03.893 0 2 3998 RECEIVE +2024-07-30 12:00:03.894 0 2 4000 SEND +2024-07-30 12:00:03.895 0 2 4002 RECEIVE +2024-07-30 12:00:03.896 0 2 4004 SEND +2024-07-30 12:00:03.897 0 2 4006 RECEIVE +2024-07-30 12:00:03.898 0 2 4008 SEND +2024-07-30 12:00:03.899 0 2 4010 RECEIVE +2024-07-30 12:00:03.900 0 2 4012 SEND +2024-07-30 12:00:03.901 0 2 4014 RECEIVE +2024-07-30 12:00:03.902 0 2 4016 SEND +2024-07-30 12:00:03.903 0 2 4018 RECEIVE +2024-07-30 12:00:03.904 0 2 4004 SEND +2024-07-30 12:00:03.905 0 2 4006 RECEIVE +2024-07-30 12:00:03.906 0 2 4008 SEND +2024-07-30 12:00:03.907 0 2 4010 RECEIVE +2024-07-30 12:00:03.908 0 2 4012 SEND +2024-07-30 12:00:03.909 0 2 4014 RECEIVE +2024-07-30 12:00:03.910 0 2 4016 SEND +2024-07-30 12:00:03.911 0 2 4018 RECEIVE +2024-07-30 12:00:03.912 0 2 4020 SEND +2024-07-30 12:00:03.913 0 2 4022 RECEIVE +2024-07-30 12:00:03.914 0 2 4024 SEND +2024-07-30 12:00:03.915 0 2 4026 RECEIVE +2024-07-30 12:00:03.916 0 2 4028 SEND +2024-07-30 12:00:03.917 0 2 4030 RECEIVE +2024-07-30 12:00:03.918 0 2 4032 SEND +2024-07-30 12:00:03.919 0 2 4034 RECEIVE +2024-07-30 12:00:03.920 0 2 4020 SEND +2024-07-30 12:00:03.921 0 2 4022 RECEIVE +2024-07-30 12:00:03.922 0 2 4024 SEND +2024-07-30 12:00:03.923 0 2 4026 RECEIVE +2024-07-30 12:00:03.924 0 2 4028 SEND +2024-07-30 12:00:03.925 0 2 4030 RECEIVE +2024-07-30 12:00:03.926 0 2 4032 SEND +2024-07-30 12:00:03.927 0 2 4034 RECEIVE +2024-07-30 12:00:03.928 0 2 4036 SEND +2024-07-30 12:00:03.929 0 2 4038 RECEIVE +2024-07-30 12:00:03.930 0 2 4040 SEND +2024-07-30 12:00:03.931 0 2 4042 RECEIVE +2024-07-30 12:00:03.932 0 2 4044 SEND +2024-07-30 12:00:03.933 0 2 4046 RECEIVE +2024-07-30 12:00:03.934 0 2 4048 SEND +2024-07-30 12:00:03.935 0 2 4050 RECEIVE +2024-07-30 12:00:03.936 0 2 4036 SEND +2024-07-30 12:00:03.937 0 2 4038 RECEIVE +2024-07-30 12:00:03.938 0 2 4040 SEND +2024-07-30 12:00:03.939 0 2 4042 RECEIVE +2024-07-30 12:00:03.940 0 2 4044 SEND +2024-07-30 12:00:03.941 0 2 4046 RECEIVE +2024-07-30 12:00:03.942 0 2 4048 SEND +2024-07-30 12:00:03.943 0 2 4050 RECEIVE +2024-07-30 12:00:03.944 0 2 4052 SEND +2024-07-30 12:00:03.945 0 2 4054 RECEIVE +2024-07-30 12:00:03.946 0 2 4056 SEND +2024-07-30 12:00:03.947 0 2 4058 RECEIVE +2024-07-30 12:00:03.948 0 2 4060 SEND +2024-07-30 12:00:03.949 0 2 4062 RECEIVE +2024-07-30 12:00:03.950 0 2 4064 SEND +2024-07-30 12:00:03.951 0 2 4066 RECEIVE +2024-07-30 12:00:03.952 0 2 4052 SEND +2024-07-30 12:00:03.953 0 2 4054 RECEIVE +2024-07-30 12:00:03.954 0 2 4056 SEND +2024-07-30 12:00:03.955 0 2 4058 RECEIVE +2024-07-30 12:00:03.956 0 2 4060 SEND +2024-07-30 12:00:03.957 0 2 4062 RECEIVE +2024-07-30 12:00:03.958 0 2 4064 SEND +2024-07-30 12:00:03.959 0 2 4066 RECEIVE +2024-07-30 12:00:03.960 0 2 4068 SEND +2024-07-30 12:00:03.961 0 2 4070 RECEIVE +2024-07-30 12:00:03.962 0 2 4072 SEND +2024-07-30 12:00:03.963 0 2 4074 RECEIVE +2024-07-30 12:00:03.964 0 2 4076 SEND +2024-07-30 12:00:03.965 0 2 4078 RECEIVE +2024-07-30 12:00:03.966 0 2 4080 SEND +2024-07-30 12:00:03.967 0 2 4082 RECEIVE +2024-07-30 12:00:03.968 0 2 4068 SEND +2024-07-30 12:00:03.969 0 2 4070 RECEIVE +2024-07-30 12:00:03.970 0 2 4072 SEND +2024-07-30 12:00:03.971 0 2 4074 RECEIVE +2024-07-30 12:00:03.972 0 2 4076 SEND +2024-07-30 12:00:03.973 0 2 4078 RECEIVE +2024-07-30 12:00:03.974 0 2 4080 SEND +2024-07-30 12:00:03.975 0 2 4082 RECEIVE +2024-07-30 12:00:03.976 0 2 4084 SEND +2024-07-30 12:00:03.977 0 2 4086 RECEIVE +2024-07-30 12:00:03.978 0 2 4088 SEND +2024-07-30 12:00:03.979 0 2 4090 RECEIVE +2024-07-30 12:00:03.980 0 2 4092 SEND +2024-07-30 12:00:03.981 0 2 4094 RECEIVE +2024-07-30 12:00:03.982 0 2 4096 SEND +2024-07-30 12:00:03.983 0 2 4098 RECEIVE +2024-07-30 12:00:03.984 0 2 4084 SEND +2024-07-30 12:00:03.985 0 2 4086 RECEIVE +2024-07-30 12:00:03.986 0 2 4088 SEND +2024-07-30 12:00:03.987 0 2 4090 RECEIVE +2024-07-30 12:00:03.988 0 2 4092 SEND +2024-07-30 12:00:03.989 0 2 4094 RECEIVE +2024-07-30 12:00:03.990 0 2 4096 SEND +2024-07-30 12:00:03.991 0 2 4098 RECEIVE +2024-07-30 12:00:03.992 0 2 4100 SEND +2024-07-30 12:00:03.993 0 2 4102 RECEIVE +2024-07-30 12:00:03.994 0 2 4104 SEND +2024-07-30 12:00:03.995 0 2 4106 RECEIVE +2024-07-30 12:00:03.996 0 2 4108 SEND +2024-07-30 12:00:03.997 0 2 4110 RECEIVE +2024-07-30 12:00:03.998 0 2 4112 SEND +2024-07-30 12:00:03.999 0 2 4114 RECEIVE +2024-07-30 12:00:04.000 0 2 4100 SEND +2024-07-30 12:00:04.001 0 2 4102 RECEIVE +2024-07-30 12:00:04.002 0 2 4104 SEND +2024-07-30 12:00:04.003 0 2 4106 RECEIVE +2024-07-30 12:00:04.004 0 2 4108 SEND +2024-07-30 12:00:04.005 0 2 4110 RECEIVE +2024-07-30 12:00:04.006 0 2 4112 SEND +2024-07-30 12:00:04.007 0 2 4114 RECEIVE +2024-07-30 12:00:04.008 0 2 4116 SEND +2024-07-30 12:00:04.009 0 2 4118 RECEIVE +2024-07-30 12:00:04.010 0 2 4120 SEND +2024-07-30 12:00:04.011 0 2 4122 RECEIVE +2024-07-30 12:00:04.012 0 2 4124 SEND +2024-07-30 12:00:04.013 0 2 4126 RECEIVE +2024-07-30 12:00:04.014 0 2 4128 SEND +2024-07-30 12:00:04.015 0 2 4130 RECEIVE +2024-07-30 12:00:04.016 0 2 4116 SEND +2024-07-30 12:00:04.017 0 2 4118 RECEIVE +2024-07-30 12:00:04.018 0 2 4120 SEND +2024-07-30 12:00:04.019 0 2 4122 RECEIVE +2024-07-30 12:00:04.020 0 2 4124 SEND +2024-07-30 12:00:04.021 0 2 4126 RECEIVE +2024-07-30 12:00:04.022 0 2 4128 SEND +2024-07-30 12:00:04.023 0 2 4130 RECEIVE +2024-07-30 12:00:04.024 0 2 4132 SEND +2024-07-30 12:00:04.025 0 2 4134 RECEIVE +2024-07-30 12:00:04.026 0 2 4136 SEND +2024-07-30 12:00:04.027 0 2 4138 RECEIVE +2024-07-30 12:00:04.028 0 2 4140 SEND +2024-07-30 12:00:04.029 0 2 4142 RECEIVE +2024-07-30 12:00:04.030 0 2 4144 SEND +2024-07-30 12:00:04.031 0 2 4146 RECEIVE +2024-07-30 12:00:04.032 0 2 4132 SEND +2024-07-30 12:00:04.033 0 2 4134 RECEIVE +2024-07-30 12:00:04.034 0 2 4136 SEND +2024-07-30 12:00:04.035 0 2 4138 RECEIVE +2024-07-30 12:00:04.036 0 2 4140 SEND +2024-07-30 12:00:04.037 0 2 4142 RECEIVE +2024-07-30 12:00:04.038 0 2 4144 SEND +2024-07-30 12:00:04.039 0 2 4146 RECEIVE +2024-07-30 12:00:04.040 0 2 4148 SEND +2024-07-30 12:00:04.041 0 2 4150 RECEIVE +2024-07-30 12:00:04.042 0 2 4152 SEND +2024-07-30 12:00:04.043 0 2 4154 RECEIVE +2024-07-30 12:00:04.044 0 2 4156 SEND +2024-07-30 12:00:04.045 0 2 4158 RECEIVE +2024-07-30 12:00:04.046 0 2 4160 SEND +2024-07-30 12:00:04.047 0 2 4162 RECEIVE +2024-07-30 12:00:04.048 0 2 4148 SEND +2024-07-30 12:00:04.049 0 2 4150 RECEIVE +2024-07-30 12:00:04.050 0 2 4152 SEND +2024-07-30 12:00:04.051 0 2 4154 RECEIVE +2024-07-30 12:00:04.052 0 2 4156 SEND +2024-07-30 12:00:04.053 0 2 4158 RECEIVE +2024-07-30 12:00:04.054 0 2 4160 SEND +2024-07-30 12:00:04.055 0 2 4162 RECEIVE +2024-07-30 12:00:04.056 0 2 4164 SEND +2024-07-30 12:00:04.057 0 2 4166 RECEIVE +2024-07-30 12:00:04.058 0 2 4168 SEND +2024-07-30 12:00:04.059 0 2 4170 RECEIVE +2024-07-30 12:00:04.060 0 2 4172 SEND +2024-07-30 12:00:04.061 0 2 4174 RECEIVE +2024-07-30 12:00:04.062 0 2 4176 SEND +2024-07-30 12:00:04.063 0 2 4178 RECEIVE +2024-07-30 12:00:04.064 0 2 4164 SEND +2024-07-30 12:00:04.065 0 2 4166 RECEIVE +2024-07-30 12:00:04.066 0 2 4168 SEND +2024-07-30 12:00:04.067 0 2 4170 RECEIVE +2024-07-30 12:00:04.068 0 2 4172 SEND +2024-07-30 12:00:04.069 0 2 4174 RECEIVE +2024-07-30 12:00:04.070 0 2 4176 SEND +2024-07-30 12:00:04.071 0 2 4178 RECEIVE +2024-07-30 12:00:04.072 0 2 4180 SEND +2024-07-30 12:00:04.073 0 2 4182 RECEIVE +2024-07-30 12:00:04.074 0 2 4184 SEND +2024-07-30 12:00:04.075 0 2 4186 RECEIVE +2024-07-30 12:00:04.076 0 2 4188 SEND +2024-07-30 12:00:04.077 0 2 4190 RECEIVE +2024-07-30 12:00:04.078 0 2 4192 SEND +2024-07-30 12:00:04.079 0 2 4194 RECEIVE +2024-07-30 12:00:04.080 0 2 4180 SEND +2024-07-30 12:00:04.081 0 2 4182 RECEIVE +2024-07-30 12:00:04.082 0 2 4184 SEND +2024-07-30 12:00:04.083 0 2 4186 RECEIVE +2024-07-30 12:00:04.084 0 2 4188 SEND +2024-07-30 12:00:04.085 0 2 4190 RECEIVE +2024-07-30 12:00:04.086 0 2 4192 SEND +2024-07-30 12:00:04.087 0 2 4194 RECEIVE +2024-07-30 12:00:04.088 0 2 4196 SEND +2024-07-30 12:00:04.089 0 2 4198 RECEIVE +2024-07-30 12:00:04.090 0 2 4200 SEND +2024-07-30 12:00:04.091 0 2 4202 RECEIVE +2024-07-30 12:00:04.092 0 2 4204 SEND +2024-07-30 12:00:04.093 0 2 4206 RECEIVE +2024-07-30 12:00:04.094 0 2 4208 SEND +2024-07-30 12:00:04.095 0 2 4210 RECEIVE +2024-07-30 12:00:04.096 0 2 4196 SEND +2024-07-30 12:00:04.097 0 2 4198 RECEIVE +2024-07-30 12:00:04.098 0 2 4200 SEND +2024-07-30 12:00:04.099 0 2 4202 RECEIVE +2024-07-30 12:00:04.100 0 2 4204 SEND +2024-07-30 12:00:04.101 0 2 4206 RECEIVE +2024-07-30 12:00:04.102 0 2 4208 SEND +2024-07-30 12:00:04.103 0 2 4210 RECEIVE +2024-07-30 12:00:04.104 0 2 4212 SEND +2024-07-30 12:00:04.105 0 2 4214 RECEIVE +2024-07-30 12:00:04.106 0 2 4216 SEND +2024-07-30 12:00:04.107 0 2 4218 RECEIVE +2024-07-30 12:00:04.108 0 2 4220 SEND +2024-07-30 12:00:04.109 0 2 4222 RECEIVE +2024-07-30 12:00:04.110 0 2 4224 SEND +2024-07-30 12:00:04.111 0 2 4226 RECEIVE +2024-07-30 12:00:04.112 0 2 4212 SEND +2024-07-30 12:00:04.113 0 2 4214 RECEIVE +2024-07-30 12:00:04.114 0 2 4216 SEND +2024-07-30 12:00:04.115 0 2 4218 RECEIVE +2024-07-30 12:00:04.116 0 2 4220 SEND +2024-07-30 12:00:04.117 0 2 4222 RECEIVE +2024-07-30 12:00:04.118 0 2 4224 SEND +2024-07-30 12:00:04.119 0 2 4226 RECEIVE +2024-07-30 12:00:04.120 0 2 4228 SEND +2024-07-30 12:00:04.121 0 2 4230 RECEIVE +2024-07-30 12:00:04.122 0 2 4232 SEND +2024-07-30 12:00:04.123 0 2 4234 RECEIVE +2024-07-30 12:00:04.124 0 2 4236 SEND +2024-07-30 12:00:04.125 0 2 4238 RECEIVE +2024-07-30 12:00:04.126 0 2 4240 SEND +2024-07-30 12:00:04.127 0 2 4242 RECEIVE +2024-07-30 12:00:04.128 0 2 4228 SEND +2024-07-30 12:00:04.129 0 2 4230 RECEIVE +2024-07-30 12:00:04.130 0 2 4232 SEND +2024-07-30 12:00:04.131 0 2 4234 RECEIVE +2024-07-30 12:00:04.132 0 2 4236 SEND +2024-07-30 12:00:04.133 0 2 4238 RECEIVE +2024-07-30 12:00:04.134 0 2 4240 SEND +2024-07-30 12:00:04.135 0 2 4242 RECEIVE +2024-07-30 12:00:04.136 0 2 4244 SEND +2024-07-30 12:00:04.137 0 2 4246 RECEIVE +2024-07-30 12:00:04.138 0 2 4248 SEND +2024-07-30 12:00:04.139 0 2 4250 RECEIVE +2024-07-30 12:00:04.140 0 2 4252 SEND +2024-07-30 12:00:04.141 0 2 4254 RECEIVE +2024-07-30 12:00:04.142 0 2 4256 SEND +2024-07-30 12:00:04.143 0 2 4258 RECEIVE +2024-07-30 12:00:04.144 0 2 4244 SEND +2024-07-30 12:00:04.145 0 2 4246 RECEIVE +2024-07-30 12:00:04.146 0 2 4248 SEND +2024-07-30 12:00:04.147 0 2 4250 RECEIVE +2024-07-30 12:00:04.148 0 2 4252 SEND +2024-07-30 12:00:04.149 0 2 4254 RECEIVE +2024-07-30 12:00:04.150 0 2 4256 SEND +2024-07-30 12:00:04.151 0 2 4258 RECEIVE +2024-07-30 12:00:04.152 0 2 4260 SEND +2024-07-30 12:00:04.153 0 2 4262 RECEIVE +2024-07-30 12:00:04.154 0 2 4264 SEND +2024-07-30 12:00:04.155 0 2 4266 RECEIVE +2024-07-30 12:00:04.156 0 2 4268 SEND +2024-07-30 12:00:04.157 0 2 4270 RECEIVE +2024-07-30 12:00:04.158 0 2 4272 SEND +2024-07-30 12:00:04.159 0 2 4274 RECEIVE +2024-07-30 12:00:04.160 0 2 4260 SEND +2024-07-30 12:00:04.161 0 2 4262 RECEIVE +2024-07-30 12:00:04.162 0 2 4264 SEND +2024-07-30 12:00:04.163 0 2 4266 RECEIVE +2024-07-30 12:00:04.164 0 2 4268 SEND +2024-07-30 12:00:04.165 0 2 4270 RECEIVE +2024-07-30 12:00:04.166 0 2 4272 SEND +2024-07-30 12:00:04.167 0 2 4274 RECEIVE +2024-07-30 12:00:04.168 0 2 4276 SEND +2024-07-30 12:00:04.169 0 2 4278 RECEIVE +2024-07-30 12:00:04.170 0 2 4280 SEND +2024-07-30 12:00:04.171 0 2 4282 RECEIVE +2024-07-30 12:00:04.172 0 2 4284 SEND +2024-07-30 12:00:04.173 0 2 4286 RECEIVE +2024-07-30 12:00:04.174 0 2 4288 SEND +2024-07-30 12:00:04.175 0 2 4290 RECEIVE +2024-07-30 12:00:04.176 0 2 4276 SEND +2024-07-30 12:00:04.177 0 2 4278 RECEIVE +2024-07-30 12:00:04.178 0 2 4280 SEND +2024-07-30 12:00:04.179 0 2 4282 RECEIVE +2024-07-30 12:00:04.180 0 2 4284 SEND +2024-07-30 12:00:04.181 0 2 4286 RECEIVE +2024-07-30 12:00:04.182 0 2 4288 SEND +2024-07-30 12:00:04.183 0 2 4290 RECEIVE +2024-07-30 12:00:04.184 0 2 4292 SEND +2024-07-30 12:00:04.185 0 2 4294 RECEIVE +2024-07-30 12:00:04.186 0 2 4296 SEND +2024-07-30 12:00:04.187 0 2 4298 RECEIVE +2024-07-30 12:00:04.188 0 2 4300 SEND +2024-07-30 12:00:04.189 0 2 4302 RECEIVE +2024-07-30 12:00:04.190 0 2 4304 SEND +2024-07-30 12:00:04.191 0 2 4306 RECEIVE +2024-07-30 12:00:04.192 0 2 4292 SEND +2024-07-30 12:00:04.193 0 2 4294 RECEIVE +2024-07-30 12:00:04.194 0 2 4296 SEND +2024-07-30 12:00:04.195 0 2 4298 RECEIVE +2024-07-30 12:00:04.196 0 2 4300 SEND +2024-07-30 12:00:04.197 0 2 4302 RECEIVE +2024-07-30 12:00:04.198 0 2 4304 SEND +2024-07-30 12:00:04.199 0 2 4306 RECEIVE +2024-07-30 12:00:04.200 0 2 4308 SEND +2024-07-30 12:00:04.201 0 2 4310 RECEIVE +2024-07-30 12:00:04.202 0 2 4312 SEND +2024-07-30 12:00:04.203 0 2 4314 RECEIVE +2024-07-30 12:00:04.204 0 2 4316 SEND +2024-07-30 12:00:04.205 0 2 4318 RECEIVE +2024-07-30 12:00:04.206 0 2 4320 SEND +2024-07-30 12:00:04.207 0 2 4322 RECEIVE +2024-07-30 12:00:04.208 0 2 4308 SEND +2024-07-30 12:00:04.209 0 2 4310 RECEIVE +2024-07-30 12:00:04.210 0 2 4312 SEND +2024-07-30 12:00:04.211 0 2 4314 RECEIVE +2024-07-30 12:00:04.212 0 2 4316 SEND +2024-07-30 12:00:04.213 0 2 4318 RECEIVE +2024-07-30 12:00:04.214 0 2 4320 SEND +2024-07-30 12:00:04.215 0 2 4322 RECEIVE +2024-07-30 12:00:04.216 0 2 4324 SEND +2024-07-30 12:00:04.217 0 2 4326 RECEIVE +2024-07-30 12:00:04.218 0 2 4328 SEND +2024-07-30 12:00:04.219 0 2 4330 RECEIVE +2024-07-30 12:00:04.220 0 2 4332 SEND +2024-07-30 12:00:04.221 0 2 4334 RECEIVE +2024-07-30 12:00:04.222 0 2 4336 SEND +2024-07-30 12:00:04.223 0 2 4338 RECEIVE +2024-07-30 12:00:04.224 0 2 4324 SEND +2024-07-30 12:00:04.225 0 2 4326 RECEIVE +2024-07-30 12:00:04.226 0 2 4328 SEND +2024-07-30 12:00:04.227 0 2 4330 RECEIVE +2024-07-30 12:00:04.228 0 2 4332 SEND +2024-07-30 12:00:04.229 0 2 4334 RECEIVE +2024-07-30 12:00:04.230 0 2 4336 SEND +2024-07-30 12:00:04.231 0 2 4338 RECEIVE +2024-07-30 12:00:04.232 0 2 4340 SEND +2024-07-30 12:00:04.233 0 2 4342 RECEIVE +2024-07-30 12:00:04.234 0 2 4344 SEND +2024-07-30 12:00:04.235 0 2 4346 RECEIVE +2024-07-30 12:00:04.236 0 2 4348 SEND +2024-07-30 12:00:04.237 0 2 4350 RECEIVE +2024-07-30 12:00:04.238 0 2 4352 SEND +2024-07-30 12:00:04.239 0 2 4354 RECEIVE +2024-07-30 12:00:04.240 0 2 4340 SEND +2024-07-30 12:00:04.241 0 2 4342 RECEIVE +2024-07-30 12:00:04.242 0 2 4344 SEND +2024-07-30 12:00:04.243 0 2 4346 RECEIVE +2024-07-30 12:00:04.244 0 2 4348 SEND +2024-07-30 12:00:04.245 0 2 4350 RECEIVE +2024-07-30 12:00:04.246 0 2 4352 SEND +2024-07-30 12:00:04.247 0 2 4354 RECEIVE +2024-07-30 12:00:04.248 0 2 4356 SEND +2024-07-30 12:00:04.249 0 2 4358 RECEIVE +2024-07-30 12:00:04.250 0 2 4360 SEND +2024-07-30 12:00:04.251 0 2 4362 RECEIVE +2024-07-30 12:00:04.252 0 2 4364 SEND +2024-07-30 12:00:04.253 0 2 4366 RECEIVE +2024-07-30 12:00:04.254 0 2 4368 SEND +2024-07-30 12:00:04.255 0 2 4370 RECEIVE +2024-07-30 12:00:04.256 0 2 4356 SEND +2024-07-30 12:00:04.257 0 2 4358 RECEIVE +2024-07-30 12:00:04.258 0 2 4360 SEND +2024-07-30 12:00:04.259 0 2 4362 RECEIVE +2024-07-30 12:00:04.260 0 2 4364 SEND +2024-07-30 12:00:04.261 0 2 4366 RECEIVE +2024-07-30 12:00:04.262 0 2 4368 SEND +2024-07-30 12:00:04.263 0 2 4370 RECEIVE +2024-07-30 12:00:04.264 0 2 4372 SEND +2024-07-30 12:00:04.265 0 2 4374 RECEIVE +2024-07-30 12:00:04.266 0 2 4376 SEND +2024-07-30 12:00:04.267 0 2 4378 RECEIVE +2024-07-30 12:00:04.268 0 2 4380 SEND +2024-07-30 12:00:04.269 0 2 4382 RECEIVE +2024-07-30 12:00:04.270 0 2 4384 SEND +2024-07-30 12:00:04.271 0 2 4386 RECEIVE +2024-07-30 12:00:04.272 0 2 4372 SEND +2024-07-30 12:00:04.273 0 2 4374 RECEIVE +2024-07-30 12:00:04.274 0 2 4376 SEND +2024-07-30 12:00:04.275 0 2 4378 RECEIVE +2024-07-30 12:00:04.276 0 2 4380 SEND +2024-07-30 12:00:04.277 0 2 4382 RECEIVE +2024-07-30 12:00:04.278 0 2 4384 SEND +2024-07-30 12:00:04.279 0 2 4386 RECEIVE +2024-07-30 12:00:04.280 0 2 4388 SEND +2024-07-30 12:00:04.281 0 2 4390 RECEIVE +2024-07-30 12:00:04.282 0 2 4392 SEND +2024-07-30 12:00:04.283 0 2 4394 RECEIVE +2024-07-30 12:00:04.284 0 2 4396 SEND +2024-07-30 12:00:04.285 0 2 4398 RECEIVE +2024-07-30 12:00:04.286 0 2 4400 SEND +2024-07-30 12:00:04.287 0 2 4402 RECEIVE +2024-07-30 12:00:04.288 0 2 4388 SEND +2024-07-30 12:00:04.289 0 2 4390 RECEIVE +2024-07-30 12:00:04.290 0 2 4392 SEND +2024-07-30 12:00:04.291 0 2 4394 RECEIVE +2024-07-30 12:00:04.292 0 2 4396 SEND +2024-07-30 12:00:04.293 0 2 4398 RECEIVE +2024-07-30 12:00:04.294 0 2 4400 SEND +2024-07-30 12:00:04.295 0 2 4402 RECEIVE +2024-07-30 12:00:04.296 1 0 4404 SEND +2024-07-30 12:00:04.297 2 1 4406 RECEIVE +2024-07-30 12:00:04.298 3 2 4408 SEND +2024-07-30 12:00:04.299 0 3 4410 RECEIVE +2024-07-30 12:00:04.300 2 0 4412 SEND +2024-07-30 12:00:04.301 1 3 4414 RECEIVE +2024-07-30 12:00:04.302 0 1 4416 SEND +2024-07-30 12:00:04.303 3 2 4418 RECEIVE +2024-07-30 12:00:04.304 0 1 4404 SEND +2024-07-30 12:00:04.305 1 2 4406 RECEIVE +2024-07-30 12:00:04.306 2 3 4408 SEND +2024-07-30 12:00:04.307 3 0 4410 RECEIVE +2024-07-30 12:00:04.308 1 3 4412 SEND +2024-07-30 12:00:04.309 2 0 4414 RECEIVE +2024-07-30 12:00:04.310 0 2 4416 SEND +2024-07-30 12:00:04.311 3 1 4418 RECEIVE +2024-07-30 12:00:04.312 1 0 4420 SEND +2024-07-30 12:00:04.313 2 1 4422 RECEIVE +2024-07-30 12:00:04.314 3 2 4424 SEND +2024-07-30 12:00:04.315 0 3 4426 RECEIVE +2024-07-30 12:00:04.316 2 0 4428 SEND +2024-07-30 12:00:04.317 1 3 4430 RECEIVE +2024-07-30 12:00:04.318 0 1 4432 SEND +2024-07-30 12:00:04.319 3 2 4434 RECEIVE +2024-07-30 12:00:04.320 0 1 4420 SEND +2024-07-30 12:00:04.321 1 2 4422 RECEIVE +2024-07-30 12:00:04.322 2 3 4424 SEND +2024-07-30 12:00:04.323 3 0 4426 RECEIVE +2024-07-30 12:00:04.324 1 3 4428 SEND +2024-07-30 12:00:04.325 2 0 4430 RECEIVE +2024-07-30 12:00:04.326 0 2 4432 SEND +2024-07-30 12:00:04.327 3 1 4434 RECEIVE +2024-07-30 12:00:04.328 1 0 4436 SEND +2024-07-30 12:00:04.329 2 1 4438 RECEIVE +2024-07-30 12:00:04.330 3 2 4440 SEND +2024-07-30 12:00:04.331 0 3 4442 RECEIVE +2024-07-30 12:00:04.332 2 0 4444 SEND +2024-07-30 12:00:04.333 1 3 4446 RECEIVE +2024-07-30 12:00:04.334 0 1 4448 SEND +2024-07-30 12:00:04.335 3 2 4450 RECEIVE +2024-07-30 12:00:04.336 0 1 4436 SEND +2024-07-30 12:00:04.337 1 2 4438 RECEIVE +2024-07-30 12:00:04.338 2 3 4440 SEND +2024-07-30 12:00:04.339 3 0 4442 RECEIVE +2024-07-30 12:00:04.340 1 3 4444 SEND +2024-07-30 12:00:04.341 2 0 4446 RECEIVE +2024-07-30 12:00:04.342 0 2 4448 SEND +2024-07-30 12:00:04.343 3 1 4450 RECEIVE +2024-07-30 12:00:04.344 1 0 4452 SEND +2024-07-30 12:00:04.345 2 1 4454 RECEIVE +2024-07-30 12:00:04.346 3 2 4456 SEND +2024-07-30 12:00:04.347 0 3 4458 RECEIVE +2024-07-30 12:00:04.348 2 0 4460 SEND +2024-07-30 12:00:04.349 1 3 4462 RECEIVE +2024-07-30 12:00:04.350 0 1 4464 SEND +2024-07-30 12:00:04.351 3 2 4466 RECEIVE +2024-07-30 12:00:04.352 0 1 4452 SEND +2024-07-30 12:00:04.353 1 2 4454 RECEIVE +2024-07-30 12:00:04.354 2 3 4456 SEND +2024-07-30 12:00:04.355 3 0 4458 RECEIVE +2024-07-30 12:00:04.356 1 3 4460 SEND +2024-07-30 12:00:04.357 2 0 4462 RECEIVE +2024-07-30 12:00:04.358 0 2 4464 SEND +2024-07-30 12:00:04.359 3 1 4466 RECEIVE +2024-07-30 12:00:04.360 1 0 4468 SEND +2024-07-30 12:00:04.361 2 1 4470 RECEIVE +2024-07-30 12:00:04.362 3 2 4472 SEND +2024-07-30 12:00:04.363 0 3 4474 RECEIVE +2024-07-30 12:00:04.364 2 0 4476 SEND +2024-07-30 12:00:04.365 1 3 4478 RECEIVE +2024-07-30 12:00:04.366 0 1 4480 SEND +2024-07-30 12:00:04.367 3 2 4482 RECEIVE +2024-07-30 12:00:04.368 0 1 4468 SEND +2024-07-30 12:00:04.369 1 2 4470 RECEIVE +2024-07-30 12:00:04.370 2 3 4472 SEND +2024-07-30 12:00:04.371 3 0 4474 RECEIVE +2024-07-30 12:00:04.372 1 3 4476 SEND +2024-07-30 12:00:04.373 2 0 4478 RECEIVE +2024-07-30 12:00:04.374 0 2 4480 SEND +2024-07-30 12:00:04.375 3 1 4482 RECEIVE +2024-07-30 12:00:04.376 1 0 4484 SEND +2024-07-30 12:00:04.377 2 1 4486 RECEIVE +2024-07-30 12:00:04.378 3 2 4488 SEND +2024-07-30 12:00:04.379 0 3 4490 RECEIVE +2024-07-30 12:00:04.380 2 0 4492 SEND +2024-07-30 12:00:04.381 1 3 4494 RECEIVE +2024-07-30 12:00:04.382 0 1 4496 SEND +2024-07-30 12:00:04.383 3 2 4498 RECEIVE +2024-07-30 12:00:04.384 0 1 4484 SEND +2024-07-30 12:00:04.385 1 2 4486 RECEIVE +2024-07-30 12:00:04.386 2 3 4488 SEND +2024-07-30 12:00:04.387 3 0 4490 RECEIVE +2024-07-30 12:00:04.388 1 3 4492 SEND +2024-07-30 12:00:04.389 2 0 4494 RECEIVE +2024-07-30 12:00:04.390 0 2 4496 SEND +2024-07-30 12:00:04.391 3 1 4498 RECEIVE +2024-07-30 12:00:04.392 1 0 4500 SEND +2024-07-30 12:00:04.393 2 1 4502 RECEIVE +2024-07-30 12:00:04.394 3 2 4504 SEND +2024-07-30 12:00:04.395 0 3 4506 RECEIVE +2024-07-30 12:00:04.396 2 0 4508 SEND +2024-07-30 12:00:04.397 1 3 4510 RECEIVE +2024-07-30 12:00:04.398 0 1 4512 SEND +2024-07-30 12:00:04.399 3 2 4514 RECEIVE +2024-07-30 12:00:04.400 0 1 4500 SEND +2024-07-30 12:00:04.401 1 2 4502 RECEIVE +2024-07-30 12:00:04.402 2 3 4504 SEND +2024-07-30 12:00:04.403 3 0 4506 RECEIVE +2024-07-30 12:00:04.404 1 3 4508 SEND +2024-07-30 12:00:04.405 2 0 4510 RECEIVE +2024-07-30 12:00:04.406 0 2 4512 SEND +2024-07-30 12:00:04.407 3 1 4514 RECEIVE +2024-07-30 12:00:04.408 1 0 4516 SEND +2024-07-30 12:00:04.409 2 1 4518 RECEIVE +2024-07-30 12:00:04.410 3 2 4520 SEND +2024-07-30 12:00:04.411 0 3 4522 RECEIVE +2024-07-30 12:00:04.412 2 0 4524 SEND +2024-07-30 12:00:04.413 1 3 4526 RECEIVE +2024-07-30 12:00:04.414 0 1 4528 SEND +2024-07-30 12:00:04.415 3 2 4530 RECEIVE +2024-07-30 12:00:04.416 0 1 4516 SEND +2024-07-30 12:00:04.417 1 2 4518 RECEIVE +2024-07-30 12:00:04.418 2 3 4520 SEND +2024-07-30 12:00:04.419 3 0 4522 RECEIVE +2024-07-30 12:00:04.420 1 3 4524 SEND +2024-07-30 12:00:04.421 2 0 4526 RECEIVE +2024-07-30 12:00:04.422 0 2 4528 SEND +2024-07-30 12:00:04.423 3 1 4530 RECEIVE +2024-07-30 12:00:04.424 1 0 4532 SEND +2024-07-30 12:00:04.425 2 1 4534 RECEIVE +2024-07-30 12:00:04.426 3 2 4536 SEND +2024-07-30 12:00:04.427 0 3 4538 RECEIVE +2024-07-30 12:00:04.428 2 0 4540 SEND +2024-07-30 12:00:04.429 1 3 4542 RECEIVE +2024-07-30 12:00:04.430 0 1 4544 SEND +2024-07-30 12:00:04.431 3 2 4546 RECEIVE +2024-07-30 12:00:04.432 0 1 4532 SEND +2024-07-30 12:00:04.433 1 2 4534 RECEIVE +2024-07-30 12:00:04.434 2 3 4536 SEND +2024-07-30 12:00:04.435 3 0 4538 RECEIVE +2024-07-30 12:00:04.436 1 3 4540 SEND +2024-07-30 12:00:04.437 2 0 4542 RECEIVE +2024-07-30 12:00:04.438 0 2 4544 SEND +2024-07-30 12:00:04.439 3 1 4546 RECEIVE +2024-07-30 12:00:04.440 1 0 4548 SEND +2024-07-30 12:00:04.441 2 1 4550 RECEIVE +2024-07-30 12:00:04.442 3 2 4552 SEND +2024-07-30 12:00:04.443 0 3 4554 RECEIVE +2024-07-30 12:00:04.444 2 0 4556 SEND +2024-07-30 12:00:04.445 1 3 4558 RECEIVE +2024-07-30 12:00:04.446 0 1 4560 SEND +2024-07-30 12:00:04.447 3 2 4562 RECEIVE +2024-07-30 12:00:04.448 0 1 4548 SEND +2024-07-30 12:00:04.449 1 2 4550 RECEIVE +2024-07-30 12:00:04.450 2 3 4552 SEND +2024-07-30 12:00:04.451 3 0 4554 RECEIVE +2024-07-30 12:00:04.452 1 3 4556 SEND +2024-07-30 12:00:04.453 2 0 4558 RECEIVE +2024-07-30 12:00:04.454 0 2 4560 SEND +2024-07-30 12:00:04.455 3 1 4562 RECEIVE +2024-07-30 12:00:04.456 1 0 4564 SEND +2024-07-30 12:00:04.457 2 1 4566 RECEIVE +2024-07-30 12:00:04.458 3 2 4568 SEND +2024-07-30 12:00:04.459 0 3 4570 RECEIVE +2024-07-30 12:00:04.460 2 0 4572 SEND +2024-07-30 12:00:04.461 1 3 4574 RECEIVE +2024-07-30 12:00:04.462 0 1 4576 SEND +2024-07-30 12:00:04.463 3 2 4578 RECEIVE +2024-07-30 12:00:04.464 0 1 4564 SEND +2024-07-30 12:00:04.465 1 2 4566 RECEIVE +2024-07-30 12:00:04.466 2 3 4568 SEND +2024-07-30 12:00:04.467 3 0 4570 RECEIVE +2024-07-30 12:00:04.468 1 3 4572 SEND +2024-07-30 12:00:04.469 2 0 4574 RECEIVE +2024-07-30 12:00:04.470 0 2 4576 SEND +2024-07-30 12:00:04.471 3 1 4578 RECEIVE +2024-07-30 12:00:04.472 1 0 4580 SEND +2024-07-30 12:00:04.473 2 1 4582 RECEIVE +2024-07-30 12:00:04.474 3 2 4584 SEND +2024-07-30 12:00:04.475 0 3 4586 RECEIVE +2024-07-30 12:00:04.476 2 0 4588 SEND +2024-07-30 12:00:04.477 1 3 4590 RECEIVE +2024-07-30 12:00:04.478 0 1 4592 SEND +2024-07-30 12:00:04.479 3 2 4594 RECEIVE +2024-07-30 12:00:04.480 0 1 4580 SEND +2024-07-30 12:00:04.481 1 2 4582 RECEIVE +2024-07-30 12:00:04.482 2 3 4584 SEND +2024-07-30 12:00:04.483 3 0 4586 RECEIVE +2024-07-30 12:00:04.484 1 3 4588 SEND +2024-07-30 12:00:04.485 2 0 4590 RECEIVE +2024-07-30 12:00:04.486 0 2 4592 SEND +2024-07-30 12:00:04.487 3 1 4594 RECEIVE +2024-07-30 12:00:04.488 1 0 4596 SEND +2024-07-30 12:00:04.489 2 1 4598 RECEIVE +2024-07-30 12:00:04.490 3 2 4600 SEND +2024-07-30 12:00:04.491 0 3 4602 RECEIVE +2024-07-30 12:00:04.492 2 0 4604 SEND +2024-07-30 12:00:04.493 1 3 4606 RECEIVE +2024-07-30 12:00:04.494 0 1 4608 SEND +2024-07-30 12:00:04.495 3 2 4610 RECEIVE +2024-07-30 12:00:04.496 0 1 4596 SEND +2024-07-30 12:00:04.497 1 2 4598 RECEIVE +2024-07-30 12:00:04.498 2 3 4600 SEND +2024-07-30 12:00:04.499 3 0 4602 RECEIVE +2024-07-30 12:00:04.500 1 3 4604 SEND +2024-07-30 12:00:04.501 2 0 4606 RECEIVE +2024-07-30 12:00:04.502 0 2 4608 SEND +2024-07-30 12:00:04.503 3 1 4610 RECEIVE +2024-07-30 12:00:04.504 1 0 4612 SEND +2024-07-30 12:00:04.505 2 1 4614 RECEIVE +2024-07-30 12:00:04.506 3 2 4616 SEND +2024-07-30 12:00:04.507 0 3 4618 RECEIVE +2024-07-30 12:00:04.508 2 0 4620 SEND +2024-07-30 12:00:04.509 1 3 4622 RECEIVE +2024-07-30 12:00:04.510 0 1 4624 SEND +2024-07-30 12:00:04.511 3 2 4626 RECEIVE +2024-07-30 12:00:04.512 0 1 4612 SEND +2024-07-30 12:00:04.513 1 2 4614 RECEIVE +2024-07-30 12:00:04.514 2 3 4616 SEND +2024-07-30 12:00:04.515 3 0 4618 RECEIVE +2024-07-30 12:00:04.516 1 3 4620 SEND +2024-07-30 12:00:04.517 2 0 4622 RECEIVE +2024-07-30 12:00:04.518 0 2 4624 SEND +2024-07-30 12:00:04.519 3 1 4626 RECEIVE +2024-07-30 12:00:04.520 1 0 4628 SEND +2024-07-30 12:00:04.521 2 1 4630 RECEIVE +2024-07-30 12:00:04.522 3 2 4632 SEND +2024-07-30 12:00:04.523 0 3 4634 RECEIVE +2024-07-30 12:00:04.524 2 0 4636 SEND +2024-07-30 12:00:04.525 1 3 4638 RECEIVE +2024-07-30 12:00:04.526 0 1 4640 SEND +2024-07-30 12:00:04.527 3 2 4642 RECEIVE +2024-07-30 12:00:04.528 0 1 4628 SEND +2024-07-30 12:00:04.529 1 2 4630 RECEIVE +2024-07-30 12:00:04.530 2 3 4632 SEND +2024-07-30 12:00:04.531 3 0 4634 RECEIVE +2024-07-30 12:00:04.532 1 3 4636 SEND +2024-07-30 12:00:04.533 2 0 4638 RECEIVE +2024-07-30 12:00:04.534 0 2 4640 SEND +2024-07-30 12:00:04.535 3 1 4642 RECEIVE +2024-07-30 12:00:04.536 1 0 4644 SEND +2024-07-30 12:00:04.537 2 1 4646 RECEIVE +2024-07-30 12:00:04.538 3 2 4648 SEND +2024-07-30 12:00:04.539 0 3 4650 RECEIVE +2024-07-30 12:00:04.540 2 0 4652 SEND +2024-07-30 12:00:04.541 1 3 4654 RECEIVE +2024-07-30 12:00:04.542 0 1 4656 SEND +2024-07-30 12:00:04.543 3 2 4658 RECEIVE +2024-07-30 12:00:04.544 0 1 4644 SEND +2024-07-30 12:00:04.545 1 2 4646 RECEIVE +2024-07-30 12:00:04.546 2 3 4648 SEND +2024-07-30 12:00:04.547 3 0 4650 RECEIVE +2024-07-30 12:00:04.548 1 3 4652 SEND +2024-07-30 12:00:04.549 2 0 4654 RECEIVE +2024-07-30 12:00:04.550 0 2 4656 SEND +2024-07-30 12:00:04.551 3 1 4658 RECEIVE +2024-07-30 12:00:04.552 1 0 4660 SEND +2024-07-30 12:00:04.553 2 1 4662 RECEIVE +2024-07-30 12:00:04.554 3 2 4664 SEND +2024-07-30 12:00:04.555 0 3 4666 RECEIVE +2024-07-30 12:00:04.556 2 0 4668 SEND +2024-07-30 12:00:04.557 1 3 4670 RECEIVE +2024-07-30 12:00:04.558 0 1 4672 SEND +2024-07-30 12:00:04.559 3 2 4674 RECEIVE +2024-07-30 12:00:04.560 0 1 4660 SEND +2024-07-30 12:00:04.561 1 2 4662 RECEIVE +2024-07-30 12:00:04.562 2 3 4664 SEND +2024-07-30 12:00:04.563 3 0 4666 RECEIVE +2024-07-30 12:00:04.564 1 3 4668 SEND +2024-07-30 12:00:04.565 2 0 4670 RECEIVE +2024-07-30 12:00:04.566 0 2 4672 SEND +2024-07-30 12:00:04.567 3 1 4674 RECEIVE +2024-07-30 12:00:04.568 1 0 4676 SEND +2024-07-30 12:00:04.569 2 1 4678 RECEIVE +2024-07-30 12:00:04.570 3 2 4680 SEND +2024-07-30 12:00:04.571 0 3 4682 RECEIVE +2024-07-30 12:00:04.572 2 0 4684 SEND +2024-07-30 12:00:04.573 1 3 4686 RECEIVE +2024-07-30 12:00:04.574 0 1 4688 SEND +2024-07-30 12:00:04.575 3 2 4690 RECEIVE +2024-07-30 12:00:04.576 0 1 4676 SEND +2024-07-30 12:00:04.577 1 2 4678 RECEIVE +2024-07-30 12:00:04.578 2 3 4680 SEND +2024-07-30 12:00:04.579 3 0 4682 RECEIVE +2024-07-30 12:00:04.580 1 3 4684 SEND +2024-07-30 12:00:04.581 2 0 4686 RECEIVE +2024-07-30 12:00:04.582 0 2 4688 SEND +2024-07-30 12:00:04.583 3 1 4690 RECEIVE +2024-07-30 12:00:04.584 1 0 4692 SEND +2024-07-30 12:00:04.585 2 1 4694 RECEIVE +2024-07-30 12:00:04.586 3 2 4696 SEND +2024-07-30 12:00:04.587 0 3 4698 RECEIVE +2024-07-30 12:00:04.588 2 0 4700 SEND +2024-07-30 12:00:04.589 1 3 4702 RECEIVE +2024-07-30 12:00:04.590 0 1 4704 SEND +2024-07-30 12:00:04.591 3 2 4706 RECEIVE +2024-07-30 12:00:04.592 0 1 4692 SEND +2024-07-30 12:00:04.593 1 2 4694 RECEIVE +2024-07-30 12:00:04.594 2 3 4696 SEND +2024-07-30 12:00:04.595 3 0 4698 RECEIVE +2024-07-30 12:00:04.596 1 3 4700 SEND +2024-07-30 12:00:04.597 2 0 4702 RECEIVE +2024-07-30 12:00:04.598 0 2 4704 SEND +2024-07-30 12:00:04.599 3 1 4706 RECEIVE +2024-07-30 12:00:04.600 1 0 4708 SEND +2024-07-30 12:00:04.601 2 1 4710 RECEIVE +2024-07-30 12:00:04.602 3 2 4712 SEND +2024-07-30 12:00:04.603 0 3 4714 RECEIVE +2024-07-30 12:00:04.604 2 0 4716 SEND +2024-07-30 12:00:04.605 1 3 4718 RECEIVE +2024-07-30 12:00:04.606 0 1 4720 SEND +2024-07-30 12:00:04.607 3 2 4722 RECEIVE +2024-07-30 12:00:04.608 0 1 4708 SEND +2024-07-30 12:00:04.609 1 2 4710 RECEIVE +2024-07-30 12:00:04.610 2 3 4712 SEND +2024-07-30 12:00:04.611 3 0 4714 RECEIVE +2024-07-30 12:00:04.612 1 3 4716 SEND +2024-07-30 12:00:04.613 2 0 4718 RECEIVE +2024-07-30 12:00:04.614 0 2 4720 SEND +2024-07-30 12:00:04.615 3 1 4722 RECEIVE +2024-07-30 12:00:04.616 1 0 4724 SEND +2024-07-30 12:00:04.617 2 1 4726 RECEIVE +2024-07-30 12:00:04.618 3 2 4728 SEND +2024-07-30 12:00:04.619 0 3 4730 RECEIVE +2024-07-30 12:00:04.620 2 0 4732 SEND +2024-07-30 12:00:04.621 1 3 4734 RECEIVE +2024-07-30 12:00:04.622 0 1 4736 SEND +2024-07-30 12:00:04.623 3 2 4738 RECEIVE +2024-07-30 12:00:04.624 0 1 4724 SEND +2024-07-30 12:00:04.625 1 2 4726 RECEIVE +2024-07-30 12:00:04.626 2 3 4728 SEND +2024-07-30 12:00:04.627 3 0 4730 RECEIVE +2024-07-30 12:00:04.628 1 3 4732 SEND +2024-07-30 12:00:04.629 2 0 4734 RECEIVE +2024-07-30 12:00:04.630 0 2 4736 SEND +2024-07-30 12:00:04.631 3 1 4738 RECEIVE +2024-07-30 12:00:04.632 1 0 4740 SEND +2024-07-30 12:00:04.633 2 1 4742 RECEIVE +2024-07-30 12:00:04.634 3 2 4744 SEND +2024-07-30 12:00:04.635 0 3 4746 RECEIVE +2024-07-30 12:00:04.636 2 0 4748 SEND +2024-07-30 12:00:04.637 1 3 4750 RECEIVE +2024-07-30 12:00:04.638 0 1 4752 SEND +2024-07-30 12:00:04.639 3 2 4754 RECEIVE +2024-07-30 12:00:04.640 0 1 4740 SEND +2024-07-30 12:00:04.641 1 2 4742 RECEIVE +2024-07-30 12:00:04.642 2 3 4744 SEND +2024-07-30 12:00:04.643 3 0 4746 RECEIVE +2024-07-30 12:00:04.644 1 3 4748 SEND +2024-07-30 12:00:04.645 2 0 4750 RECEIVE +2024-07-30 12:00:04.646 0 2 4752 SEND +2024-07-30 12:00:04.647 3 1 4754 RECEIVE +2024-07-30 12:00:04.648 1 0 4756 SEND +2024-07-30 12:00:04.649 2 1 4758 RECEIVE +2024-07-30 12:00:04.650 3 2 4760 SEND +2024-07-30 12:00:04.651 0 3 4762 RECEIVE +2024-07-30 12:00:04.652 2 0 4764 SEND +2024-07-30 12:00:04.653 1 3 4766 RECEIVE +2024-07-30 12:00:04.654 0 1 4768 SEND +2024-07-30 12:00:04.655 3 2 4770 RECEIVE +2024-07-30 12:00:04.656 0 1 4756 SEND +2024-07-30 12:00:04.657 1 2 4758 RECEIVE +2024-07-30 12:00:04.658 2 3 4760 SEND +2024-07-30 12:00:04.659 3 0 4762 RECEIVE +2024-07-30 12:00:04.660 1 3 4764 SEND +2024-07-30 12:00:04.661 2 0 4766 RECEIVE +2024-07-30 12:00:04.662 0 2 4768 SEND +2024-07-30 12:00:04.663 3 1 4770 RECEIVE +2024-07-30 12:00:04.664 1 0 4772 SEND +2024-07-30 12:00:04.665 2 1 4774 RECEIVE +2024-07-30 12:00:04.666 3 2 4776 SEND +2024-07-30 12:00:04.667 0 3 4778 RECEIVE +2024-07-30 12:00:04.668 2 0 4780 SEND +2024-07-30 12:00:04.669 1 3 4782 RECEIVE +2024-07-30 12:00:04.670 0 1 4784 SEND +2024-07-30 12:00:04.671 3 2 4786 RECEIVE +2024-07-30 12:00:04.672 0 1 4772 SEND +2024-07-30 12:00:04.673 1 2 4774 RECEIVE +2024-07-30 12:00:04.674 2 3 4776 SEND +2024-07-30 12:00:04.675 3 0 4778 RECEIVE +2024-07-30 12:00:04.676 1 3 4780 SEND +2024-07-30 12:00:04.677 2 0 4782 RECEIVE +2024-07-30 12:00:04.678 0 2 4784 SEND +2024-07-30 12:00:04.679 3 1 4786 RECEIVE +2024-07-30 12:00:04.680 1 0 4788 SEND +2024-07-30 12:00:04.681 2 1 4790 RECEIVE +2024-07-30 12:00:04.682 3 2 4792 SEND +2024-07-30 12:00:04.683 0 3 4794 RECEIVE +2024-07-30 12:00:04.684 2 0 4796 SEND +2024-07-30 12:00:04.685 1 3 4798 RECEIVE +2024-07-30 12:00:04.686 0 1 4800 SEND +2024-07-30 12:00:04.687 3 2 4802 RECEIVE +2024-07-30 12:00:04.688 0 1 4788 SEND +2024-07-30 12:00:04.689 1 2 4790 RECEIVE +2024-07-30 12:00:04.690 2 3 4792 SEND +2024-07-30 12:00:04.691 3 0 4794 RECEIVE +2024-07-30 12:00:04.692 1 3 4796 SEND +2024-07-30 12:00:04.693 2 0 4798 RECEIVE +2024-07-30 12:00:04.694 0 2 4800 SEND +2024-07-30 12:00:04.695 3 1 4802 RECEIVE +2024-07-30 12:00:04.696 1 0 4804 SEND +2024-07-30 12:00:04.697 2 1 4806 RECEIVE +2024-07-30 12:00:04.698 3 2 4808 SEND +2024-07-30 12:00:04.699 0 3 4810 RECEIVE +2024-07-30 12:00:04.700 2 0 4812 SEND +2024-07-30 12:00:04.701 1 3 4814 RECEIVE +2024-07-30 12:00:04.702 0 1 4816 SEND +2024-07-30 12:00:04.703 3 2 4818 RECEIVE +2024-07-30 12:00:04.704 0 1 4804 SEND +2024-07-30 12:00:04.705 1 2 4806 RECEIVE +2024-07-30 12:00:04.706 2 3 4808 SEND +2024-07-30 12:00:04.707 3 0 4810 RECEIVE +2024-07-30 12:00:04.708 1 3 4812 SEND +2024-07-30 12:00:04.709 2 0 4814 RECEIVE +2024-07-30 12:00:04.710 0 2 4816 SEND +2024-07-30 12:00:04.711 3 1 4818 RECEIVE +2024-07-30 12:00:04.712 1 0 4820 SEND +2024-07-30 12:00:04.713 2 1 4822 RECEIVE +2024-07-30 12:00:04.714 3 2 4824 SEND +2024-07-30 12:00:04.715 0 3 4826 RECEIVE +2024-07-30 12:00:04.716 2 0 4828 SEND +2024-07-30 12:00:04.717 1 3 4830 RECEIVE +2024-07-30 12:00:04.718 0 1 4832 SEND +2024-07-30 12:00:04.719 3 2 4834 RECEIVE +2024-07-30 12:00:04.720 0 1 4820 SEND +2024-07-30 12:00:04.721 1 2 4822 RECEIVE +2024-07-30 12:00:04.722 2 3 4824 SEND +2024-07-30 12:00:04.723 3 0 4826 RECEIVE +2024-07-30 12:00:04.724 1 3 4828 SEND +2024-07-30 12:00:04.725 2 0 4830 RECEIVE +2024-07-30 12:00:04.726 0 2 4832 SEND +2024-07-30 12:00:04.727 3 1 4834 RECEIVE +2024-07-30 12:00:04.728 1 0 4836 SEND +2024-07-30 12:00:04.729 2 1 4838 RECEIVE +2024-07-30 12:00:04.730 3 2 4840 SEND +2024-07-30 12:00:04.731 0 3 4842 RECEIVE +2024-07-30 12:00:04.732 2 0 4844 SEND +2024-07-30 12:00:04.733 1 3 4846 RECEIVE +2024-07-30 12:00:04.734 0 1 4848 SEND +2024-07-30 12:00:04.735 3 2 4850 RECEIVE +2024-07-30 12:00:04.736 0 1 4836 SEND +2024-07-30 12:00:04.737 1 2 4838 RECEIVE +2024-07-30 12:00:04.738 2 3 4840 SEND +2024-07-30 12:00:04.739 3 0 4842 RECEIVE +2024-07-30 12:00:04.740 1 3 4844 SEND +2024-07-30 12:00:04.741 2 0 4846 RECEIVE +2024-07-30 12:00:04.742 0 2 4848 SEND +2024-07-30 12:00:04.743 3 1 4850 RECEIVE +2024-07-30 12:00:04.744 1 0 4852 SEND +2024-07-30 12:00:04.745 2 1 4854 RECEIVE +2024-07-30 12:00:04.746 3 2 4856 SEND +2024-07-30 12:00:04.747 0 3 4858 RECEIVE +2024-07-30 12:00:04.748 2 0 4860 SEND +2024-07-30 12:00:04.749 1 3 4862 RECEIVE +2024-07-30 12:00:04.750 0 1 4864 SEND +2024-07-30 12:00:04.751 3 2 4866 RECEIVE +2024-07-30 12:00:04.752 0 1 4852 SEND +2024-07-30 12:00:04.753 1 2 4854 RECEIVE +2024-07-30 12:00:04.754 2 3 4856 SEND +2024-07-30 12:00:04.755 3 0 4858 RECEIVE +2024-07-30 12:00:04.756 1 3 4860 SEND +2024-07-30 12:00:04.757 2 0 4862 RECEIVE +2024-07-30 12:00:04.758 0 2 4864 SEND +2024-07-30 12:00:04.759 3 1 4866 RECEIVE +2024-07-30 12:00:04.760 1 0 4868 SEND +2024-07-30 12:00:04.761 2 1 4870 RECEIVE +2024-07-30 12:00:04.762 3 2 4872 SEND +2024-07-30 12:00:04.763 0 3 4874 RECEIVE +2024-07-30 12:00:04.764 2 0 4876 SEND +2024-07-30 12:00:04.765 1 3 4878 RECEIVE +2024-07-30 12:00:04.766 0 1 4880 SEND +2024-07-30 12:00:04.767 3 2 4882 RECEIVE +2024-07-30 12:00:04.768 0 1 4868 SEND +2024-07-30 12:00:04.769 1 2 4870 RECEIVE +2024-07-30 12:00:04.770 2 3 4872 SEND +2024-07-30 12:00:04.771 3 0 4874 RECEIVE +2024-07-30 12:00:04.772 1 3 4876 SEND +2024-07-30 12:00:04.773 2 0 4878 RECEIVE +2024-07-30 12:00:04.774 0 2 4880 SEND +2024-07-30 12:00:04.775 3 1 4882 RECEIVE +2024-07-30 12:00:04.776 1 0 4884 SEND +2024-07-30 12:00:04.777 2 1 4886 RECEIVE +2024-07-30 12:00:04.778 3 2 4888 SEND +2024-07-30 12:00:04.779 0 3 4890 RECEIVE +2024-07-30 12:00:04.780 2 0 4892 SEND +2024-07-30 12:00:04.781 1 3 4894 RECEIVE +2024-07-30 12:00:04.782 0 1 4896 SEND +2024-07-30 12:00:04.783 3 2 4898 RECEIVE +2024-07-30 12:00:04.784 0 1 4884 SEND +2024-07-30 12:00:04.785 1 2 4886 RECEIVE +2024-07-30 12:00:04.786 2 3 4888 SEND +2024-07-30 12:00:04.787 3 0 4890 RECEIVE +2024-07-30 12:00:04.788 1 3 4892 SEND +2024-07-30 12:00:04.789 2 0 4894 RECEIVE +2024-07-30 12:00:04.790 0 2 4896 SEND +2024-07-30 12:00:04.791 3 1 4898 RECEIVE +2024-07-30 12:00:04.792 1 0 4900 SEND +2024-07-30 12:00:04.793 2 1 4902 RECEIVE +2024-07-30 12:00:04.794 3 2 4904 SEND +2024-07-30 12:00:04.795 0 3 4906 RECEIVE +2024-07-30 12:00:04.796 2 0 4908 SEND +2024-07-30 12:00:04.797 1 3 4910 RECEIVE +2024-07-30 12:00:04.798 0 1 4912 SEND +2024-07-30 12:00:04.799 3 2 4914 RECEIVE +2024-07-30 12:00:04.800 0 1 4900 SEND +2024-07-30 12:00:04.801 1 2 4902 RECEIVE +2024-07-30 12:00:04.802 2 3 4904 SEND +2024-07-30 12:00:04.803 3 0 4906 RECEIVE +2024-07-30 12:00:04.804 1 3 4908 SEND +2024-07-30 12:00:04.805 2 0 4910 RECEIVE +2024-07-30 12:00:04.806 0 2 4912 SEND +2024-07-30 12:00:04.807 3 1 4914 RECEIVE +2024-07-30 12:00:04.808 1 0 4916 SEND +2024-07-30 12:00:04.809 2 1 4918 RECEIVE +2024-07-30 12:00:04.810 3 2 4920 SEND +2024-07-30 12:00:04.811 0 3 4922 RECEIVE +2024-07-30 12:00:04.812 2 0 4924 SEND +2024-07-30 12:00:04.813 1 3 4926 RECEIVE +2024-07-30 12:00:04.814 0 1 4928 SEND +2024-07-30 12:00:04.815 3 2 4930 RECEIVE +2024-07-30 12:00:04.816 0 1 4916 SEND +2024-07-30 12:00:04.817 1 2 4918 RECEIVE +2024-07-30 12:00:04.818 2 3 4920 SEND +2024-07-30 12:00:04.819 3 0 4922 RECEIVE +2024-07-30 12:00:04.820 1 3 4924 SEND +2024-07-30 12:00:04.821 2 0 4926 RECEIVE +2024-07-30 12:00:04.822 0 2 4928 SEND +2024-07-30 12:00:04.823 3 1 4930 RECEIVE +2024-07-30 12:00:04.824 1 0 4932 SEND +2024-07-30 12:00:04.825 2 1 4934 RECEIVE +2024-07-30 12:00:04.826 3 2 4936 SEND +2024-07-30 12:00:04.827 0 3 4938 RECEIVE +2024-07-30 12:00:04.828 2 0 4940 SEND +2024-07-30 12:00:04.829 1 3 4942 RECEIVE +2024-07-30 12:00:04.830 0 1 4944 SEND +2024-07-30 12:00:04.831 3 2 4946 RECEIVE +2024-07-30 12:00:04.832 0 1 4932 SEND +2024-07-30 12:00:04.833 1 2 4934 RECEIVE +2024-07-30 12:00:04.834 2 3 4936 SEND +2024-07-30 12:00:04.835 3 0 4938 RECEIVE +2024-07-30 12:00:04.836 1 3 4940 SEND +2024-07-30 12:00:04.837 2 0 4942 RECEIVE +2024-07-30 12:00:04.838 0 2 4944 SEND +2024-07-30 12:00:04.839 3 1 4946 RECEIVE +2024-07-30 12:00:04.840 1 0 4948 SEND +2024-07-30 12:00:04.841 2 1 4950 RECEIVE +2024-07-30 12:00:04.842 3 2 4952 SEND +2024-07-30 12:00:04.843 0 3 4954 RECEIVE +2024-07-30 12:00:04.844 2 0 4956 SEND +2024-07-30 12:00:04.845 1 3 4958 RECEIVE +2024-07-30 12:00:04.846 0 1 4960 SEND +2024-07-30 12:00:04.847 3 2 4962 RECEIVE +2024-07-30 12:00:04.848 0 1 4948 SEND +2024-07-30 12:00:04.849 1 2 4950 RECEIVE +2024-07-30 12:00:04.850 2 3 4952 SEND +2024-07-30 12:00:04.851 3 0 4954 RECEIVE +2024-07-30 12:00:04.852 1 3 4956 SEND +2024-07-30 12:00:04.853 2 0 4958 RECEIVE +2024-07-30 12:00:04.854 0 2 4960 SEND +2024-07-30 12:00:04.855 3 1 4962 RECEIVE +2024-07-30 12:00:04.856 1 0 4964 SEND +2024-07-30 12:00:04.857 2 1 4966 RECEIVE +2024-07-30 12:00:04.858 3 2 4968 SEND +2024-07-30 12:00:04.859 0 3 4970 RECEIVE +2024-07-30 12:00:04.860 2 0 4972 SEND +2024-07-30 12:00:04.861 1 3 4974 RECEIVE +2024-07-30 12:00:04.862 0 1 4976 SEND +2024-07-30 12:00:04.863 3 2 4978 RECEIVE +2024-07-30 12:00:04.864 0 1 4964 SEND +2024-07-30 12:00:04.865 1 2 4966 RECEIVE +2024-07-30 12:00:04.866 2 3 4968 SEND +2024-07-30 12:00:04.867 3 0 4970 RECEIVE +2024-07-30 12:00:04.868 1 3 4972 SEND +2024-07-30 12:00:04.869 2 0 4974 RECEIVE +2024-07-30 12:00:04.870 0 2 4976 SEND +2024-07-30 12:00:04.871 3 1 4978 RECEIVE +2024-07-30 12:00:04.872 1 0 4980 SEND +2024-07-30 12:00:04.873 2 1 4982 RECEIVE +2024-07-30 12:00:04.874 3 2 4984 SEND +2024-07-30 12:00:04.875 0 3 4986 RECEIVE +2024-07-30 12:00:04.876 2 0 4988 SEND +2024-07-30 12:00:04.877 1 3 4990 RECEIVE +2024-07-30 12:00:04.878 0 1 4992 SEND +2024-07-30 12:00:04.879 3 2 4994 RECEIVE +2024-07-30 12:00:04.880 0 1 4980 SEND +2024-07-30 12:00:04.881 1 2 4982 RECEIVE +2024-07-30 12:00:04.882 2 3 4984 SEND +2024-07-30 12:00:04.883 3 0 4986 RECEIVE +2024-07-30 12:00:04.884 1 3 4988 SEND +2024-07-30 12:00:04.885 2 0 4990 RECEIVE +2024-07-30 12:00:04.886 0 2 4992 SEND +2024-07-30 12:00:04.887 3 1 4994 RECEIVE +2024-07-30 12:00:04.888 1 0 4996 SEND +2024-07-30 12:00:04.889 2 1 4998 RECEIVE +2024-07-30 12:00:04.890 3 2 5000 SEND +2024-07-30 12:00:04.891 0 3 5002 RECEIVE +2024-07-30 12:00:04.892 2 0 5004 SEND +2024-07-30 12:00:04.893 1 3 5006 RECEIVE +2024-07-30 12:00:04.894 0 1 5008 SEND +2024-07-30 12:00:04.895 3 2 5010 RECEIVE +2024-07-30 12:00:04.896 0 1 4996 SEND +2024-07-30 12:00:04.897 1 2 4998 RECEIVE +2024-07-30 12:00:04.898 2 3 5000 SEND +2024-07-30 12:00:04.899 3 0 5002 RECEIVE +2024-07-30 12:00:04.900 1 3 5004 SEND +2024-07-30 12:00:04.901 2 0 5006 RECEIVE +2024-07-30 12:00:04.902 0 2 5008 SEND +2024-07-30 12:00:04.903 3 1 5010 RECEIVE +2024-07-30 12:00:04.904 1 0 5012 SEND +2024-07-30 12:00:04.905 2 1 5014 RECEIVE +2024-07-30 12:00:04.906 3 2 5016 SEND +2024-07-30 12:00:04.907 0 3 5018 RECEIVE +2024-07-30 12:00:04.908 2 0 5020 SEND +2024-07-30 12:00:04.909 1 3 5022 RECEIVE +2024-07-30 12:00:04.910 0 1 5024 SEND +2024-07-30 12:00:04.911 3 2 5026 RECEIVE +2024-07-30 12:00:04.912 0 1 5012 SEND +2024-07-30 12:00:04.913 1 2 5014 RECEIVE +2024-07-30 12:00:04.914 2 3 5016 SEND +2024-07-30 12:00:04.915 3 0 5018 RECEIVE +2024-07-30 12:00:04.916 1 3 5020 SEND +2024-07-30 12:00:04.917 2 0 5022 RECEIVE +2024-07-30 12:00:04.918 0 2 5024 SEND +2024-07-30 12:00:04.919 3 1 5026 RECEIVE +2024-07-30 12:00:04.920 1 0 5028 SEND +2024-07-30 12:00:04.921 2 1 5030 RECEIVE +2024-07-30 12:00:04.922 3 2 5032 SEND +2024-07-30 12:00:04.923 0 3 5034 RECEIVE +2024-07-30 12:00:04.924 2 0 5036 SEND +2024-07-30 12:00:04.925 1 3 5038 RECEIVE +2024-07-30 12:00:04.926 0 1 5040 SEND +2024-07-30 12:00:04.927 3 2 5042 RECEIVE +2024-07-30 12:00:04.928 0 1 5028 SEND +2024-07-30 12:00:04.929 1 2 5030 RECEIVE +2024-07-30 12:00:04.930 2 3 5032 SEND +2024-07-30 12:00:04.931 3 0 5034 RECEIVE +2024-07-30 12:00:04.932 1 3 5036 SEND +2024-07-30 12:00:04.933 2 0 5038 RECEIVE +2024-07-30 12:00:04.934 0 2 5040 SEND +2024-07-30 12:00:04.935 3 1 5042 RECEIVE +2024-07-30 12:00:04.936 1 0 5044 SEND +2024-07-30 12:00:04.937 2 1 5046 RECEIVE +2024-07-30 12:00:04.938 3 2 5048 SEND +2024-07-30 12:00:04.939 0 3 5050 RECEIVE +2024-07-30 12:00:04.940 2 0 5052 SEND +2024-07-30 12:00:04.941 1 3 5054 RECEIVE +2024-07-30 12:00:04.942 0 1 5056 SEND +2024-07-30 12:00:04.943 3 2 5058 RECEIVE +2024-07-30 12:00:04.944 0 1 5044 SEND +2024-07-30 12:00:04.945 1 2 5046 RECEIVE +2024-07-30 12:00:04.946 2 3 5048 SEND +2024-07-30 12:00:04.947 3 0 5050 RECEIVE +2024-07-30 12:00:04.948 1 3 5052 SEND +2024-07-30 12:00:04.949 2 0 5054 RECEIVE +2024-07-30 12:00:04.950 0 2 5056 SEND +2024-07-30 12:00:04.951 3 1 5058 RECEIVE +2024-07-30 12:00:04.952 1 0 5060 SEND +2024-07-30 12:00:04.953 2 1 5062 RECEIVE +2024-07-30 12:00:04.954 3 2 5064 SEND +2024-07-30 12:00:04.955 0 3 5066 RECEIVE +2024-07-30 12:00:04.956 2 0 5068 SEND +2024-07-30 12:00:04.957 1 3 5070 RECEIVE +2024-07-30 12:00:04.958 0 1 5072 SEND +2024-07-30 12:00:04.959 3 2 5074 RECEIVE +2024-07-30 12:00:04.960 0 1 5060 SEND +2024-07-30 12:00:04.961 1 2 5062 RECEIVE +2024-07-30 12:00:04.962 2 3 5064 SEND +2024-07-30 12:00:04.963 3 0 5066 RECEIVE +2024-07-30 12:00:04.964 1 3 5068 SEND +2024-07-30 12:00:04.965 2 0 5070 RECEIVE +2024-07-30 12:00:04.966 0 2 5072 SEND +2024-07-30 12:00:04.967 3 1 5074 RECEIVE +2024-07-30 12:00:04.968 1 0 5076 SEND +2024-07-30 12:00:04.969 2 1 5078 RECEIVE +2024-07-30 12:00:04.970 3 2 5080 SEND +2024-07-30 12:00:04.971 0 3 5082 RECEIVE +2024-07-30 12:00:04.972 2 0 5084 SEND +2024-07-30 12:00:04.973 1 3 5086 RECEIVE +2024-07-30 12:00:04.974 0 1 5088 SEND +2024-07-30 12:00:04.975 3 2 5090 RECEIVE +2024-07-30 12:00:04.976 0 1 5076 SEND +2024-07-30 12:00:04.977 1 2 5078 RECEIVE +2024-07-30 12:00:04.978 2 3 5080 SEND +2024-07-30 12:00:04.979 3 0 5082 RECEIVE +2024-07-30 12:00:04.980 1 3 5084 SEND +2024-07-30 12:00:04.981 2 0 5086 RECEIVE +2024-07-30 12:00:04.982 0 2 5088 SEND +2024-07-30 12:00:04.983 3 1 5090 RECEIVE +2024-07-30 12:00:04.984 1 0 5092 SEND +2024-07-30 12:00:04.985 2 1 5094 RECEIVE +2024-07-30 12:00:04.986 3 2 5096 SEND +2024-07-30 12:00:04.987 0 3 5098 RECEIVE +2024-07-30 12:00:04.988 2 0 5100 SEND +2024-07-30 12:00:04.989 1 3 5102 RECEIVE +2024-07-30 12:00:04.990 0 1 5104 SEND +2024-07-30 12:00:04.991 3 2 5106 RECEIVE +2024-07-30 12:00:04.992 0 1 5092 SEND +2024-07-30 12:00:04.993 1 2 5094 RECEIVE +2024-07-30 12:00:04.994 2 3 5096 SEND +2024-07-30 12:00:04.995 3 0 5098 RECEIVE +2024-07-30 12:00:04.996 1 3 5100 SEND +2024-07-30 12:00:04.997 2 0 5102 RECEIVE +2024-07-30 12:00:04.998 0 2 5104 SEND +2024-07-30 12:00:04.999 3 1 5106 RECEIVE +2024-07-30 12:00:05.000 1 0 5108 SEND +2024-07-30 12:00:05.001 2 1 5110 RECEIVE +2024-07-30 12:00:05.002 3 2 5112 SEND +2024-07-30 12:00:05.003 0 3 5114 RECEIVE +2024-07-30 12:00:05.004 2 0 5116 SEND +2024-07-30 12:00:05.005 1 3 5118 RECEIVE +2024-07-30 12:00:05.006 0 1 5120 SEND +2024-07-30 12:00:05.007 3 2 5122 RECEIVE +2024-07-30 12:00:05.008 0 1 5108 SEND +2024-07-30 12:00:05.009 1 2 5110 RECEIVE +2024-07-30 12:00:05.010 2 3 5112 SEND +2024-07-30 12:00:05.011 3 0 5114 RECEIVE +2024-07-30 12:00:05.012 1 3 5116 SEND +2024-07-30 12:00:05.013 2 0 5118 RECEIVE +2024-07-30 12:00:05.014 0 2 5120 SEND +2024-07-30 12:00:05.015 3 1 5122 RECEIVE +2024-07-30 12:00:05.016 1 0 5124 SEND +2024-07-30 12:00:05.017 2 1 5126 RECEIVE +2024-07-30 12:00:05.018 3 2 5128 SEND +2024-07-30 12:00:05.019 0 3 5130 RECEIVE +2024-07-30 12:00:05.020 2 0 5132 SEND +2024-07-30 12:00:05.021 1 3 5134 RECEIVE +2024-07-30 12:00:05.022 0 1 5136 SEND +2024-07-30 12:00:05.023 3 2 5138 RECEIVE +2024-07-30 12:00:05.024 0 1 5124 SEND +2024-07-30 12:00:05.025 1 2 5126 RECEIVE +2024-07-30 12:00:05.026 2 3 5128 SEND +2024-07-30 12:00:05.027 3 0 5130 RECEIVE +2024-07-30 12:00:05.028 1 3 5132 SEND +2024-07-30 12:00:05.029 2 0 5134 RECEIVE +2024-07-30 12:00:05.030 0 2 5136 SEND +2024-07-30 12:00:05.031 3 1 5138 RECEIVE +2024-07-30 12:00:05.032 1 0 5140 SEND +2024-07-30 12:00:05.033 2 1 5142 RECEIVE +2024-07-30 12:00:05.034 3 2 5144 SEND +2024-07-30 12:00:05.035 0 3 5146 RECEIVE +2024-07-30 12:00:05.036 2 0 5148 SEND +2024-07-30 12:00:05.037 1 3 5150 RECEIVE +2024-07-30 12:00:05.038 0 1 5152 SEND +2024-07-30 12:00:05.039 3 2 5154 RECEIVE +2024-07-30 12:00:05.040 0 1 5140 SEND +2024-07-30 12:00:05.041 1 2 5142 RECEIVE +2024-07-30 12:00:05.042 2 3 5144 SEND +2024-07-30 12:00:05.043 3 0 5146 RECEIVE +2024-07-30 12:00:05.044 1 3 5148 SEND +2024-07-30 12:00:05.045 2 0 5150 RECEIVE +2024-07-30 12:00:05.046 0 2 5152 SEND +2024-07-30 12:00:05.047 3 1 5154 RECEIVE +2024-07-30 12:00:05.048 1 0 5156 SEND +2024-07-30 12:00:05.049 2 1 5158 RECEIVE +2024-07-30 12:00:05.050 3 2 5160 SEND +2024-07-30 12:00:05.051 0 3 5162 RECEIVE +2024-07-30 12:00:05.052 2 0 5164 SEND +2024-07-30 12:00:05.053 1 3 5166 RECEIVE +2024-07-30 12:00:05.054 0 1 5168 SEND +2024-07-30 12:00:05.055 3 2 5170 RECEIVE +2024-07-30 12:00:05.056 0 1 5156 SEND +2024-07-30 12:00:05.057 1 2 5158 RECEIVE +2024-07-30 12:00:05.058 2 3 5160 SEND +2024-07-30 12:00:05.059 3 0 5162 RECEIVE +2024-07-30 12:00:05.060 1 3 5164 SEND +2024-07-30 12:00:05.061 2 0 5166 RECEIVE +2024-07-30 12:00:05.062 0 2 5168 SEND +2024-07-30 12:00:05.063 3 1 5170 RECEIVE +2024-07-30 12:00:05.064 1 0 5172 SEND +2024-07-30 12:00:05.065 2 1 5174 RECEIVE +2024-07-30 12:00:05.066 3 2 5176 SEND +2024-07-30 12:00:05.067 0 3 5178 RECEIVE +2024-07-30 12:00:05.068 2 0 5180 SEND +2024-07-30 12:00:05.069 1 3 5182 RECEIVE +2024-07-30 12:00:05.070 0 1 5184 SEND +2024-07-30 12:00:05.071 3 2 5186 RECEIVE +2024-07-30 12:00:05.072 0 1 5172 SEND +2024-07-30 12:00:05.073 1 2 5174 RECEIVE +2024-07-30 12:00:05.074 2 3 5176 SEND +2024-07-30 12:00:05.075 3 0 5178 RECEIVE +2024-07-30 12:00:05.076 1 3 5180 SEND +2024-07-30 12:00:05.077 2 0 5182 RECEIVE +2024-07-30 12:00:05.078 0 2 5184 SEND +2024-07-30 12:00:05.079 3 1 5186 RECEIVE +2024-07-30 12:00:05.080 1 0 5188 SEND +2024-07-30 12:00:05.081 2 1 5190 RECEIVE +2024-07-30 12:00:05.082 3 2 5192 SEND +2024-07-30 12:00:05.083 0 3 5194 RECEIVE +2024-07-30 12:00:05.084 2 0 5196 SEND +2024-07-30 12:00:05.085 1 3 5198 RECEIVE +2024-07-30 12:00:05.086 0 1 5200 SEND +2024-07-30 12:00:05.087 3 2 5202 RECEIVE +2024-07-30 12:00:05.088 0 1 5188 SEND +2024-07-30 12:00:05.089 1 2 5190 RECEIVE +2024-07-30 12:00:05.090 2 3 5192 SEND +2024-07-30 12:00:05.091 3 0 5194 RECEIVE +2024-07-30 12:00:05.092 1 3 5196 SEND +2024-07-30 12:00:05.093 2 0 5198 RECEIVE +2024-07-30 12:00:05.094 0 2 5200 SEND +2024-07-30 12:00:05.095 3 1 5202 RECEIVE +2024-07-30 12:00:05.096 1 0 5204 SEND +2024-07-30 12:00:05.097 2 1 5206 RECEIVE +2024-07-30 12:00:05.098 3 2 5208 SEND +2024-07-30 12:00:05.099 0 3 5210 RECEIVE +2024-07-30 12:00:05.100 2 0 5212 SEND +2024-07-30 12:00:05.101 1 3 5214 RECEIVE +2024-07-30 12:00:05.102 0 1 5216 SEND +2024-07-30 12:00:05.103 3 2 5218 RECEIVE +2024-07-30 12:00:05.104 0 1 5204 SEND +2024-07-30 12:00:05.105 1 2 5206 RECEIVE +2024-07-30 12:00:05.106 2 3 5208 SEND +2024-07-30 12:00:05.107 3 0 5210 RECEIVE +2024-07-30 12:00:05.108 1 3 5212 SEND +2024-07-30 12:00:05.109 2 0 5214 RECEIVE +2024-07-30 12:00:05.110 0 2 5216 SEND +2024-07-30 12:00:05.111 3 1 5218 RECEIVE +2024-07-30 12:00:05.112 1 0 5220 SEND +2024-07-30 12:00:05.113 2 1 5222 RECEIVE +2024-07-30 12:00:05.114 3 2 5224 SEND +2024-07-30 12:00:05.115 0 3 5226 RECEIVE +2024-07-30 12:00:05.116 2 0 5228 SEND +2024-07-30 12:00:05.117 1 3 5230 RECEIVE +2024-07-30 12:00:05.118 0 1 5232 SEND +2024-07-30 12:00:05.119 3 2 5234 RECEIVE +2024-07-30 12:00:05.120 0 1 5220 SEND +2024-07-30 12:00:05.121 1 2 5222 RECEIVE +2024-07-30 12:00:05.122 2 3 5224 SEND +2024-07-30 12:00:05.123 3 0 5226 RECEIVE +2024-07-30 12:00:05.124 1 3 5228 SEND +2024-07-30 12:00:05.125 2 0 5230 RECEIVE +2024-07-30 12:00:05.126 0 2 5232 SEND +2024-07-30 12:00:05.127 3 1 5234 RECEIVE +2024-07-30 12:00:05.128 1 0 5236 SEND +2024-07-30 12:00:05.129 2 1 5238 RECEIVE +2024-07-30 12:00:05.130 3 2 5240 SEND +2024-07-30 12:00:05.131 0 3 5242 RECEIVE +2024-07-30 12:00:05.132 2 0 5244 SEND +2024-07-30 12:00:05.133 1 3 5246 RECEIVE +2024-07-30 12:00:05.134 0 1 5248 SEND +2024-07-30 12:00:05.135 3 2 5250 RECEIVE +2024-07-30 12:00:05.136 0 1 5236 SEND +2024-07-30 12:00:05.137 1 2 5238 RECEIVE +2024-07-30 12:00:05.138 2 3 5240 SEND +2024-07-30 12:00:05.139 3 0 5242 RECEIVE +2024-07-30 12:00:05.140 1 3 5244 SEND +2024-07-30 12:00:05.141 2 0 5246 RECEIVE +2024-07-30 12:00:05.142 0 2 5248 SEND +2024-07-30 12:00:05.143 3 1 5250 RECEIVE +2024-07-30 12:00:05.144 1 0 5252 SEND +2024-07-30 12:00:05.145 2 1 5254 RECEIVE +2024-07-30 12:00:05.146 3 2 5256 SEND +2024-07-30 12:00:05.147 0 3 5258 RECEIVE +2024-07-30 12:00:05.148 2 0 5260 SEND +2024-07-30 12:00:05.149 1 3 5262 RECEIVE +2024-07-30 12:00:05.150 0 1 5264 SEND +2024-07-30 12:00:05.151 3 2 5266 RECEIVE +2024-07-30 12:00:05.152 0 1 5252 SEND +2024-07-30 12:00:05.153 1 2 5254 RECEIVE +2024-07-30 12:00:05.154 2 3 5256 SEND +2024-07-30 12:00:05.155 3 0 5258 RECEIVE +2024-07-30 12:00:05.156 1 3 5260 SEND +2024-07-30 12:00:05.157 2 0 5262 RECEIVE +2024-07-30 12:00:05.158 0 2 5264 SEND +2024-07-30 12:00:05.159 3 1 5266 RECEIVE +2024-07-30 12:00:05.160 1 0 5268 SEND +2024-07-30 12:00:05.161 2 1 5270 RECEIVE +2024-07-30 12:00:05.162 3 2 5272 SEND +2024-07-30 12:00:05.163 0 3 5274 RECEIVE +2024-07-30 12:00:05.164 2 0 5276 SEND +2024-07-30 12:00:05.165 1 3 5278 RECEIVE +2024-07-30 12:00:05.166 0 1 5280 SEND +2024-07-30 12:00:05.167 3 2 5282 RECEIVE +2024-07-30 12:00:05.168 0 1 5268 SEND +2024-07-30 12:00:05.169 1 2 5270 RECEIVE +2024-07-30 12:00:05.170 2 3 5272 SEND +2024-07-30 12:00:05.171 3 0 5274 RECEIVE +2024-07-30 12:00:05.172 1 3 5276 SEND +2024-07-30 12:00:05.173 2 0 5278 RECEIVE +2024-07-30 12:00:05.174 0 2 5280 SEND +2024-07-30 12:00:05.175 3 1 5282 RECEIVE +2024-07-30 12:00:05.176 1 0 5284 SEND +2024-07-30 12:00:05.177 2 1 5286 RECEIVE +2024-07-30 12:00:05.178 3 2 5288 SEND +2024-07-30 12:00:05.179 0 3 5290 RECEIVE +2024-07-30 12:00:05.180 2 0 5292 SEND +2024-07-30 12:00:05.181 1 3 5294 RECEIVE +2024-07-30 12:00:05.182 0 1 5296 SEND +2024-07-30 12:00:05.183 3 2 5298 RECEIVE +2024-07-30 12:00:05.184 0 1 5284 SEND +2024-07-30 12:00:05.185 1 2 5286 RECEIVE +2024-07-30 12:00:05.186 2 3 5288 SEND +2024-07-30 12:00:05.187 3 0 5290 RECEIVE +2024-07-30 12:00:05.188 1 3 5292 SEND +2024-07-30 12:00:05.189 2 0 5294 RECEIVE +2024-07-30 12:00:05.190 0 2 5296 SEND +2024-07-30 12:00:05.191 3 1 5298 RECEIVE +2024-07-30 12:00:05.192 1 0 5300 SEND +2024-07-30 12:00:05.193 2 1 5302 RECEIVE +2024-07-30 12:00:05.194 3 2 5304 SEND +2024-07-30 12:00:05.195 0 3 5306 RECEIVE +2024-07-30 12:00:05.196 2 0 5308 SEND +2024-07-30 12:00:05.197 1 3 5310 RECEIVE +2024-07-30 12:00:05.198 0 1 5312 SEND +2024-07-30 12:00:05.199 3 2 5314 RECEIVE +2024-07-30 12:00:05.200 0 1 5300 SEND +2024-07-30 12:00:05.201 1 2 5302 RECEIVE +2024-07-30 12:00:05.202 2 3 5304 SEND +2024-07-30 12:00:05.203 3 0 5306 RECEIVE +2024-07-30 12:00:05.204 1 3 5308 SEND +2024-07-30 12:00:05.205 2 0 5310 RECEIVE +2024-07-30 12:00:05.206 0 2 5312 SEND +2024-07-30 12:00:05.207 3 1 5314 RECEIVE +2024-07-30 12:00:05.208 1 0 5316 SEND +2024-07-30 12:00:05.209 2 1 5318 RECEIVE +2024-07-30 12:00:05.210 3 2 5320 SEND +2024-07-30 12:00:05.211 0 3 5322 RECEIVE +2024-07-30 12:00:05.212 2 0 5324 SEND +2024-07-30 12:00:05.213 1 3 5326 RECEIVE +2024-07-30 12:00:05.214 0 1 5328 SEND +2024-07-30 12:00:05.215 3 2 5330 RECEIVE +2024-07-30 12:00:05.216 0 1 5316 SEND +2024-07-30 12:00:05.217 1 2 5318 RECEIVE +2024-07-30 12:00:05.218 2 3 5320 SEND +2024-07-30 12:00:05.219 3 0 5322 RECEIVE +2024-07-30 12:00:05.220 1 3 5324 SEND +2024-07-30 12:00:05.221 2 0 5326 RECEIVE +2024-07-30 12:00:05.222 0 2 5328 SEND +2024-07-30 12:00:05.223 3 1 5330 RECEIVE +2024-07-30 12:00:05.224 1 0 5332 SEND +2024-07-30 12:00:05.225 2 1 5334 RECEIVE +2024-07-30 12:00:05.226 3 2 5336 SEND +2024-07-30 12:00:05.227 0 3 5338 RECEIVE +2024-07-30 12:00:05.228 2 0 5340 SEND +2024-07-30 12:00:05.229 1 3 5342 RECEIVE +2024-07-30 12:00:05.230 0 1 5344 SEND +2024-07-30 12:00:05.231 3 2 5346 RECEIVE +2024-07-30 12:00:05.232 0 1 5332 SEND +2024-07-30 12:00:05.233 1 2 5334 RECEIVE +2024-07-30 12:00:05.234 2 3 5336 SEND +2024-07-30 12:00:05.235 3 0 5338 RECEIVE +2024-07-30 12:00:05.236 1 3 5340 SEND +2024-07-30 12:00:05.237 2 0 5342 RECEIVE +2024-07-30 12:00:05.238 0 2 5344 SEND +2024-07-30 12:00:05.239 3 1 5346 RECEIVE +2024-07-30 12:00:05.240 1 0 5348 SEND +2024-07-30 12:00:05.241 2 1 5350 RECEIVE +2024-07-30 12:00:05.242 3 2 5352 SEND +2024-07-30 12:00:05.243 0 3 5354 RECEIVE +2024-07-30 12:00:05.244 2 0 5356 SEND +2024-07-30 12:00:05.245 1 3 5358 RECEIVE +2024-07-30 12:00:05.246 0 1 5360 SEND +2024-07-30 12:00:05.247 3 2 5362 RECEIVE +2024-07-30 12:00:05.248 0 1 5348 SEND +2024-07-30 12:00:05.249 1 2 5350 RECEIVE +2024-07-30 12:00:05.250 2 3 5352 SEND +2024-07-30 12:00:05.251 3 0 5354 RECEIVE +2024-07-30 12:00:05.252 1 3 5356 SEND +2024-07-30 12:00:05.253 2 0 5358 RECEIVE +2024-07-30 12:00:05.254 0 2 5360 SEND +2024-07-30 12:00:05.255 3 1 5362 RECEIVE +2024-07-30 12:00:05.256 1 0 5364 SEND +2024-07-30 12:00:05.257 2 1 5366 RECEIVE +2024-07-30 12:00:05.258 3 2 5368 SEND +2024-07-30 12:00:05.259 0 3 5370 RECEIVE +2024-07-30 12:00:05.260 2 0 5372 SEND +2024-07-30 12:00:05.261 1 3 5374 RECEIVE +2024-07-30 12:00:05.262 0 1 5376 SEND +2024-07-30 12:00:05.263 3 2 5378 RECEIVE +2024-07-30 12:00:05.264 0 1 5364 SEND +2024-07-30 12:00:05.265 1 2 5366 RECEIVE +2024-07-30 12:00:05.266 2 3 5368 SEND +2024-07-30 12:00:05.267 3 0 5370 RECEIVE +2024-07-30 12:00:05.268 1 3 5372 SEND +2024-07-30 12:00:05.269 2 0 5374 RECEIVE +2024-07-30 12:00:05.270 0 2 5376 SEND +2024-07-30 12:00:05.271 3 1 5378 RECEIVE +2024-07-30 12:00:05.272 1 0 5380 SEND +2024-07-30 12:00:05.273 2 1 5382 RECEIVE +2024-07-30 12:00:05.274 3 2 5384 SEND +2024-07-30 12:00:05.275 0 3 5386 RECEIVE +2024-07-30 12:00:05.276 2 0 5388 SEND +2024-07-30 12:00:05.277 1 3 5390 RECEIVE +2024-07-30 12:00:05.278 0 1 5392 SEND +2024-07-30 12:00:05.279 3 2 5394 RECEIVE +2024-07-30 12:00:05.280 0 1 5380 SEND +2024-07-30 12:00:05.281 1 2 5382 RECEIVE +2024-07-30 12:00:05.282 2 3 5384 SEND +2024-07-30 12:00:05.283 3 0 5386 RECEIVE +2024-07-30 12:00:05.284 1 3 5388 SEND +2024-07-30 12:00:05.285 2 0 5390 RECEIVE +2024-07-30 12:00:05.286 0 2 5392 SEND +2024-07-30 12:00:05.287 3 1 5394 RECEIVE +2024-07-30 12:00:05.288 1 0 5396 SEND +2024-07-30 12:00:05.289 2 1 5398 RECEIVE +2024-07-30 12:00:05.290 3 2 5400 SEND +2024-07-30 12:00:05.291 0 3 5402 RECEIVE +2024-07-30 12:00:05.292 2 0 5404 SEND +2024-07-30 12:00:05.293 1 3 5406 RECEIVE +2024-07-30 12:00:05.294 0 1 5408 SEND +2024-07-30 12:00:05.295 3 2 5410 RECEIVE +2024-07-30 12:00:05.296 0 1 5396 SEND +2024-07-30 12:00:05.297 1 2 5398 RECEIVE +2024-07-30 12:00:05.298 2 3 5400 SEND +2024-07-30 12:00:05.299 3 0 5402 RECEIVE +2024-07-30 12:00:05.300 1 3 5404 SEND +2024-07-30 12:00:05.301 2 0 5406 RECEIVE +2024-07-30 12:00:05.302 0 2 5408 SEND +2024-07-30 12:00:05.303 3 1 5410 RECEIVE +2024-07-30 12:00:05.304 1 0 5412 SEND +2024-07-30 12:00:05.305 2 1 5414 RECEIVE +2024-07-30 12:00:05.306 3 2 5416 SEND +2024-07-30 12:00:05.307 0 3 5418 RECEIVE +2024-07-30 12:00:05.308 2 0 5420 SEND +2024-07-30 12:00:05.309 1 3 5422 RECEIVE +2024-07-30 12:00:05.310 0 1 5424 SEND +2024-07-30 12:00:05.311 3 2 5426 RECEIVE +2024-07-30 12:00:05.312 0 1 5412 SEND +2024-07-30 12:00:05.313 1 2 5414 RECEIVE +2024-07-30 12:00:05.314 2 3 5416 SEND +2024-07-30 12:00:05.315 3 0 5418 RECEIVE +2024-07-30 12:00:05.316 1 3 5420 SEND +2024-07-30 12:00:05.317 2 0 5422 RECEIVE +2024-07-30 12:00:05.318 0 2 5424 SEND +2024-07-30 12:00:05.319 3 1 5426 RECEIVE +2024-07-30 12:00:05.320 1 0 5428 SEND +2024-07-30 12:00:05.321 2 1 5430 RECEIVE +2024-07-30 12:00:05.322 3 2 5432 SEND +2024-07-30 12:00:05.323 0 3 5434 RECEIVE +2024-07-30 12:00:05.324 2 0 5436 SEND +2024-07-30 12:00:05.325 1 3 5438 RECEIVE +2024-07-30 12:00:05.326 0 1 5440 SEND +2024-07-30 12:00:05.327 3 2 5442 RECEIVE +2024-07-30 12:00:05.328 0 1 5428 SEND +2024-07-30 12:00:05.329 1 2 5430 RECEIVE +2024-07-30 12:00:05.330 2 3 5432 SEND +2024-07-30 12:00:05.331 3 0 5434 RECEIVE +2024-07-30 12:00:05.332 1 3 5436 SEND +2024-07-30 12:00:05.333 2 0 5438 RECEIVE +2024-07-30 12:00:05.334 0 2 5440 SEND +2024-07-30 12:00:05.335 3 1 5442 RECEIVE +2024-07-30 12:00:05.336 1 0 5444 SEND +2024-07-30 12:00:05.337 2 1 5446 RECEIVE +2024-07-30 12:00:05.338 3 2 5448 SEND +2024-07-30 12:00:05.339 0 3 5450 RECEIVE +2024-07-30 12:00:05.340 2 0 5452 SEND +2024-07-30 12:00:05.341 1 3 5454 RECEIVE +2024-07-30 12:00:05.342 0 1 5456 SEND +2024-07-30 12:00:05.343 3 2 5458 RECEIVE +2024-07-30 12:00:05.344 0 1 5444 SEND +2024-07-30 12:00:05.345 1 2 5446 RECEIVE +2024-07-30 12:00:05.346 2 3 5448 SEND +2024-07-30 12:00:05.347 3 0 5450 RECEIVE +2024-07-30 12:00:05.348 1 3 5452 SEND +2024-07-30 12:00:05.349 2 0 5454 RECEIVE +2024-07-30 12:00:05.350 0 2 5456 SEND +2024-07-30 12:00:05.351 3 1 5458 RECEIVE +2024-07-30 12:00:05.352 1 0 5460 SEND +2024-07-30 12:00:05.353 2 1 5462 RECEIVE +2024-07-30 12:00:05.354 3 2 5464 SEND +2024-07-30 12:00:05.355 0 3 5466 RECEIVE +2024-07-30 12:00:05.356 2 0 5468 SEND +2024-07-30 12:00:05.357 1 3 5470 RECEIVE +2024-07-30 12:00:05.358 0 1 5472 SEND +2024-07-30 12:00:05.359 3 2 5474 RECEIVE +2024-07-30 12:00:05.360 0 1 5460 SEND +2024-07-30 12:00:05.361 1 2 5462 RECEIVE +2024-07-30 12:00:05.362 2 3 5464 SEND +2024-07-30 12:00:05.363 3 0 5466 RECEIVE +2024-07-30 12:00:05.364 1 3 5468 SEND +2024-07-30 12:00:05.365 2 0 5470 RECEIVE +2024-07-30 12:00:05.366 0 2 5472 SEND +2024-07-30 12:00:05.367 3 1 5474 RECEIVE +2024-07-30 12:00:05.368 1 0 5476 SEND +2024-07-30 12:00:05.369 2 1 5478 RECEIVE +2024-07-30 12:00:05.370 3 2 5480 SEND +2024-07-30 12:00:05.371 0 3 5482 RECEIVE +2024-07-30 12:00:05.372 2 0 5484 SEND +2024-07-30 12:00:05.373 1 3 5486 RECEIVE +2024-07-30 12:00:05.374 0 1 5488 SEND +2024-07-30 12:00:05.375 3 2 5490 RECEIVE +2024-07-30 12:00:05.376 0 1 5476 SEND +2024-07-30 12:00:05.377 1 2 5478 RECEIVE +2024-07-30 12:00:05.378 2 3 5480 SEND +2024-07-30 12:00:05.379 3 0 5482 RECEIVE +2024-07-30 12:00:05.380 1 3 5484 SEND +2024-07-30 12:00:05.381 2 0 5486 RECEIVE +2024-07-30 12:00:05.382 0 2 5488 SEND +2024-07-30 12:00:05.383 3 1 5490 RECEIVE +2024-07-30 12:00:05.384 1 0 5492 SEND +2024-07-30 12:00:05.385 2 1 5494 RECEIVE +2024-07-30 12:00:05.386 3 2 5496 SEND +2024-07-30 12:00:05.387 0 3 5498 RECEIVE +2024-07-30 12:00:05.388 2 0 5500 SEND +2024-07-30 12:00:05.389 1 3 5502 RECEIVE +2024-07-30 12:00:05.390 0 1 5504 SEND +2024-07-30 12:00:05.391 3 2 5506 RECEIVE +2024-07-30 12:00:05.392 0 1 5492 SEND +2024-07-30 12:00:05.393 1 2 5494 RECEIVE +2024-07-30 12:00:05.394 2 3 5496 SEND +2024-07-30 12:00:05.395 3 0 5498 RECEIVE +2024-07-30 12:00:05.396 1 3 5500 SEND +2024-07-30 12:00:05.397 2 0 5502 RECEIVE +2024-07-30 12:00:05.398 0 2 5504 SEND +2024-07-30 12:00:05.399 3 1 5506 RECEIVE +2024-07-30 12:00:05.400 1 0 5508 SEND +2024-07-30 12:00:05.401 2 1 5510 RECEIVE +2024-07-30 12:00:05.402 3 2 5512 SEND +2024-07-30 12:00:05.403 0 3 5514 RECEIVE +2024-07-30 12:00:05.404 2 0 5516 SEND +2024-07-30 12:00:05.405 1 3 5518 RECEIVE +2024-07-30 12:00:05.406 0 1 5520 SEND +2024-07-30 12:00:05.407 3 2 5522 RECEIVE +2024-07-30 12:00:05.408 0 1 5508 SEND +2024-07-30 12:00:05.409 1 2 5510 RECEIVE +2024-07-30 12:00:05.410 2 3 5512 SEND +2024-07-30 12:00:05.411 3 0 5514 RECEIVE +2024-07-30 12:00:05.412 1 3 5516 SEND +2024-07-30 12:00:05.413 2 0 5518 RECEIVE +2024-07-30 12:00:05.414 0 2 5520 SEND +2024-07-30 12:00:05.415 3 1 5522 RECEIVE +2024-07-30 12:00:05.416 1 0 5524 SEND +2024-07-30 12:00:05.417 2 1 5526 RECEIVE +2024-07-30 12:00:05.418 3 2 5528 SEND +2024-07-30 12:00:05.419 0 3 5530 RECEIVE +2024-07-30 12:00:05.420 2 0 5532 SEND +2024-07-30 12:00:05.421 1 3 5534 RECEIVE +2024-07-30 12:00:05.422 0 1 5536 SEND +2024-07-30 12:00:05.423 3 2 5538 RECEIVE +2024-07-30 12:00:05.424 0 1 5524 SEND +2024-07-30 12:00:05.425 1 2 5526 RECEIVE +2024-07-30 12:00:05.426 2 3 5528 SEND +2024-07-30 12:00:05.427 3 0 5530 RECEIVE +2024-07-30 12:00:05.428 1 3 5532 SEND +2024-07-30 12:00:05.429 2 0 5534 RECEIVE +2024-07-30 12:00:05.430 0 2 5536 SEND +2024-07-30 12:00:05.431 3 1 5538 RECEIVE +2024-07-30 12:00:05.432 1 0 5540 SEND +2024-07-30 12:00:05.433 2 1 5542 RECEIVE +2024-07-30 12:00:05.434 3 2 5544 SEND +2024-07-30 12:00:05.435 0 3 5546 RECEIVE +2024-07-30 12:00:05.436 2 0 5548 SEND +2024-07-30 12:00:05.437 1 3 5550 RECEIVE +2024-07-30 12:00:05.438 0 1 5552 SEND +2024-07-30 12:00:05.439 3 2 5554 RECEIVE +2024-07-30 12:00:05.440 0 1 5540 SEND +2024-07-30 12:00:05.441 1 2 5542 RECEIVE +2024-07-30 12:00:05.442 2 3 5544 SEND +2024-07-30 12:00:05.443 3 0 5546 RECEIVE +2024-07-30 12:00:05.444 1 3 5548 SEND +2024-07-30 12:00:05.445 2 0 5550 RECEIVE +2024-07-30 12:00:05.446 0 2 5552 SEND +2024-07-30 12:00:05.447 3 1 5554 RECEIVE +2024-07-30 12:00:05.448 1 0 5556 SEND +2024-07-30 12:00:05.449 2 1 5558 RECEIVE +2024-07-30 12:00:05.450 3 2 5560 SEND +2024-07-30 12:00:05.451 0 3 5562 RECEIVE +2024-07-30 12:00:05.452 2 0 5564 SEND +2024-07-30 12:00:05.453 1 3 5566 RECEIVE +2024-07-30 12:00:05.454 0 1 5568 SEND +2024-07-30 12:00:05.455 3 2 5570 RECEIVE +2024-07-30 12:00:05.456 0 1 5556 SEND +2024-07-30 12:00:05.457 1 2 5558 RECEIVE +2024-07-30 12:00:05.458 2 3 5560 SEND +2024-07-30 12:00:05.459 3 0 5562 RECEIVE +2024-07-30 12:00:05.460 1 3 5564 SEND +2024-07-30 12:00:05.461 2 0 5566 RECEIVE +2024-07-30 12:00:05.462 0 2 5568 SEND +2024-07-30 12:00:05.463 3 1 5570 RECEIVE +2024-07-30 12:00:05.464 1 0 5572 SEND +2024-07-30 12:00:05.465 2 1 5574 RECEIVE +2024-07-30 12:00:05.466 3 2 5576 SEND +2024-07-30 12:00:05.467 0 3 5578 RECEIVE +2024-07-30 12:00:05.468 2 0 5580 SEND +2024-07-30 12:00:05.469 1 3 5582 RECEIVE +2024-07-30 12:00:05.470 0 1 5584 SEND +2024-07-30 12:00:05.471 3 2 5586 RECEIVE +2024-07-30 12:00:05.472 0 1 5572 SEND +2024-07-30 12:00:05.473 1 2 5574 RECEIVE +2024-07-30 12:00:05.474 2 3 5576 SEND +2024-07-30 12:00:05.475 3 0 5578 RECEIVE +2024-07-30 12:00:05.476 1 3 5580 SEND +2024-07-30 12:00:05.477 2 0 5582 RECEIVE +2024-07-30 12:00:05.478 0 2 5584 SEND +2024-07-30 12:00:05.479 3 1 5586 RECEIVE +2024-07-30 12:00:05.480 1 0 5588 SEND +2024-07-30 12:00:05.481 2 1 5590 RECEIVE +2024-07-30 12:00:05.482 3 2 5592 SEND +2024-07-30 12:00:05.483 0 3 5594 RECEIVE +2024-07-30 12:00:05.484 2 0 5596 SEND +2024-07-30 12:00:05.485 1 3 5598 RECEIVE +2024-07-30 12:00:05.486 0 1 5600 SEND +2024-07-30 12:00:05.487 3 2 5602 RECEIVE +2024-07-30 12:00:05.488 0 1 5588 SEND +2024-07-30 12:00:05.489 1 2 5590 RECEIVE +2024-07-30 12:00:05.490 2 3 5592 SEND +2024-07-30 12:00:05.491 3 0 5594 RECEIVE +2024-07-30 12:00:05.492 1 3 5596 SEND +2024-07-30 12:00:05.493 2 0 5598 RECEIVE +2024-07-30 12:00:05.494 0 2 5600 SEND +2024-07-30 12:00:05.495 3 1 5602 RECEIVE +2024-07-30 12:00:05.496 1 0 5604 SEND +2024-07-30 12:00:05.497 2 1 5606 RECEIVE +2024-07-30 12:00:05.498 3 2 5608 SEND +2024-07-30 12:00:05.499 0 3 5610 RECEIVE +2024-07-30 12:00:05.500 2 0 5612 SEND +2024-07-30 12:00:05.501 1 3 5614 RECEIVE +2024-07-30 12:00:05.502 0 1 5616 SEND +2024-07-30 12:00:05.503 3 2 5618 RECEIVE +2024-07-30 12:00:05.504 0 1 5604 SEND +2024-07-30 12:00:05.505 1 2 5606 RECEIVE +2024-07-30 12:00:05.506 2 3 5608 SEND +2024-07-30 12:00:05.507 3 0 5610 RECEIVE +2024-07-30 12:00:05.508 1 3 5612 SEND +2024-07-30 12:00:05.509 2 0 5614 RECEIVE +2024-07-30 12:00:05.510 0 2 5616 SEND +2024-07-30 12:00:05.511 3 1 5618 RECEIVE +2024-07-30 12:00:05.512 1 0 5620 SEND +2024-07-30 12:00:05.513 2 1 5622 RECEIVE +2024-07-30 12:00:05.514 3 2 5624 SEND +2024-07-30 12:00:05.515 0 3 5626 RECEIVE +2024-07-30 12:00:05.516 2 0 5628 SEND +2024-07-30 12:00:05.517 1 3 5630 RECEIVE +2024-07-30 12:00:05.518 0 1 5632 SEND +2024-07-30 12:00:05.519 3 2 5634 RECEIVE +2024-07-30 12:00:05.520 0 1 5620 SEND +2024-07-30 12:00:05.521 1 2 5622 RECEIVE +2024-07-30 12:00:05.522 2 3 5624 SEND +2024-07-30 12:00:05.523 3 0 5626 RECEIVE +2024-07-30 12:00:05.524 1 3 5628 SEND +2024-07-30 12:00:05.525 2 0 5630 RECEIVE +2024-07-30 12:00:05.526 0 2 5632 SEND +2024-07-30 12:00:05.527 3 1 5634 RECEIVE +2024-07-30 12:00:05.528 1 0 5636 SEND +2024-07-30 12:00:05.529 2 1 5638 RECEIVE +2024-07-30 12:00:05.530 3 2 5640 SEND +2024-07-30 12:00:05.531 0 3 5642 RECEIVE +2024-07-30 12:00:05.532 2 0 5644 SEND +2024-07-30 12:00:05.533 1 3 5646 RECEIVE +2024-07-30 12:00:05.534 0 1 5648 SEND +2024-07-30 12:00:05.535 3 2 5650 RECEIVE +2024-07-30 12:00:05.536 0 1 5636 SEND +2024-07-30 12:00:05.537 1 2 5638 RECEIVE +2024-07-30 12:00:05.538 2 3 5640 SEND +2024-07-30 12:00:05.539 3 0 5642 RECEIVE +2024-07-30 12:00:05.540 1 3 5644 SEND +2024-07-30 12:00:05.541 2 0 5646 RECEIVE +2024-07-30 12:00:05.542 0 2 5648 SEND +2024-07-30 12:00:05.543 3 1 5650 RECEIVE +2024-07-30 12:00:05.544 1 0 5652 SEND +2024-07-30 12:00:05.545 2 1 5654 RECEIVE +2024-07-30 12:00:05.546 3 2 5656 SEND +2024-07-30 12:00:05.547 0 3 5658 RECEIVE +2024-07-30 12:00:05.548 2 0 5660 SEND +2024-07-30 12:00:05.549 1 3 5662 RECEIVE +2024-07-30 12:00:05.550 0 1 5664 SEND +2024-07-30 12:00:05.551 3 2 5666 RECEIVE +2024-07-30 12:00:05.552 0 1 5652 SEND +2024-07-30 12:00:05.553 1 2 5654 RECEIVE +2024-07-30 12:00:05.554 2 3 5656 SEND +2024-07-30 12:00:05.555 3 0 5658 RECEIVE +2024-07-30 12:00:05.556 1 3 5660 SEND +2024-07-30 12:00:05.557 2 0 5662 RECEIVE +2024-07-30 12:00:05.558 0 2 5664 SEND +2024-07-30 12:00:05.559 3 1 5666 RECEIVE +2024-07-30 12:00:05.560 1 0 5668 SEND +2024-07-30 12:00:05.561 2 1 5670 RECEIVE +2024-07-30 12:00:05.562 3 2 5672 SEND +2024-07-30 12:00:05.563 0 3 5674 RECEIVE +2024-07-30 12:00:05.564 2 0 5676 SEND +2024-07-30 12:00:05.565 1 3 5678 RECEIVE +2024-07-30 12:00:05.566 0 1 5680 SEND +2024-07-30 12:00:05.567 3 2 5682 RECEIVE +2024-07-30 12:00:05.568 0 1 5668 SEND +2024-07-30 12:00:05.569 1 2 5670 RECEIVE +2024-07-30 12:00:05.570 2 3 5672 SEND +2024-07-30 12:00:05.571 3 0 5674 RECEIVE +2024-07-30 12:00:05.572 1 3 5676 SEND +2024-07-30 12:00:05.573 2 0 5678 RECEIVE +2024-07-30 12:00:05.574 0 2 5680 SEND +2024-07-30 12:00:05.575 3 1 5682 RECEIVE +2024-07-30 12:00:05.576 1 0 5684 SEND +2024-07-30 12:00:05.577 2 1 5686 RECEIVE +2024-07-30 12:00:05.578 3 2 5688 SEND +2024-07-30 12:00:05.579 0 3 5690 RECEIVE +2024-07-30 12:00:05.580 2 0 5692 SEND +2024-07-30 12:00:05.581 1 3 5694 RECEIVE +2024-07-30 12:00:05.582 0 1 5696 SEND +2024-07-30 12:00:05.583 3 2 5698 RECEIVE +2024-07-30 12:00:05.584 0 1 5684 SEND +2024-07-30 12:00:05.585 1 2 5686 RECEIVE +2024-07-30 12:00:05.586 2 3 5688 SEND +2024-07-30 12:00:05.587 3 0 5690 RECEIVE +2024-07-30 12:00:05.588 1 3 5692 SEND +2024-07-30 12:00:05.589 2 0 5694 RECEIVE +2024-07-30 12:00:05.590 0 2 5696 SEND +2024-07-30 12:00:05.591 3 1 5698 RECEIVE +2024-07-30 12:00:05.592 1 0 5700 SEND +2024-07-30 12:00:05.593 2 1 5702 RECEIVE +2024-07-30 12:00:05.594 3 2 5704 SEND +2024-07-30 12:00:05.595 0 3 5706 RECEIVE +2024-07-30 12:00:05.596 2 0 5708 SEND +2024-07-30 12:00:05.597 1 3 5710 RECEIVE +2024-07-30 12:00:05.598 0 1 5712 SEND +2024-07-30 12:00:05.599 3 2 5714 RECEIVE +2024-07-30 12:00:05.600 0 1 5700 SEND +2024-07-30 12:00:05.601 1 2 5702 RECEIVE +2024-07-30 12:00:05.602 2 3 5704 SEND +2024-07-30 12:00:05.603 3 0 5706 RECEIVE +2024-07-30 12:00:05.604 1 3 5708 SEND +2024-07-30 12:00:05.605 2 0 5710 RECEIVE +2024-07-30 12:00:05.606 0 2 5712 SEND +2024-07-30 12:00:05.607 3 1 5714 RECEIVE +2024-07-30 12:00:05.608 1 0 5716 SEND +2024-07-30 12:00:05.609 2 1 5718 RECEIVE +2024-07-30 12:00:05.610 3 2 5720 SEND +2024-07-30 12:00:05.611 0 3 5722 RECEIVE +2024-07-30 12:00:05.612 2 0 5724 SEND +2024-07-30 12:00:05.613 1 3 5726 RECEIVE +2024-07-30 12:00:05.614 0 1 5728 SEND +2024-07-30 12:00:05.615 3 2 5730 RECEIVE +2024-07-30 12:00:05.616 0 1 5716 SEND +2024-07-30 12:00:05.617 1 2 5718 RECEIVE +2024-07-30 12:00:05.618 2 3 5720 SEND +2024-07-30 12:00:05.619 3 0 5722 RECEIVE +2024-07-30 12:00:05.620 1 3 5724 SEND +2024-07-30 12:00:05.621 2 0 5726 RECEIVE +2024-07-30 12:00:05.622 0 2 5728 SEND +2024-07-30 12:00:05.623 3 1 5730 RECEIVE +2024-07-30 12:00:05.624 1 0 5732 SEND +2024-07-30 12:00:05.625 2 1 5734 RECEIVE +2024-07-30 12:00:05.626 3 2 5736 SEND +2024-07-30 12:00:05.627 0 3 5738 RECEIVE +2024-07-30 12:00:05.628 2 0 5740 SEND +2024-07-30 12:00:05.629 1 3 5742 RECEIVE +2024-07-30 12:00:05.630 0 1 5744 SEND +2024-07-30 12:00:05.631 3 2 5746 RECEIVE +2024-07-30 12:00:05.632 0 1 5732 SEND +2024-07-30 12:00:05.633 1 2 5734 RECEIVE +2024-07-30 12:00:05.634 2 3 5736 SEND +2024-07-30 12:00:05.635 3 0 5738 RECEIVE +2024-07-30 12:00:05.636 1 3 5740 SEND +2024-07-30 12:00:05.637 2 0 5742 RECEIVE +2024-07-30 12:00:05.638 0 2 5744 SEND +2024-07-30 12:00:05.639 3 1 5746 RECEIVE +2024-07-30 12:00:05.640 1 0 5748 SEND +2024-07-30 12:00:05.641 2 1 5750 RECEIVE +2024-07-30 12:00:05.642 3 2 5752 SEND +2024-07-30 12:00:05.643 0 3 5754 RECEIVE +2024-07-30 12:00:05.644 2 0 5756 SEND +2024-07-30 12:00:05.645 1 3 5758 RECEIVE +2024-07-30 12:00:05.646 0 1 5760 SEND +2024-07-30 12:00:05.647 3 2 5762 RECEIVE +2024-07-30 12:00:05.648 0 1 5748 SEND +2024-07-30 12:00:05.649 1 2 5750 RECEIVE +2024-07-30 12:00:05.650 2 3 5752 SEND +2024-07-30 12:00:05.651 3 0 5754 RECEIVE +2024-07-30 12:00:05.652 1 3 5756 SEND +2024-07-30 12:00:05.653 2 0 5758 RECEIVE +2024-07-30 12:00:05.654 0 2 5760 SEND +2024-07-30 12:00:05.655 3 1 5762 RECEIVE +2024-07-30 12:00:05.656 1 0 5764 SEND +2024-07-30 12:00:05.657 2 1 5766 RECEIVE +2024-07-30 12:00:05.658 3 2 5768 SEND +2024-07-30 12:00:05.659 0 3 5770 RECEIVE +2024-07-30 12:00:05.660 2 0 5772 SEND +2024-07-30 12:00:05.661 1 3 5774 RECEIVE +2024-07-30 12:00:05.662 0 1 5776 SEND +2024-07-30 12:00:05.663 3 2 5778 RECEIVE +2024-07-30 12:00:05.664 0 1 5764 SEND +2024-07-30 12:00:05.665 1 2 5766 RECEIVE +2024-07-30 12:00:05.666 2 3 5768 SEND +2024-07-30 12:00:05.667 3 0 5770 RECEIVE +2024-07-30 12:00:05.668 1 3 5772 SEND +2024-07-30 12:00:05.669 2 0 5774 RECEIVE +2024-07-30 12:00:05.670 0 2 5776 SEND +2024-07-30 12:00:05.671 3 1 5778 RECEIVE +2024-07-30 12:00:05.672 1 0 5780 SEND +2024-07-30 12:00:05.673 2 1 5782 RECEIVE +2024-07-30 12:00:05.674 3 2 5784 SEND +2024-07-30 12:00:05.675 0 3 5786 RECEIVE +2024-07-30 12:00:05.676 2 0 5788 SEND +2024-07-30 12:00:05.677 1 3 5790 RECEIVE +2024-07-30 12:00:05.678 0 1 5792 SEND +2024-07-30 12:00:05.679 3 2 5794 RECEIVE +2024-07-30 12:00:05.680 0 1 5780 SEND +2024-07-30 12:00:05.681 1 2 5782 RECEIVE +2024-07-30 12:00:05.682 2 3 5784 SEND +2024-07-30 12:00:05.683 3 0 5786 RECEIVE +2024-07-30 12:00:05.684 1 3 5788 SEND +2024-07-30 12:00:05.685 2 0 5790 RECEIVE +2024-07-30 12:00:05.686 0 2 5792 SEND +2024-07-30 12:00:05.687 3 1 5794 RECEIVE +2024-07-30 12:00:05.688 1 0 5796 SEND +2024-07-30 12:00:05.689 2 1 5798 RECEIVE +2024-07-30 12:00:05.690 3 2 5800 SEND +2024-07-30 12:00:05.691 0 3 5802 RECEIVE +2024-07-30 12:00:05.692 2 0 5804 SEND +2024-07-30 12:00:05.693 1 3 5806 RECEIVE +2024-07-30 12:00:05.694 0 1 5808 SEND +2024-07-30 12:00:05.695 3 2 5810 RECEIVE +2024-07-30 12:00:05.696 0 1 5796 SEND +2024-07-30 12:00:05.697 1 2 5798 RECEIVE +2024-07-30 12:00:05.698 2 3 5800 SEND +2024-07-30 12:00:05.699 3 0 5802 RECEIVE +2024-07-30 12:00:05.700 1 3 5804 SEND +2024-07-30 12:00:05.701 2 0 5806 RECEIVE +2024-07-30 12:00:05.702 0 2 5808 SEND +2024-07-30 12:00:05.703 3 1 5810 RECEIVE +2024-07-30 12:00:05.704 1 0 5812 SEND +2024-07-30 12:00:05.705 2 1 5814 RECEIVE +2024-07-30 12:00:05.706 3 2 5816 SEND +2024-07-30 12:00:05.707 0 3 5818 RECEIVE +2024-07-30 12:00:05.708 2 0 5820 SEND +2024-07-30 12:00:05.709 1 3 5822 RECEIVE +2024-07-30 12:00:05.710 0 1 5824 SEND +2024-07-30 12:00:05.711 3 2 5826 RECEIVE +2024-07-30 12:00:05.712 0 1 5812 SEND +2024-07-30 12:00:05.713 1 2 5814 RECEIVE +2024-07-30 12:00:05.714 2 3 5816 SEND +2024-07-30 12:00:05.715 3 0 5818 RECEIVE +2024-07-30 12:00:05.716 1 3 5820 SEND +2024-07-30 12:00:05.717 2 0 5822 RECEIVE +2024-07-30 12:00:05.718 0 2 5824 SEND +2024-07-30 12:00:05.719 3 1 5826 RECEIVE +2024-07-30 12:00:05.720 1 0 5828 SEND +2024-07-30 12:00:05.721 2 1 5830 RECEIVE +2024-07-30 12:00:05.722 3 2 5832 SEND +2024-07-30 12:00:05.723 0 3 5834 RECEIVE +2024-07-30 12:00:05.724 2 0 5836 SEND +2024-07-30 12:00:05.725 1 3 5838 RECEIVE +2024-07-30 12:00:05.726 0 1 5840 SEND +2024-07-30 12:00:05.727 3 2 5842 RECEIVE +2024-07-30 12:00:05.728 0 1 5828 SEND +2024-07-30 12:00:05.729 1 2 5830 RECEIVE +2024-07-30 12:00:05.730 2 3 5832 SEND +2024-07-30 12:00:05.731 3 0 5834 RECEIVE +2024-07-30 12:00:05.732 1 3 5836 SEND +2024-07-30 12:00:05.733 2 0 5838 RECEIVE +2024-07-30 12:00:05.734 0 2 5840 SEND +2024-07-30 12:00:05.735 3 1 5842 RECEIVE +2024-07-30 12:00:05.736 1 0 5844 SEND +2024-07-30 12:00:05.737 2 1 5846 RECEIVE +2024-07-30 12:00:05.738 3 2 5848 SEND +2024-07-30 12:00:05.739 0 3 5850 RECEIVE +2024-07-30 12:00:05.740 2 0 5852 SEND +2024-07-30 12:00:05.741 1 3 5854 RECEIVE +2024-07-30 12:00:05.742 0 1 5856 SEND +2024-07-30 12:00:05.743 3 2 5858 RECEIVE +2024-07-30 12:00:05.744 0 1 5844 SEND +2024-07-30 12:00:05.745 1 2 5846 RECEIVE +2024-07-30 12:00:05.746 2 3 5848 SEND +2024-07-30 12:00:05.747 3 0 5850 RECEIVE +2024-07-30 12:00:05.748 1 3 5852 SEND +2024-07-30 12:00:05.749 2 0 5854 RECEIVE +2024-07-30 12:00:05.750 0 2 5856 SEND +2024-07-30 12:00:05.751 3 1 5858 RECEIVE +2024-07-30 12:00:05.752 1 0 5860 SEND +2024-07-30 12:00:05.753 2 1 5862 RECEIVE +2024-07-30 12:00:05.754 3 2 5864 SEND +2024-07-30 12:00:05.755 0 3 5866 RECEIVE +2024-07-30 12:00:05.756 2 0 5868 SEND +2024-07-30 12:00:05.757 1 3 5870 RECEIVE +2024-07-30 12:00:05.758 0 1 5872 SEND +2024-07-30 12:00:05.759 3 2 5874 RECEIVE +2024-07-30 12:00:05.760 0 1 5860 SEND +2024-07-30 12:00:05.761 1 2 5862 RECEIVE +2024-07-30 12:00:05.762 2 3 5864 SEND +2024-07-30 12:00:05.763 3 0 5866 RECEIVE +2024-07-30 12:00:05.764 1 3 5868 SEND +2024-07-30 12:00:05.765 2 0 5870 RECEIVE +2024-07-30 12:00:05.766 0 2 5872 SEND +2024-07-30 12:00:05.767 3 1 5874 RECEIVE +2024-07-30 12:00:05.768 1 0 5876 SEND +2024-07-30 12:00:05.769 2 1 5878 RECEIVE +2024-07-30 12:00:05.770 3 2 5880 SEND +2024-07-30 12:00:05.771 0 3 5882 RECEIVE +2024-07-30 12:00:05.772 2 0 5884 SEND +2024-07-30 12:00:05.773 1 3 5886 RECEIVE +2024-07-30 12:00:05.774 0 1 5888 SEND +2024-07-30 12:00:05.775 3 2 5890 RECEIVE +2024-07-30 12:00:05.776 0 1 5876 SEND +2024-07-30 12:00:05.777 1 2 5878 RECEIVE +2024-07-30 12:00:05.778 2 3 5880 SEND +2024-07-30 12:00:05.779 3 0 5882 RECEIVE +2024-07-30 12:00:05.780 1 3 5884 SEND +2024-07-30 12:00:05.781 2 0 5886 RECEIVE +2024-07-30 12:00:05.782 0 2 5888 SEND +2024-07-30 12:00:05.783 3 1 5890 RECEIVE +2024-07-30 12:00:05.784 1 0 5892 SEND +2024-07-30 12:00:05.785 2 1 5894 RECEIVE +2024-07-30 12:00:05.786 3 2 5896 SEND +2024-07-30 12:00:05.787 0 3 5898 RECEIVE +2024-07-30 12:00:05.788 2 0 5900 SEND +2024-07-30 12:00:05.789 1 3 5902 RECEIVE +2024-07-30 12:00:05.790 0 1 5904 SEND +2024-07-30 12:00:05.791 3 2 5906 RECEIVE +2024-07-30 12:00:05.792 0 1 5892 SEND +2024-07-30 12:00:05.793 1 2 5894 RECEIVE +2024-07-30 12:00:05.794 2 3 5896 SEND +2024-07-30 12:00:05.795 3 0 5898 RECEIVE +2024-07-30 12:00:05.796 1 3 5900 SEND +2024-07-30 12:00:05.797 2 0 5902 RECEIVE +2024-07-30 12:00:05.798 0 2 5904 SEND +2024-07-30 12:00:05.799 3 1 5906 RECEIVE +2024-07-30 12:00:05.800 1 0 5908 SEND +2024-07-30 12:00:05.801 2 1 5910 RECEIVE +2024-07-30 12:00:05.802 3 2 5912 SEND +2024-07-30 12:00:05.803 0 3 5914 RECEIVE +2024-07-30 12:00:05.804 2 0 5916 SEND +2024-07-30 12:00:05.805 1 3 5918 RECEIVE +2024-07-30 12:00:05.806 0 1 5920 SEND +2024-07-30 12:00:05.807 3 2 5922 RECEIVE +2024-07-30 12:00:05.808 0 1 5908 SEND +2024-07-30 12:00:05.809 1 2 5910 RECEIVE +2024-07-30 12:00:05.810 2 3 5912 SEND +2024-07-30 12:00:05.811 3 0 5914 RECEIVE +2024-07-30 12:00:05.812 1 3 5916 SEND +2024-07-30 12:00:05.813 2 0 5918 RECEIVE +2024-07-30 12:00:05.814 0 2 5920 SEND +2024-07-30 12:00:05.815 3 1 5922 RECEIVE +2024-07-30 12:00:05.816 1 0 5924 SEND +2024-07-30 12:00:05.817 2 1 5926 RECEIVE +2024-07-30 12:00:05.818 3 2 5928 SEND +2024-07-30 12:00:05.819 0 3 5930 RECEIVE +2024-07-30 12:00:05.820 2 0 5932 SEND +2024-07-30 12:00:05.821 1 3 5934 RECEIVE +2024-07-30 12:00:05.822 0 1 5936 SEND +2024-07-30 12:00:05.823 3 2 5938 RECEIVE +2024-07-30 12:00:05.824 0 1 5924 SEND +2024-07-30 12:00:05.825 1 2 5926 RECEIVE +2024-07-30 12:00:05.826 2 3 5928 SEND +2024-07-30 12:00:05.827 3 0 5930 RECEIVE +2024-07-30 12:00:05.828 1 3 5932 SEND +2024-07-30 12:00:05.829 2 0 5934 RECEIVE +2024-07-30 12:00:05.830 0 2 5936 SEND +2024-07-30 12:00:05.831 3 1 5938 RECEIVE +2024-07-30 12:00:05.832 1 0 5940 SEND +2024-07-30 12:00:05.833 2 1 5942 RECEIVE +2024-07-30 12:00:05.834 3 2 5944 SEND +2024-07-30 12:00:05.835 0 3 5946 RECEIVE +2024-07-30 12:00:05.836 2 0 5948 SEND +2024-07-30 12:00:05.837 1 3 5950 RECEIVE +2024-07-30 12:00:05.838 0 1 5952 SEND +2024-07-30 12:00:05.839 3 2 5954 RECEIVE +2024-07-30 12:00:05.840 0 1 5940 SEND +2024-07-30 12:00:05.841 1 2 5942 RECEIVE +2024-07-30 12:00:05.842 2 3 5944 SEND +2024-07-30 12:00:05.843 3 0 5946 RECEIVE +2024-07-30 12:00:05.844 1 3 5948 SEND +2024-07-30 12:00:05.845 2 0 5950 RECEIVE +2024-07-30 12:00:05.846 0 2 5952 SEND +2024-07-30 12:00:05.847 3 1 5954 RECEIVE +2024-07-30 12:00:05.848 1 0 5956 SEND +2024-07-30 12:00:05.849 2 1 5958 RECEIVE +2024-07-30 12:00:05.850 3 2 5960 SEND +2024-07-30 12:00:05.851 0 3 5962 RECEIVE +2024-07-30 12:00:05.852 2 0 5964 SEND +2024-07-30 12:00:05.853 1 3 5966 RECEIVE +2024-07-30 12:00:05.854 0 1 5968 SEND +2024-07-30 12:00:05.855 3 2 5970 RECEIVE +2024-07-30 12:00:05.856 0 1 5956 SEND +2024-07-30 12:00:05.857 1 2 5958 RECEIVE +2024-07-30 12:00:05.858 2 3 5960 SEND +2024-07-30 12:00:05.859 3 0 5962 RECEIVE +2024-07-30 12:00:05.860 1 3 5964 SEND +2024-07-30 12:00:05.861 2 0 5966 RECEIVE +2024-07-30 12:00:05.862 0 2 5968 SEND +2024-07-30 12:00:05.863 3 1 5970 RECEIVE +2024-07-30 12:00:05.864 1 0 5972 SEND +2024-07-30 12:00:05.865 2 1 5974 RECEIVE +2024-07-30 12:00:05.866 3 2 5976 SEND +2024-07-30 12:00:05.867 0 3 5978 RECEIVE +2024-07-30 12:00:05.868 2 0 5980 SEND +2024-07-30 12:00:05.869 1 3 5982 RECEIVE +2024-07-30 12:00:05.870 0 1 5984 SEND +2024-07-30 12:00:05.871 3 2 5986 RECEIVE +2024-07-30 12:00:05.872 0 1 5972 SEND +2024-07-30 12:00:05.873 1 2 5974 RECEIVE +2024-07-30 12:00:05.874 2 3 5976 SEND +2024-07-30 12:00:05.875 3 0 5978 RECEIVE +2024-07-30 12:00:05.876 1 3 5980 SEND +2024-07-30 12:00:05.877 2 0 5982 RECEIVE +2024-07-30 12:00:05.878 0 2 5984 SEND +2024-07-30 12:00:05.879 3 1 5986 RECEIVE +2024-07-30 12:00:05.880 1 0 5988 SEND +2024-07-30 12:00:05.881 2 1 5990 RECEIVE +2024-07-30 12:00:05.882 3 2 5992 SEND +2024-07-30 12:00:05.883 0 3 5994 RECEIVE +2024-07-30 12:00:05.884 2 0 5996 SEND +2024-07-30 12:00:05.885 1 3 5998 RECEIVE +2024-07-30 12:00:05.886 0 1 6000 SEND +2024-07-30 12:00:05.887 3 2 6002 RECEIVE +2024-07-30 12:00:05.888 0 1 5988 SEND +2024-07-30 12:00:05.889 1 2 5990 RECEIVE +2024-07-30 12:00:05.890 2 3 5992 SEND +2024-07-30 12:00:05.891 3 0 5994 RECEIVE +2024-07-30 12:00:05.892 1 3 5996 SEND +2024-07-30 12:00:05.893 2 0 5998 RECEIVE +2024-07-30 12:00:05.894 0 2 6000 SEND +2024-07-30 12:00:05.895 3 1 6002 RECEIVE +2024-07-30 12:00:05.896 1 0 6004 SEND +2024-07-30 12:00:05.897 2 1 6006 RECEIVE +2024-07-30 12:00:05.898 3 2 6008 SEND +2024-07-30 12:00:05.899 0 3 6010 RECEIVE +2024-07-30 12:00:05.900 2 0 6012 SEND +2024-07-30 12:00:05.901 1 3 6014 RECEIVE +2024-07-30 12:00:05.902 0 1 6016 SEND +2024-07-30 12:00:05.903 3 2 6018 RECEIVE +2024-07-30 12:00:05.904 0 1 6004 SEND +2024-07-30 12:00:05.905 1 2 6006 RECEIVE +2024-07-30 12:00:05.906 2 3 6008 SEND +2024-07-30 12:00:05.907 3 0 6010 RECEIVE +2024-07-30 12:00:05.908 1 3 6012 SEND +2024-07-30 12:00:05.909 2 0 6014 RECEIVE +2024-07-30 12:00:05.910 0 2 6016 SEND +2024-07-30 12:00:05.911 3 1 6018 RECEIVE +2024-07-30 12:00:05.912 1 0 6020 SEND +2024-07-30 12:00:05.913 2 1 6022 RECEIVE +2024-07-30 12:00:05.914 3 2 6024 SEND +2024-07-30 12:00:05.915 0 3 6026 RECEIVE +2024-07-30 12:00:05.916 2 0 6028 SEND +2024-07-30 12:00:05.917 1 3 6030 RECEIVE +2024-07-30 12:00:05.918 0 1 6032 SEND +2024-07-30 12:00:05.919 3 2 6034 RECEIVE +2024-07-30 12:00:05.920 0 1 6020 SEND +2024-07-30 12:00:05.921 1 2 6022 RECEIVE +2024-07-30 12:00:05.922 2 3 6024 SEND +2024-07-30 12:00:05.923 3 0 6026 RECEIVE +2024-07-30 12:00:05.924 1 3 6028 SEND +2024-07-30 12:00:05.925 2 0 6030 RECEIVE +2024-07-30 12:00:05.926 0 2 6032 SEND +2024-07-30 12:00:05.927 3 1 6034 RECEIVE +2024-07-30 12:00:05.928 1 0 6036 SEND +2024-07-30 12:00:05.929 2 1 6038 RECEIVE +2024-07-30 12:00:05.930 3 2 6040 SEND +2024-07-30 12:00:05.931 0 3 6042 RECEIVE +2024-07-30 12:00:05.932 2 0 6044 SEND +2024-07-30 12:00:05.933 1 3 6046 RECEIVE +2024-07-30 12:00:05.934 0 1 6048 SEND +2024-07-30 12:00:05.935 3 2 6050 RECEIVE +2024-07-30 12:00:05.936 0 1 6036 SEND +2024-07-30 12:00:05.937 1 2 6038 RECEIVE +2024-07-30 12:00:05.938 2 3 6040 SEND +2024-07-30 12:00:05.939 3 0 6042 RECEIVE +2024-07-30 12:00:05.940 1 3 6044 SEND +2024-07-30 12:00:05.941 2 0 6046 RECEIVE +2024-07-30 12:00:05.942 0 2 6048 SEND +2024-07-30 12:00:05.943 3 1 6050 RECEIVE +2024-07-30 12:00:05.944 1 0 6052 SEND +2024-07-30 12:00:05.945 2 1 6054 RECEIVE +2024-07-30 12:00:05.946 3 2 6056 SEND +2024-07-30 12:00:05.947 0 3 6058 RECEIVE +2024-07-30 12:00:05.948 2 0 6060 SEND +2024-07-30 12:00:05.949 1 3 6062 RECEIVE +2024-07-30 12:00:05.950 0 1 6064 SEND +2024-07-30 12:00:05.951 3 2 6066 RECEIVE +2024-07-30 12:00:05.952 0 1 6052 SEND +2024-07-30 12:00:05.953 1 2 6054 RECEIVE +2024-07-30 12:00:05.954 2 3 6056 SEND +2024-07-30 12:00:05.955 3 0 6058 RECEIVE +2024-07-30 12:00:05.956 1 3 6060 SEND +2024-07-30 12:00:05.957 2 0 6062 RECEIVE +2024-07-30 12:00:05.958 0 2 6064 SEND +2024-07-30 12:00:05.959 3 1 6066 RECEIVE +2024-07-30 12:00:05.960 1 0 6068 SEND +2024-07-30 12:00:05.961 2 1 6070 RECEIVE +2024-07-30 12:00:05.962 3 2 6072 SEND +2024-07-30 12:00:05.963 0 3 6074 RECEIVE +2024-07-30 12:00:05.964 2 0 6076 SEND +2024-07-30 12:00:05.965 1 3 6078 RECEIVE +2024-07-30 12:00:05.966 0 1 6080 SEND +2024-07-30 12:00:05.967 3 2 6082 RECEIVE +2024-07-30 12:00:05.968 0 1 6068 SEND +2024-07-30 12:00:05.969 1 2 6070 RECEIVE +2024-07-30 12:00:05.970 2 3 6072 SEND +2024-07-30 12:00:05.971 3 0 6074 RECEIVE +2024-07-30 12:00:05.972 1 3 6076 SEND +2024-07-30 12:00:05.973 2 0 6078 RECEIVE +2024-07-30 12:00:05.974 0 2 6080 SEND +2024-07-30 12:00:05.975 3 1 6082 RECEIVE +2024-07-30 12:00:05.976 1 0 6084 SEND +2024-07-30 12:00:05.977 2 1 6086 RECEIVE +2024-07-30 12:00:05.978 3 2 6088 SEND +2024-07-30 12:00:05.979 0 3 6090 RECEIVE +2024-07-30 12:00:05.980 2 0 6092 SEND +2024-07-30 12:00:05.981 1 3 6094 RECEIVE +2024-07-30 12:00:05.982 0 1 6096 SEND +2024-07-30 12:00:05.983 3 2 6098 RECEIVE +2024-07-30 12:00:05.984 0 1 6084 SEND +2024-07-30 12:00:05.985 1 2 6086 RECEIVE +2024-07-30 12:00:05.986 2 3 6088 SEND +2024-07-30 12:00:05.987 3 0 6090 RECEIVE +2024-07-30 12:00:05.988 1 3 6092 SEND +2024-07-30 12:00:05.989 2 0 6094 RECEIVE +2024-07-30 12:00:05.990 0 2 6096 SEND +2024-07-30 12:00:05.991 3 1 6098 RECEIVE +2024-07-30 12:00:05.992 1 0 6100 SEND +2024-07-30 12:00:05.993 2 1 6102 RECEIVE +2024-07-30 12:00:05.994 3 2 6104 SEND +2024-07-30 12:00:05.995 0 3 6106 RECEIVE +2024-07-30 12:00:05.996 2 0 6108 SEND +2024-07-30 12:00:05.997 1 3 6110 RECEIVE +2024-07-30 12:00:05.998 0 1 6112 SEND +2024-07-30 12:00:05.999 3 2 6114 RECEIVE +2024-07-30 12:00:06.000 0 1 6100 SEND +2024-07-30 12:00:06.001 1 2 6102 RECEIVE +2024-07-30 12:00:06.002 2 3 6104 SEND +2024-07-30 12:00:06.003 3 0 6106 RECEIVE +2024-07-30 12:00:06.004 1 3 6108 SEND +2024-07-30 12:00:06.005 2 0 6110 RECEIVE +2024-07-30 12:00:06.006 0 2 6112 SEND +2024-07-30 12:00:06.007 3 1 6114 RECEIVE +2024-07-30 12:00:06.008 1 0 6116 SEND +2024-07-30 12:00:06.009 2 1 6118 RECEIVE +2024-07-30 12:00:06.010 3 2 6120 SEND +2024-07-30 12:00:06.011 0 3 6122 RECEIVE +2024-07-30 12:00:06.012 2 0 6124 SEND +2024-07-30 12:00:06.013 1 3 6126 RECEIVE +2024-07-30 12:00:06.014 0 1 6128 SEND +2024-07-30 12:00:06.015 3 2 6130 RECEIVE +2024-07-30 12:00:06.016 0 1 6116 SEND +2024-07-30 12:00:06.017 1 2 6118 RECEIVE +2024-07-30 12:00:06.018 2 3 6120 SEND +2024-07-30 12:00:06.019 3 0 6122 RECEIVE +2024-07-30 12:00:06.020 1 3 6124 SEND +2024-07-30 12:00:06.021 2 0 6126 RECEIVE +2024-07-30 12:00:06.022 0 2 6128 SEND +2024-07-30 12:00:06.023 3 1 6130 RECEIVE +2024-07-30 12:00:06.024 1 0 6132 SEND +2024-07-30 12:00:06.025 2 1 6134 RECEIVE +2024-07-30 12:00:06.026 3 2 6136 SEND +2024-07-30 12:00:06.027 0 3 6138 RECEIVE +2024-07-30 12:00:06.028 2 0 6140 SEND +2024-07-30 12:00:06.029 1 3 6142 RECEIVE +2024-07-30 12:00:06.030 0 1 6144 SEND +2024-07-30 12:00:06.031 3 2 6146 RECEIVE +2024-07-30 12:00:06.032 0 1 6132 SEND +2024-07-30 12:00:06.033 1 2 6134 RECEIVE +2024-07-30 12:00:06.034 2 3 6136 SEND +2024-07-30 12:00:06.035 3 0 6138 RECEIVE +2024-07-30 12:00:06.036 1 3 6140 SEND +2024-07-30 12:00:06.037 2 0 6142 RECEIVE +2024-07-30 12:00:06.038 0 2 6144 SEND +2024-07-30 12:00:06.039 3 1 6146 RECEIVE +2024-07-30 12:00:06.040 1 0 6148 SEND +2024-07-30 12:00:06.041 2 1 6150 RECEIVE +2024-07-30 12:00:06.042 3 2 6152 SEND +2024-07-30 12:00:06.043 0 3 6154 RECEIVE +2024-07-30 12:00:06.044 2 0 6156 SEND +2024-07-30 12:00:06.045 1 3 6158 RECEIVE +2024-07-30 12:00:06.046 0 1 6160 SEND +2024-07-30 12:00:06.047 3 2 6162 RECEIVE +2024-07-30 12:00:06.048 0 1 6148 SEND +2024-07-30 12:00:06.049 1 2 6150 RECEIVE +2024-07-30 12:00:06.050 2 3 6152 SEND +2024-07-30 12:00:06.051 3 0 6154 RECEIVE +2024-07-30 12:00:06.052 1 3 6156 SEND +2024-07-30 12:00:06.053 2 0 6158 RECEIVE +2024-07-30 12:00:06.054 0 2 6160 SEND +2024-07-30 12:00:06.055 3 1 6162 RECEIVE +2024-07-30 12:00:06.056 1 0 6164 SEND +2024-07-30 12:00:06.057 2 1 6166 RECEIVE +2024-07-30 12:00:06.058 3 2 6168 SEND +2024-07-30 12:00:06.059 0 3 6170 RECEIVE +2024-07-30 12:00:06.060 2 0 6172 SEND +2024-07-30 12:00:06.061 1 3 6174 RECEIVE +2024-07-30 12:00:06.062 0 1 6176 SEND +2024-07-30 12:00:06.063 3 2 6178 RECEIVE +2024-07-30 12:00:06.064 0 1 6164 SEND +2024-07-30 12:00:06.065 1 2 6166 RECEIVE +2024-07-30 12:00:06.066 2 3 6168 SEND +2024-07-30 12:00:06.067 3 0 6170 RECEIVE +2024-07-30 12:00:06.068 1 3 6172 SEND +2024-07-30 12:00:06.069 2 0 6174 RECEIVE +2024-07-30 12:00:06.070 0 2 6176 SEND +2024-07-30 12:00:06.071 3 1 6178 RECEIVE +2024-07-30 12:00:06.072 1 0 6180 SEND +2024-07-30 12:00:06.073 2 1 6182 RECEIVE +2024-07-30 12:00:06.074 3 2 6184 SEND +2024-07-30 12:00:06.075 0 3 6186 RECEIVE +2024-07-30 12:00:06.076 2 0 6188 SEND +2024-07-30 12:00:06.077 1 3 6190 RECEIVE +2024-07-30 12:00:06.078 0 1 6192 SEND +2024-07-30 12:00:06.079 3 2 6194 RECEIVE +2024-07-30 12:00:06.080 0 1 6180 SEND +2024-07-30 12:00:06.081 1 2 6182 RECEIVE +2024-07-30 12:00:06.082 2 3 6184 SEND +2024-07-30 12:00:06.083 3 0 6186 RECEIVE +2024-07-30 12:00:06.084 1 3 6188 SEND +2024-07-30 12:00:06.085 2 0 6190 RECEIVE +2024-07-30 12:00:06.086 0 2 6192 SEND +2024-07-30 12:00:06.087 3 1 6194 RECEIVE +2024-07-30 12:00:06.088 1 0 6196 SEND +2024-07-30 12:00:06.089 2 1 6198 RECEIVE +2024-07-30 12:00:06.090 3 2 6200 SEND +2024-07-30 12:00:06.091 0 3 6202 RECEIVE +2024-07-30 12:00:06.092 2 0 6204 SEND +2024-07-30 12:00:06.093 1 3 6206 RECEIVE +2024-07-30 12:00:06.094 0 1 6208 SEND +2024-07-30 12:00:06.095 3 2 6210 RECEIVE +2024-07-30 12:00:06.096 0 1 6196 SEND +2024-07-30 12:00:06.097 1 2 6198 RECEIVE +2024-07-30 12:00:06.098 2 3 6200 SEND +2024-07-30 12:00:06.099 3 0 6202 RECEIVE +2024-07-30 12:00:06.100 1 3 6204 SEND +2024-07-30 12:00:06.101 2 0 6206 RECEIVE +2024-07-30 12:00:06.102 0 2 6208 SEND +2024-07-30 12:00:06.103 3 1 6210 RECEIVE +2024-07-30 12:00:06.104 1 0 6212 SEND +2024-07-30 12:00:06.105 2 1 6214 RECEIVE +2024-07-30 12:00:06.106 3 2 6216 SEND +2024-07-30 12:00:06.107 0 3 6218 RECEIVE +2024-07-30 12:00:06.108 2 0 6220 SEND +2024-07-30 12:00:06.109 1 3 6222 RECEIVE +2024-07-30 12:00:06.110 0 1 6224 SEND +2024-07-30 12:00:06.111 3 2 6226 RECEIVE +2024-07-30 12:00:06.112 0 1 6212 SEND +2024-07-30 12:00:06.113 1 2 6214 RECEIVE +2024-07-30 12:00:06.114 2 3 6216 SEND +2024-07-30 12:00:06.115 3 0 6218 RECEIVE +2024-07-30 12:00:06.116 1 3 6220 SEND +2024-07-30 12:00:06.117 2 0 6222 RECEIVE +2024-07-30 12:00:06.118 0 2 6224 SEND +2024-07-30 12:00:06.119 3 1 6226 RECEIVE +2024-07-30 12:00:06.120 1 0 6228 SEND +2024-07-30 12:00:06.121 2 1 6230 RECEIVE +2024-07-30 12:00:06.122 3 2 6232 SEND +2024-07-30 12:00:06.123 0 3 6234 RECEIVE +2024-07-30 12:00:06.124 2 0 6236 SEND +2024-07-30 12:00:06.125 1 3 6238 RECEIVE +2024-07-30 12:00:06.126 0 1 6240 SEND +2024-07-30 12:00:06.127 3 2 6242 RECEIVE +2024-07-30 12:00:06.128 0 1 6228 SEND +2024-07-30 12:00:06.129 1 2 6230 RECEIVE +2024-07-30 12:00:06.130 2 3 6232 SEND +2024-07-30 12:00:06.131 3 0 6234 RECEIVE +2024-07-30 12:00:06.132 1 3 6236 SEND +2024-07-30 12:00:06.133 2 0 6238 RECEIVE +2024-07-30 12:00:06.134 0 2 6240 SEND +2024-07-30 12:00:06.135 3 1 6242 RECEIVE +2024-07-30 12:00:06.136 1 0 6244 SEND +2024-07-30 12:00:06.137 2 1 6246 RECEIVE +2024-07-30 12:00:06.138 3 2 6248 SEND +2024-07-30 12:00:06.139 0 3 6250 RECEIVE +2024-07-30 12:00:06.140 2 0 6252 SEND +2024-07-30 12:00:06.141 1 3 6254 RECEIVE +2024-07-30 12:00:06.142 0 1 6256 SEND +2024-07-30 12:00:06.143 3 2 6258 RECEIVE +2024-07-30 12:00:06.144 0 1 6244 SEND +2024-07-30 12:00:06.145 1 2 6246 RECEIVE +2024-07-30 12:00:06.146 2 3 6248 SEND +2024-07-30 12:00:06.147 3 0 6250 RECEIVE +2024-07-30 12:00:06.148 1 3 6252 SEND +2024-07-30 12:00:06.149 2 0 6254 RECEIVE +2024-07-30 12:00:06.150 0 2 6256 SEND +2024-07-30 12:00:06.151 3 1 6258 RECEIVE +2024-07-30 12:00:06.152 1 0 6260 SEND +2024-07-30 12:00:06.153 2 1 6262 RECEIVE +2024-07-30 12:00:06.154 3 2 6264 SEND +2024-07-30 12:00:06.155 0 3 6266 RECEIVE +2024-07-30 12:00:06.156 2 0 6268 SEND +2024-07-30 12:00:06.157 1 3 6270 RECEIVE +2024-07-30 12:00:06.158 0 1 6272 SEND +2024-07-30 12:00:06.159 3 2 6274 RECEIVE +2024-07-30 12:00:06.160 0 1 6260 SEND +2024-07-30 12:00:06.161 1 2 6262 RECEIVE +2024-07-30 12:00:06.162 2 3 6264 SEND +2024-07-30 12:00:06.163 3 0 6266 RECEIVE +2024-07-30 12:00:06.164 1 3 6268 SEND +2024-07-30 12:00:06.165 2 0 6270 RECEIVE +2024-07-30 12:00:06.166 0 2 6272 SEND +2024-07-30 12:00:06.167 3 1 6274 RECEIVE +2024-07-30 12:00:06.168 1 0 6276 SEND +2024-07-30 12:00:06.169 2 1 6278 RECEIVE +2024-07-30 12:00:06.170 3 2 6280 SEND +2024-07-30 12:00:06.171 0 3 6282 RECEIVE +2024-07-30 12:00:06.172 2 0 6284 SEND +2024-07-30 12:00:06.173 1 3 6286 RECEIVE +2024-07-30 12:00:06.174 0 1 6288 SEND +2024-07-30 12:00:06.175 3 2 6290 RECEIVE +2024-07-30 12:00:06.176 0 1 6276 SEND +2024-07-30 12:00:06.177 1 2 6278 RECEIVE +2024-07-30 12:00:06.178 2 3 6280 SEND +2024-07-30 12:00:06.179 3 0 6282 RECEIVE +2024-07-30 12:00:06.180 1 3 6284 SEND +2024-07-30 12:00:06.181 2 0 6286 RECEIVE +2024-07-30 12:00:06.182 0 2 6288 SEND +2024-07-30 12:00:06.183 3 1 6290 RECEIVE +2024-07-30 12:00:06.184 1 0 6292 SEND +2024-07-30 12:00:06.185 2 1 6294 RECEIVE +2024-07-30 12:00:06.186 3 2 6296 SEND +2024-07-30 12:00:06.187 0 3 6298 RECEIVE +2024-07-30 12:00:06.188 2 0 6300 SEND +2024-07-30 12:00:06.189 1 3 6302 RECEIVE +2024-07-30 12:00:06.190 0 1 6304 SEND +2024-07-30 12:00:06.191 3 2 6306 RECEIVE +2024-07-30 12:00:06.192 0 1 6292 SEND +2024-07-30 12:00:06.193 1 2 6294 RECEIVE +2024-07-30 12:00:06.194 2 3 6296 SEND +2024-07-30 12:00:06.195 3 0 6298 RECEIVE +2024-07-30 12:00:06.196 1 3 6300 SEND +2024-07-30 12:00:06.197 2 0 6302 RECEIVE +2024-07-30 12:00:06.198 0 2 6304 SEND +2024-07-30 12:00:06.199 3 1 6306 RECEIVE +2024-07-30 12:00:06.200 1 0 6308 SEND +2024-07-30 12:00:06.201 2 1 6310 RECEIVE +2024-07-30 12:00:06.202 3 2 6312 SEND +2024-07-30 12:00:06.203 0 3 6314 RECEIVE +2024-07-30 12:00:06.204 2 0 6316 SEND +2024-07-30 12:00:06.205 1 3 6318 RECEIVE +2024-07-30 12:00:06.206 0 1 6320 SEND +2024-07-30 12:00:06.207 3 2 6322 RECEIVE +2024-07-30 12:00:06.208 0 1 6308 SEND +2024-07-30 12:00:06.209 1 2 6310 RECEIVE +2024-07-30 12:00:06.210 2 3 6312 SEND +2024-07-30 12:00:06.211 3 0 6314 RECEIVE +2024-07-30 12:00:06.212 1 3 6316 SEND +2024-07-30 12:00:06.213 2 0 6318 RECEIVE +2024-07-30 12:00:06.214 0 2 6320 SEND +2024-07-30 12:00:06.215 3 1 6322 RECEIVE +2024-07-30 12:00:06.216 1 0 6324 SEND +2024-07-30 12:00:06.217 2 1 6326 RECEIVE +2024-07-30 12:00:06.218 3 2 6328 SEND +2024-07-30 12:00:06.219 0 3 6330 RECEIVE +2024-07-30 12:00:06.220 2 0 6332 SEND +2024-07-30 12:00:06.221 1 3 6334 RECEIVE +2024-07-30 12:00:06.222 0 1 6336 SEND +2024-07-30 12:00:06.223 3 2 6338 RECEIVE +2024-07-30 12:00:06.224 0 1 6324 SEND +2024-07-30 12:00:06.225 1 2 6326 RECEIVE +2024-07-30 12:00:06.226 2 3 6328 SEND +2024-07-30 12:00:06.227 3 0 6330 RECEIVE +2024-07-30 12:00:06.228 1 3 6332 SEND +2024-07-30 12:00:06.229 2 0 6334 RECEIVE +2024-07-30 12:00:06.230 0 2 6336 SEND +2024-07-30 12:00:06.231 3 1 6338 RECEIVE +2024-07-30 12:00:06.232 1 0 6340 SEND +2024-07-30 12:00:06.233 2 1 6342 RECEIVE +2024-07-30 12:00:06.234 3 2 6344 SEND +2024-07-30 12:00:06.235 0 3 6346 RECEIVE +2024-07-30 12:00:06.236 2 0 6348 SEND +2024-07-30 12:00:06.237 1 3 6350 RECEIVE +2024-07-30 12:00:06.238 0 1 6352 SEND +2024-07-30 12:00:06.239 3 2 6354 RECEIVE +2024-07-30 12:00:06.240 0 1 6340 SEND +2024-07-30 12:00:06.241 1 2 6342 RECEIVE +2024-07-30 12:00:06.242 2 3 6344 SEND +2024-07-30 12:00:06.243 3 0 6346 RECEIVE +2024-07-30 12:00:06.244 1 3 6348 SEND +2024-07-30 12:00:06.245 2 0 6350 RECEIVE +2024-07-30 12:00:06.246 0 2 6352 SEND +2024-07-30 12:00:06.247 3 1 6354 RECEIVE +2024-07-30 12:00:06.248 1 0 6356 SEND +2024-07-30 12:00:06.249 2 1 6358 RECEIVE +2024-07-30 12:00:06.250 3 2 6360 SEND +2024-07-30 12:00:06.251 0 3 6362 RECEIVE +2024-07-30 12:00:06.252 2 0 6364 SEND +2024-07-30 12:00:06.253 1 3 6366 RECEIVE +2024-07-30 12:00:06.254 0 1 6368 SEND +2024-07-30 12:00:06.255 3 2 6370 RECEIVE +2024-07-30 12:00:06.256 0 1 6356 SEND +2024-07-30 12:00:06.257 1 2 6358 RECEIVE +2024-07-30 12:00:06.258 2 3 6360 SEND +2024-07-30 12:00:06.259 3 0 6362 RECEIVE +2024-07-30 12:00:06.260 1 3 6364 SEND +2024-07-30 12:00:06.261 2 0 6366 RECEIVE +2024-07-30 12:00:06.262 0 2 6368 SEND +2024-07-30 12:00:06.263 3 1 6370 RECEIVE +2024-07-30 12:00:06.264 1 0 6372 SEND +2024-07-30 12:00:06.265 2 1 6374 RECEIVE +2024-07-30 12:00:06.266 3 2 6376 SEND +2024-07-30 12:00:06.267 0 3 6378 RECEIVE +2024-07-30 12:00:06.268 2 0 6380 SEND +2024-07-30 12:00:06.269 1 3 6382 RECEIVE +2024-07-30 12:00:06.270 0 1 6384 SEND +2024-07-30 12:00:06.271 3 2 6386 RECEIVE +2024-07-30 12:00:06.272 0 1 6372 SEND +2024-07-30 12:00:06.273 1 2 6374 RECEIVE +2024-07-30 12:00:06.274 2 3 6376 SEND +2024-07-30 12:00:06.275 3 0 6378 RECEIVE +2024-07-30 12:00:06.276 1 3 6380 SEND +2024-07-30 12:00:06.277 2 0 6382 RECEIVE +2024-07-30 12:00:06.278 0 2 6384 SEND +2024-07-30 12:00:06.279 3 1 6386 RECEIVE +2024-07-30 12:00:06.280 1 0 6388 SEND +2024-07-30 12:00:06.281 2 1 6390 RECEIVE +2024-07-30 12:00:06.282 3 2 6392 SEND +2024-07-30 12:00:06.283 0 3 6394 RECEIVE +2024-07-30 12:00:06.284 2 0 6396 SEND +2024-07-30 12:00:06.285 1 3 6398 RECEIVE +2024-07-30 12:00:06.286 0 1 6400 SEND +2024-07-30 12:00:06.287 3 2 6402 RECEIVE +2024-07-30 12:00:06.288 0 1 6388 SEND +2024-07-30 12:00:06.289 1 2 6390 RECEIVE +2024-07-30 12:00:06.290 2 3 6392 SEND +2024-07-30 12:00:06.291 3 0 6394 RECEIVE +2024-07-30 12:00:06.292 1 3 6396 SEND +2024-07-30 12:00:06.293 2 0 6398 RECEIVE +2024-07-30 12:00:06.294 0 2 6400 SEND +2024-07-30 12:00:06.295 3 1 6402 RECEIVE +2024-07-30 12:00:06.296 1 0 6404 SEND +2024-07-30 12:00:06.297 2 1 6406 RECEIVE +2024-07-30 12:00:06.298 3 2 6408 SEND +2024-07-30 12:00:06.299 0 3 6410 RECEIVE +2024-07-30 12:00:06.300 2 0 6412 SEND +2024-07-30 12:00:06.301 1 3 6414 RECEIVE +2024-07-30 12:00:06.302 0 1 6416 SEND +2024-07-30 12:00:06.303 3 2 6418 RECEIVE +2024-07-30 12:00:06.304 0 1 6404 SEND +2024-07-30 12:00:06.305 1 2 6406 RECEIVE +2024-07-30 12:00:06.306 2 3 6408 SEND +2024-07-30 12:00:06.307 3 0 6410 RECEIVE +2024-07-30 12:00:06.308 1 3 6412 SEND +2024-07-30 12:00:06.309 2 0 6414 RECEIVE +2024-07-30 12:00:06.310 0 2 6416 SEND +2024-07-30 12:00:06.311 3 1 6418 RECEIVE +2024-07-30 12:00:06.312 1 0 6420 SEND +2024-07-30 12:00:06.313 2 1 6422 RECEIVE +2024-07-30 12:00:06.314 3 2 6424 SEND +2024-07-30 12:00:06.315 0 3 6426 RECEIVE +2024-07-30 12:00:06.316 2 0 6428 SEND +2024-07-30 12:00:06.317 1 3 6430 RECEIVE +2024-07-30 12:00:06.318 0 1 6432 SEND +2024-07-30 12:00:06.319 3 2 6434 RECEIVE +2024-07-30 12:00:06.320 0 1 6420 SEND +2024-07-30 12:00:06.321 1 2 6422 RECEIVE +2024-07-30 12:00:06.322 2 3 6424 SEND +2024-07-30 12:00:06.323 3 0 6426 RECEIVE +2024-07-30 12:00:06.324 1 3 6428 SEND +2024-07-30 12:00:06.325 2 0 6430 RECEIVE +2024-07-30 12:00:06.326 0 2 6432 SEND +2024-07-30 12:00:06.327 3 1 6434 RECEIVE +2024-07-30 12:00:06.328 1 0 6436 SEND +2024-07-30 12:00:06.329 2 1 6438 RECEIVE +2024-07-30 12:00:06.330 3 2 6440 SEND +2024-07-30 12:00:06.331 0 3 6442 RECEIVE +2024-07-30 12:00:06.332 2 0 6444 SEND +2024-07-30 12:00:06.333 1 3 6446 RECEIVE +2024-07-30 12:00:06.334 0 1 6448 SEND +2024-07-30 12:00:06.335 3 2 6450 RECEIVE +2024-07-30 12:00:06.336 0 1 6436 SEND +2024-07-30 12:00:06.337 1 2 6438 RECEIVE +2024-07-30 12:00:06.338 2 3 6440 SEND +2024-07-30 12:00:06.339 3 0 6442 RECEIVE +2024-07-30 12:00:06.340 1 3 6444 SEND +2024-07-30 12:00:06.341 2 0 6446 RECEIVE +2024-07-30 12:00:06.342 0 2 6448 SEND +2024-07-30 12:00:06.343 3 1 6450 RECEIVE +2024-07-30 12:00:06.344 1 0 6452 SEND +2024-07-30 12:00:06.345 2 1 6454 RECEIVE +2024-07-30 12:00:06.346 3 2 6456 SEND +2024-07-30 12:00:06.347 0 3 6458 RECEIVE +2024-07-30 12:00:06.348 2 0 6460 SEND +2024-07-30 12:00:06.349 1 3 6462 RECEIVE +2024-07-30 12:00:06.350 0 1 6464 SEND +2024-07-30 12:00:06.351 3 2 6466 RECEIVE +2024-07-30 12:00:06.352 0 1 6452 SEND +2024-07-30 12:00:06.353 1 2 6454 RECEIVE +2024-07-30 12:00:06.354 2 3 6456 SEND +2024-07-30 12:00:06.355 3 0 6458 RECEIVE +2024-07-30 12:00:06.356 1 3 6460 SEND +2024-07-30 12:00:06.357 2 0 6462 RECEIVE +2024-07-30 12:00:06.358 0 2 6464 SEND +2024-07-30 12:00:06.359 3 1 6466 RECEIVE +2024-07-30 12:00:06.360 1 0 6468 SEND +2024-07-30 12:00:06.361 2 1 6470 RECEIVE +2024-07-30 12:00:06.362 3 2 6472 SEND +2024-07-30 12:00:06.363 0 3 6474 RECEIVE +2024-07-30 12:00:06.364 2 0 6476 SEND +2024-07-30 12:00:06.365 1 3 6478 RECEIVE +2024-07-30 12:00:06.366 0 1 6480 SEND +2024-07-30 12:00:06.367 3 2 6482 RECEIVE +2024-07-30 12:00:06.368 0 1 6468 SEND +2024-07-30 12:00:06.369 1 2 6470 RECEIVE +2024-07-30 12:00:06.370 2 3 6472 SEND +2024-07-30 12:00:06.371 3 0 6474 RECEIVE +2024-07-30 12:00:06.372 1 3 6476 SEND +2024-07-30 12:00:06.373 2 0 6478 RECEIVE +2024-07-30 12:00:06.374 0 2 6480 SEND +2024-07-30 12:00:06.375 3 1 6482 RECEIVE +2024-07-30 12:00:06.376 1 0 6484 SEND +2024-07-30 12:00:06.377 2 1 6486 RECEIVE +2024-07-30 12:00:06.378 3 2 6488 SEND +2024-07-30 12:00:06.379 0 3 6490 RECEIVE +2024-07-30 12:00:06.380 2 0 6492 SEND +2024-07-30 12:00:06.381 1 3 6494 RECEIVE +2024-07-30 12:00:06.382 0 1 6496 SEND +2024-07-30 12:00:06.383 3 2 6498 RECEIVE +2024-07-30 12:00:06.384 0 1 6484 SEND +2024-07-30 12:00:06.385 1 2 6486 RECEIVE +2024-07-30 12:00:06.386 2 3 6488 SEND +2024-07-30 12:00:06.387 3 0 6490 RECEIVE +2024-07-30 12:00:06.388 1 3 6492 SEND +2024-07-30 12:00:06.389 2 0 6494 RECEIVE +2024-07-30 12:00:06.390 0 2 6496 SEND +2024-07-30 12:00:06.391 3 1 6498 RECEIVE +2024-07-30 12:00:06.392 1 0 6500 SEND +2024-07-30 12:00:06.393 2 1 6502 RECEIVE +2024-07-30 12:00:06.394 3 2 6504 SEND +2024-07-30 12:00:06.395 0 3 6506 RECEIVE +2024-07-30 12:00:06.396 2 0 6508 SEND +2024-07-30 12:00:06.397 1 3 6510 RECEIVE +2024-07-30 12:00:06.398 0 1 6512 SEND +2024-07-30 12:00:06.399 3 2 6514 RECEIVE +2024-07-30 12:00:06.400 0 1 6500 SEND +2024-07-30 12:00:06.401 1 2 6502 RECEIVE +2024-07-30 12:00:06.402 2 3 6504 SEND +2024-07-30 12:00:06.403 3 0 6506 RECEIVE +2024-07-30 12:00:06.404 1 3 6508 SEND +2024-07-30 12:00:06.405 2 0 6510 RECEIVE +2024-07-30 12:00:06.406 0 2 6512 SEND +2024-07-30 12:00:06.407 3 1 6514 RECEIVE +2024-07-30 12:00:06.408 1 0 6516 SEND +2024-07-30 12:00:06.409 2 1 6518 RECEIVE +2024-07-30 12:00:06.410 3 2 6520 SEND +2024-07-30 12:00:06.411 0 3 6522 RECEIVE +2024-07-30 12:00:06.412 2 0 6524 SEND +2024-07-30 12:00:06.413 1 3 6526 RECEIVE +2024-07-30 12:00:06.414 0 1 6528 SEND +2024-07-30 12:00:06.415 3 2 6530 RECEIVE +2024-07-30 12:00:06.416 0 1 6516 SEND +2024-07-30 12:00:06.417 1 2 6518 RECEIVE +2024-07-30 12:00:06.418 2 3 6520 SEND +2024-07-30 12:00:06.419 3 0 6522 RECEIVE +2024-07-30 12:00:06.420 1 3 6524 SEND +2024-07-30 12:00:06.421 2 0 6526 RECEIVE +2024-07-30 12:00:06.422 0 2 6528 SEND +2024-07-30 12:00:06.423 3 1 6530 RECEIVE +2024-07-30 12:00:06.424 1 0 6532 SEND +2024-07-30 12:00:06.425 2 1 6534 RECEIVE +2024-07-30 12:00:06.426 3 2 6536 SEND +2024-07-30 12:00:06.427 0 3 6538 RECEIVE +2024-07-30 12:00:06.428 2 0 6540 SEND +2024-07-30 12:00:06.429 1 3 6542 RECEIVE +2024-07-30 12:00:06.430 0 1 6544 SEND +2024-07-30 12:00:06.431 3 2 6546 RECEIVE +2024-07-30 12:00:06.432 0 1 6532 SEND +2024-07-30 12:00:06.433 1 2 6534 RECEIVE +2024-07-30 12:00:06.434 2 3 6536 SEND +2024-07-30 12:00:06.435 3 0 6538 RECEIVE +2024-07-30 12:00:06.436 1 3 6540 SEND +2024-07-30 12:00:06.437 2 0 6542 RECEIVE +2024-07-30 12:00:06.438 0 2 6544 SEND +2024-07-30 12:00:06.439 3 1 6546 RECEIVE +2024-07-30 12:00:06.440 1 0 6548 SEND +2024-07-30 12:00:06.441 2 1 6550 RECEIVE +2024-07-30 12:00:06.442 3 2 6552 SEND +2024-07-30 12:00:06.443 0 3 6554 RECEIVE +2024-07-30 12:00:06.444 2 0 6556 SEND +2024-07-30 12:00:06.445 1 3 6558 RECEIVE +2024-07-30 12:00:06.446 0 1 6560 SEND +2024-07-30 12:00:06.447 3 2 6562 RECEIVE +2024-07-30 12:00:06.448 0 1 6548 SEND +2024-07-30 12:00:06.449 1 2 6550 RECEIVE +2024-07-30 12:00:06.450 2 3 6552 SEND +2024-07-30 12:00:06.451 3 0 6554 RECEIVE +2024-07-30 12:00:06.452 1 3 6556 SEND +2024-07-30 12:00:06.453 2 0 6558 RECEIVE +2024-07-30 12:00:06.454 0 2 6560 SEND +2024-07-30 12:00:06.455 3 1 6562 RECEIVE +2024-07-30 12:00:06.456 1 0 6564 SEND +2024-07-30 12:00:06.457 2 1 6566 RECEIVE +2024-07-30 12:00:06.458 3 2 6568 SEND +2024-07-30 12:00:06.459 0 3 6570 RECEIVE +2024-07-30 12:00:06.460 2 0 6572 SEND +2024-07-30 12:00:06.461 1 3 6574 RECEIVE +2024-07-30 12:00:06.462 0 1 6576 SEND +2024-07-30 12:00:06.463 3 2 6578 RECEIVE +2024-07-30 12:00:06.464 0 1 6564 SEND +2024-07-30 12:00:06.465 1 2 6566 RECEIVE +2024-07-30 12:00:06.466 2 3 6568 SEND +2024-07-30 12:00:06.467 3 0 6570 RECEIVE +2024-07-30 12:00:06.468 1 3 6572 SEND +2024-07-30 12:00:06.469 2 0 6574 RECEIVE +2024-07-30 12:00:06.470 0 2 6576 SEND +2024-07-30 12:00:06.471 3 1 6578 RECEIVE +2024-07-30 12:00:06.472 1 0 6580 SEND +2024-07-30 12:00:06.473 2 1 6582 RECEIVE +2024-07-30 12:00:06.474 3 2 6584 SEND +2024-07-30 12:00:06.475 0 3 6586 RECEIVE +2024-07-30 12:00:06.476 2 0 6588 SEND +2024-07-30 12:00:06.477 1 3 6590 RECEIVE +2024-07-30 12:00:06.478 0 1 6592 SEND +2024-07-30 12:00:06.479 3 2 6594 RECEIVE +2024-07-30 12:00:06.480 0 1 6580 SEND +2024-07-30 12:00:06.481 1 2 6582 RECEIVE +2024-07-30 12:00:06.482 2 3 6584 SEND +2024-07-30 12:00:06.483 3 0 6586 RECEIVE +2024-07-30 12:00:06.484 1 3 6588 SEND +2024-07-30 12:00:06.485 2 0 6590 RECEIVE +2024-07-30 12:00:06.486 0 2 6592 SEND +2024-07-30 12:00:06.487 3 1 6594 RECEIVE +2024-07-30 12:00:06.488 1 0 6596 SEND +2024-07-30 12:00:06.489 2 1 6598 RECEIVE +2024-07-30 12:00:06.490 3 2 6600 SEND +2024-07-30 12:00:06.491 0 3 6602 RECEIVE +2024-07-30 12:00:06.492 2 0 6604 SEND +2024-07-30 12:00:06.493 1 3 6606 RECEIVE +2024-07-30 12:00:06.494 0 1 6608 SEND +2024-07-30 12:00:06.495 3 2 6610 RECEIVE +2024-07-30 12:00:06.496 0 1 6596 SEND +2024-07-30 12:00:06.497 1 2 6598 RECEIVE +2024-07-30 12:00:06.498 2 3 6600 SEND +2024-07-30 12:00:06.499 3 0 6602 RECEIVE +2024-07-30 12:00:06.500 1 3 6604 SEND +2024-07-30 12:00:06.501 2 0 6606 RECEIVE +2024-07-30 12:00:06.502 0 2 6608 SEND +2024-07-30 12:00:06.503 3 1 6610 RECEIVE +2024-07-30 12:00:06.504 1 0 6612 SEND +2024-07-30 12:00:06.505 2 1 6614 RECEIVE +2024-07-30 12:00:06.506 3 2 6616 SEND +2024-07-30 12:00:06.507 0 3 6618 RECEIVE +2024-07-30 12:00:06.508 2 0 6620 SEND +2024-07-30 12:00:06.509 1 3 6622 RECEIVE +2024-07-30 12:00:06.510 0 1 6624 SEND +2024-07-30 12:00:06.511 3 2 6626 RECEIVE +2024-07-30 12:00:06.512 0 1 6612 SEND +2024-07-30 12:00:06.513 1 2 6614 RECEIVE +2024-07-30 12:00:06.514 2 3 6616 SEND +2024-07-30 12:00:06.515 3 0 6618 RECEIVE +2024-07-30 12:00:06.516 1 3 6620 SEND +2024-07-30 12:00:06.517 2 0 6622 RECEIVE +2024-07-30 12:00:06.518 0 2 6624 SEND +2024-07-30 12:00:06.519 3 1 6626 RECEIVE +2024-07-30 12:00:06.520 1 0 6628 SEND +2024-07-30 12:00:06.521 2 1 6630 RECEIVE +2024-07-30 12:00:06.522 3 2 6632 SEND +2024-07-30 12:00:06.523 0 3 6634 RECEIVE +2024-07-30 12:00:06.524 2 0 6636 SEND +2024-07-30 12:00:06.525 1 3 6638 RECEIVE +2024-07-30 12:00:06.526 0 1 6640 SEND +2024-07-30 12:00:06.527 3 2 6642 RECEIVE +2024-07-30 12:00:06.528 0 1 6628 SEND +2024-07-30 12:00:06.529 1 2 6630 RECEIVE +2024-07-30 12:00:06.530 2 3 6632 SEND +2024-07-30 12:00:06.531 3 0 6634 RECEIVE +2024-07-30 12:00:06.532 1 3 6636 SEND +2024-07-30 12:00:06.533 2 0 6638 RECEIVE +2024-07-30 12:00:06.534 0 2 6640 SEND +2024-07-30 12:00:06.535 3 1 6642 RECEIVE +2024-07-30 12:00:06.536 1 0 6644 SEND +2024-07-30 12:00:06.537 2 1 6646 RECEIVE +2024-07-30 12:00:06.538 3 2 6648 SEND +2024-07-30 12:00:06.539 0 3 6650 RECEIVE +2024-07-30 12:00:06.540 2 0 6652 SEND +2024-07-30 12:00:06.541 1 3 6654 RECEIVE +2024-07-30 12:00:06.542 0 1 6656 SEND +2024-07-30 12:00:06.543 3 2 6658 RECEIVE +2024-07-30 12:00:06.544 0 1 6644 SEND +2024-07-30 12:00:06.545 1 2 6646 RECEIVE +2024-07-30 12:00:06.546 2 3 6648 SEND +2024-07-30 12:00:06.547 3 0 6650 RECEIVE +2024-07-30 12:00:06.548 1 3 6652 SEND +2024-07-30 12:00:06.549 2 0 6654 RECEIVE +2024-07-30 12:00:06.550 0 2 6656 SEND +2024-07-30 12:00:06.551 3 1 6658 RECEIVE +2024-07-30 12:00:06.552 1 0 6660 SEND +2024-07-30 12:00:06.553 2 1 6662 RECEIVE +2024-07-30 12:00:06.554 3 2 6664 SEND +2024-07-30 12:00:06.555 0 3 6666 RECEIVE +2024-07-30 12:00:06.556 2 0 6668 SEND +2024-07-30 12:00:06.557 1 3 6670 RECEIVE +2024-07-30 12:00:06.558 0 1 6672 SEND +2024-07-30 12:00:06.559 3 2 6674 RECEIVE +2024-07-30 12:00:06.560 0 1 6660 SEND +2024-07-30 12:00:06.561 1 2 6662 RECEIVE +2024-07-30 12:00:06.562 2 3 6664 SEND +2024-07-30 12:00:06.563 3 0 6666 RECEIVE +2024-07-30 12:00:06.564 1 3 6668 SEND +2024-07-30 12:00:06.565 2 0 6670 RECEIVE +2024-07-30 12:00:06.566 0 2 6672 SEND +2024-07-30 12:00:06.567 3 1 6674 RECEIVE +2024-07-30 12:00:06.568 1 0 6676 SEND +2024-07-30 12:00:06.569 2 1 6678 RECEIVE +2024-07-30 12:00:06.570 3 2 6680 SEND +2024-07-30 12:00:06.571 0 3 6682 RECEIVE +2024-07-30 12:00:06.572 2 0 6684 SEND +2024-07-30 12:00:06.573 1 3 6686 RECEIVE +2024-07-30 12:00:06.574 0 1 6688 SEND +2024-07-30 12:00:06.575 3 2 6690 RECEIVE +2024-07-30 12:00:06.576 0 1 6676 SEND +2024-07-30 12:00:06.577 1 2 6678 RECEIVE +2024-07-30 12:00:06.578 2 3 6680 SEND +2024-07-30 12:00:06.579 3 0 6682 RECEIVE +2024-07-30 12:00:06.580 1 3 6684 SEND +2024-07-30 12:00:06.581 2 0 6686 RECEIVE +2024-07-30 12:00:06.582 0 2 6688 SEND +2024-07-30 12:00:06.583 3 1 6690 RECEIVE +2024-07-30 12:00:06.584 1 0 6692 SEND +2024-07-30 12:00:06.585 2 1 6694 RECEIVE +2024-07-30 12:00:06.586 3 2 6696 SEND +2024-07-30 12:00:06.587 0 3 6698 RECEIVE +2024-07-30 12:00:06.588 2 0 6700 SEND +2024-07-30 12:00:06.589 1 3 6702 RECEIVE +2024-07-30 12:00:06.590 0 1 6704 SEND +2024-07-30 12:00:06.591 3 2 6706 RECEIVE +2024-07-30 12:00:06.592 0 1 6692 SEND +2024-07-30 12:00:06.593 1 2 6694 RECEIVE +2024-07-30 12:00:06.594 2 3 6696 SEND +2024-07-30 12:00:06.595 3 0 6698 RECEIVE +2024-07-30 12:00:06.596 1 3 6700 SEND +2024-07-30 12:00:06.597 2 0 6702 RECEIVE +2024-07-30 12:00:06.598 0 2 6704 SEND +2024-07-30 12:00:06.599 3 1 6706 RECEIVE +2024-07-30 12:00:06.600 1 0 6708 SEND +2024-07-30 12:00:06.601 2 1 6710 RECEIVE +2024-07-30 12:00:06.602 3 2 6712 SEND +2024-07-30 12:00:06.603 0 3 6714 RECEIVE +2024-07-30 12:00:06.604 2 0 6716 SEND +2024-07-30 12:00:06.605 1 3 6718 RECEIVE +2024-07-30 12:00:06.606 0 1 6720 SEND +2024-07-30 12:00:06.607 3 2 6722 RECEIVE +2024-07-30 12:00:06.608 0 1 6708 SEND +2024-07-30 12:00:06.609 1 2 6710 RECEIVE +2024-07-30 12:00:06.610 2 3 6712 SEND +2024-07-30 12:00:06.611 3 0 6714 RECEIVE +2024-07-30 12:00:06.612 1 3 6716 SEND +2024-07-30 12:00:06.613 2 0 6718 RECEIVE +2024-07-30 12:00:06.614 0 2 6720 SEND +2024-07-30 12:00:06.615 3 1 6722 RECEIVE +2024-07-30 12:00:06.616 1 0 6724 SEND +2024-07-30 12:00:06.617 2 1 6726 RECEIVE +2024-07-30 12:00:06.618 3 2 6728 SEND +2024-07-30 12:00:06.619 0 3 6730 RECEIVE +2024-07-30 12:00:06.620 2 0 6732 SEND +2024-07-30 12:00:06.621 1 3 6734 RECEIVE +2024-07-30 12:00:06.622 0 1 6736 SEND +2024-07-30 12:00:06.623 3 2 6738 RECEIVE +2024-07-30 12:00:06.624 0 1 6724 SEND +2024-07-30 12:00:06.625 1 2 6726 RECEIVE +2024-07-30 12:00:06.626 2 3 6728 SEND +2024-07-30 12:00:06.627 3 0 6730 RECEIVE +2024-07-30 12:00:06.628 1 3 6732 SEND +2024-07-30 12:00:06.629 2 0 6734 RECEIVE +2024-07-30 12:00:06.630 0 2 6736 SEND +2024-07-30 12:00:06.631 3 1 6738 RECEIVE +2024-07-30 12:00:06.632 1 0 6740 SEND +2024-07-30 12:00:06.633 2 1 6742 RECEIVE +2024-07-30 12:00:06.634 3 2 6744 SEND +2024-07-30 12:00:06.635 0 3 6746 RECEIVE +2024-07-30 12:00:06.636 2 0 6748 SEND +2024-07-30 12:00:06.637 1 3 6750 RECEIVE +2024-07-30 12:00:06.638 0 1 6752 SEND +2024-07-30 12:00:06.639 3 2 6754 RECEIVE +2024-07-30 12:00:06.640 0 1 6740 SEND +2024-07-30 12:00:06.641 1 2 6742 RECEIVE +2024-07-30 12:00:06.642 2 3 6744 SEND +2024-07-30 12:00:06.643 3 0 6746 RECEIVE +2024-07-30 12:00:06.644 1 3 6748 SEND +2024-07-30 12:00:06.645 2 0 6750 RECEIVE +2024-07-30 12:00:06.646 0 2 6752 SEND +2024-07-30 12:00:06.647 3 1 6754 RECEIVE +2024-07-30 12:00:06.648 1 0 6756 SEND +2024-07-30 12:00:06.649 2 1 6758 RECEIVE +2024-07-30 12:00:06.650 3 2 6760 SEND +2024-07-30 12:00:06.651 0 3 6762 RECEIVE +2024-07-30 12:00:06.652 2 0 6764 SEND +2024-07-30 12:00:06.653 1 3 6766 RECEIVE +2024-07-30 12:00:06.654 0 1 6768 SEND +2024-07-30 12:00:06.655 3 2 6770 RECEIVE +2024-07-30 12:00:06.656 0 1 6756 SEND +2024-07-30 12:00:06.657 1 2 6758 RECEIVE +2024-07-30 12:00:06.658 2 3 6760 SEND +2024-07-30 12:00:06.659 3 0 6762 RECEIVE +2024-07-30 12:00:06.660 1 3 6764 SEND +2024-07-30 12:00:06.661 2 0 6766 RECEIVE +2024-07-30 12:00:06.662 0 2 6768 SEND +2024-07-30 12:00:06.663 3 1 6770 RECEIVE +2024-07-30 12:00:06.664 1 0 6772 SEND +2024-07-30 12:00:06.665 2 1 6774 RECEIVE +2024-07-30 12:00:06.666 3 2 6776 SEND +2024-07-30 12:00:06.667 0 3 6778 RECEIVE +2024-07-30 12:00:06.668 2 0 6780 SEND +2024-07-30 12:00:06.669 1 3 6782 RECEIVE +2024-07-30 12:00:06.670 0 1 6784 SEND +2024-07-30 12:00:06.671 3 2 6786 RECEIVE +2024-07-30 12:00:06.672 0 1 6772 SEND +2024-07-30 12:00:06.673 1 2 6774 RECEIVE +2024-07-30 12:00:06.674 2 3 6776 SEND +2024-07-30 12:00:06.675 3 0 6778 RECEIVE +2024-07-30 12:00:06.676 1 3 6780 SEND +2024-07-30 12:00:06.677 2 0 6782 RECEIVE +2024-07-30 12:00:06.678 0 2 6784 SEND +2024-07-30 12:00:06.679 3 1 6786 RECEIVE +2024-07-30 12:00:06.680 1 0 6788 SEND +2024-07-30 12:00:06.681 2 1 6790 RECEIVE +2024-07-30 12:00:06.682 3 2 6792 SEND +2024-07-30 12:00:06.683 0 3 6794 RECEIVE +2024-07-30 12:00:06.684 2 0 6796 SEND +2024-07-30 12:00:06.685 1 3 6798 RECEIVE +2024-07-30 12:00:06.686 0 1 6800 SEND +2024-07-30 12:00:06.687 3 2 6802 RECEIVE +2024-07-30 12:00:06.688 0 1 6788 SEND +2024-07-30 12:00:06.689 1 2 6790 RECEIVE +2024-07-30 12:00:06.690 2 3 6792 SEND +2024-07-30 12:00:06.691 3 0 6794 RECEIVE +2024-07-30 12:00:06.692 1 3 6796 SEND +2024-07-30 12:00:06.693 2 0 6798 RECEIVE +2024-07-30 12:00:06.694 0 2 6800 SEND +2024-07-30 12:00:06.695 3 1 6802 RECEIVE +2024-07-30 12:00:06.696 1 0 6804 SEND +2024-07-30 12:00:06.697 2 1 6806 RECEIVE +2024-07-30 12:00:06.698 3 2 6808 SEND +2024-07-30 12:00:06.699 0 3 6810 RECEIVE +2024-07-30 12:00:06.700 2 0 6812 SEND +2024-07-30 12:00:06.701 1 3 6814 RECEIVE +2024-07-30 12:00:06.702 0 1 6816 SEND +2024-07-30 12:00:06.703 3 2 6818 RECEIVE +2024-07-30 12:00:06.704 0 1 6804 SEND +2024-07-30 12:00:06.705 1 2 6806 RECEIVE +2024-07-30 12:00:06.706 2 3 6808 SEND +2024-07-30 12:00:06.707 3 0 6810 RECEIVE +2024-07-30 12:00:06.708 1 3 6812 SEND +2024-07-30 12:00:06.709 2 0 6814 RECEIVE +2024-07-30 12:00:06.710 0 2 6816 SEND +2024-07-30 12:00:06.711 3 1 6818 RECEIVE +2024-07-30 12:00:06.712 1 0 6820 SEND +2024-07-30 12:00:06.713 2 1 6822 RECEIVE +2024-07-30 12:00:06.714 3 2 6824 SEND +2024-07-30 12:00:06.715 0 3 6826 RECEIVE +2024-07-30 12:00:06.716 2 0 6828 SEND +2024-07-30 12:00:06.717 1 3 6830 RECEIVE +2024-07-30 12:00:06.718 0 1 6832 SEND +2024-07-30 12:00:06.719 3 2 6834 RECEIVE +2024-07-30 12:00:06.720 0 1 6820 SEND +2024-07-30 12:00:06.721 1 2 6822 RECEIVE +2024-07-30 12:00:06.722 2 3 6824 SEND +2024-07-30 12:00:06.723 3 0 6826 RECEIVE +2024-07-30 12:00:06.724 1 3 6828 SEND +2024-07-30 12:00:06.725 2 0 6830 RECEIVE +2024-07-30 12:00:06.726 0 2 6832 SEND +2024-07-30 12:00:06.727 3 1 6834 RECEIVE +2024-07-30 12:00:06.728 1 0 6836 SEND +2024-07-30 12:00:06.729 2 1 6838 RECEIVE +2024-07-30 12:00:06.730 3 2 6840 SEND +2024-07-30 12:00:06.731 0 3 6842 RECEIVE +2024-07-30 12:00:06.732 2 0 6844 SEND +2024-07-30 12:00:06.733 1 3 6846 RECEIVE +2024-07-30 12:00:06.734 0 1 6848 SEND +2024-07-30 12:00:06.735 3 2 6850 RECEIVE +2024-07-30 12:00:06.736 0 1 6836 SEND +2024-07-30 12:00:06.737 1 2 6838 RECEIVE +2024-07-30 12:00:06.738 2 3 6840 SEND +2024-07-30 12:00:06.739 3 0 6842 RECEIVE +2024-07-30 12:00:06.740 1 3 6844 SEND +2024-07-30 12:00:06.741 2 0 6846 RECEIVE +2024-07-30 12:00:06.742 0 2 6848 SEND +2024-07-30 12:00:06.743 3 1 6850 RECEIVE +2024-07-30 12:00:06.744 1 0 6852 SEND +2024-07-30 12:00:06.745 2 1 6854 RECEIVE +2024-07-30 12:00:06.746 3 2 6856 SEND +2024-07-30 12:00:06.747 0 3 6858 RECEIVE +2024-07-30 12:00:06.748 2 0 6860 SEND +2024-07-30 12:00:06.749 1 3 6862 RECEIVE +2024-07-30 12:00:06.750 0 1 6864 SEND +2024-07-30 12:00:06.751 3 2 6866 RECEIVE +2024-07-30 12:00:06.752 0 1 6852 SEND +2024-07-30 12:00:06.753 1 2 6854 RECEIVE +2024-07-30 12:00:06.754 2 3 6856 SEND +2024-07-30 12:00:06.755 3 0 6858 RECEIVE +2024-07-30 12:00:06.756 1 3 6860 SEND +2024-07-30 12:00:06.757 2 0 6862 RECEIVE +2024-07-30 12:00:06.758 0 2 6864 SEND +2024-07-30 12:00:06.759 3 1 6866 RECEIVE +2024-07-30 12:00:06.760 1 0 6868 SEND +2024-07-30 12:00:06.761 2 1 6870 RECEIVE +2024-07-30 12:00:06.762 3 2 6872 SEND +2024-07-30 12:00:06.763 0 3 6874 RECEIVE +2024-07-30 12:00:06.764 2 0 6876 SEND +2024-07-30 12:00:06.765 1 3 6878 RECEIVE +2024-07-30 12:00:06.766 0 1 6880 SEND +2024-07-30 12:00:06.767 3 2 6882 RECEIVE +2024-07-30 12:00:06.768 0 1 6868 SEND +2024-07-30 12:00:06.769 1 2 6870 RECEIVE +2024-07-30 12:00:06.770 2 3 6872 SEND +2024-07-30 12:00:06.771 3 0 6874 RECEIVE +2024-07-30 12:00:06.772 1 3 6876 SEND +2024-07-30 12:00:06.773 2 0 6878 RECEIVE +2024-07-30 12:00:06.774 0 2 6880 SEND +2024-07-30 12:00:06.775 3 1 6882 RECEIVE +2024-07-30 12:00:06.776 1 0 6884 SEND +2024-07-30 12:00:06.777 2 1 6886 RECEIVE +2024-07-30 12:00:06.778 3 2 6888 SEND +2024-07-30 12:00:06.779 0 3 6890 RECEIVE +2024-07-30 12:00:06.780 2 0 6892 SEND +2024-07-30 12:00:06.781 1 3 6894 RECEIVE +2024-07-30 12:00:06.782 0 1 6896 SEND +2024-07-30 12:00:06.783 3 2 6898 RECEIVE +2024-07-30 12:00:06.784 0 1 6884 SEND +2024-07-30 12:00:06.785 1 2 6886 RECEIVE +2024-07-30 12:00:06.786 2 3 6888 SEND +2024-07-30 12:00:06.787 3 0 6890 RECEIVE +2024-07-30 12:00:06.788 1 3 6892 SEND +2024-07-30 12:00:06.789 2 0 6894 RECEIVE +2024-07-30 12:00:06.790 0 2 6896 SEND +2024-07-30 12:00:06.791 3 1 6898 RECEIVE +2024-07-30 12:00:06.792 1 0 6900 SEND +2024-07-30 12:00:06.793 2 1 6902 RECEIVE +2024-07-30 12:00:06.794 3 2 6904 SEND +2024-07-30 12:00:06.795 0 3 6906 RECEIVE +2024-07-30 12:00:06.796 2 0 6908 SEND +2024-07-30 12:00:06.797 1 3 6910 RECEIVE +2024-07-30 12:00:06.798 0 1 6912 SEND +2024-07-30 12:00:06.799 3 2 6914 RECEIVE +2024-07-30 12:00:06.800 0 1 6900 SEND +2024-07-30 12:00:06.801 1 2 6902 RECEIVE +2024-07-30 12:00:06.802 2 3 6904 SEND +2024-07-30 12:00:06.803 3 0 6906 RECEIVE +2024-07-30 12:00:06.804 1 3 6908 SEND +2024-07-30 12:00:06.805 2 0 6910 RECEIVE +2024-07-30 12:00:06.806 0 2 6912 SEND +2024-07-30 12:00:06.807 3 1 6914 RECEIVE +2024-07-30 12:00:06.808 1 0 6916 SEND +2024-07-30 12:00:06.809 2 1 6918 RECEIVE +2024-07-30 12:00:06.810 3 2 6920 SEND +2024-07-30 12:00:06.811 0 3 6922 RECEIVE +2024-07-30 12:00:06.812 2 0 6924 SEND +2024-07-30 12:00:06.813 1 3 6926 RECEIVE +2024-07-30 12:00:06.814 0 1 6928 SEND +2024-07-30 12:00:06.815 3 2 6930 RECEIVE +2024-07-30 12:00:06.816 0 1 6916 SEND +2024-07-30 12:00:06.817 1 2 6918 RECEIVE +2024-07-30 12:00:06.818 2 3 6920 SEND +2024-07-30 12:00:06.819 3 0 6922 RECEIVE +2024-07-30 12:00:06.820 1 3 6924 SEND +2024-07-30 12:00:06.821 2 0 6926 RECEIVE +2024-07-30 12:00:06.822 0 2 6928 SEND +2024-07-30 12:00:06.823 3 1 6930 RECEIVE +2024-07-30 12:00:06.824 1 0 6932 SEND +2024-07-30 12:00:06.825 2 1 6934 RECEIVE +2024-07-30 12:00:06.826 3 2 6936 SEND +2024-07-30 12:00:06.827 0 3 6938 RECEIVE +2024-07-30 12:00:06.828 2 0 6940 SEND +2024-07-30 12:00:06.829 1 3 6942 RECEIVE +2024-07-30 12:00:06.830 0 1 6944 SEND +2024-07-30 12:00:06.831 3 2 6946 RECEIVE +2024-07-30 12:00:06.832 0 1 6932 SEND +2024-07-30 12:00:06.833 1 2 6934 RECEIVE +2024-07-30 12:00:06.834 2 3 6936 SEND +2024-07-30 12:00:06.835 3 0 6938 RECEIVE +2024-07-30 12:00:06.836 1 3 6940 SEND +2024-07-30 12:00:06.837 2 0 6942 RECEIVE +2024-07-30 12:00:06.838 0 2 6944 SEND +2024-07-30 12:00:06.839 3 1 6946 RECEIVE +2024-07-30 12:00:06.840 1 0 6948 SEND +2024-07-30 12:00:06.841 2 1 6950 RECEIVE +2024-07-30 12:00:06.842 3 2 6952 SEND +2024-07-30 12:00:06.843 0 3 6954 RECEIVE +2024-07-30 12:00:06.844 2 0 6956 SEND +2024-07-30 12:00:06.845 1 3 6958 RECEIVE +2024-07-30 12:00:06.846 0 1 6960 SEND +2024-07-30 12:00:06.847 3 2 6962 RECEIVE +2024-07-30 12:00:06.848 0 1 6948 SEND +2024-07-30 12:00:06.849 1 2 6950 RECEIVE +2024-07-30 12:00:06.850 2 3 6952 SEND +2024-07-30 12:00:06.851 3 0 6954 RECEIVE +2024-07-30 12:00:06.852 1 3 6956 SEND +2024-07-30 12:00:06.853 2 0 6958 RECEIVE +2024-07-30 12:00:06.854 0 2 6960 SEND +2024-07-30 12:00:06.855 3 1 6962 RECEIVE +2024-07-30 12:00:06.856 1 0 6964 SEND +2024-07-30 12:00:06.857 2 1 6966 RECEIVE +2024-07-30 12:00:06.858 3 2 6968 SEND +2024-07-30 12:00:06.859 0 3 6970 RECEIVE +2024-07-30 12:00:06.860 2 0 6972 SEND +2024-07-30 12:00:06.861 1 3 6974 RECEIVE +2024-07-30 12:00:06.862 0 1 6976 SEND +2024-07-30 12:00:06.863 3 2 6978 RECEIVE +2024-07-30 12:00:06.864 0 1 6964 SEND +2024-07-30 12:00:06.865 1 2 6966 RECEIVE +2024-07-30 12:00:06.866 2 3 6968 SEND +2024-07-30 12:00:06.867 3 0 6970 RECEIVE +2024-07-30 12:00:06.868 1 3 6972 SEND +2024-07-30 12:00:06.869 2 0 6974 RECEIVE +2024-07-30 12:00:06.870 0 2 6976 SEND +2024-07-30 12:00:06.871 3 1 6978 RECEIVE +2024-07-30 12:00:06.872 1 0 6980 SEND +2024-07-30 12:00:06.873 2 1 6982 RECEIVE +2024-07-30 12:00:06.874 3 2 6984 SEND +2024-07-30 12:00:06.875 0 3 6986 RECEIVE +2024-07-30 12:00:06.876 2 0 6988 SEND +2024-07-30 12:00:06.877 1 3 6990 RECEIVE +2024-07-30 12:00:06.878 0 1 6992 SEND +2024-07-30 12:00:06.879 3 2 6994 RECEIVE +2024-07-30 12:00:06.880 0 1 6980 SEND +2024-07-30 12:00:06.881 1 2 6982 RECEIVE +2024-07-30 12:00:06.882 2 3 6984 SEND +2024-07-30 12:00:06.883 3 0 6986 RECEIVE +2024-07-30 12:00:06.884 1 3 6988 SEND +2024-07-30 12:00:06.885 2 0 6990 RECEIVE +2024-07-30 12:00:06.886 0 2 6992 SEND +2024-07-30 12:00:06.887 3 1 6994 RECEIVE +2024-07-30 12:00:06.888 1 0 6996 SEND +2024-07-30 12:00:06.889 2 1 6998 RECEIVE +2024-07-30 12:00:06.890 3 2 7000 SEND +2024-07-30 12:00:06.891 0 3 7002 RECEIVE +2024-07-30 12:00:06.892 2 0 7004 SEND +2024-07-30 12:00:06.893 1 3 7006 RECEIVE +2024-07-30 12:00:06.894 0 1 7008 SEND +2024-07-30 12:00:06.895 3 2 7010 RECEIVE +2024-07-30 12:00:06.896 0 1 6996 SEND +2024-07-30 12:00:06.897 1 2 6998 RECEIVE +2024-07-30 12:00:06.898 2 3 7000 SEND +2024-07-30 12:00:06.899 3 0 7002 RECEIVE +2024-07-30 12:00:06.900 1 3 7004 SEND +2024-07-30 12:00:06.901 2 0 7006 RECEIVE +2024-07-30 12:00:06.902 0 2 7008 SEND +2024-07-30 12:00:06.903 3 1 7010 RECEIVE +2024-07-30 12:00:06.904 1 0 7012 SEND +2024-07-30 12:00:06.905 2 1 7014 RECEIVE +2024-07-30 12:00:06.906 3 2 7016 SEND +2024-07-30 12:00:06.907 0 3 7018 RECEIVE +2024-07-30 12:00:06.908 2 0 7020 SEND +2024-07-30 12:00:06.909 1 3 7022 RECEIVE +2024-07-30 12:00:06.910 0 1 7024 SEND +2024-07-30 12:00:06.911 3 2 7026 RECEIVE +2024-07-30 12:00:06.912 0 1 7012 SEND +2024-07-30 12:00:06.913 1 2 7014 RECEIVE +2024-07-30 12:00:06.914 2 3 7016 SEND +2024-07-30 12:00:06.915 3 0 7018 RECEIVE +2024-07-30 12:00:06.916 1 3 7020 SEND +2024-07-30 12:00:06.917 2 0 7022 RECEIVE +2024-07-30 12:00:06.918 0 2 7024 SEND +2024-07-30 12:00:06.919 3 1 7026 RECEIVE +2024-07-30 12:00:06.920 1 0 7028 SEND +2024-07-30 12:00:06.921 2 1 7030 RECEIVE +2024-07-30 12:00:06.922 3 2 7032 SEND +2024-07-30 12:00:06.923 0 3 7034 RECEIVE +2024-07-30 12:00:06.924 2 0 7036 SEND +2024-07-30 12:00:06.925 1 3 7038 RECEIVE +2024-07-30 12:00:06.926 0 1 7040 SEND +2024-07-30 12:00:06.927 3 2 7042 RECEIVE +2024-07-30 12:00:06.928 0 1 7028 SEND +2024-07-30 12:00:06.929 1 2 7030 RECEIVE +2024-07-30 12:00:06.930 2 3 7032 SEND +2024-07-30 12:00:06.931 3 0 7034 RECEIVE +2024-07-30 12:00:06.932 1 3 7036 SEND +2024-07-30 12:00:06.933 2 0 7038 RECEIVE +2024-07-30 12:00:06.934 0 2 7040 SEND +2024-07-30 12:00:06.935 3 1 7042 RECEIVE +2024-07-30 12:00:06.936 1 0 7044 SEND +2024-07-30 12:00:06.937 2 1 7046 RECEIVE +2024-07-30 12:00:06.938 3 2 7048 SEND +2024-07-30 12:00:06.939 0 3 7050 RECEIVE +2024-07-30 12:00:06.940 2 0 7052 SEND +2024-07-30 12:00:06.941 1 3 7054 RECEIVE +2024-07-30 12:00:06.942 0 1 7056 SEND +2024-07-30 12:00:06.943 3 2 7058 RECEIVE +2024-07-30 12:00:06.944 0 1 7044 SEND +2024-07-30 12:00:06.945 1 2 7046 RECEIVE +2024-07-30 12:00:06.946 2 3 7048 SEND +2024-07-30 12:00:06.947 3 0 7050 RECEIVE +2024-07-30 12:00:06.948 1 3 7052 SEND +2024-07-30 12:00:06.949 2 0 7054 RECEIVE +2024-07-30 12:00:06.950 0 2 7056 SEND +2024-07-30 12:00:06.951 3 1 7058 RECEIVE +2024-07-30 12:00:06.952 1 0 7060 SEND +2024-07-30 12:00:06.953 2 1 7062 RECEIVE +2024-07-30 12:00:06.954 3 2 7064 SEND +2024-07-30 12:00:06.955 0 3 7066 RECEIVE +2024-07-30 12:00:06.956 2 0 7068 SEND +2024-07-30 12:00:06.957 1 3 7070 RECEIVE +2024-07-30 12:00:06.958 0 1 7072 SEND +2024-07-30 12:00:06.959 3 2 7074 RECEIVE +2024-07-30 12:00:06.960 0 1 7060 SEND +2024-07-30 12:00:06.961 1 2 7062 RECEIVE +2024-07-30 12:00:06.962 2 3 7064 SEND +2024-07-30 12:00:06.963 3 0 7066 RECEIVE +2024-07-30 12:00:06.964 1 3 7068 SEND +2024-07-30 12:00:06.965 2 0 7070 RECEIVE +2024-07-30 12:00:06.966 0 2 7072 SEND +2024-07-30 12:00:06.967 3 1 7074 RECEIVE +2024-07-30 12:00:06.968 1 0 7076 SEND +2024-07-30 12:00:06.969 2 1 7078 RECEIVE +2024-07-30 12:00:06.970 3 2 7080 SEND +2024-07-30 12:00:06.971 0 3 7082 RECEIVE +2024-07-30 12:00:06.972 2 0 7084 SEND +2024-07-30 12:00:06.973 1 3 7086 RECEIVE +2024-07-30 12:00:06.974 0 1 7088 SEND +2024-07-30 12:00:06.975 3 2 7090 RECEIVE +2024-07-30 12:00:06.976 0 1 7076 SEND +2024-07-30 12:00:06.977 1 2 7078 RECEIVE +2024-07-30 12:00:06.978 2 3 7080 SEND +2024-07-30 12:00:06.979 3 0 7082 RECEIVE +2024-07-30 12:00:06.980 1 3 7084 SEND +2024-07-30 12:00:06.981 2 0 7086 RECEIVE +2024-07-30 12:00:06.982 0 2 7088 SEND +2024-07-30 12:00:06.983 3 1 7090 RECEIVE +2024-07-30 12:00:06.984 1 0 7092 SEND +2024-07-30 12:00:06.985 2 1 7094 RECEIVE +2024-07-30 12:00:06.986 3 2 7096 SEND +2024-07-30 12:00:06.987 0 3 7098 RECEIVE +2024-07-30 12:00:06.988 2 0 7100 SEND +2024-07-30 12:00:06.989 1 3 7102 RECEIVE +2024-07-30 12:00:06.990 0 1 7104 SEND +2024-07-30 12:00:06.991 3 2 7106 RECEIVE +2024-07-30 12:00:06.992 0 1 7092 SEND +2024-07-30 12:00:06.993 1 2 7094 RECEIVE +2024-07-30 12:00:06.994 2 3 7096 SEND +2024-07-30 12:00:06.995 3 0 7098 RECEIVE +2024-07-30 12:00:06.996 1 3 7100 SEND +2024-07-30 12:00:06.997 2 0 7102 RECEIVE +2024-07-30 12:00:06.998 0 2 7104 SEND +2024-07-30 12:00:06.999 3 1 7106 RECEIVE +2024-07-30 12:00:07.000 1 0 7108 SEND +2024-07-30 12:00:07.001 2 1 7110 RECEIVE +2024-07-30 12:00:07.002 3 2 7112 SEND +2024-07-30 12:00:07.003 0 3 7114 RECEIVE +2024-07-30 12:00:07.004 2 0 7116 SEND +2024-07-30 12:00:07.005 1 3 7118 RECEIVE +2024-07-30 12:00:07.006 0 1 7120 SEND +2024-07-30 12:00:07.007 3 2 7122 RECEIVE +2024-07-30 12:00:07.008 0 1 7108 SEND +2024-07-30 12:00:07.009 1 2 7110 RECEIVE +2024-07-30 12:00:07.010 2 3 7112 SEND +2024-07-30 12:00:07.011 3 0 7114 RECEIVE +2024-07-30 12:00:07.012 1 3 7116 SEND +2024-07-30 12:00:07.013 2 0 7118 RECEIVE +2024-07-30 12:00:07.014 0 2 7120 SEND +2024-07-30 12:00:07.015 3 1 7122 RECEIVE +2024-07-30 12:00:07.016 1 0 7124 SEND +2024-07-30 12:00:07.017 2 1 7126 RECEIVE +2024-07-30 12:00:07.018 3 2 7128 SEND +2024-07-30 12:00:07.019 0 3 7130 RECEIVE +2024-07-30 12:00:07.020 2 0 7132 SEND +2024-07-30 12:00:07.021 1 3 7134 RECEIVE +2024-07-30 12:00:07.022 0 1 7136 SEND +2024-07-30 12:00:07.023 3 2 7138 RECEIVE +2024-07-30 12:00:07.024 0 1 7124 SEND +2024-07-30 12:00:07.025 1 2 7126 RECEIVE +2024-07-30 12:00:07.026 2 3 7128 SEND +2024-07-30 12:00:07.027 3 0 7130 RECEIVE +2024-07-30 12:00:07.028 1 3 7132 SEND +2024-07-30 12:00:07.029 2 0 7134 RECEIVE +2024-07-30 12:00:07.030 0 2 7136 SEND +2024-07-30 12:00:07.031 3 1 7138 RECEIVE +2024-07-30 12:00:07.032 1 0 7140 SEND +2024-07-30 12:00:07.033 2 1 7142 RECEIVE +2024-07-30 12:00:07.034 3 2 7144 SEND +2024-07-30 12:00:07.035 0 3 7146 RECEIVE +2024-07-30 12:00:07.036 2 0 7148 SEND +2024-07-30 12:00:07.037 1 3 7150 RECEIVE +2024-07-30 12:00:07.038 0 1 7152 SEND +2024-07-30 12:00:07.039 3 2 7154 RECEIVE +2024-07-30 12:00:07.040 0 1 7140 SEND +2024-07-30 12:00:07.041 1 2 7142 RECEIVE +2024-07-30 12:00:07.042 2 3 7144 SEND +2024-07-30 12:00:07.043 3 0 7146 RECEIVE +2024-07-30 12:00:07.044 1 3 7148 SEND +2024-07-30 12:00:07.045 2 0 7150 RECEIVE +2024-07-30 12:00:07.046 0 2 7152 SEND +2024-07-30 12:00:07.047 3 1 7154 RECEIVE +2024-07-30 12:00:07.048 1 0 7156 SEND +2024-07-30 12:00:07.049 2 1 7158 RECEIVE +2024-07-30 12:00:07.050 3 2 7160 SEND +2024-07-30 12:00:07.051 0 3 7162 RECEIVE +2024-07-30 12:00:07.052 2 0 7164 SEND +2024-07-30 12:00:07.053 1 3 7166 RECEIVE +2024-07-30 12:00:07.054 0 1 7168 SEND +2024-07-30 12:00:07.055 3 2 7170 RECEIVE +2024-07-30 12:00:07.056 0 1 7156 SEND +2024-07-30 12:00:07.057 1 2 7158 RECEIVE +2024-07-30 12:00:07.058 2 3 7160 SEND +2024-07-30 12:00:07.059 3 0 7162 RECEIVE +2024-07-30 12:00:07.060 1 3 7164 SEND +2024-07-30 12:00:07.061 2 0 7166 RECEIVE +2024-07-30 12:00:07.062 0 2 7168 SEND +2024-07-30 12:00:07.063 3 1 7170 RECEIVE +2024-07-30 12:00:07.064 1 0 7172 SEND +2024-07-30 12:00:07.065 2 1 7174 RECEIVE +2024-07-30 12:00:07.066 3 2 7176 SEND +2024-07-30 12:00:07.067 0 3 7178 RECEIVE +2024-07-30 12:00:07.068 2 0 7180 SEND +2024-07-30 12:00:07.069 1 3 7182 RECEIVE +2024-07-30 12:00:07.070 0 1 7184 SEND +2024-07-30 12:00:07.071 3 2 7186 RECEIVE +2024-07-30 12:00:07.072 0 1 7172 SEND +2024-07-30 12:00:07.073 1 2 7174 RECEIVE +2024-07-30 12:00:07.074 2 3 7176 SEND +2024-07-30 12:00:07.075 3 0 7178 RECEIVE +2024-07-30 12:00:07.076 1 3 7180 SEND +2024-07-30 12:00:07.077 2 0 7182 RECEIVE +2024-07-30 12:00:07.078 0 2 7184 SEND +2024-07-30 12:00:07.079 3 1 7186 RECEIVE +2024-07-30 12:00:07.080 1 0 7188 SEND +2024-07-30 12:00:07.081 2 1 7190 RECEIVE +2024-07-30 12:00:07.082 3 2 7192 SEND +2024-07-30 12:00:07.083 0 3 7194 RECEIVE +2024-07-30 12:00:07.084 2 0 7196 SEND +2024-07-30 12:00:07.085 1 3 7198 RECEIVE +2024-07-30 12:00:07.086 0 1 7200 SEND +2024-07-30 12:00:07.087 3 2 7202 RECEIVE +2024-07-30 12:00:07.088 0 1 7188 SEND +2024-07-30 12:00:07.089 1 2 7190 RECEIVE +2024-07-30 12:00:07.090 2 3 7192 SEND +2024-07-30 12:00:07.091 3 0 7194 RECEIVE +2024-07-30 12:00:07.092 1 3 7196 SEND +2024-07-30 12:00:07.093 2 0 7198 RECEIVE +2024-07-30 12:00:07.094 0 2 7200 SEND +2024-07-30 12:00:07.095 3 1 7202 RECEIVE +2024-07-30 12:00:07.096 1 0 7204 SEND +2024-07-30 12:00:07.097 2 1 7206 RECEIVE +2024-07-30 12:00:07.098 3 2 7208 SEND +2024-07-30 12:00:07.099 0 3 7210 RECEIVE +2024-07-30 12:00:07.100 2 0 7212 SEND +2024-07-30 12:00:07.101 1 3 7214 RECEIVE +2024-07-30 12:00:07.102 0 1 7216 SEND +2024-07-30 12:00:07.103 3 2 7218 RECEIVE +2024-07-30 12:00:07.104 0 1 7204 SEND +2024-07-30 12:00:07.105 1 2 7206 RECEIVE +2024-07-30 12:00:07.106 2 3 7208 SEND +2024-07-30 12:00:07.107 3 0 7210 RECEIVE +2024-07-30 12:00:07.108 1 3 7212 SEND +2024-07-30 12:00:07.109 2 0 7214 RECEIVE +2024-07-30 12:00:07.110 0 2 7216 SEND +2024-07-30 12:00:07.111 3 1 7218 RECEIVE +2024-07-30 12:00:07.112 1 0 7220 SEND +2024-07-30 12:00:07.113 2 1 7222 RECEIVE +2024-07-30 12:00:07.114 3 2 7224 SEND +2024-07-30 12:00:07.115 0 3 7226 RECEIVE +2024-07-30 12:00:07.116 2 0 7228 SEND +2024-07-30 12:00:07.117 1 3 7230 RECEIVE +2024-07-30 12:00:07.118 0 1 7232 SEND +2024-07-30 12:00:07.119 3 2 7234 RECEIVE +2024-07-30 12:00:07.120 0 1 7220 SEND +2024-07-30 12:00:07.121 1 2 7222 RECEIVE +2024-07-30 12:00:07.122 2 3 7224 SEND +2024-07-30 12:00:07.123 3 0 7226 RECEIVE +2024-07-30 12:00:07.124 1 3 7228 SEND +2024-07-30 12:00:07.125 2 0 7230 RECEIVE +2024-07-30 12:00:07.126 0 2 7232 SEND +2024-07-30 12:00:07.127 3 1 7234 RECEIVE +2024-07-30 12:00:07.128 1 0 7236 SEND +2024-07-30 12:00:07.129 2 1 7238 RECEIVE +2024-07-30 12:00:07.130 3 2 7240 SEND +2024-07-30 12:00:07.131 0 3 7242 RECEIVE +2024-07-30 12:00:07.132 2 0 7244 SEND +2024-07-30 12:00:07.133 1 3 7246 RECEIVE +2024-07-30 12:00:07.134 0 1 7248 SEND +2024-07-30 12:00:07.135 3 2 7250 RECEIVE +2024-07-30 12:00:07.136 0 1 7236 SEND +2024-07-30 12:00:07.137 1 2 7238 RECEIVE +2024-07-30 12:00:07.138 2 3 7240 SEND +2024-07-30 12:00:07.139 3 0 7242 RECEIVE +2024-07-30 12:00:07.140 1 3 7244 SEND +2024-07-30 12:00:07.141 2 0 7246 RECEIVE +2024-07-30 12:00:07.142 0 2 7248 SEND +2024-07-30 12:00:07.143 3 1 7250 RECEIVE +2024-07-30 12:00:07.144 1 0 7252 SEND +2024-07-30 12:00:07.145 2 1 7254 RECEIVE +2024-07-30 12:00:07.146 3 2 7256 SEND +2024-07-30 12:00:07.147 0 3 7258 RECEIVE +2024-07-30 12:00:07.148 2 0 7260 SEND +2024-07-30 12:00:07.149 1 3 7262 RECEIVE +2024-07-30 12:00:07.150 0 1 7264 SEND +2024-07-30 12:00:07.151 3 2 7266 RECEIVE +2024-07-30 12:00:07.152 0 1 7252 SEND +2024-07-30 12:00:07.153 1 2 7254 RECEIVE +2024-07-30 12:00:07.154 2 3 7256 SEND +2024-07-30 12:00:07.155 3 0 7258 RECEIVE +2024-07-30 12:00:07.156 1 3 7260 SEND +2024-07-30 12:00:07.157 2 0 7262 RECEIVE +2024-07-30 12:00:07.158 0 2 7264 SEND +2024-07-30 12:00:07.159 3 1 7266 RECEIVE +2024-07-30 12:00:07.160 1 0 7268 SEND +2024-07-30 12:00:07.161 2 1 7270 RECEIVE +2024-07-30 12:00:07.162 3 2 7272 SEND +2024-07-30 12:00:07.163 0 3 7274 RECEIVE +2024-07-30 12:00:07.164 2 0 7276 SEND +2024-07-30 12:00:07.165 1 3 7278 RECEIVE +2024-07-30 12:00:07.166 0 1 7280 SEND +2024-07-30 12:00:07.167 3 2 7282 RECEIVE +2024-07-30 12:00:07.168 0 1 7268 SEND +2024-07-30 12:00:07.169 1 2 7270 RECEIVE +2024-07-30 12:00:07.170 2 3 7272 SEND +2024-07-30 12:00:07.171 3 0 7274 RECEIVE +2024-07-30 12:00:07.172 1 3 7276 SEND +2024-07-30 12:00:07.173 2 0 7278 RECEIVE +2024-07-30 12:00:07.174 0 2 7280 SEND +2024-07-30 12:00:07.175 3 1 7282 RECEIVE +2024-07-30 12:00:07.176 1 0 7284 SEND +2024-07-30 12:00:07.177 2 1 7286 RECEIVE +2024-07-30 12:00:07.178 3 2 7288 SEND +2024-07-30 12:00:07.179 0 3 7290 RECEIVE +2024-07-30 12:00:07.180 2 0 7292 SEND +2024-07-30 12:00:07.181 1 3 7294 RECEIVE +2024-07-30 12:00:07.182 0 1 7296 SEND +2024-07-30 12:00:07.183 3 2 7298 RECEIVE +2024-07-30 12:00:07.184 0 1 7284 SEND +2024-07-30 12:00:07.185 1 2 7286 RECEIVE +2024-07-30 12:00:07.186 2 3 7288 SEND +2024-07-30 12:00:07.187 3 0 7290 RECEIVE +2024-07-30 12:00:07.188 1 3 7292 SEND +2024-07-30 12:00:07.189 2 0 7294 RECEIVE +2024-07-30 12:00:07.190 0 2 7296 SEND +2024-07-30 12:00:07.191 3 1 7298 RECEIVE +2024-07-30 12:00:07.192 1 0 7300 SEND +2024-07-30 12:00:07.193 2 1 7302 RECEIVE +2024-07-30 12:00:07.194 3 2 7304 SEND +2024-07-30 12:00:07.195 0 3 7306 RECEIVE +2024-07-30 12:00:07.196 2 0 7308 SEND +2024-07-30 12:00:07.197 1 3 7310 RECEIVE +2024-07-30 12:00:07.198 0 1 7312 SEND +2024-07-30 12:00:07.199 3 2 7314 RECEIVE +2024-07-30 12:00:07.200 0 1 7300 SEND +2024-07-30 12:00:07.201 1 2 7302 RECEIVE +2024-07-30 12:00:07.202 2 3 7304 SEND +2024-07-30 12:00:07.203 3 0 7306 RECEIVE +2024-07-30 12:00:07.204 1 3 7308 SEND +2024-07-30 12:00:07.205 2 0 7310 RECEIVE +2024-07-30 12:00:07.206 0 2 7312 SEND +2024-07-30 12:00:07.207 3 1 7314 RECEIVE +2024-07-30 12:00:07.208 1 0 7316 SEND +2024-07-30 12:00:07.209 2 1 7318 RECEIVE +2024-07-30 12:00:07.210 3 2 7320 SEND +2024-07-30 12:00:07.211 0 3 7322 RECEIVE +2024-07-30 12:00:07.212 2 0 7324 SEND +2024-07-30 12:00:07.213 1 3 7326 RECEIVE +2024-07-30 12:00:07.214 0 1 7328 SEND +2024-07-30 12:00:07.215 3 2 7330 RECEIVE +2024-07-30 12:00:07.216 0 1 7316 SEND +2024-07-30 12:00:07.217 1 2 7318 RECEIVE +2024-07-30 12:00:07.218 2 3 7320 SEND +2024-07-30 12:00:07.219 3 0 7322 RECEIVE +2024-07-30 12:00:07.220 1 3 7324 SEND +2024-07-30 12:00:07.221 2 0 7326 RECEIVE +2024-07-30 12:00:07.222 0 2 7328 SEND +2024-07-30 12:00:07.223 3 1 7330 RECEIVE +2024-07-30 12:00:07.224 1 0 7332 SEND +2024-07-30 12:00:07.225 2 1 7334 RECEIVE +2024-07-30 12:00:07.226 3 2 7336 SEND +2024-07-30 12:00:07.227 0 3 7338 RECEIVE +2024-07-30 12:00:07.228 2 0 7340 SEND +2024-07-30 12:00:07.229 1 3 7342 RECEIVE +2024-07-30 12:00:07.230 0 1 7344 SEND +2024-07-30 12:00:07.231 3 2 7346 RECEIVE +2024-07-30 12:00:07.232 0 1 7332 SEND +2024-07-30 12:00:07.233 1 2 7334 RECEIVE +2024-07-30 12:00:07.234 2 3 7336 SEND +2024-07-30 12:00:07.235 3 0 7338 RECEIVE +2024-07-30 12:00:07.236 1 3 7340 SEND +2024-07-30 12:00:07.237 2 0 7342 RECEIVE +2024-07-30 12:00:07.238 0 2 7344 SEND +2024-07-30 12:00:07.239 3 1 7346 RECEIVE +2024-07-30 12:00:07.240 1 0 7348 SEND +2024-07-30 12:00:07.241 2 1 7350 RECEIVE +2024-07-30 12:00:07.242 3 2 7352 SEND +2024-07-30 12:00:07.243 0 3 7354 RECEIVE +2024-07-30 12:00:07.244 2 0 7356 SEND +2024-07-30 12:00:07.245 1 3 7358 RECEIVE +2024-07-30 12:00:07.246 0 1 7360 SEND +2024-07-30 12:00:07.247 3 2 7362 RECEIVE +2024-07-30 12:00:07.248 0 1 7348 SEND +2024-07-30 12:00:07.249 1 2 7350 RECEIVE +2024-07-30 12:00:07.250 2 3 7352 SEND +2024-07-30 12:00:07.251 3 0 7354 RECEIVE +2024-07-30 12:00:07.252 1 3 7356 SEND +2024-07-30 12:00:07.253 2 0 7358 RECEIVE +2024-07-30 12:00:07.254 0 2 7360 SEND +2024-07-30 12:00:07.255 3 1 7362 RECEIVE +2024-07-30 12:00:07.256 1 0 7364 SEND +2024-07-30 12:00:07.257 2 1 7366 RECEIVE +2024-07-30 12:00:07.258 3 2 7368 SEND +2024-07-30 12:00:07.259 0 3 7370 RECEIVE +2024-07-30 12:00:07.260 2 0 7372 SEND +2024-07-30 12:00:07.261 1 3 7374 RECEIVE +2024-07-30 12:00:07.262 0 1 7376 SEND +2024-07-30 12:00:07.263 3 2 7378 RECEIVE +2024-07-30 12:00:07.264 0 1 7364 SEND +2024-07-30 12:00:07.265 1 2 7366 RECEIVE +2024-07-30 12:00:07.266 2 3 7368 SEND +2024-07-30 12:00:07.267 3 0 7370 RECEIVE +2024-07-30 12:00:07.268 1 3 7372 SEND +2024-07-30 12:00:07.269 2 0 7374 RECEIVE +2024-07-30 12:00:07.270 0 2 7376 SEND +2024-07-30 12:00:07.271 3 1 7378 RECEIVE +2024-07-30 12:00:07.272 1 0 7380 SEND +2024-07-30 12:00:07.273 2 1 7382 RECEIVE +2024-07-30 12:00:07.274 3 2 7384 SEND +2024-07-30 12:00:07.275 0 3 7386 RECEIVE +2024-07-30 12:00:07.276 2 0 7388 SEND +2024-07-30 12:00:07.277 1 3 7390 RECEIVE +2024-07-30 12:00:07.278 0 1 7392 SEND +2024-07-30 12:00:07.279 3 2 7394 RECEIVE +2024-07-30 12:00:07.280 0 1 7380 SEND +2024-07-30 12:00:07.281 1 2 7382 RECEIVE +2024-07-30 12:00:07.282 2 3 7384 SEND +2024-07-30 12:00:07.283 3 0 7386 RECEIVE +2024-07-30 12:00:07.284 1 3 7388 SEND +2024-07-30 12:00:07.285 2 0 7390 RECEIVE +2024-07-30 12:00:07.286 0 2 7392 SEND +2024-07-30 12:00:07.287 3 1 7394 RECEIVE +2024-07-30 12:00:07.288 1 0 7396 SEND +2024-07-30 12:00:07.289 2 1 7398 RECEIVE +2024-07-30 12:00:07.290 3 2 7400 SEND +2024-07-30 12:00:07.291 0 3 7402 RECEIVE +2024-07-30 12:00:07.292 2 0 7404 SEND +2024-07-30 12:00:07.293 1 3 7406 RECEIVE +2024-07-30 12:00:07.294 0 1 7408 SEND +2024-07-30 12:00:07.295 3 2 7410 RECEIVE +2024-07-30 12:00:07.296 0 1 7396 SEND +2024-07-30 12:00:07.297 1 2 7398 RECEIVE +2024-07-30 12:00:07.298 2 3 7400 SEND +2024-07-30 12:00:07.299 3 0 7402 RECEIVE +2024-07-30 12:00:07.300 1 3 7404 SEND +2024-07-30 12:00:07.301 2 0 7406 RECEIVE +2024-07-30 12:00:07.302 0 2 7408 SEND +2024-07-30 12:00:07.303 3 1 7410 RECEIVE +2024-07-30 12:00:07.304 1 0 7412 SEND +2024-07-30 12:00:07.305 2 1 7414 RECEIVE +2024-07-30 12:00:07.306 3 2 7416 SEND +2024-07-30 12:00:07.307 0 3 7418 RECEIVE +2024-07-30 12:00:07.308 2 0 7420 SEND +2024-07-30 12:00:07.309 1 3 7422 RECEIVE +2024-07-30 12:00:07.310 0 1 7424 SEND +2024-07-30 12:00:07.311 3 2 7426 RECEIVE +2024-07-30 12:00:07.312 0 1 7412 SEND +2024-07-30 12:00:07.313 1 2 7414 RECEIVE +2024-07-30 12:00:07.314 2 3 7416 SEND +2024-07-30 12:00:07.315 3 0 7418 RECEIVE +2024-07-30 12:00:07.316 1 3 7420 SEND +2024-07-30 12:00:07.317 2 0 7422 RECEIVE +2024-07-30 12:00:07.318 0 2 7424 SEND +2024-07-30 12:00:07.319 3 1 7426 RECEIVE +2024-07-30 12:00:07.320 1 0 7428 SEND +2024-07-30 12:00:07.321 2 1 7430 RECEIVE +2024-07-30 12:00:07.322 3 2 7432 SEND +2024-07-30 12:00:07.323 0 3 7434 RECEIVE +2024-07-30 12:00:07.324 2 0 7436 SEND +2024-07-30 12:00:07.325 1 3 7438 RECEIVE +2024-07-30 12:00:07.326 0 1 7440 SEND +2024-07-30 12:00:07.327 3 2 7442 RECEIVE +2024-07-30 12:00:07.328 0 1 7428 SEND +2024-07-30 12:00:07.329 1 2 7430 RECEIVE +2024-07-30 12:00:07.330 2 3 7432 SEND +2024-07-30 12:00:07.331 3 0 7434 RECEIVE +2024-07-30 12:00:07.332 1 3 7436 SEND +2024-07-30 12:00:07.333 2 0 7438 RECEIVE +2024-07-30 12:00:07.334 0 2 7440 SEND +2024-07-30 12:00:07.335 3 1 7442 RECEIVE +2024-07-30 12:00:07.336 1 0 7444 SEND +2024-07-30 12:00:07.337 2 1 7446 RECEIVE +2024-07-30 12:00:07.338 3 2 7448 SEND +2024-07-30 12:00:07.339 0 3 7450 RECEIVE +2024-07-30 12:00:07.340 2 0 7452 SEND +2024-07-30 12:00:07.341 1 3 7454 RECEIVE +2024-07-30 12:00:07.342 0 1 7456 SEND +2024-07-30 12:00:07.343 3 2 7458 RECEIVE +2024-07-30 12:00:07.344 0 1 7444 SEND +2024-07-30 12:00:07.345 1 2 7446 RECEIVE +2024-07-30 12:00:07.346 2 3 7448 SEND +2024-07-30 12:00:07.347 3 0 7450 RECEIVE +2024-07-30 12:00:07.348 1 3 7452 SEND +2024-07-30 12:00:07.349 2 0 7454 RECEIVE +2024-07-30 12:00:07.350 0 2 7456 SEND +2024-07-30 12:00:07.351 3 1 7458 RECEIVE +2024-07-30 12:00:07.352 1 0 7460 SEND +2024-07-30 12:00:07.353 2 1 7462 RECEIVE +2024-07-30 12:00:07.354 3 2 7464 SEND +2024-07-30 12:00:07.355 0 3 7466 RECEIVE +2024-07-30 12:00:07.356 2 0 7468 SEND +2024-07-30 12:00:07.357 1 3 7470 RECEIVE +2024-07-30 12:00:07.358 0 1 7472 SEND +2024-07-30 12:00:07.359 3 2 7474 RECEIVE +2024-07-30 12:00:07.360 0 1 7460 SEND +2024-07-30 12:00:07.361 1 2 7462 RECEIVE +2024-07-30 12:00:07.362 2 3 7464 SEND +2024-07-30 12:00:07.363 3 0 7466 RECEIVE +2024-07-30 12:00:07.364 1 3 7468 SEND +2024-07-30 12:00:07.365 2 0 7470 RECEIVE +2024-07-30 12:00:07.366 0 2 7472 SEND +2024-07-30 12:00:07.367 3 1 7474 RECEIVE +2024-07-30 12:00:07.368 1 0 7476 SEND +2024-07-30 12:00:07.369 2 1 7478 RECEIVE +2024-07-30 12:00:07.370 3 2 7480 SEND +2024-07-30 12:00:07.371 0 3 7482 RECEIVE +2024-07-30 12:00:07.372 2 0 7484 SEND +2024-07-30 12:00:07.373 1 3 7486 RECEIVE +2024-07-30 12:00:07.374 0 1 7488 SEND +2024-07-30 12:00:07.375 3 2 7490 RECEIVE +2024-07-30 12:00:07.376 0 1 7476 SEND +2024-07-30 12:00:07.377 1 2 7478 RECEIVE +2024-07-30 12:00:07.378 2 3 7480 SEND +2024-07-30 12:00:07.379 3 0 7482 RECEIVE +2024-07-30 12:00:07.380 1 3 7484 SEND +2024-07-30 12:00:07.381 2 0 7486 RECEIVE +2024-07-30 12:00:07.382 0 2 7488 SEND +2024-07-30 12:00:07.383 3 1 7490 RECEIVE +2024-07-30 12:00:07.384 1 0 7492 SEND +2024-07-30 12:00:07.385 2 1 7494 RECEIVE +2024-07-30 12:00:07.386 3 2 7496 SEND +2024-07-30 12:00:07.387 0 3 7498 RECEIVE +2024-07-30 12:00:07.388 2 0 7500 SEND +2024-07-30 12:00:07.389 1 3 7502 RECEIVE +2024-07-30 12:00:07.390 0 1 7504 SEND +2024-07-30 12:00:07.391 3 2 7506 RECEIVE +2024-07-30 12:00:07.392 0 1 7492 SEND +2024-07-30 12:00:07.393 1 2 7494 RECEIVE +2024-07-30 12:00:07.394 2 3 7496 SEND +2024-07-30 12:00:07.395 3 0 7498 RECEIVE +2024-07-30 12:00:07.396 1 3 7500 SEND +2024-07-30 12:00:07.397 2 0 7502 RECEIVE +2024-07-30 12:00:07.398 0 2 7504 SEND +2024-07-30 12:00:07.399 3 1 7506 RECEIVE +2024-07-30 12:00:07.400 1 0 7508 SEND +2024-07-30 12:00:07.401 2 1 7510 RECEIVE +2024-07-30 12:00:07.402 3 2 7512 SEND +2024-07-30 12:00:07.403 0 3 7514 RECEIVE +2024-07-30 12:00:07.404 2 0 7516 SEND +2024-07-30 12:00:07.405 1 3 7518 RECEIVE +2024-07-30 12:00:07.406 0 1 7520 SEND +2024-07-30 12:00:07.407 3 2 7522 RECEIVE +2024-07-30 12:00:07.408 0 1 7508 SEND +2024-07-30 12:00:07.409 1 2 7510 RECEIVE +2024-07-30 12:00:07.410 2 3 7512 SEND +2024-07-30 12:00:07.411 3 0 7514 RECEIVE +2024-07-30 12:00:07.412 1 3 7516 SEND +2024-07-30 12:00:07.413 2 0 7518 RECEIVE +2024-07-30 12:00:07.414 0 2 7520 SEND +2024-07-30 12:00:07.415 3 1 7522 RECEIVE +2024-07-30 12:00:07.416 1 0 7524 SEND +2024-07-30 12:00:07.417 2 1 7526 RECEIVE +2024-07-30 12:00:07.418 3 2 7528 SEND +2024-07-30 12:00:07.419 0 3 7530 RECEIVE +2024-07-30 12:00:07.420 2 0 7532 SEND +2024-07-30 12:00:07.421 1 3 7534 RECEIVE +2024-07-30 12:00:07.422 0 1 7536 SEND +2024-07-30 12:00:07.423 3 2 7538 RECEIVE +2024-07-30 12:00:07.424 0 1 7524 SEND +2024-07-30 12:00:07.425 1 2 7526 RECEIVE +2024-07-30 12:00:07.426 2 3 7528 SEND +2024-07-30 12:00:07.427 3 0 7530 RECEIVE +2024-07-30 12:00:07.428 1 3 7532 SEND +2024-07-30 12:00:07.429 2 0 7534 RECEIVE +2024-07-30 12:00:07.430 0 2 7536 SEND +2024-07-30 12:00:07.431 3 1 7538 RECEIVE +2024-07-30 12:00:07.432 1 0 7540 SEND +2024-07-30 12:00:07.433 2 1 7542 RECEIVE +2024-07-30 12:00:07.434 3 2 7544 SEND +2024-07-30 12:00:07.435 0 3 7546 RECEIVE +2024-07-30 12:00:07.436 2 0 7548 SEND +2024-07-30 12:00:07.437 1 3 7550 RECEIVE +2024-07-30 12:00:07.438 0 1 7552 SEND +2024-07-30 12:00:07.439 3 2 7554 RECEIVE +2024-07-30 12:00:07.440 0 1 7540 SEND +2024-07-30 12:00:07.441 1 2 7542 RECEIVE +2024-07-30 12:00:07.442 2 3 7544 SEND +2024-07-30 12:00:07.443 3 0 7546 RECEIVE +2024-07-30 12:00:07.444 1 3 7548 SEND +2024-07-30 12:00:07.445 2 0 7550 RECEIVE +2024-07-30 12:00:07.446 0 2 7552 SEND +2024-07-30 12:00:07.447 3 1 7554 RECEIVE +2024-07-30 12:00:07.448 1 0 7556 SEND +2024-07-30 12:00:07.449 2 1 7558 RECEIVE +2024-07-30 12:00:07.450 3 2 7560 SEND +2024-07-30 12:00:07.451 0 3 7562 RECEIVE +2024-07-30 12:00:07.452 2 0 7564 SEND +2024-07-30 12:00:07.453 1 3 7566 RECEIVE +2024-07-30 12:00:07.454 0 1 7568 SEND +2024-07-30 12:00:07.455 3 2 7570 RECEIVE +2024-07-30 12:00:07.456 0 1 7556 SEND +2024-07-30 12:00:07.457 1 2 7558 RECEIVE +2024-07-30 12:00:07.458 2 3 7560 SEND +2024-07-30 12:00:07.459 3 0 7562 RECEIVE +2024-07-30 12:00:07.460 1 3 7564 SEND +2024-07-30 12:00:07.461 2 0 7566 RECEIVE +2024-07-30 12:00:07.462 0 2 7568 SEND +2024-07-30 12:00:07.463 3 1 7570 RECEIVE +2024-07-30 12:00:07.464 1 0 7572 SEND +2024-07-30 12:00:07.465 2 1 7574 RECEIVE +2024-07-30 12:00:07.466 3 2 7576 SEND +2024-07-30 12:00:07.467 0 3 7578 RECEIVE +2024-07-30 12:00:07.468 2 0 7580 SEND +2024-07-30 12:00:07.469 1 3 7582 RECEIVE +2024-07-30 12:00:07.470 0 1 7584 SEND +2024-07-30 12:00:07.471 3 2 7586 RECEIVE +2024-07-30 12:00:07.472 0 1 7572 SEND +2024-07-30 12:00:07.473 1 2 7574 RECEIVE +2024-07-30 12:00:07.474 2 3 7576 SEND +2024-07-30 12:00:07.475 3 0 7578 RECEIVE +2024-07-30 12:00:07.476 1 3 7580 SEND +2024-07-30 12:00:07.477 2 0 7582 RECEIVE +2024-07-30 12:00:07.478 0 2 7584 SEND +2024-07-30 12:00:07.479 3 1 7586 RECEIVE +2024-07-30 12:00:07.480 1 0 7588 SEND +2024-07-30 12:00:07.481 2 1 7590 RECEIVE +2024-07-30 12:00:07.482 3 2 7592 SEND +2024-07-30 12:00:07.483 0 3 7594 RECEIVE +2024-07-30 12:00:07.484 2 0 7596 SEND +2024-07-30 12:00:07.485 1 3 7598 RECEIVE +2024-07-30 12:00:07.486 0 1 7600 SEND +2024-07-30 12:00:07.487 3 2 7602 RECEIVE +2024-07-30 12:00:07.488 0 1 7588 SEND +2024-07-30 12:00:07.489 1 2 7590 RECEIVE +2024-07-30 12:00:07.490 2 3 7592 SEND +2024-07-30 12:00:07.491 3 0 7594 RECEIVE +2024-07-30 12:00:07.492 1 3 7596 SEND +2024-07-30 12:00:07.493 2 0 7598 RECEIVE +2024-07-30 12:00:07.494 0 2 7600 SEND +2024-07-30 12:00:07.495 3 1 7602 RECEIVE +2024-07-30 12:00:07.496 1 0 7604 SEND +2024-07-30 12:00:07.497 2 1 7606 RECEIVE +2024-07-30 12:00:07.498 3 2 7608 SEND +2024-07-30 12:00:07.499 0 3 7610 RECEIVE +2024-07-30 12:00:07.500 2 0 7612 SEND +2024-07-30 12:00:07.501 1 3 7614 RECEIVE +2024-07-30 12:00:07.502 0 1 7616 SEND +2024-07-30 12:00:07.503 3 2 7618 RECEIVE +2024-07-30 12:00:07.504 0 1 7604 SEND +2024-07-30 12:00:07.505 1 2 7606 RECEIVE +2024-07-30 12:00:07.506 2 3 7608 SEND +2024-07-30 12:00:07.507 3 0 7610 RECEIVE +2024-07-30 12:00:07.508 1 3 7612 SEND +2024-07-30 12:00:07.509 2 0 7614 RECEIVE +2024-07-30 12:00:07.510 0 2 7616 SEND +2024-07-30 12:00:07.511 3 1 7618 RECEIVE +2024-07-30 12:00:07.512 1 0 7620 SEND +2024-07-30 12:00:07.513 2 1 7622 RECEIVE +2024-07-30 12:00:07.514 3 2 7624 SEND +2024-07-30 12:00:07.515 0 3 7626 RECEIVE +2024-07-30 12:00:07.516 2 0 7628 SEND +2024-07-30 12:00:07.517 1 3 7630 RECEIVE +2024-07-30 12:00:07.518 0 1 7632 SEND +2024-07-30 12:00:07.519 3 2 7634 RECEIVE +2024-07-30 12:00:07.520 0 1 7620 SEND +2024-07-30 12:00:07.521 1 2 7622 RECEIVE +2024-07-30 12:00:07.522 2 3 7624 SEND +2024-07-30 12:00:07.523 3 0 7626 RECEIVE +2024-07-30 12:00:07.524 1 3 7628 SEND +2024-07-30 12:00:07.525 2 0 7630 RECEIVE +2024-07-30 12:00:07.526 0 2 7632 SEND +2024-07-30 12:00:07.527 3 1 7634 RECEIVE +2024-07-30 12:00:07.528 1 0 7636 SEND +2024-07-30 12:00:07.529 2 1 7638 RECEIVE +2024-07-30 12:00:07.530 3 2 7640 SEND +2024-07-30 12:00:07.531 0 3 7642 RECEIVE +2024-07-30 12:00:07.532 2 0 7644 SEND +2024-07-30 12:00:07.533 1 3 7646 RECEIVE +2024-07-30 12:00:07.534 0 1 7648 SEND +2024-07-30 12:00:07.535 3 2 7650 RECEIVE +2024-07-30 12:00:07.536 0 1 7636 SEND +2024-07-30 12:00:07.537 1 2 7638 RECEIVE +2024-07-30 12:00:07.538 2 3 7640 SEND +2024-07-30 12:00:07.539 3 0 7642 RECEIVE +2024-07-30 12:00:07.540 1 3 7644 SEND +2024-07-30 12:00:07.541 2 0 7646 RECEIVE +2024-07-30 12:00:07.542 0 2 7648 SEND +2024-07-30 12:00:07.543 3 1 7650 RECEIVE +2024-07-30 12:00:07.544 1 0 7652 SEND +2024-07-30 12:00:07.545 2 1 7654 RECEIVE +2024-07-30 12:00:07.546 3 2 7656 SEND +2024-07-30 12:00:07.547 0 3 7658 RECEIVE +2024-07-30 12:00:07.548 2 0 7660 SEND +2024-07-30 12:00:07.549 1 3 7662 RECEIVE +2024-07-30 12:00:07.550 0 1 7664 SEND +2024-07-30 12:00:07.551 3 2 7666 RECEIVE +2024-07-30 12:00:07.552 0 1 7652 SEND +2024-07-30 12:00:07.553 1 2 7654 RECEIVE +2024-07-30 12:00:07.554 2 3 7656 SEND +2024-07-30 12:00:07.555 3 0 7658 RECEIVE +2024-07-30 12:00:07.556 1 3 7660 SEND +2024-07-30 12:00:07.557 2 0 7662 RECEIVE +2024-07-30 12:00:07.558 0 2 7664 SEND +2024-07-30 12:00:07.559 3 1 7666 RECEIVE +2024-07-30 12:00:07.560 1 0 7668 SEND +2024-07-30 12:00:07.561 2 1 7670 RECEIVE +2024-07-30 12:00:07.562 3 2 7672 SEND +2024-07-30 12:00:07.563 0 3 7674 RECEIVE +2024-07-30 12:00:07.564 2 0 7676 SEND +2024-07-30 12:00:07.565 1 3 7678 RECEIVE +2024-07-30 12:00:07.566 0 1 7680 SEND +2024-07-30 12:00:07.567 3 2 7682 RECEIVE +2024-07-30 12:00:07.568 0 1 7668 SEND +2024-07-30 12:00:07.569 1 2 7670 RECEIVE +2024-07-30 12:00:07.570 2 3 7672 SEND +2024-07-30 12:00:07.571 3 0 7674 RECEIVE +2024-07-30 12:00:07.572 1 3 7676 SEND +2024-07-30 12:00:07.573 2 0 7678 RECEIVE +2024-07-30 12:00:07.574 0 2 7680 SEND +2024-07-30 12:00:07.575 3 1 7682 RECEIVE +2024-07-30 12:00:07.576 1 0 7684 SEND +2024-07-30 12:00:07.577 2 1 7686 RECEIVE +2024-07-30 12:00:07.578 3 2 7688 SEND +2024-07-30 12:00:07.579 0 3 7690 RECEIVE +2024-07-30 12:00:07.580 2 0 7692 SEND +2024-07-30 12:00:07.581 1 3 7694 RECEIVE +2024-07-30 12:00:07.582 0 1 7696 SEND +2024-07-30 12:00:07.583 3 2 7698 RECEIVE +2024-07-30 12:00:07.584 0 1 7684 SEND +2024-07-30 12:00:07.585 1 2 7686 RECEIVE +2024-07-30 12:00:07.586 2 3 7688 SEND +2024-07-30 12:00:07.587 3 0 7690 RECEIVE +2024-07-30 12:00:07.588 1 3 7692 SEND +2024-07-30 12:00:07.589 2 0 7694 RECEIVE +2024-07-30 12:00:07.590 0 2 7696 SEND +2024-07-30 12:00:07.591 3 1 7698 RECEIVE +2024-07-30 12:00:07.592 1 0 7700 SEND +2024-07-30 12:00:07.593 2 1 7702 RECEIVE +2024-07-30 12:00:07.594 3 2 7704 SEND +2024-07-30 12:00:07.595 0 3 7706 RECEIVE +2024-07-30 12:00:07.596 2 0 7708 SEND +2024-07-30 12:00:07.597 1 3 7710 RECEIVE +2024-07-30 12:00:07.598 0 1 7712 SEND +2024-07-30 12:00:07.599 3 2 7714 RECEIVE +2024-07-30 12:00:07.600 0 1 7700 SEND +2024-07-30 12:00:07.601 1 2 7702 RECEIVE +2024-07-30 12:00:07.602 2 3 7704 SEND +2024-07-30 12:00:07.603 3 0 7706 RECEIVE +2024-07-30 12:00:07.604 1 3 7708 SEND +2024-07-30 12:00:07.605 2 0 7710 RECEIVE +2024-07-30 12:00:07.606 0 2 7712 SEND +2024-07-30 12:00:07.607 3 1 7714 RECEIVE +2024-07-30 12:00:07.608 1 0 7716 SEND +2024-07-30 12:00:07.609 2 1 7718 RECEIVE +2024-07-30 12:00:07.610 3 2 7720 SEND +2024-07-30 12:00:07.611 0 3 7722 RECEIVE +2024-07-30 12:00:07.612 2 0 7724 SEND +2024-07-30 12:00:07.613 1 3 7726 RECEIVE +2024-07-30 12:00:07.614 0 1 7728 SEND +2024-07-30 12:00:07.615 3 2 7730 RECEIVE +2024-07-30 12:00:07.616 0 1 7716 SEND +2024-07-30 12:00:07.617 1 2 7718 RECEIVE +2024-07-30 12:00:07.618 2 3 7720 SEND +2024-07-30 12:00:07.619 3 0 7722 RECEIVE +2024-07-30 12:00:07.620 1 3 7724 SEND +2024-07-30 12:00:07.621 2 0 7726 RECEIVE +2024-07-30 12:00:07.622 0 2 7728 SEND +2024-07-30 12:00:07.623 3 1 7730 RECEIVE +2024-07-30 12:00:07.624 1 0 7732 SEND +2024-07-30 12:00:07.625 2 1 7734 RECEIVE +2024-07-30 12:00:07.626 3 2 7736 SEND +2024-07-30 12:00:07.627 0 3 7738 RECEIVE +2024-07-30 12:00:07.628 2 0 7740 SEND +2024-07-30 12:00:07.629 1 3 7742 RECEIVE +2024-07-30 12:00:07.630 0 1 7744 SEND +2024-07-30 12:00:07.631 3 2 7746 RECEIVE +2024-07-30 12:00:07.632 0 1 7732 SEND +2024-07-30 12:00:07.633 1 2 7734 RECEIVE +2024-07-30 12:00:07.634 2 3 7736 SEND +2024-07-30 12:00:07.635 3 0 7738 RECEIVE +2024-07-30 12:00:07.636 1 3 7740 SEND +2024-07-30 12:00:07.637 2 0 7742 RECEIVE +2024-07-30 12:00:07.638 0 2 7744 SEND +2024-07-30 12:00:07.639 3 1 7746 RECEIVE +2024-07-30 12:00:07.640 1 0 7748 SEND +2024-07-30 12:00:07.641 2 1 7750 RECEIVE +2024-07-30 12:00:07.642 3 2 7752 SEND +2024-07-30 12:00:07.643 0 3 7754 RECEIVE +2024-07-30 12:00:07.644 2 0 7756 SEND +2024-07-30 12:00:07.645 1 3 7758 RECEIVE +2024-07-30 12:00:07.646 0 1 7760 SEND +2024-07-30 12:00:07.647 3 2 7762 RECEIVE +2024-07-30 12:00:07.648 0 1 7748 SEND +2024-07-30 12:00:07.649 1 2 7750 RECEIVE +2024-07-30 12:00:07.650 2 3 7752 SEND +2024-07-30 12:00:07.651 3 0 7754 RECEIVE +2024-07-30 12:00:07.652 1 3 7756 SEND +2024-07-30 12:00:07.653 2 0 7758 RECEIVE +2024-07-30 12:00:07.654 0 2 7760 SEND +2024-07-30 12:00:07.655 3 1 7762 RECEIVE +2024-07-30 12:00:07.656 1 0 7764 SEND +2024-07-30 12:00:07.657 2 1 7766 RECEIVE +2024-07-30 12:00:07.658 3 2 7768 SEND +2024-07-30 12:00:07.659 0 3 7770 RECEIVE +2024-07-30 12:00:07.660 2 0 7772 SEND +2024-07-30 12:00:07.661 1 3 7774 RECEIVE +2024-07-30 12:00:07.662 0 1 7776 SEND +2024-07-30 12:00:07.663 3 2 7778 RECEIVE +2024-07-30 12:00:07.664 0 1 7764 SEND +2024-07-30 12:00:07.665 1 2 7766 RECEIVE +2024-07-30 12:00:07.666 2 3 7768 SEND +2024-07-30 12:00:07.667 3 0 7770 RECEIVE +2024-07-30 12:00:07.668 1 3 7772 SEND +2024-07-30 12:00:07.669 2 0 7774 RECEIVE +2024-07-30 12:00:07.670 0 2 7776 SEND +2024-07-30 12:00:07.671 3 1 7778 RECEIVE +2024-07-30 12:00:07.672 1 0 7780 SEND +2024-07-30 12:00:07.673 2 1 7782 RECEIVE +2024-07-30 12:00:07.674 3 2 7784 SEND +2024-07-30 12:00:07.675 0 3 7786 RECEIVE +2024-07-30 12:00:07.676 2 0 7788 SEND +2024-07-30 12:00:07.677 1 3 7790 RECEIVE +2024-07-30 12:00:07.678 0 1 7792 SEND +2024-07-30 12:00:07.679 3 2 7794 RECEIVE +2024-07-30 12:00:07.680 0 1 7780 SEND +2024-07-30 12:00:07.681 1 2 7782 RECEIVE +2024-07-30 12:00:07.682 2 3 7784 SEND +2024-07-30 12:00:07.683 3 0 7786 RECEIVE +2024-07-30 12:00:07.684 1 3 7788 SEND +2024-07-30 12:00:07.685 2 0 7790 RECEIVE +2024-07-30 12:00:07.686 0 2 7792 SEND +2024-07-30 12:00:07.687 3 1 7794 RECEIVE +2024-07-30 12:00:07.688 1 0 7796 SEND +2024-07-30 12:00:07.689 2 1 7798 RECEIVE +2024-07-30 12:00:07.690 3 2 7800 SEND +2024-07-30 12:00:07.691 0 3 7802 RECEIVE +2024-07-30 12:00:07.692 2 0 7804 SEND +2024-07-30 12:00:07.693 1 3 7806 RECEIVE +2024-07-30 12:00:07.694 0 1 7808 SEND +2024-07-30 12:00:07.695 3 2 7810 RECEIVE +2024-07-30 12:00:07.696 0 1 7796 SEND +2024-07-30 12:00:07.697 1 2 7798 RECEIVE +2024-07-30 12:00:07.698 2 3 7800 SEND +2024-07-30 12:00:07.699 3 0 7802 RECEIVE +2024-07-30 12:00:07.700 1 3 7804 SEND +2024-07-30 12:00:07.701 2 0 7806 RECEIVE +2024-07-30 12:00:07.702 0 2 7808 SEND +2024-07-30 12:00:07.703 3 1 7810 RECEIVE +2024-07-30 12:00:07.704 1 0 7812 SEND +2024-07-30 12:00:07.705 2 1 7814 RECEIVE +2024-07-30 12:00:07.706 3 2 7816 SEND +2024-07-30 12:00:07.707 0 3 7818 RECEIVE +2024-07-30 12:00:07.708 2 0 7820 SEND +2024-07-30 12:00:07.709 1 3 7822 RECEIVE +2024-07-30 12:00:07.710 0 1 7824 SEND +2024-07-30 12:00:07.711 3 2 7826 RECEIVE +2024-07-30 12:00:07.712 0 1 7812 SEND +2024-07-30 12:00:07.713 1 2 7814 RECEIVE +2024-07-30 12:00:07.714 2 3 7816 SEND +2024-07-30 12:00:07.715 3 0 7818 RECEIVE +2024-07-30 12:00:07.716 1 3 7820 SEND +2024-07-30 12:00:07.717 2 0 7822 RECEIVE +2024-07-30 12:00:07.718 0 2 7824 SEND +2024-07-30 12:00:07.719 3 1 7826 RECEIVE +2024-07-30 12:00:07.720 1 0 7828 SEND +2024-07-30 12:00:07.721 2 1 7830 RECEIVE +2024-07-30 12:00:07.722 3 2 7832 SEND +2024-07-30 12:00:07.723 0 3 7834 RECEIVE +2024-07-30 12:00:07.724 2 0 7836 SEND +2024-07-30 12:00:07.725 1 3 7838 RECEIVE +2024-07-30 12:00:07.726 0 1 7840 SEND +2024-07-30 12:00:07.727 3 2 7842 RECEIVE +2024-07-30 12:00:07.728 0 1 7828 SEND +2024-07-30 12:00:07.729 1 2 7830 RECEIVE +2024-07-30 12:00:07.730 2 3 7832 SEND +2024-07-30 12:00:07.731 3 0 7834 RECEIVE +2024-07-30 12:00:07.732 1 3 7836 SEND +2024-07-30 12:00:07.733 2 0 7838 RECEIVE +2024-07-30 12:00:07.734 0 2 7840 SEND +2024-07-30 12:00:07.735 3 1 7842 RECEIVE +2024-07-30 12:00:07.736 1 0 7844 SEND +2024-07-30 12:00:07.737 2 1 7846 RECEIVE +2024-07-30 12:00:07.738 3 2 7848 SEND +2024-07-30 12:00:07.739 0 3 7850 RECEIVE +2024-07-30 12:00:07.740 2 0 7852 SEND +2024-07-30 12:00:07.741 1 3 7854 RECEIVE +2024-07-30 12:00:07.742 0 1 7856 SEND +2024-07-30 12:00:07.743 3 2 7858 RECEIVE +2024-07-30 12:00:07.744 0 1 7844 SEND +2024-07-30 12:00:07.745 1 2 7846 RECEIVE +2024-07-30 12:00:07.746 2 3 7848 SEND +2024-07-30 12:00:07.747 3 0 7850 RECEIVE +2024-07-30 12:00:07.748 1 3 7852 SEND +2024-07-30 12:00:07.749 2 0 7854 RECEIVE +2024-07-30 12:00:07.750 0 2 7856 SEND +2024-07-30 12:00:07.751 3 1 7858 RECEIVE +2024-07-30 12:00:07.752 1 0 7860 SEND +2024-07-30 12:00:07.753 2 1 7862 RECEIVE +2024-07-30 12:00:07.754 3 2 7864 SEND +2024-07-30 12:00:07.755 0 3 7866 RECEIVE +2024-07-30 12:00:07.756 2 0 7868 SEND +2024-07-30 12:00:07.757 1 3 7870 RECEIVE +2024-07-30 12:00:07.758 0 1 7872 SEND +2024-07-30 12:00:07.759 3 2 7874 RECEIVE +2024-07-30 12:00:07.760 0 1 7860 SEND +2024-07-30 12:00:07.761 1 2 7862 RECEIVE +2024-07-30 12:00:07.762 2 3 7864 SEND +2024-07-30 12:00:07.763 3 0 7866 RECEIVE +2024-07-30 12:00:07.764 1 3 7868 SEND +2024-07-30 12:00:07.765 2 0 7870 RECEIVE +2024-07-30 12:00:07.766 0 2 7872 SEND +2024-07-30 12:00:07.767 3 1 7874 RECEIVE +2024-07-30 12:00:07.768 1 0 7876 SEND +2024-07-30 12:00:07.769 2 1 7878 RECEIVE +2024-07-30 12:00:07.770 3 2 7880 SEND +2024-07-30 12:00:07.771 0 3 7882 RECEIVE +2024-07-30 12:00:07.772 2 0 7884 SEND +2024-07-30 12:00:07.773 1 3 7886 RECEIVE +2024-07-30 12:00:07.774 0 1 7888 SEND +2024-07-30 12:00:07.775 3 2 7890 RECEIVE +2024-07-30 12:00:07.776 0 1 7876 SEND +2024-07-30 12:00:07.777 1 2 7878 RECEIVE +2024-07-30 12:00:07.778 2 3 7880 SEND +2024-07-30 12:00:07.779 3 0 7882 RECEIVE +2024-07-30 12:00:07.780 1 3 7884 SEND +2024-07-30 12:00:07.781 2 0 7886 RECEIVE +2024-07-30 12:00:07.782 0 2 7888 SEND +2024-07-30 12:00:07.783 3 1 7890 RECEIVE +2024-07-30 12:00:07.784 1 0 7892 SEND +2024-07-30 12:00:07.785 2 1 7894 RECEIVE +2024-07-30 12:00:07.786 3 2 7896 SEND +2024-07-30 12:00:07.787 0 3 7898 RECEIVE +2024-07-30 12:00:07.788 2 0 7900 SEND +2024-07-30 12:00:07.789 1 3 7902 RECEIVE +2024-07-30 12:00:07.790 0 1 7904 SEND +2024-07-30 12:00:07.791 3 2 7906 RECEIVE +2024-07-30 12:00:07.792 0 1 7892 SEND +2024-07-30 12:00:07.793 1 2 7894 RECEIVE +2024-07-30 12:00:07.794 2 3 7896 SEND +2024-07-30 12:00:07.795 3 0 7898 RECEIVE +2024-07-30 12:00:07.796 1 3 7900 SEND +2024-07-30 12:00:07.797 2 0 7902 RECEIVE +2024-07-30 12:00:07.798 0 2 7904 SEND +2024-07-30 12:00:07.799 3 1 7906 RECEIVE +2024-07-30 12:00:07.800 1 0 7908 SEND +2024-07-30 12:00:07.801 2 1 7910 RECEIVE +2024-07-30 12:00:07.802 3 2 7912 SEND +2024-07-30 12:00:07.803 0 3 7914 RECEIVE +2024-07-30 12:00:07.804 2 0 7916 SEND +2024-07-30 12:00:07.805 1 3 7918 RECEIVE +2024-07-30 12:00:07.806 0 1 7920 SEND +2024-07-30 12:00:07.807 3 2 7922 RECEIVE +2024-07-30 12:00:07.808 0 1 7908 SEND +2024-07-30 12:00:07.809 1 2 7910 RECEIVE +2024-07-30 12:00:07.810 2 3 7912 SEND +2024-07-30 12:00:07.811 3 0 7914 RECEIVE +2024-07-30 12:00:07.812 1 3 7916 SEND +2024-07-30 12:00:07.813 2 0 7918 RECEIVE +2024-07-30 12:00:07.814 0 2 7920 SEND +2024-07-30 12:00:07.815 3 1 7922 RECEIVE +2024-07-30 12:00:07.816 1 0 7924 SEND +2024-07-30 12:00:07.817 2 1 7926 RECEIVE +2024-07-30 12:00:07.818 3 2 7928 SEND +2024-07-30 12:00:07.819 0 3 7930 RECEIVE +2024-07-30 12:00:07.820 2 0 7932 SEND +2024-07-30 12:00:07.821 1 3 7934 RECEIVE +2024-07-30 12:00:07.822 0 1 7936 SEND +2024-07-30 12:00:07.823 3 2 7938 RECEIVE +2024-07-30 12:00:07.824 0 1 7924 SEND +2024-07-30 12:00:07.825 1 2 7926 RECEIVE +2024-07-30 12:00:07.826 2 3 7928 SEND +2024-07-30 12:00:07.827 3 0 7930 RECEIVE +2024-07-30 12:00:07.828 1 3 7932 SEND +2024-07-30 12:00:07.829 2 0 7934 RECEIVE +2024-07-30 12:00:07.830 0 2 7936 SEND +2024-07-30 12:00:07.831 3 1 7938 RECEIVE +2024-07-30 12:00:07.832 1 0 7940 SEND +2024-07-30 12:00:07.833 2 1 7942 RECEIVE +2024-07-30 12:00:07.834 3 2 7944 SEND +2024-07-30 12:00:07.835 0 3 7946 RECEIVE +2024-07-30 12:00:07.836 2 0 7948 SEND +2024-07-30 12:00:07.837 1 3 7950 RECEIVE +2024-07-30 12:00:07.838 0 1 7952 SEND +2024-07-30 12:00:07.839 3 2 7954 RECEIVE +2024-07-30 12:00:07.840 0 1 7940 SEND +2024-07-30 12:00:07.841 1 2 7942 RECEIVE +2024-07-30 12:00:07.842 2 3 7944 SEND +2024-07-30 12:00:07.843 3 0 7946 RECEIVE +2024-07-30 12:00:07.844 1 3 7948 SEND +2024-07-30 12:00:07.845 2 0 7950 RECEIVE +2024-07-30 12:00:07.846 0 2 7952 SEND +2024-07-30 12:00:07.847 3 1 7954 RECEIVE +2024-07-30 12:00:07.848 1 0 7956 SEND +2024-07-30 12:00:07.849 2 1 7958 RECEIVE +2024-07-30 12:00:07.850 3 2 7960 SEND +2024-07-30 12:00:07.851 0 3 7962 RECEIVE +2024-07-30 12:00:07.852 2 0 7964 SEND +2024-07-30 12:00:07.853 1 3 7966 RECEIVE +2024-07-30 12:00:07.854 0 1 7968 SEND +2024-07-30 12:00:07.855 3 2 7970 RECEIVE +2024-07-30 12:00:07.856 0 1 7956 SEND +2024-07-30 12:00:07.857 1 2 7958 RECEIVE +2024-07-30 12:00:07.858 2 3 7960 SEND +2024-07-30 12:00:07.859 3 0 7962 RECEIVE +2024-07-30 12:00:07.860 1 3 7964 SEND +2024-07-30 12:00:07.861 2 0 7966 RECEIVE +2024-07-30 12:00:07.862 0 2 7968 SEND +2024-07-30 12:00:07.863 3 1 7970 RECEIVE +2024-07-30 12:00:07.864 1 0 7972 SEND +2024-07-30 12:00:07.865 2 1 7974 RECEIVE +2024-07-30 12:00:07.866 3 2 7976 SEND +2024-07-30 12:00:07.867 0 3 7978 RECEIVE +2024-07-30 12:00:07.868 2 0 7980 SEND +2024-07-30 12:00:07.869 1 3 7982 RECEIVE +2024-07-30 12:00:07.870 0 1 7984 SEND +2024-07-30 12:00:07.871 3 2 7986 RECEIVE +2024-07-30 12:00:07.872 0 1 7972 SEND +2024-07-30 12:00:07.873 1 2 7974 RECEIVE +2024-07-30 12:00:07.874 2 3 7976 SEND +2024-07-30 12:00:07.875 3 0 7978 RECEIVE +2024-07-30 12:00:07.876 1 3 7980 SEND +2024-07-30 12:00:07.877 2 0 7982 RECEIVE +2024-07-30 12:00:07.878 0 2 7984 SEND +2024-07-30 12:00:07.879 3 1 7986 RECEIVE +2024-07-30 12:00:07.880 1 0 7988 SEND +2024-07-30 12:00:07.881 2 1 7990 RECEIVE +2024-07-30 12:00:07.882 3 2 7992 SEND +2024-07-30 12:00:07.883 0 3 7994 RECEIVE +2024-07-30 12:00:07.884 2 0 7996 SEND +2024-07-30 12:00:07.885 1 3 7998 RECEIVE +2024-07-30 12:00:07.886 0 1 8000 SEND +2024-07-30 12:00:07.887 3 2 8002 RECEIVE +2024-07-30 12:00:07.888 0 1 7988 SEND +2024-07-30 12:00:07.889 1 2 7990 RECEIVE +2024-07-30 12:00:07.890 2 3 7992 SEND +2024-07-30 12:00:07.891 3 0 7994 RECEIVE +2024-07-30 12:00:07.892 1 3 7996 SEND +2024-07-30 12:00:07.893 2 0 7998 RECEIVE +2024-07-30 12:00:07.894 0 2 8000 SEND +2024-07-30 12:00:07.895 3 1 8002 RECEIVE +2024-07-30 12:00:07.896 1 0 8004 SEND +2024-07-30 12:00:07.897 2 1 8006 RECEIVE +2024-07-30 12:00:07.898 3 2 8008 SEND +2024-07-30 12:00:07.899 0 3 8010 RECEIVE +2024-07-30 12:00:07.900 2 0 8012 SEND +2024-07-30 12:00:07.901 1 3 8014 RECEIVE +2024-07-30 12:00:07.902 0 1 8016 SEND +2024-07-30 12:00:07.903 3 2 8018 RECEIVE +2024-07-30 12:00:07.904 0 1 8004 SEND +2024-07-30 12:00:07.905 1 2 8006 RECEIVE +2024-07-30 12:00:07.906 2 3 8008 SEND +2024-07-30 12:00:07.907 3 0 8010 RECEIVE +2024-07-30 12:00:07.908 1 3 8012 SEND +2024-07-30 12:00:07.909 2 0 8014 RECEIVE +2024-07-30 12:00:07.910 0 2 8016 SEND +2024-07-30 12:00:07.911 3 1 8018 RECEIVE +2024-07-30 12:00:07.912 1 0 8020 SEND +2024-07-30 12:00:07.913 2 1 8022 RECEIVE +2024-07-30 12:00:07.914 3 2 8024 SEND +2024-07-30 12:00:07.915 0 3 8026 RECEIVE +2024-07-30 12:00:07.916 2 0 8028 SEND +2024-07-30 12:00:07.917 1 3 8030 RECEIVE +2024-07-30 12:00:07.918 0 1 8032 SEND +2024-07-30 12:00:07.919 3 2 8034 RECEIVE +2024-07-30 12:00:07.920 0 1 8020 SEND +2024-07-30 12:00:07.921 1 2 8022 RECEIVE +2024-07-30 12:00:07.922 2 3 8024 SEND +2024-07-30 12:00:07.923 3 0 8026 RECEIVE +2024-07-30 12:00:07.924 1 3 8028 SEND +2024-07-30 12:00:07.925 2 0 8030 RECEIVE +2024-07-30 12:00:07.926 0 2 8032 SEND +2024-07-30 12:00:07.927 3 1 8034 RECEIVE +2024-07-30 12:00:07.928 1 0 8036 SEND +2024-07-30 12:00:07.929 2 1 8038 RECEIVE +2024-07-30 12:00:07.930 3 2 8040 SEND +2024-07-30 12:00:07.931 0 3 8042 RECEIVE +2024-07-30 12:00:07.932 2 0 8044 SEND +2024-07-30 12:00:07.933 1 3 8046 RECEIVE +2024-07-30 12:00:07.934 0 1 8048 SEND +2024-07-30 12:00:07.935 3 2 8050 RECEIVE +2024-07-30 12:00:07.936 0 1 8036 SEND +2024-07-30 12:00:07.937 1 2 8038 RECEIVE +2024-07-30 12:00:07.938 2 3 8040 SEND +2024-07-30 12:00:07.939 3 0 8042 RECEIVE +2024-07-30 12:00:07.940 1 3 8044 SEND +2024-07-30 12:00:07.941 2 0 8046 RECEIVE +2024-07-30 12:00:07.942 0 2 8048 SEND +2024-07-30 12:00:07.943 3 1 8050 RECEIVE +2024-07-30 12:00:07.944 1 0 8052 SEND +2024-07-30 12:00:07.945 2 1 8054 RECEIVE +2024-07-30 12:00:07.946 3 2 8056 SEND +2024-07-30 12:00:07.947 0 3 8058 RECEIVE +2024-07-30 12:00:07.948 2 0 8060 SEND +2024-07-30 12:00:07.949 1 3 8062 RECEIVE +2024-07-30 12:00:07.950 0 1 8064 SEND +2024-07-30 12:00:07.951 3 2 8066 RECEIVE +2024-07-30 12:00:07.952 0 1 8052 SEND +2024-07-30 12:00:07.953 1 2 8054 RECEIVE +2024-07-30 12:00:07.954 2 3 8056 SEND +2024-07-30 12:00:07.955 3 0 8058 RECEIVE +2024-07-30 12:00:07.956 1 3 8060 SEND +2024-07-30 12:00:07.957 2 0 8062 RECEIVE +2024-07-30 12:00:07.958 0 2 8064 SEND +2024-07-30 12:00:07.959 3 1 8066 RECEIVE +2024-07-30 12:00:07.960 1 0 8068 SEND +2024-07-30 12:00:07.961 2 1 8070 RECEIVE +2024-07-30 12:00:07.962 3 2 8072 SEND +2024-07-30 12:00:07.963 0 3 8074 RECEIVE +2024-07-30 12:00:07.964 2 0 8076 SEND +2024-07-30 12:00:07.965 1 3 8078 RECEIVE +2024-07-30 12:00:07.966 0 1 8080 SEND +2024-07-30 12:00:07.967 3 2 8082 RECEIVE +2024-07-30 12:00:07.968 0 1 8068 SEND +2024-07-30 12:00:07.969 1 2 8070 RECEIVE +2024-07-30 12:00:07.970 2 3 8072 SEND +2024-07-30 12:00:07.971 3 0 8074 RECEIVE +2024-07-30 12:00:07.972 1 3 8076 SEND +2024-07-30 12:00:07.973 2 0 8078 RECEIVE +2024-07-30 12:00:07.974 0 2 8080 SEND +2024-07-30 12:00:07.975 3 1 8082 RECEIVE +2024-07-30 12:00:07.976 1 0 8084 SEND +2024-07-30 12:00:07.977 2 1 8086 RECEIVE +2024-07-30 12:00:07.978 3 2 8088 SEND +2024-07-30 12:00:07.979 0 3 8090 RECEIVE +2024-07-30 12:00:07.980 2 0 8092 SEND +2024-07-30 12:00:07.981 1 3 8094 RECEIVE +2024-07-30 12:00:07.982 0 1 8096 SEND +2024-07-30 12:00:07.983 3 2 8098 RECEIVE +2024-07-30 12:00:07.984 0 1 8084 SEND +2024-07-30 12:00:07.985 1 2 8086 RECEIVE +2024-07-30 12:00:07.986 2 3 8088 SEND +2024-07-30 12:00:07.987 3 0 8090 RECEIVE +2024-07-30 12:00:07.988 1 3 8092 SEND +2024-07-30 12:00:07.989 2 0 8094 RECEIVE +2024-07-30 12:00:07.990 0 2 8096 SEND +2024-07-30 12:00:07.991 3 1 8098 RECEIVE +2024-07-30 12:00:07.992 1 0 8100 SEND +2024-07-30 12:00:07.993 2 1 8102 RECEIVE +2024-07-30 12:00:07.994 3 2 8104 SEND +2024-07-30 12:00:07.995 0 3 8106 RECEIVE +2024-07-30 12:00:07.996 2 0 8108 SEND +2024-07-30 12:00:07.997 1 3 8110 RECEIVE +2024-07-30 12:00:07.998 0 1 8112 SEND +2024-07-30 12:00:07.999 3 2 8114 RECEIVE +2024-07-30 12:00:08.000 0 1 8100 SEND +2024-07-30 12:00:08.001 1 2 8102 RECEIVE +2024-07-30 12:00:08.002 2 3 8104 SEND +2024-07-30 12:00:08.003 3 0 8106 RECEIVE +2024-07-30 12:00:08.004 1 3 8108 SEND +2024-07-30 12:00:08.005 2 0 8110 RECEIVE +2024-07-30 12:00:08.006 0 2 8112 SEND +2024-07-30 12:00:08.007 3 1 8114 RECEIVE +2024-07-30 12:00:08.008 1 0 8116 SEND +2024-07-30 12:00:08.009 2 1 8118 RECEIVE +2024-07-30 12:00:08.010 3 2 8120 SEND +2024-07-30 12:00:08.011 0 3 8122 RECEIVE +2024-07-30 12:00:08.012 2 0 8124 SEND +2024-07-30 12:00:08.013 1 3 8126 RECEIVE +2024-07-30 12:00:08.014 0 1 8128 SEND +2024-07-30 12:00:08.015 3 2 8130 RECEIVE +2024-07-30 12:00:08.016 0 1 8116 SEND +2024-07-30 12:00:08.017 1 2 8118 RECEIVE +2024-07-30 12:00:08.018 2 3 8120 SEND +2024-07-30 12:00:08.019 3 0 8122 RECEIVE +2024-07-30 12:00:08.020 1 3 8124 SEND +2024-07-30 12:00:08.021 2 0 8126 RECEIVE +2024-07-30 12:00:08.022 0 2 8128 SEND +2024-07-30 12:00:08.023 3 1 8130 RECEIVE +2024-07-30 12:00:08.024 1 0 8132 SEND +2024-07-30 12:00:08.025 2 1 8134 RECEIVE +2024-07-30 12:00:08.026 3 2 8136 SEND +2024-07-30 12:00:08.027 0 3 8138 RECEIVE +2024-07-30 12:00:08.028 2 0 8140 SEND +2024-07-30 12:00:08.029 1 3 8142 RECEIVE +2024-07-30 12:00:08.030 0 1 8144 SEND +2024-07-30 12:00:08.031 3 2 8146 RECEIVE +2024-07-30 12:00:08.032 0 1 8132 SEND +2024-07-30 12:00:08.033 1 2 8134 RECEIVE +2024-07-30 12:00:08.034 2 3 8136 SEND +2024-07-30 12:00:08.035 3 0 8138 RECEIVE +2024-07-30 12:00:08.036 1 3 8140 SEND +2024-07-30 12:00:08.037 2 0 8142 RECEIVE +2024-07-30 12:00:08.038 0 2 8144 SEND +2024-07-30 12:00:08.039 3 1 8146 RECEIVE +2024-07-30 12:00:08.040 1 0 8148 SEND +2024-07-30 12:00:08.041 2 1 8150 RECEIVE +2024-07-30 12:00:08.042 3 2 8152 SEND +2024-07-30 12:00:08.043 0 3 8154 RECEIVE +2024-07-30 12:00:08.044 2 0 8156 SEND +2024-07-30 12:00:08.045 1 3 8158 RECEIVE +2024-07-30 12:00:08.046 0 1 8160 SEND +2024-07-30 12:00:08.047 3 2 8162 RECEIVE +2024-07-30 12:00:08.048 0 1 8148 SEND +2024-07-30 12:00:08.049 1 2 8150 RECEIVE +2024-07-30 12:00:08.050 2 3 8152 SEND +2024-07-30 12:00:08.051 3 0 8154 RECEIVE +2024-07-30 12:00:08.052 1 3 8156 SEND +2024-07-30 12:00:08.053 2 0 8158 RECEIVE +2024-07-30 12:00:08.054 0 2 8160 SEND +2024-07-30 12:00:08.055 3 1 8162 RECEIVE +2024-07-30 12:00:08.056 1 0 8164 SEND +2024-07-30 12:00:08.057 2 1 8166 RECEIVE +2024-07-30 12:00:08.058 3 2 8168 SEND +2024-07-30 12:00:08.059 0 3 8170 RECEIVE +2024-07-30 12:00:08.060 2 0 8172 SEND +2024-07-30 12:00:08.061 1 3 8174 RECEIVE +2024-07-30 12:00:08.062 0 1 8176 SEND +2024-07-30 12:00:08.063 3 2 8178 RECEIVE +2024-07-30 12:00:08.064 0 1 8164 SEND +2024-07-30 12:00:08.065 1 2 8166 RECEIVE +2024-07-30 12:00:08.066 2 3 8168 SEND +2024-07-30 12:00:08.067 3 0 8170 RECEIVE +2024-07-30 12:00:08.068 1 3 8172 SEND +2024-07-30 12:00:08.069 2 0 8174 RECEIVE +2024-07-30 12:00:08.070 0 2 8176 SEND +2024-07-30 12:00:08.071 3 1 8178 RECEIVE +2024-07-30 12:00:08.072 1 0 8180 SEND +2024-07-30 12:00:08.073 2 1 8182 RECEIVE +2024-07-30 12:00:08.074 3 2 8184 SEND +2024-07-30 12:00:08.075 0 3 8186 RECEIVE +2024-07-30 12:00:08.076 2 0 8188 SEND +2024-07-30 12:00:08.077 1 3 8190 RECEIVE +2024-07-30 12:00:08.078 0 1 8192 SEND +2024-07-30 12:00:08.079 3 2 8194 RECEIVE +2024-07-30 12:00:08.080 0 1 8180 SEND +2024-07-30 12:00:08.081 1 2 8182 RECEIVE +2024-07-30 12:00:08.082 2 3 8184 SEND +2024-07-30 12:00:08.083 3 0 8186 RECEIVE +2024-07-30 12:00:08.084 1 3 8188 SEND +2024-07-30 12:00:08.085 2 0 8190 RECEIVE +2024-07-30 12:00:08.086 0 2 8192 SEND +2024-07-30 12:00:08.087 3 1 8194 RECEIVE +2024-07-30 12:00:08.088 1 0 8196 SEND +2024-07-30 12:00:08.089 2 1 8198 RECEIVE +2024-07-30 12:00:08.090 3 2 8200 SEND +2024-07-30 12:00:08.091 0 3 8202 RECEIVE +2024-07-30 12:00:08.092 2 0 8204 SEND +2024-07-30 12:00:08.093 1 3 8206 RECEIVE +2024-07-30 12:00:08.094 0 1 8208 SEND +2024-07-30 12:00:08.095 3 2 8210 RECEIVE +2024-07-30 12:00:08.096 0 1 8196 SEND +2024-07-30 12:00:08.097 1 2 8198 RECEIVE +2024-07-30 12:00:08.098 2 3 8200 SEND +2024-07-30 12:00:08.099 3 0 8202 RECEIVE +2024-07-30 12:00:08.100 1 3 8204 SEND +2024-07-30 12:00:08.101 2 0 8206 RECEIVE +2024-07-30 12:00:08.102 0 2 8208 SEND +2024-07-30 12:00:08.103 3 1 8210 RECEIVE +2024-07-30 12:00:08.104 1 0 8212 SEND +2024-07-30 12:00:08.105 2 1 8214 RECEIVE +2024-07-30 12:00:08.106 3 2 8216 SEND +2024-07-30 12:00:08.107 0 3 8218 RECEIVE +2024-07-30 12:00:08.108 2 0 8220 SEND +2024-07-30 12:00:08.109 1 3 8222 RECEIVE +2024-07-30 12:00:08.110 0 1 8224 SEND +2024-07-30 12:00:08.111 3 2 8226 RECEIVE +2024-07-30 12:00:08.112 0 1 8212 SEND +2024-07-30 12:00:08.113 1 2 8214 RECEIVE +2024-07-30 12:00:08.114 2 3 8216 SEND +2024-07-30 12:00:08.115 3 0 8218 RECEIVE +2024-07-30 12:00:08.116 1 3 8220 SEND +2024-07-30 12:00:08.117 2 0 8222 RECEIVE +2024-07-30 12:00:08.118 0 2 8224 SEND +2024-07-30 12:00:08.119 3 1 8226 RECEIVE +2024-07-30 12:00:08.120 1 0 8228 SEND +2024-07-30 12:00:08.121 2 1 8230 RECEIVE +2024-07-30 12:00:08.122 3 2 8232 SEND +2024-07-30 12:00:08.123 0 3 8234 RECEIVE +2024-07-30 12:00:08.124 2 0 8236 SEND +2024-07-30 12:00:08.125 1 3 8238 RECEIVE +2024-07-30 12:00:08.126 0 1 8240 SEND +2024-07-30 12:00:08.127 3 2 8242 RECEIVE +2024-07-30 12:00:08.128 0 1 8228 SEND +2024-07-30 12:00:08.129 1 2 8230 RECEIVE +2024-07-30 12:00:08.130 2 3 8232 SEND +2024-07-30 12:00:08.131 3 0 8234 RECEIVE +2024-07-30 12:00:08.132 1 3 8236 SEND +2024-07-30 12:00:08.133 2 0 8238 RECEIVE +2024-07-30 12:00:08.134 0 2 8240 SEND +2024-07-30 12:00:08.135 3 1 8242 RECEIVE +2024-07-30 12:00:08.136 1 0 8244 SEND +2024-07-30 12:00:08.137 2 1 8246 RECEIVE +2024-07-30 12:00:08.138 3 2 8248 SEND +2024-07-30 12:00:08.139 0 3 8250 RECEIVE +2024-07-30 12:00:08.140 2 0 8252 SEND +2024-07-30 12:00:08.141 1 3 8254 RECEIVE +2024-07-30 12:00:08.142 0 1 8256 SEND +2024-07-30 12:00:08.143 3 2 8258 RECEIVE +2024-07-30 12:00:08.144 0 1 8244 SEND +2024-07-30 12:00:08.145 1 2 8246 RECEIVE +2024-07-30 12:00:08.146 2 3 8248 SEND +2024-07-30 12:00:08.147 3 0 8250 RECEIVE +2024-07-30 12:00:08.148 1 3 8252 SEND +2024-07-30 12:00:08.149 2 0 8254 RECEIVE +2024-07-30 12:00:08.150 0 2 8256 SEND +2024-07-30 12:00:08.151 3 1 8258 RECEIVE +2024-07-30 12:00:08.152 1 0 8260 SEND +2024-07-30 12:00:08.153 2 1 8262 RECEIVE +2024-07-30 12:00:08.154 3 2 8264 SEND +2024-07-30 12:00:08.155 0 3 8266 RECEIVE +2024-07-30 12:00:08.156 2 0 8268 SEND +2024-07-30 12:00:08.157 1 3 8270 RECEIVE +2024-07-30 12:00:08.158 0 1 8272 SEND +2024-07-30 12:00:08.159 3 2 8274 RECEIVE +2024-07-30 12:00:08.160 0 1 8260 SEND +2024-07-30 12:00:08.161 1 2 8262 RECEIVE +2024-07-30 12:00:08.162 2 3 8264 SEND +2024-07-30 12:00:08.163 3 0 8266 RECEIVE +2024-07-30 12:00:08.164 1 3 8268 SEND +2024-07-30 12:00:08.165 2 0 8270 RECEIVE +2024-07-30 12:00:08.166 0 2 8272 SEND +2024-07-30 12:00:08.167 3 1 8274 RECEIVE +2024-07-30 12:00:08.168 1 0 8276 SEND +2024-07-30 12:00:08.169 2 1 8278 RECEIVE +2024-07-30 12:00:08.170 3 2 8280 SEND +2024-07-30 12:00:08.171 0 3 8282 RECEIVE +2024-07-30 12:00:08.172 2 0 8284 SEND +2024-07-30 12:00:08.173 1 3 8286 RECEIVE +2024-07-30 12:00:08.174 0 1 8288 SEND +2024-07-30 12:00:08.175 3 2 8290 RECEIVE +2024-07-30 12:00:08.176 0 1 8276 SEND +2024-07-30 12:00:08.177 1 2 8278 RECEIVE +2024-07-30 12:00:08.178 2 3 8280 SEND +2024-07-30 12:00:08.179 3 0 8282 RECEIVE +2024-07-30 12:00:08.180 1 3 8284 SEND +2024-07-30 12:00:08.181 2 0 8286 RECEIVE +2024-07-30 12:00:08.182 0 2 8288 SEND +2024-07-30 12:00:08.183 3 1 8290 RECEIVE +2024-07-30 12:00:08.184 1 0 8292 SEND +2024-07-30 12:00:08.185 2 1 8294 RECEIVE +2024-07-30 12:00:08.186 3 2 8296 SEND +2024-07-30 12:00:08.187 0 3 8298 RECEIVE +2024-07-30 12:00:08.188 2 0 8300 SEND +2024-07-30 12:00:08.189 1 3 8302 RECEIVE +2024-07-30 12:00:08.190 0 1 8304 SEND +2024-07-30 12:00:08.191 3 2 8306 RECEIVE +2024-07-30 12:00:08.192 0 1 8292 SEND +2024-07-30 12:00:08.193 1 2 8294 RECEIVE +2024-07-30 12:00:08.194 2 3 8296 SEND +2024-07-30 12:00:08.195 3 0 8298 RECEIVE +2024-07-30 12:00:08.196 1 3 8300 SEND +2024-07-30 12:00:08.197 2 0 8302 RECEIVE +2024-07-30 12:00:08.198 0 2 8304 SEND +2024-07-30 12:00:08.199 3 1 8306 RECEIVE +2024-07-30 12:00:08.200 1 0 8308 SEND +2024-07-30 12:00:08.201 2 1 8310 RECEIVE +2024-07-30 12:00:08.202 3 2 8312 SEND +2024-07-30 12:00:08.203 0 3 8314 RECEIVE +2024-07-30 12:00:08.204 2 0 8316 SEND +2024-07-30 12:00:08.205 1 3 8318 RECEIVE +2024-07-30 12:00:08.206 0 1 8320 SEND +2024-07-30 12:00:08.207 3 2 8322 RECEIVE +2024-07-30 12:00:08.208 0 1 8308 SEND +2024-07-30 12:00:08.209 1 2 8310 RECEIVE +2024-07-30 12:00:08.210 2 3 8312 SEND +2024-07-30 12:00:08.211 3 0 8314 RECEIVE +2024-07-30 12:00:08.212 1 3 8316 SEND +2024-07-30 12:00:08.213 2 0 8318 RECEIVE +2024-07-30 12:00:08.214 0 2 8320 SEND +2024-07-30 12:00:08.215 3 1 8322 RECEIVE +2024-07-30 12:00:08.216 1 0 8324 SEND +2024-07-30 12:00:08.217 2 1 8326 RECEIVE +2024-07-30 12:00:08.218 3 2 8328 SEND +2024-07-30 12:00:08.219 0 3 8330 RECEIVE +2024-07-30 12:00:08.220 2 0 8332 SEND +2024-07-30 12:00:08.221 1 3 8334 RECEIVE +2024-07-30 12:00:08.222 0 1 8336 SEND +2024-07-30 12:00:08.223 3 2 8338 RECEIVE +2024-07-30 12:00:08.224 0 1 8324 SEND +2024-07-30 12:00:08.225 1 2 8326 RECEIVE +2024-07-30 12:00:08.226 2 3 8328 SEND +2024-07-30 12:00:08.227 3 0 8330 RECEIVE +2024-07-30 12:00:08.228 1 3 8332 SEND +2024-07-30 12:00:08.229 2 0 8334 RECEIVE +2024-07-30 12:00:08.230 0 2 8336 SEND +2024-07-30 12:00:08.231 3 1 8338 RECEIVE +2024-07-30 12:00:08.232 1 0 8340 SEND +2024-07-30 12:00:08.233 2 1 8342 RECEIVE +2024-07-30 12:00:08.234 3 2 8344 SEND +2024-07-30 12:00:08.235 0 3 8346 RECEIVE +2024-07-30 12:00:08.236 2 0 8348 SEND +2024-07-30 12:00:08.237 1 3 8350 RECEIVE +2024-07-30 12:00:08.238 0 1 8352 SEND +2024-07-30 12:00:08.239 3 2 8354 RECEIVE +2024-07-30 12:00:08.240 0 1 8340 SEND +2024-07-30 12:00:08.241 1 2 8342 RECEIVE +2024-07-30 12:00:08.242 2 3 8344 SEND +2024-07-30 12:00:08.243 3 0 8346 RECEIVE +2024-07-30 12:00:08.244 1 3 8348 SEND +2024-07-30 12:00:08.245 2 0 8350 RECEIVE +2024-07-30 12:00:08.246 0 2 8352 SEND +2024-07-30 12:00:08.247 3 1 8354 RECEIVE +2024-07-30 12:00:08.248 1 0 8356 SEND +2024-07-30 12:00:08.249 2 1 8358 RECEIVE +2024-07-30 12:00:08.250 3 2 8360 SEND +2024-07-30 12:00:08.251 0 3 8362 RECEIVE +2024-07-30 12:00:08.252 2 0 8364 SEND +2024-07-30 12:00:08.253 1 3 8366 RECEIVE +2024-07-30 12:00:08.254 0 1 8368 SEND +2024-07-30 12:00:08.255 3 2 8370 RECEIVE +2024-07-30 12:00:08.256 0 1 8356 SEND +2024-07-30 12:00:08.257 1 2 8358 RECEIVE +2024-07-30 12:00:08.258 2 3 8360 SEND +2024-07-30 12:00:08.259 3 0 8362 RECEIVE +2024-07-30 12:00:08.260 1 3 8364 SEND +2024-07-30 12:00:08.261 2 0 8366 RECEIVE +2024-07-30 12:00:08.262 0 2 8368 SEND +2024-07-30 12:00:08.263 3 1 8370 RECEIVE +2024-07-30 12:00:08.264 1 0 8372 SEND +2024-07-30 12:00:08.265 2 1 8374 RECEIVE +2024-07-30 12:00:08.266 3 2 8376 SEND +2024-07-30 12:00:08.267 0 3 8378 RECEIVE +2024-07-30 12:00:08.268 2 0 8380 SEND +2024-07-30 12:00:08.269 1 3 8382 RECEIVE +2024-07-30 12:00:08.270 0 1 8384 SEND +2024-07-30 12:00:08.271 3 2 8386 RECEIVE +2024-07-30 12:00:08.272 0 1 8372 SEND +2024-07-30 12:00:08.273 1 2 8374 RECEIVE +2024-07-30 12:00:08.274 2 3 8376 SEND +2024-07-30 12:00:08.275 3 0 8378 RECEIVE +2024-07-30 12:00:08.276 1 3 8380 SEND +2024-07-30 12:00:08.277 2 0 8382 RECEIVE +2024-07-30 12:00:08.278 0 2 8384 SEND +2024-07-30 12:00:08.279 3 1 8386 RECEIVE +2024-07-30 12:00:08.280 1 0 8388 SEND +2024-07-30 12:00:08.281 2 1 8390 RECEIVE +2024-07-30 12:00:08.282 3 2 8392 SEND +2024-07-30 12:00:08.283 0 3 8394 RECEIVE +2024-07-30 12:00:08.284 2 0 8396 SEND +2024-07-30 12:00:08.285 1 3 8398 RECEIVE +2024-07-30 12:00:08.286 0 1 8400 SEND +2024-07-30 12:00:08.287 3 2 8402 RECEIVE +2024-07-30 12:00:08.288 0 1 8388 SEND +2024-07-30 12:00:08.289 1 2 8390 RECEIVE +2024-07-30 12:00:08.290 2 3 8392 SEND +2024-07-30 12:00:08.291 3 0 8394 RECEIVE +2024-07-30 12:00:08.292 1 3 8396 SEND +2024-07-30 12:00:08.293 2 0 8398 RECEIVE +2024-07-30 12:00:08.294 0 2 8400 SEND +2024-07-30 12:00:08.295 3 1 8402 RECEIVE +2024-07-30 12:00:08.296 1 0 8404 SEND +2024-07-30 12:00:08.297 2 1 8406 RECEIVE +2024-07-30 12:00:08.298 3 2 8408 SEND +2024-07-30 12:00:08.299 0 3 8410 RECEIVE +2024-07-30 12:00:08.300 2 0 8412 SEND +2024-07-30 12:00:08.301 1 3 8414 RECEIVE +2024-07-30 12:00:08.302 0 1 8416 SEND +2024-07-30 12:00:08.303 3 2 8418 RECEIVE +2024-07-30 12:00:08.304 0 1 8404 SEND +2024-07-30 12:00:08.305 1 2 8406 RECEIVE +2024-07-30 12:00:08.306 2 3 8408 SEND +2024-07-30 12:00:08.307 3 0 8410 RECEIVE +2024-07-30 12:00:08.308 1 3 8412 SEND +2024-07-30 12:00:08.309 2 0 8414 RECEIVE +2024-07-30 12:00:08.310 0 2 8416 SEND +2024-07-30 12:00:08.311 3 1 8418 RECEIVE +2024-07-30 12:00:08.312 1 0 8420 SEND +2024-07-30 12:00:08.313 2 1 8422 RECEIVE +2024-07-30 12:00:08.314 3 2 8424 SEND +2024-07-30 12:00:08.315 0 3 8426 RECEIVE +2024-07-30 12:00:08.316 2 0 8428 SEND +2024-07-30 12:00:08.317 1 3 8430 RECEIVE +2024-07-30 12:00:08.318 0 1 8432 SEND +2024-07-30 12:00:08.319 3 2 8434 RECEIVE +2024-07-30 12:00:08.320 0 1 8420 SEND +2024-07-30 12:00:08.321 1 2 8422 RECEIVE +2024-07-30 12:00:08.322 2 3 8424 SEND +2024-07-30 12:00:08.323 3 0 8426 RECEIVE +2024-07-30 12:00:08.324 1 3 8428 SEND +2024-07-30 12:00:08.325 2 0 8430 RECEIVE +2024-07-30 12:00:08.326 0 2 8432 SEND +2024-07-30 12:00:08.327 3 1 8434 RECEIVE +2024-07-30 12:00:08.328 1 0 8436 SEND +2024-07-30 12:00:08.329 2 1 8438 RECEIVE +2024-07-30 12:00:08.330 3 2 8440 SEND +2024-07-30 12:00:08.331 0 3 8442 RECEIVE +2024-07-30 12:00:08.332 2 0 8444 SEND +2024-07-30 12:00:08.333 1 3 8446 RECEIVE +2024-07-30 12:00:08.334 0 1 8448 SEND +2024-07-30 12:00:08.335 3 2 8450 RECEIVE +2024-07-30 12:00:08.336 0 1 8436 SEND +2024-07-30 12:00:08.337 1 2 8438 RECEIVE +2024-07-30 12:00:08.338 2 3 8440 SEND +2024-07-30 12:00:08.339 3 0 8442 RECEIVE +2024-07-30 12:00:08.340 1 3 8444 SEND +2024-07-30 12:00:08.341 2 0 8446 RECEIVE +2024-07-30 12:00:08.342 0 2 8448 SEND +2024-07-30 12:00:08.343 3 1 8450 RECEIVE +2024-07-30 12:00:08.344 1 0 8452 SEND +2024-07-30 12:00:08.345 2 1 8454 RECEIVE +2024-07-30 12:00:08.346 3 2 8456 SEND +2024-07-30 12:00:08.347 0 3 8458 RECEIVE +2024-07-30 12:00:08.348 2 0 8460 SEND +2024-07-30 12:00:08.349 1 3 8462 RECEIVE +2024-07-30 12:00:08.350 0 1 8464 SEND +2024-07-30 12:00:08.351 3 2 8466 RECEIVE +2024-07-30 12:00:08.352 0 1 8452 SEND +2024-07-30 12:00:08.353 1 2 8454 RECEIVE +2024-07-30 12:00:08.354 2 3 8456 SEND +2024-07-30 12:00:08.355 3 0 8458 RECEIVE +2024-07-30 12:00:08.356 1 3 8460 SEND +2024-07-30 12:00:08.357 2 0 8462 RECEIVE +2024-07-30 12:00:08.358 0 2 8464 SEND +2024-07-30 12:00:08.359 3 1 8466 RECEIVE +2024-07-30 12:00:08.360 1 0 8468 SEND +2024-07-30 12:00:08.361 2 1 8470 RECEIVE +2024-07-30 12:00:08.362 3 2 8472 SEND +2024-07-30 12:00:08.363 0 3 8474 RECEIVE +2024-07-30 12:00:08.364 2 0 8476 SEND +2024-07-30 12:00:08.365 1 3 8478 RECEIVE +2024-07-30 12:00:08.366 0 1 8480 SEND +2024-07-30 12:00:08.367 3 2 8482 RECEIVE +2024-07-30 12:00:08.368 0 1 8468 SEND +2024-07-30 12:00:08.369 1 2 8470 RECEIVE +2024-07-30 12:00:08.370 2 3 8472 SEND +2024-07-30 12:00:08.371 3 0 8474 RECEIVE +2024-07-30 12:00:08.372 1 3 8476 SEND +2024-07-30 12:00:08.373 2 0 8478 RECEIVE +2024-07-30 12:00:08.374 0 2 8480 SEND +2024-07-30 12:00:08.375 3 1 8482 RECEIVE +2024-07-30 12:00:08.376 1 0 8484 SEND +2024-07-30 12:00:08.377 2 1 8486 RECEIVE +2024-07-30 12:00:08.378 3 2 8488 SEND +2024-07-30 12:00:08.379 0 3 8490 RECEIVE +2024-07-30 12:00:08.380 2 0 8492 SEND +2024-07-30 12:00:08.381 1 3 8494 RECEIVE +2024-07-30 12:00:08.382 0 1 8496 SEND +2024-07-30 12:00:08.383 3 2 8498 RECEIVE +2024-07-30 12:00:08.384 0 1 8484 SEND +2024-07-30 12:00:08.385 1 2 8486 RECEIVE +2024-07-30 12:00:08.386 2 3 8488 SEND +2024-07-30 12:00:08.387 3 0 8490 RECEIVE +2024-07-30 12:00:08.388 1 3 8492 SEND +2024-07-30 12:00:08.389 2 0 8494 RECEIVE +2024-07-30 12:00:08.390 0 2 8496 SEND +2024-07-30 12:00:08.391 3 1 8498 RECEIVE +2024-07-30 12:00:08.392 1 0 8500 SEND +2024-07-30 12:00:08.393 2 1 8502 RECEIVE +2024-07-30 12:00:08.394 3 2 8504 SEND +2024-07-30 12:00:08.395 0 3 8506 RECEIVE +2024-07-30 12:00:08.396 2 0 8508 SEND +2024-07-30 12:00:08.397 1 3 8510 RECEIVE +2024-07-30 12:00:08.398 0 1 8512 SEND +2024-07-30 12:00:08.399 3 2 8514 RECEIVE +2024-07-30 12:00:08.400 0 1 8500 SEND +2024-07-30 12:00:08.401 1 2 8502 RECEIVE +2024-07-30 12:00:08.402 2 3 8504 SEND +2024-07-30 12:00:08.403 3 0 8506 RECEIVE +2024-07-30 12:00:08.404 1 3 8508 SEND +2024-07-30 12:00:08.405 2 0 8510 RECEIVE +2024-07-30 12:00:08.406 0 2 8512 SEND +2024-07-30 12:00:08.407 3 1 8514 RECEIVE +2024-07-30 12:00:08.408 1 0 8516 SEND +2024-07-30 12:00:08.409 2 1 8518 RECEIVE +2024-07-30 12:00:08.410 3 2 8520 SEND +2024-07-30 12:00:08.411 0 3 8522 RECEIVE +2024-07-30 12:00:08.412 2 0 8524 SEND +2024-07-30 12:00:08.413 1 3 8526 RECEIVE +2024-07-30 12:00:08.414 0 1 8528 SEND +2024-07-30 12:00:08.415 3 2 8530 RECEIVE +2024-07-30 12:00:08.416 0 1 8516 SEND +2024-07-30 12:00:08.417 1 2 8518 RECEIVE +2024-07-30 12:00:08.418 2 3 8520 SEND +2024-07-30 12:00:08.419 3 0 8522 RECEIVE +2024-07-30 12:00:08.420 1 3 8524 SEND +2024-07-30 12:00:08.421 2 0 8526 RECEIVE +2024-07-30 12:00:08.422 0 2 8528 SEND +2024-07-30 12:00:08.423 3 1 8530 RECEIVE +2024-07-30 12:00:08.424 1 0 8532 SEND +2024-07-30 12:00:08.425 2 1 8534 RECEIVE +2024-07-30 12:00:08.426 3 2 8536 SEND +2024-07-30 12:00:08.427 0 3 8538 RECEIVE +2024-07-30 12:00:08.428 2 0 8540 SEND +2024-07-30 12:00:08.429 1 3 8542 RECEIVE +2024-07-30 12:00:08.430 0 1 8544 SEND +2024-07-30 12:00:08.431 3 2 8546 RECEIVE +2024-07-30 12:00:08.432 0 1 8532 SEND +2024-07-30 12:00:08.433 1 2 8534 RECEIVE +2024-07-30 12:00:08.434 2 3 8536 SEND +2024-07-30 12:00:08.435 3 0 8538 RECEIVE +2024-07-30 12:00:08.436 1 3 8540 SEND +2024-07-30 12:00:08.437 2 0 8542 RECEIVE +2024-07-30 12:00:08.438 0 2 8544 SEND +2024-07-30 12:00:08.439 3 1 8546 RECEIVE +2024-07-30 12:00:08.440 1 0 8548 SEND +2024-07-30 12:00:08.441 2 1 8550 RECEIVE +2024-07-30 12:00:08.442 3 2 8552 SEND +2024-07-30 12:00:08.443 0 3 8554 RECEIVE +2024-07-30 12:00:08.444 2 0 8556 SEND +2024-07-30 12:00:08.445 1 3 8558 RECEIVE +2024-07-30 12:00:08.446 0 1 8560 SEND +2024-07-30 12:00:08.447 3 2 8562 RECEIVE +2024-07-30 12:00:08.448 0 1 8548 SEND +2024-07-30 12:00:08.449 1 2 8550 RECEIVE +2024-07-30 12:00:08.450 2 3 8552 SEND +2024-07-30 12:00:08.451 3 0 8554 RECEIVE +2024-07-30 12:00:08.452 1 3 8556 SEND +2024-07-30 12:00:08.453 2 0 8558 RECEIVE +2024-07-30 12:00:08.454 0 2 8560 SEND +2024-07-30 12:00:08.455 3 1 8562 RECEIVE +2024-07-30 12:00:08.456 1 0 8564 SEND +2024-07-30 12:00:08.457 2 1 8566 RECEIVE +2024-07-30 12:00:08.458 3 2 8568 SEND +2024-07-30 12:00:08.459 0 3 8570 RECEIVE +2024-07-30 12:00:08.460 2 0 8572 SEND +2024-07-30 12:00:08.461 1 3 8574 RECEIVE +2024-07-30 12:00:08.462 0 1 8576 SEND +2024-07-30 12:00:08.463 3 2 8578 RECEIVE +2024-07-30 12:00:08.464 0 1 8564 SEND +2024-07-30 12:00:08.465 1 2 8566 RECEIVE +2024-07-30 12:00:08.466 2 3 8568 SEND +2024-07-30 12:00:08.467 3 0 8570 RECEIVE +2024-07-30 12:00:08.468 1 3 8572 SEND +2024-07-30 12:00:08.469 2 0 8574 RECEIVE +2024-07-30 12:00:08.470 0 2 8576 SEND +2024-07-30 12:00:08.471 3 1 8578 RECEIVE +2024-07-30 12:00:08.472 1 0 8580 SEND +2024-07-30 12:00:08.473 2 1 8582 RECEIVE +2024-07-30 12:00:08.474 3 2 8584 SEND +2024-07-30 12:00:08.475 0 3 8586 RECEIVE +2024-07-30 12:00:08.476 2 0 8588 SEND +2024-07-30 12:00:08.477 1 3 8590 RECEIVE +2024-07-30 12:00:08.478 0 1 8592 SEND +2024-07-30 12:00:08.479 3 2 8594 RECEIVE +2024-07-30 12:00:08.480 0 1 8580 SEND +2024-07-30 12:00:08.481 1 2 8582 RECEIVE +2024-07-30 12:00:08.482 2 3 8584 SEND +2024-07-30 12:00:08.483 3 0 8586 RECEIVE +2024-07-30 12:00:08.484 1 3 8588 SEND +2024-07-30 12:00:08.485 2 0 8590 RECEIVE +2024-07-30 12:00:08.486 0 2 8592 SEND +2024-07-30 12:00:08.487 3 1 8594 RECEIVE +2024-07-30 12:00:08.488 1 0 8596 SEND +2024-07-30 12:00:08.489 2 1 8598 RECEIVE +2024-07-30 12:00:08.490 3 2 8600 SEND +2024-07-30 12:00:08.491 0 3 8602 RECEIVE +2024-07-30 12:00:08.492 2 0 8604 SEND +2024-07-30 12:00:08.493 1 3 8606 RECEIVE +2024-07-30 12:00:08.494 0 1 8608 SEND +2024-07-30 12:00:08.495 3 2 8610 RECEIVE +2024-07-30 12:00:08.496 0 1 8596 SEND +2024-07-30 12:00:08.497 1 2 8598 RECEIVE +2024-07-30 12:00:08.498 2 3 8600 SEND +2024-07-30 12:00:08.499 3 0 8602 RECEIVE +2024-07-30 12:00:08.500 1 3 8604 SEND +2024-07-30 12:00:08.501 2 0 8606 RECEIVE +2024-07-30 12:00:08.502 0 2 8608 SEND +2024-07-30 12:00:08.503 3 1 8610 RECEIVE +2024-07-30 12:00:08.504 1 0 8612 SEND +2024-07-30 12:00:08.505 2 1 8614 RECEIVE +2024-07-30 12:00:08.506 3 2 8616 SEND +2024-07-30 12:00:08.507 0 3 8618 RECEIVE +2024-07-30 12:00:08.508 2 0 8620 SEND +2024-07-30 12:00:08.509 1 3 8622 RECEIVE +2024-07-30 12:00:08.510 0 1 8624 SEND +2024-07-30 12:00:08.511 3 2 8626 RECEIVE +2024-07-30 12:00:08.512 0 1 8612 SEND +2024-07-30 12:00:08.513 1 2 8614 RECEIVE +2024-07-30 12:00:08.514 2 3 8616 SEND +2024-07-30 12:00:08.515 3 0 8618 RECEIVE +2024-07-30 12:00:08.516 1 3 8620 SEND +2024-07-30 12:00:08.517 2 0 8622 RECEIVE +2024-07-30 12:00:08.518 0 2 8624 SEND +2024-07-30 12:00:08.519 3 1 8626 RECEIVE +2024-07-30 12:00:08.520 1 0 8628 SEND +2024-07-30 12:00:08.521 2 1 8630 RECEIVE +2024-07-30 12:00:08.522 3 2 8632 SEND +2024-07-30 12:00:08.523 0 3 8634 RECEIVE +2024-07-30 12:00:08.524 2 0 8636 SEND +2024-07-30 12:00:08.525 1 3 8638 RECEIVE +2024-07-30 12:00:08.526 0 1 8640 SEND +2024-07-30 12:00:08.527 3 2 8642 RECEIVE +2024-07-30 12:00:08.528 0 1 8628 SEND +2024-07-30 12:00:08.529 1 2 8630 RECEIVE +2024-07-30 12:00:08.530 2 3 8632 SEND +2024-07-30 12:00:08.531 3 0 8634 RECEIVE +2024-07-30 12:00:08.532 1 3 8636 SEND +2024-07-30 12:00:08.533 2 0 8638 RECEIVE +2024-07-30 12:00:08.534 0 2 8640 SEND +2024-07-30 12:00:08.535 3 1 8642 RECEIVE +2024-07-30 12:00:08.536 1 0 8644 SEND +2024-07-30 12:00:08.537 2 1 8646 RECEIVE +2024-07-30 12:00:08.538 3 2 8648 SEND +2024-07-30 12:00:08.539 0 3 8650 RECEIVE +2024-07-30 12:00:08.540 2 0 8652 SEND +2024-07-30 12:00:08.541 1 3 8654 RECEIVE +2024-07-30 12:00:08.542 0 1 8656 SEND +2024-07-30 12:00:08.543 3 2 8658 RECEIVE +2024-07-30 12:00:08.544 0 1 8644 SEND +2024-07-30 12:00:08.545 1 2 8646 RECEIVE +2024-07-30 12:00:08.546 2 3 8648 SEND +2024-07-30 12:00:08.547 3 0 8650 RECEIVE +2024-07-30 12:00:08.548 1 3 8652 SEND +2024-07-30 12:00:08.549 2 0 8654 RECEIVE +2024-07-30 12:00:08.550 0 2 8656 SEND +2024-07-30 12:00:08.551 3 1 8658 RECEIVE +2024-07-30 12:00:08.552 1 0 8660 SEND +2024-07-30 12:00:08.553 2 1 8662 RECEIVE +2024-07-30 12:00:08.554 3 2 8664 SEND +2024-07-30 12:00:08.555 0 3 8666 RECEIVE +2024-07-30 12:00:08.556 2 0 8668 SEND +2024-07-30 12:00:08.557 1 3 8670 RECEIVE +2024-07-30 12:00:08.558 0 1 8672 SEND +2024-07-30 12:00:08.559 3 2 8674 RECEIVE +2024-07-30 12:00:08.560 0 1 8660 SEND +2024-07-30 12:00:08.561 1 2 8662 RECEIVE +2024-07-30 12:00:08.562 2 3 8664 SEND +2024-07-30 12:00:08.563 3 0 8666 RECEIVE +2024-07-30 12:00:08.564 1 3 8668 SEND +2024-07-30 12:00:08.565 2 0 8670 RECEIVE +2024-07-30 12:00:08.566 0 2 8672 SEND +2024-07-30 12:00:08.567 3 1 8674 RECEIVE +2024-07-30 12:00:08.568 1 0 8676 SEND +2024-07-30 12:00:08.569 2 1 8678 RECEIVE +2024-07-30 12:00:08.570 3 2 8680 SEND +2024-07-30 12:00:08.571 0 3 8682 RECEIVE +2024-07-30 12:00:08.572 2 0 8684 SEND +2024-07-30 12:00:08.573 1 3 8686 RECEIVE +2024-07-30 12:00:08.574 0 1 8688 SEND +2024-07-30 12:00:08.575 3 2 8690 RECEIVE +2024-07-30 12:00:08.576 0 1 8676 SEND +2024-07-30 12:00:08.577 1 2 8678 RECEIVE +2024-07-30 12:00:08.578 2 3 8680 SEND +2024-07-30 12:00:08.579 3 0 8682 RECEIVE +2024-07-30 12:00:08.580 1 3 8684 SEND +2024-07-30 12:00:08.581 2 0 8686 RECEIVE +2024-07-30 12:00:08.582 0 2 8688 SEND +2024-07-30 12:00:08.583 3 1 8690 RECEIVE +2024-07-30 12:00:08.584 1 0 8692 SEND +2024-07-30 12:00:08.585 2 1 8694 RECEIVE +2024-07-30 12:00:08.586 3 2 8696 SEND +2024-07-30 12:00:08.587 0 3 8698 RECEIVE +2024-07-30 12:00:08.588 2 0 8700 SEND +2024-07-30 12:00:08.589 1 3 8702 RECEIVE +2024-07-30 12:00:08.590 0 1 8704 SEND +2024-07-30 12:00:08.591 3 2 8706 RECEIVE +2024-07-30 12:00:08.592 0 1 8692 SEND +2024-07-30 12:00:08.593 1 2 8694 RECEIVE +2024-07-30 12:00:08.594 2 3 8696 SEND +2024-07-30 12:00:08.595 3 0 8698 RECEIVE +2024-07-30 12:00:08.596 1 3 8700 SEND +2024-07-30 12:00:08.597 2 0 8702 RECEIVE +2024-07-30 12:00:08.598 0 2 8704 SEND +2024-07-30 12:00:08.599 3 1 8706 RECEIVE +2024-07-30 12:00:08.600 1 0 8708 SEND +2024-07-30 12:00:08.601 2 1 8710 RECEIVE +2024-07-30 12:00:08.602 3 2 8712 SEND +2024-07-30 12:00:08.603 0 3 8714 RECEIVE +2024-07-30 12:00:08.604 2 0 8716 SEND +2024-07-30 12:00:08.605 1 3 8718 RECEIVE +2024-07-30 12:00:08.606 0 1 8720 SEND +2024-07-30 12:00:08.607 3 2 8722 RECEIVE +2024-07-30 12:00:08.608 0 1 8708 SEND +2024-07-30 12:00:08.609 1 2 8710 RECEIVE +2024-07-30 12:00:08.610 2 3 8712 SEND +2024-07-30 12:00:08.611 3 0 8714 RECEIVE +2024-07-30 12:00:08.612 1 3 8716 SEND +2024-07-30 12:00:08.613 2 0 8718 RECEIVE +2024-07-30 12:00:08.614 0 2 8720 SEND +2024-07-30 12:00:08.615 3 1 8722 RECEIVE +2024-07-30 12:00:08.616 1 0 8724 SEND +2024-07-30 12:00:08.617 2 1 8726 RECEIVE +2024-07-30 12:00:08.618 3 2 8728 SEND +2024-07-30 12:00:08.619 0 3 8730 RECEIVE +2024-07-30 12:00:08.620 2 0 8732 SEND +2024-07-30 12:00:08.621 1 3 8734 RECEIVE +2024-07-30 12:00:08.622 0 1 8736 SEND +2024-07-30 12:00:08.623 3 2 8738 RECEIVE +2024-07-30 12:00:08.624 0 1 8724 SEND +2024-07-30 12:00:08.625 1 2 8726 RECEIVE +2024-07-30 12:00:08.626 2 3 8728 SEND +2024-07-30 12:00:08.627 3 0 8730 RECEIVE +2024-07-30 12:00:08.628 1 3 8732 SEND +2024-07-30 12:00:08.629 2 0 8734 RECEIVE +2024-07-30 12:00:08.630 0 2 8736 SEND +2024-07-30 12:00:08.631 3 1 8738 RECEIVE +2024-07-30 12:00:08.632 1 0 8740 SEND +2024-07-30 12:00:08.633 2 1 8742 RECEIVE +2024-07-30 12:00:08.634 3 2 8744 SEND +2024-07-30 12:00:08.635 0 3 8746 RECEIVE +2024-07-30 12:00:08.636 2 0 8748 SEND +2024-07-30 12:00:08.637 1 3 8750 RECEIVE +2024-07-30 12:00:08.638 0 1 8752 SEND +2024-07-30 12:00:08.639 3 2 8754 RECEIVE +2024-07-30 12:00:08.640 0 1 8740 SEND +2024-07-30 12:00:08.641 1 2 8742 RECEIVE +2024-07-30 12:00:08.642 2 3 8744 SEND +2024-07-30 12:00:08.643 3 0 8746 RECEIVE +2024-07-30 12:00:08.644 1 3 8748 SEND +2024-07-30 12:00:08.645 2 0 8750 RECEIVE +2024-07-30 12:00:08.646 0 2 8752 SEND +2024-07-30 12:00:08.647 3 1 8754 RECEIVE +2024-07-30 12:00:08.648 1 0 8756 SEND +2024-07-30 12:00:08.649 2 1 8758 RECEIVE +2024-07-30 12:00:08.650 3 2 8760 SEND +2024-07-30 12:00:08.651 0 3 8762 RECEIVE +2024-07-30 12:00:08.652 2 0 8764 SEND +2024-07-30 12:00:08.653 1 3 8766 RECEIVE +2024-07-30 12:00:08.654 0 1 8768 SEND +2024-07-30 12:00:08.655 3 2 8770 RECEIVE +2024-07-30 12:00:08.656 0 1 8756 SEND +2024-07-30 12:00:08.657 1 2 8758 RECEIVE +2024-07-30 12:00:08.658 2 3 8760 SEND +2024-07-30 12:00:08.659 3 0 8762 RECEIVE +2024-07-30 12:00:08.660 1 3 8764 SEND +2024-07-30 12:00:08.661 2 0 8766 RECEIVE +2024-07-30 12:00:08.662 0 2 8768 SEND +2024-07-30 12:00:08.663 3 1 8770 RECEIVE +2024-07-30 12:00:08.664 1 0 8772 SEND +2024-07-30 12:00:08.665 2 1 8774 RECEIVE +2024-07-30 12:00:08.666 3 2 8776 SEND +2024-07-30 12:00:08.667 0 3 8778 RECEIVE +2024-07-30 12:00:08.668 2 0 8780 SEND +2024-07-30 12:00:08.669 1 3 8782 RECEIVE +2024-07-30 12:00:08.670 0 1 8784 SEND +2024-07-30 12:00:08.671 3 2 8786 RECEIVE +2024-07-30 12:00:08.672 0 1 8772 SEND +2024-07-30 12:00:08.673 1 2 8774 RECEIVE +2024-07-30 12:00:08.674 2 3 8776 SEND +2024-07-30 12:00:08.675 3 0 8778 RECEIVE +2024-07-30 12:00:08.676 1 3 8780 SEND +2024-07-30 12:00:08.677 2 0 8782 RECEIVE +2024-07-30 12:00:08.678 0 2 8784 SEND +2024-07-30 12:00:08.679 3 1 8786 RECEIVE +2024-07-30 12:00:08.680 1 0 8788 SEND +2024-07-30 12:00:08.681 2 1 8790 RECEIVE +2024-07-30 12:00:08.682 3 2 8792 SEND +2024-07-30 12:00:08.683 0 3 8794 RECEIVE +2024-07-30 12:00:08.684 2 0 8796 SEND +2024-07-30 12:00:08.685 1 3 8798 RECEIVE +2024-07-30 12:00:08.686 0 1 8800 SEND +2024-07-30 12:00:08.687 3 2 8802 RECEIVE +2024-07-30 12:00:08.688 0 1 8788 SEND +2024-07-30 12:00:08.689 1 2 8790 RECEIVE +2024-07-30 12:00:08.690 2 3 8792 SEND +2024-07-30 12:00:08.691 3 0 8794 RECEIVE +2024-07-30 12:00:08.692 1 3 8796 SEND +2024-07-30 12:00:08.693 2 0 8798 RECEIVE +2024-07-30 12:00:08.694 0 2 8800 SEND +2024-07-30 12:00:08.695 3 1 8802 RECEIVE +2024-07-30 12:00:08.696 1 0 8804 SEND +2024-07-30 12:00:08.697 2 1 8806 RECEIVE +2024-07-30 12:00:08.698 3 2 8808 SEND +2024-07-30 12:00:08.699 0 3 8810 RECEIVE +2024-07-30 12:00:08.700 2 0 8812 SEND +2024-07-30 12:00:08.701 1 3 8814 RECEIVE +2024-07-30 12:00:08.702 0 1 8816 SEND +2024-07-30 12:00:08.703 3 2 8818 RECEIVE +2024-07-30 12:00:08.704 0 1 8804 SEND +2024-07-30 12:00:08.705 1 2 8806 RECEIVE +2024-07-30 12:00:08.706 2 3 8808 SEND +2024-07-30 12:00:08.707 3 0 8810 RECEIVE +2024-07-30 12:00:08.708 1 3 8812 SEND +2024-07-30 12:00:08.709 2 0 8814 RECEIVE +2024-07-30 12:00:08.710 0 2 8816 SEND +2024-07-30 12:00:08.711 3 1 8818 RECEIVE +2024-07-30 12:00:08.712 1 0 8820 SEND +2024-07-30 12:00:08.713 2 1 8822 RECEIVE +2024-07-30 12:00:08.714 3 2 8824 SEND +2024-07-30 12:00:08.715 0 3 8826 RECEIVE +2024-07-30 12:00:08.716 2 0 8828 SEND +2024-07-30 12:00:08.717 1 3 8830 RECEIVE +2024-07-30 12:00:08.718 0 1 8832 SEND +2024-07-30 12:00:08.719 3 2 8834 RECEIVE +2024-07-30 12:00:08.720 0 1 8820 SEND +2024-07-30 12:00:08.721 1 2 8822 RECEIVE +2024-07-30 12:00:08.722 2 3 8824 SEND +2024-07-30 12:00:08.723 3 0 8826 RECEIVE +2024-07-30 12:00:08.724 1 3 8828 SEND +2024-07-30 12:00:08.725 2 0 8830 RECEIVE +2024-07-30 12:00:08.726 0 2 8832 SEND +2024-07-30 12:00:08.727 3 1 8834 RECEIVE +2024-07-30 12:00:08.728 1 0 8836 SEND +2024-07-30 12:00:08.729 2 1 8838 RECEIVE +2024-07-30 12:00:08.730 3 2 8840 SEND +2024-07-30 12:00:08.731 0 3 8842 RECEIVE +2024-07-30 12:00:08.732 2 0 8844 SEND +2024-07-30 12:00:08.733 1 3 8846 RECEIVE +2024-07-30 12:00:08.734 0 1 8848 SEND +2024-07-30 12:00:08.735 3 2 8850 RECEIVE +2024-07-30 12:00:08.736 0 1 8836 SEND +2024-07-30 12:00:08.737 1 2 8838 RECEIVE +2024-07-30 12:00:08.738 2 3 8840 SEND +2024-07-30 12:00:08.739 3 0 8842 RECEIVE +2024-07-30 12:00:08.740 1 3 8844 SEND +2024-07-30 12:00:08.741 2 0 8846 RECEIVE +2024-07-30 12:00:08.742 0 2 8848 SEND +2024-07-30 12:00:08.743 3 1 8850 RECEIVE +2024-07-30 12:00:08.744 1 0 8852 SEND +2024-07-30 12:00:08.745 2 1 8854 RECEIVE +2024-07-30 12:00:08.746 3 2 8856 SEND +2024-07-30 12:00:08.747 0 3 8858 RECEIVE +2024-07-30 12:00:08.748 2 0 8860 SEND +2024-07-30 12:00:08.749 1 3 8862 RECEIVE +2024-07-30 12:00:08.750 0 1 8864 SEND +2024-07-30 12:00:08.751 3 2 8866 RECEIVE +2024-07-30 12:00:08.752 0 1 8852 SEND +2024-07-30 12:00:08.753 1 2 8854 RECEIVE +2024-07-30 12:00:08.754 2 3 8856 SEND +2024-07-30 12:00:08.755 3 0 8858 RECEIVE +2024-07-30 12:00:08.756 1 3 8860 SEND +2024-07-30 12:00:08.757 2 0 8862 RECEIVE +2024-07-30 12:00:08.758 0 2 8864 SEND +2024-07-30 12:00:08.759 3 1 8866 RECEIVE +2024-07-30 12:00:08.760 1 0 8868 SEND +2024-07-30 12:00:08.761 2 1 8870 RECEIVE +2024-07-30 12:00:08.762 3 2 8872 SEND +2024-07-30 12:00:08.763 0 3 8874 RECEIVE +2024-07-30 12:00:08.764 2 0 8876 SEND +2024-07-30 12:00:08.765 1 3 8878 RECEIVE +2024-07-30 12:00:08.766 0 1 8880 SEND +2024-07-30 12:00:08.767 3 2 8882 RECEIVE +2024-07-30 12:00:08.768 0 1 8868 SEND +2024-07-30 12:00:08.769 1 2 8870 RECEIVE +2024-07-30 12:00:08.770 2 3 8872 SEND +2024-07-30 12:00:08.771 3 0 8874 RECEIVE +2024-07-30 12:00:08.772 1 3 8876 SEND +2024-07-30 12:00:08.773 2 0 8878 RECEIVE +2024-07-30 12:00:08.774 0 2 8880 SEND +2024-07-30 12:00:08.775 3 1 8882 RECEIVE +2024-07-30 12:00:08.776 1 0 8884 SEND +2024-07-30 12:00:08.777 2 1 8886 RECEIVE +2024-07-30 12:00:08.778 3 2 8888 SEND +2024-07-30 12:00:08.779 0 3 8890 RECEIVE +2024-07-30 12:00:08.780 2 0 8892 SEND +2024-07-30 12:00:08.781 1 3 8894 RECEIVE +2024-07-30 12:00:08.782 0 1 8896 SEND +2024-07-30 12:00:08.783 3 2 8898 RECEIVE +2024-07-30 12:00:08.784 0 1 8884 SEND +2024-07-30 12:00:08.785 1 2 8886 RECEIVE +2024-07-30 12:00:08.786 2 3 8888 SEND +2024-07-30 12:00:08.787 3 0 8890 RECEIVE +2024-07-30 12:00:08.788 1 3 8892 SEND +2024-07-30 12:00:08.789 2 0 8894 RECEIVE +2024-07-30 12:00:08.790 0 2 8896 SEND +2024-07-30 12:00:08.791 3 1 8898 RECEIVE +2024-07-30 12:00:08.792 1 0 8900 SEND +2024-07-30 12:00:08.793 2 1 8902 RECEIVE +2024-07-30 12:00:08.794 3 2 8904 SEND +2024-07-30 12:00:08.795 0 3 8906 RECEIVE +2024-07-30 12:00:08.796 2 0 8908 SEND +2024-07-30 12:00:08.797 1 3 8910 RECEIVE +2024-07-30 12:00:08.798 0 1 8912 SEND +2024-07-30 12:00:08.799 3 2 8914 RECEIVE +2024-07-30 12:00:08.800 0 1 8900 SEND +2024-07-30 12:00:08.801 1 2 8902 RECEIVE +2024-07-30 12:00:08.802 2 3 8904 SEND +2024-07-30 12:00:08.803 3 0 8906 RECEIVE +2024-07-30 12:00:08.804 1 3 8908 SEND +2024-07-30 12:00:08.805 2 0 8910 RECEIVE +2024-07-30 12:00:08.806 0 2 8912 SEND +2024-07-30 12:00:08.807 3 1 8914 RECEIVE +2024-07-30 12:00:08.808 1 0 8916 SEND +2024-07-30 12:00:08.809 2 1 8918 RECEIVE +2024-07-30 12:00:08.810 3 2 8920 SEND +2024-07-30 12:00:08.811 0 3 8922 RECEIVE +2024-07-30 12:00:08.812 2 0 8924 SEND +2024-07-30 12:00:08.813 1 3 8926 RECEIVE +2024-07-30 12:00:08.814 0 1 8928 SEND +2024-07-30 12:00:08.815 3 2 8930 RECEIVE +2024-07-30 12:00:08.816 0 1 8916 SEND +2024-07-30 12:00:08.817 1 2 8918 RECEIVE +2024-07-30 12:00:08.818 2 3 8920 SEND +2024-07-30 12:00:08.819 3 0 8922 RECEIVE +2024-07-30 12:00:08.820 1 3 8924 SEND +2024-07-30 12:00:08.821 2 0 8926 RECEIVE +2024-07-30 12:00:08.822 0 2 8928 SEND +2024-07-30 12:00:08.823 3 1 8930 RECEIVE +2024-07-30 12:00:08.824 1 0 8932 SEND +2024-07-30 12:00:08.825 2 1 8934 RECEIVE +2024-07-30 12:00:08.826 3 2 8936 SEND +2024-07-30 12:00:08.827 0 3 8938 RECEIVE +2024-07-30 12:00:08.828 2 0 8940 SEND +2024-07-30 12:00:08.829 1 3 8942 RECEIVE +2024-07-30 12:00:08.830 0 1 8944 SEND +2024-07-30 12:00:08.831 3 2 8946 RECEIVE +2024-07-30 12:00:08.832 0 1 8932 SEND +2024-07-30 12:00:08.833 1 2 8934 RECEIVE +2024-07-30 12:00:08.834 2 3 8936 SEND +2024-07-30 12:00:08.835 3 0 8938 RECEIVE +2024-07-30 12:00:08.836 1 3 8940 SEND +2024-07-30 12:00:08.837 2 0 8942 RECEIVE +2024-07-30 12:00:08.838 0 2 8944 SEND +2024-07-30 12:00:08.839 3 1 8946 RECEIVE +2024-07-30 12:00:08.840 1 0 8948 SEND +2024-07-30 12:00:08.841 2 1 8950 RECEIVE +2024-07-30 12:00:08.842 3 2 8952 SEND +2024-07-30 12:00:08.843 0 3 8954 RECEIVE +2024-07-30 12:00:08.844 2 0 8956 SEND +2024-07-30 12:00:08.845 1 3 8958 RECEIVE +2024-07-30 12:00:08.846 0 1 8960 SEND +2024-07-30 12:00:08.847 3 2 8962 RECEIVE +2024-07-30 12:00:08.848 0 1 8948 SEND +2024-07-30 12:00:08.849 1 2 8950 RECEIVE +2024-07-30 12:00:08.850 2 3 8952 SEND +2024-07-30 12:00:08.851 3 0 8954 RECEIVE +2024-07-30 12:00:08.852 1 3 8956 SEND +2024-07-30 12:00:08.853 2 0 8958 RECEIVE +2024-07-30 12:00:08.854 0 2 8960 SEND +2024-07-30 12:00:08.855 3 1 8962 RECEIVE +2024-07-30 12:00:08.856 1 0 8964 SEND +2024-07-30 12:00:08.857 2 1 8966 RECEIVE +2024-07-30 12:00:08.858 3 2 8968 SEND +2024-07-30 12:00:08.859 0 3 8970 RECEIVE +2024-07-30 12:00:08.860 2 0 8972 SEND +2024-07-30 12:00:08.861 1 3 8974 RECEIVE +2024-07-30 12:00:08.862 0 1 8976 SEND +2024-07-30 12:00:08.863 3 2 8978 RECEIVE +2024-07-30 12:00:08.864 0 1 8964 SEND +2024-07-30 12:00:08.865 1 2 8966 RECEIVE +2024-07-30 12:00:08.866 2 3 8968 SEND +2024-07-30 12:00:08.867 3 0 8970 RECEIVE +2024-07-30 12:00:08.868 1 3 8972 SEND +2024-07-30 12:00:08.869 2 0 8974 RECEIVE +2024-07-30 12:00:08.870 0 2 8976 SEND +2024-07-30 12:00:08.871 3 1 8978 RECEIVE +2024-07-30 12:00:08.872 1 0 8980 SEND +2024-07-30 12:00:08.873 2 1 8982 RECEIVE +2024-07-30 12:00:08.874 3 2 8984 SEND +2024-07-30 12:00:08.875 0 3 8986 RECEIVE +2024-07-30 12:00:08.876 2 0 8988 SEND +2024-07-30 12:00:08.877 1 3 8990 RECEIVE +2024-07-30 12:00:08.878 0 1 8992 SEND +2024-07-30 12:00:08.879 3 2 8994 RECEIVE +2024-07-30 12:00:08.880 0 1 8980 SEND +2024-07-30 12:00:08.881 1 2 8982 RECEIVE +2024-07-30 12:00:08.882 2 3 8984 SEND +2024-07-30 12:00:08.883 3 0 8986 RECEIVE +2024-07-30 12:00:08.884 1 3 8988 SEND +2024-07-30 12:00:08.885 2 0 8990 RECEIVE +2024-07-30 12:00:08.886 0 2 8992 SEND +2024-07-30 12:00:08.887 3 1 8994 RECEIVE +2024-07-30 12:00:08.888 1 0 8996 SEND +2024-07-30 12:00:08.889 2 1 8998 RECEIVE +2024-07-30 12:00:08.890 3 2 9000 SEND +2024-07-30 12:00:08.891 0 3 9002 RECEIVE +2024-07-30 12:00:08.892 2 0 9004 SEND +2024-07-30 12:00:08.893 1 3 9006 RECEIVE +2024-07-30 12:00:08.894 0 1 9008 SEND +2024-07-30 12:00:08.895 3 2 9010 RECEIVE +2024-07-30 12:00:08.896 0 1 8996 SEND +2024-07-30 12:00:08.897 1 2 8998 RECEIVE +2024-07-30 12:00:08.898 2 3 9000 SEND +2024-07-30 12:00:08.899 3 0 9002 RECEIVE +2024-07-30 12:00:08.900 1 3 9004 SEND +2024-07-30 12:00:08.901 2 0 9006 RECEIVE +2024-07-30 12:00:08.902 0 2 9008 SEND +2024-07-30 12:00:08.903 3 1 9010 RECEIVE +2024-07-30 12:00:08.904 1 0 9012 SEND +2024-07-30 12:00:08.905 2 1 9014 RECEIVE +2024-07-30 12:00:08.906 3 2 9016 SEND +2024-07-30 12:00:08.907 0 3 9018 RECEIVE +2024-07-30 12:00:08.908 2 0 9020 SEND +2024-07-30 12:00:08.909 1 3 9022 RECEIVE +2024-07-30 12:00:08.910 0 1 9024 SEND +2024-07-30 12:00:08.911 3 2 9026 RECEIVE +2024-07-30 12:00:08.912 0 1 9012 SEND +2024-07-30 12:00:08.913 1 2 9014 RECEIVE +2024-07-30 12:00:08.914 2 3 9016 SEND +2024-07-30 12:00:08.915 3 0 9018 RECEIVE +2024-07-30 12:00:08.916 1 3 9020 SEND +2024-07-30 12:00:08.917 2 0 9022 RECEIVE +2024-07-30 12:00:08.918 0 2 9024 SEND +2024-07-30 12:00:08.919 3 1 9026 RECEIVE +2024-07-30 12:00:08.920 1 0 9028 SEND +2024-07-30 12:00:08.921 2 1 9030 RECEIVE +2024-07-30 12:00:08.922 3 2 9032 SEND +2024-07-30 12:00:08.923 0 3 9034 RECEIVE +2024-07-30 12:00:08.924 2 0 9036 SEND +2024-07-30 12:00:08.925 1 3 9038 RECEIVE +2024-07-30 12:00:08.926 0 1 9040 SEND +2024-07-30 12:00:08.927 3 2 9042 RECEIVE +2024-07-30 12:00:08.928 0 1 9028 SEND +2024-07-30 12:00:08.929 1 2 9030 RECEIVE +2024-07-30 12:00:08.930 2 3 9032 SEND +2024-07-30 12:00:08.931 3 0 9034 RECEIVE +2024-07-30 12:00:08.932 1 3 9036 SEND +2024-07-30 12:00:08.933 2 0 9038 RECEIVE +2024-07-30 12:00:08.934 0 2 9040 SEND +2024-07-30 12:00:08.935 3 1 9042 RECEIVE +2024-07-30 12:00:08.936 1 0 9044 SEND +2024-07-30 12:00:08.937 2 1 9046 RECEIVE +2024-07-30 12:00:08.938 3 2 9048 SEND +2024-07-30 12:00:08.939 0 3 9050 RECEIVE +2024-07-30 12:00:08.940 2 0 9052 SEND +2024-07-30 12:00:08.941 1 3 9054 RECEIVE +2024-07-30 12:00:08.942 0 1 9056 SEND +2024-07-30 12:00:08.943 3 2 9058 RECEIVE +2024-07-30 12:00:08.944 0 1 9044 SEND +2024-07-30 12:00:08.945 1 2 9046 RECEIVE +2024-07-30 12:00:08.946 2 3 9048 SEND +2024-07-30 12:00:08.947 3 0 9050 RECEIVE +2024-07-30 12:00:08.948 1 3 9052 SEND +2024-07-30 12:00:08.949 2 0 9054 RECEIVE +2024-07-30 12:00:08.950 0 2 9056 SEND +2024-07-30 12:00:08.951 3 1 9058 RECEIVE +2024-07-30 12:00:08.952 1 0 9060 SEND +2024-07-30 12:00:08.953 2 1 9062 RECEIVE +2024-07-30 12:00:08.954 3 2 9064 SEND +2024-07-30 12:00:08.955 0 3 9066 RECEIVE +2024-07-30 12:00:08.956 2 0 9068 SEND +2024-07-30 12:00:08.957 1 3 9070 RECEIVE +2024-07-30 12:00:08.958 0 1 9072 SEND +2024-07-30 12:00:08.959 3 2 9074 RECEIVE +2024-07-30 12:00:08.960 0 1 9060 SEND +2024-07-30 12:00:08.961 1 2 9062 RECEIVE +2024-07-30 12:00:08.962 2 3 9064 SEND +2024-07-30 12:00:08.963 3 0 9066 RECEIVE +2024-07-30 12:00:08.964 1 3 9068 SEND +2024-07-30 12:00:08.965 2 0 9070 RECEIVE +2024-07-30 12:00:08.966 0 2 9072 SEND +2024-07-30 12:00:08.967 3 1 9074 RECEIVE +2024-07-30 12:00:08.968 1 0 9076 SEND +2024-07-30 12:00:08.969 2 1 9078 RECEIVE +2024-07-30 12:00:08.970 3 2 9080 SEND +2024-07-30 12:00:08.971 0 3 9082 RECEIVE +2024-07-30 12:00:08.972 2 0 9084 SEND +2024-07-30 12:00:08.973 1 3 9086 RECEIVE +2024-07-30 12:00:08.974 0 1 9088 SEND +2024-07-30 12:00:08.975 3 2 9090 RECEIVE +2024-07-30 12:00:08.976 0 1 9076 SEND +2024-07-30 12:00:08.977 1 2 9078 RECEIVE +2024-07-30 12:00:08.978 2 3 9080 SEND +2024-07-30 12:00:08.979 3 0 9082 RECEIVE +2024-07-30 12:00:08.980 1 3 9084 SEND +2024-07-30 12:00:08.981 2 0 9086 RECEIVE +2024-07-30 12:00:08.982 0 2 9088 SEND +2024-07-30 12:00:08.983 3 1 9090 RECEIVE +2024-07-30 12:00:08.984 1 0 9092 SEND +2024-07-30 12:00:08.985 2 1 9094 RECEIVE +2024-07-30 12:00:08.986 3 2 9096 SEND +2024-07-30 12:00:08.987 0 3 9098 RECEIVE +2024-07-30 12:00:08.988 2 0 9100 SEND +2024-07-30 12:00:08.989 1 3 9102 RECEIVE +2024-07-30 12:00:08.990 0 1 9104 SEND +2024-07-30 12:00:08.991 3 2 9106 RECEIVE +2024-07-30 12:00:08.992 0 1 9092 SEND +2024-07-30 12:00:08.993 1 2 9094 RECEIVE +2024-07-30 12:00:08.994 2 3 9096 SEND +2024-07-30 12:00:08.995 3 0 9098 RECEIVE +2024-07-30 12:00:08.996 1 3 9100 SEND +2024-07-30 12:00:08.997 2 0 9102 RECEIVE +2024-07-30 12:00:08.998 0 2 9104 SEND +2024-07-30 12:00:08.999 3 1 9106 RECEIVE +2024-07-30 12:00:09.000 1 0 9108 SEND +2024-07-30 12:00:09.001 2 1 9110 RECEIVE +2024-07-30 12:00:09.002 3 2 9112 SEND +2024-07-30 12:00:09.003 0 3 9114 RECEIVE +2024-07-30 12:00:09.004 2 0 9116 SEND +2024-07-30 12:00:09.005 1 3 9118 RECEIVE +2024-07-30 12:00:09.006 0 1 9120 SEND +2024-07-30 12:00:09.007 3 2 9122 RECEIVE +2024-07-30 12:00:09.008 0 1 9108 SEND +2024-07-30 12:00:09.009 1 2 9110 RECEIVE +2024-07-30 12:00:09.010 2 3 9112 SEND +2024-07-30 12:00:09.011 3 0 9114 RECEIVE +2024-07-30 12:00:09.012 1 3 9116 SEND +2024-07-30 12:00:09.013 2 0 9118 RECEIVE +2024-07-30 12:00:09.014 0 2 9120 SEND +2024-07-30 12:00:09.015 3 1 9122 RECEIVE +2024-07-30 12:00:09.016 1 0 9124 SEND +2024-07-30 12:00:09.017 2 1 9126 RECEIVE +2024-07-30 12:00:09.018 3 2 9128 SEND +2024-07-30 12:00:09.019 0 3 9130 RECEIVE +2024-07-30 12:00:09.020 2 0 9132 SEND +2024-07-30 12:00:09.021 1 3 9134 RECEIVE +2024-07-30 12:00:09.022 0 1 9136 SEND +2024-07-30 12:00:09.023 3 2 9138 RECEIVE +2024-07-30 12:00:09.024 0 1 9124 SEND +2024-07-30 12:00:09.025 1 2 9126 RECEIVE +2024-07-30 12:00:09.026 2 3 9128 SEND +2024-07-30 12:00:09.027 3 0 9130 RECEIVE +2024-07-30 12:00:09.028 1 3 9132 SEND +2024-07-30 12:00:09.029 2 0 9134 RECEIVE +2024-07-30 12:00:09.030 0 2 9136 SEND +2024-07-30 12:00:09.031 3 1 9138 RECEIVE +2024-07-30 12:00:09.032 1 0 9140 SEND +2024-07-30 12:00:09.033 2 1 9142 RECEIVE +2024-07-30 12:00:09.034 3 2 9144 SEND +2024-07-30 12:00:09.035 0 3 9146 RECEIVE +2024-07-30 12:00:09.036 2 0 9148 SEND +2024-07-30 12:00:09.037 1 3 9150 RECEIVE +2024-07-30 12:00:09.038 0 1 9152 SEND +2024-07-30 12:00:09.039 3 2 9154 RECEIVE +2024-07-30 12:00:09.040 0 1 9140 SEND +2024-07-30 12:00:09.041 1 2 9142 RECEIVE +2024-07-30 12:00:09.042 2 3 9144 SEND +2024-07-30 12:00:09.043 3 0 9146 RECEIVE +2024-07-30 12:00:09.044 1 3 9148 SEND +2024-07-30 12:00:09.045 2 0 9150 RECEIVE +2024-07-30 12:00:09.046 0 2 9152 SEND +2024-07-30 12:00:09.047 3 1 9154 RECEIVE +2024-07-30 12:00:09.048 1 0 9156 SEND +2024-07-30 12:00:09.049 2 1 9158 RECEIVE +2024-07-30 12:00:09.050 3 2 9160 SEND +2024-07-30 12:00:09.051 0 3 9162 RECEIVE +2024-07-30 12:00:09.052 2 0 9164 SEND +2024-07-30 12:00:09.053 1 3 9166 RECEIVE +2024-07-30 12:00:09.054 0 1 9168 SEND +2024-07-30 12:00:09.055 3 2 9170 RECEIVE +2024-07-30 12:00:09.056 0 1 9156 SEND +2024-07-30 12:00:09.057 1 2 9158 RECEIVE +2024-07-30 12:00:09.058 2 3 9160 SEND +2024-07-30 12:00:09.059 3 0 9162 RECEIVE +2024-07-30 12:00:09.060 1 3 9164 SEND +2024-07-30 12:00:09.061 2 0 9166 RECEIVE +2024-07-30 12:00:09.062 0 2 9168 SEND +2024-07-30 12:00:09.063 3 1 9170 RECEIVE +2024-07-30 12:00:09.064 1 0 9172 SEND +2024-07-30 12:00:09.065 2 1 9174 RECEIVE +2024-07-30 12:00:09.066 3 2 9176 SEND +2024-07-30 12:00:09.067 0 3 9178 RECEIVE +2024-07-30 12:00:09.068 2 0 9180 SEND +2024-07-30 12:00:09.069 1 3 9182 RECEIVE +2024-07-30 12:00:09.070 0 1 9184 SEND +2024-07-30 12:00:09.071 3 2 9186 RECEIVE +2024-07-30 12:00:09.072 0 1 9172 SEND +2024-07-30 12:00:09.073 1 2 9174 RECEIVE +2024-07-30 12:00:09.074 2 3 9176 SEND +2024-07-30 12:00:09.075 3 0 9178 RECEIVE +2024-07-30 12:00:09.076 1 3 9180 SEND +2024-07-30 12:00:09.077 2 0 9182 RECEIVE +2024-07-30 12:00:09.078 0 2 9184 SEND +2024-07-30 12:00:09.079 3 1 9186 RECEIVE +2024-07-30 12:00:09.080 1 0 9188 SEND +2024-07-30 12:00:09.081 2 1 9190 RECEIVE +2024-07-30 12:00:09.082 3 2 9192 SEND +2024-07-30 12:00:09.083 0 3 9194 RECEIVE +2024-07-30 12:00:09.084 2 0 9196 SEND +2024-07-30 12:00:09.085 1 3 9198 RECEIVE +2024-07-30 12:00:09.086 0 1 9200 SEND +2024-07-30 12:00:09.087 3 2 9202 RECEIVE +2024-07-30 12:00:09.088 0 1 9188 SEND +2024-07-30 12:00:09.089 1 2 9190 RECEIVE +2024-07-30 12:00:09.090 2 3 9192 SEND +2024-07-30 12:00:09.091 3 0 9194 RECEIVE +2024-07-30 12:00:09.092 1 3 9196 SEND +2024-07-30 12:00:09.093 2 0 9198 RECEIVE +2024-07-30 12:00:09.094 0 2 9200 SEND +2024-07-30 12:00:09.095 3 1 9202 RECEIVE +2024-07-30 12:00:09.096 1 0 9204 SEND +2024-07-30 12:00:09.097 2 1 9206 RECEIVE +2024-07-30 12:00:09.098 3 2 9208 SEND +2024-07-30 12:00:09.099 0 3 9210 RECEIVE +2024-07-30 12:00:09.100 2 0 9212 SEND +2024-07-30 12:00:09.101 1 3 9214 RECEIVE +2024-07-30 12:00:09.102 0 1 9216 SEND +2024-07-30 12:00:09.103 3 2 9218 RECEIVE +2024-07-30 12:00:09.104 0 1 9204 SEND +2024-07-30 12:00:09.105 1 2 9206 RECEIVE +2024-07-30 12:00:09.106 2 3 9208 SEND +2024-07-30 12:00:09.107 3 0 9210 RECEIVE +2024-07-30 12:00:09.108 1 3 9212 SEND +2024-07-30 12:00:09.109 2 0 9214 RECEIVE +2024-07-30 12:00:09.110 0 2 9216 SEND +2024-07-30 12:00:09.111 3 1 9218 RECEIVE +2024-07-30 12:00:09.112 1 0 9220 SEND +2024-07-30 12:00:09.113 2 1 9222 RECEIVE +2024-07-30 12:00:09.114 3 2 9224 SEND +2024-07-30 12:00:09.115 0 3 9226 RECEIVE +2024-07-30 12:00:09.116 2 0 9228 SEND +2024-07-30 12:00:09.117 1 3 9230 RECEIVE +2024-07-30 12:00:09.118 0 1 9232 SEND +2024-07-30 12:00:09.119 3 2 9234 RECEIVE +2024-07-30 12:00:09.120 0 1 9220 SEND +2024-07-30 12:00:09.121 1 2 9222 RECEIVE +2024-07-30 12:00:09.122 2 3 9224 SEND +2024-07-30 12:00:09.123 3 0 9226 RECEIVE +2024-07-30 12:00:09.124 1 3 9228 SEND +2024-07-30 12:00:09.125 2 0 9230 RECEIVE +2024-07-30 12:00:09.126 0 2 9232 SEND +2024-07-30 12:00:09.127 3 1 9234 RECEIVE +2024-07-30 12:00:09.128 1 0 9236 SEND +2024-07-30 12:00:09.129 2 1 9238 RECEIVE +2024-07-30 12:00:09.130 3 2 9240 SEND +2024-07-30 12:00:09.131 0 3 9242 RECEIVE +2024-07-30 12:00:09.132 2 0 9244 SEND +2024-07-30 12:00:09.133 1 3 9246 RECEIVE +2024-07-30 12:00:09.134 0 1 9248 SEND +2024-07-30 12:00:09.135 3 2 9250 RECEIVE +2024-07-30 12:00:09.136 0 1 9236 SEND +2024-07-30 12:00:09.137 1 2 9238 RECEIVE +2024-07-30 12:00:09.138 2 3 9240 SEND +2024-07-30 12:00:09.139 3 0 9242 RECEIVE +2024-07-30 12:00:09.140 1 3 9244 SEND +2024-07-30 12:00:09.141 2 0 9246 RECEIVE +2024-07-30 12:00:09.142 0 2 9248 SEND +2024-07-30 12:00:09.143 3 1 9250 RECEIVE +2024-07-30 12:00:09.144 1 0 9252 SEND +2024-07-30 12:00:09.145 2 1 9254 RECEIVE +2024-07-30 12:00:09.146 3 2 9256 SEND +2024-07-30 12:00:09.147 0 3 9258 RECEIVE +2024-07-30 12:00:09.148 2 0 9260 SEND +2024-07-30 12:00:09.149 1 3 9262 RECEIVE +2024-07-30 12:00:09.150 0 1 9264 SEND +2024-07-30 12:00:09.151 3 2 9266 RECEIVE +2024-07-30 12:00:09.152 0 1 9252 SEND +2024-07-30 12:00:09.153 1 2 9254 RECEIVE +2024-07-30 12:00:09.154 2 3 9256 SEND +2024-07-30 12:00:09.155 3 0 9258 RECEIVE +2024-07-30 12:00:09.156 1 3 9260 SEND +2024-07-30 12:00:09.157 2 0 9262 RECEIVE +2024-07-30 12:00:09.158 0 2 9264 SEND +2024-07-30 12:00:09.159 3 1 9266 RECEIVE +2024-07-30 12:00:09.160 1 0 9268 SEND +2024-07-30 12:00:09.161 2 1 9270 RECEIVE +2024-07-30 12:00:09.162 3 2 9272 SEND +2024-07-30 12:00:09.163 0 3 9274 RECEIVE +2024-07-30 12:00:09.164 2 0 9276 SEND +2024-07-30 12:00:09.165 1 3 9278 RECEIVE +2024-07-30 12:00:09.166 0 1 9280 SEND +2024-07-30 12:00:09.167 3 2 9282 RECEIVE +2024-07-30 12:00:09.168 0 1 9268 SEND +2024-07-30 12:00:09.169 1 2 9270 RECEIVE +2024-07-30 12:00:09.170 2 3 9272 SEND +2024-07-30 12:00:09.171 3 0 9274 RECEIVE +2024-07-30 12:00:09.172 1 3 9276 SEND +2024-07-30 12:00:09.173 2 0 9278 RECEIVE +2024-07-30 12:00:09.174 0 2 9280 SEND +2024-07-30 12:00:09.175 3 1 9282 RECEIVE +2024-07-30 12:00:09.176 1 0 9284 SEND +2024-07-30 12:00:09.177 2 1 9286 RECEIVE +2024-07-30 12:00:09.178 3 2 9288 SEND +2024-07-30 12:00:09.179 0 3 9290 RECEIVE +2024-07-30 12:00:09.180 2 0 9292 SEND +2024-07-30 12:00:09.181 1 3 9294 RECEIVE +2024-07-30 12:00:09.182 0 1 9296 SEND +2024-07-30 12:00:09.183 3 2 9298 RECEIVE +2024-07-30 12:00:09.184 0 1 9284 SEND +2024-07-30 12:00:09.185 1 2 9286 RECEIVE +2024-07-30 12:00:09.186 2 3 9288 SEND +2024-07-30 12:00:09.187 3 0 9290 RECEIVE +2024-07-30 12:00:09.188 1 3 9292 SEND +2024-07-30 12:00:09.189 2 0 9294 RECEIVE +2024-07-30 12:00:09.190 0 2 9296 SEND +2024-07-30 12:00:09.191 3 1 9298 RECEIVE +2024-07-30 12:00:09.192 1 0 9300 SEND +2024-07-30 12:00:09.193 2 1 9302 RECEIVE +2024-07-30 12:00:09.194 3 2 9304 SEND +2024-07-30 12:00:09.195 0 3 9306 RECEIVE +2024-07-30 12:00:09.196 2 0 9308 SEND +2024-07-30 12:00:09.197 1 3 9310 RECEIVE +2024-07-30 12:00:09.198 0 1 9312 SEND +2024-07-30 12:00:09.199 3 2 9314 RECEIVE +2024-07-30 12:00:09.200 0 1 9300 SEND +2024-07-30 12:00:09.201 1 2 9302 RECEIVE +2024-07-30 12:00:09.202 2 3 9304 SEND +2024-07-30 12:00:09.203 3 0 9306 RECEIVE +2024-07-30 12:00:09.204 1 3 9308 SEND +2024-07-30 12:00:09.205 2 0 9310 RECEIVE +2024-07-30 12:00:09.206 0 2 9312 SEND +2024-07-30 12:00:09.207 3 1 9314 RECEIVE +2024-07-30 12:00:09.208 1 0 9316 SEND +2024-07-30 12:00:09.209 2 1 9318 RECEIVE +2024-07-30 12:00:09.210 3 2 9320 SEND +2024-07-30 12:00:09.211 0 3 9322 RECEIVE +2024-07-30 12:00:09.212 2 0 9324 SEND +2024-07-30 12:00:09.213 1 3 9326 RECEIVE +2024-07-30 12:00:09.214 0 1 9328 SEND +2024-07-30 12:00:09.215 3 2 9330 RECEIVE +2024-07-30 12:00:09.216 0 1 9316 SEND +2024-07-30 12:00:09.217 1 2 9318 RECEIVE +2024-07-30 12:00:09.218 2 3 9320 SEND +2024-07-30 12:00:09.219 3 0 9322 RECEIVE +2024-07-30 12:00:09.220 1 3 9324 SEND +2024-07-30 12:00:09.221 2 0 9326 RECEIVE +2024-07-30 12:00:09.222 0 2 9328 SEND +2024-07-30 12:00:09.223 3 1 9330 RECEIVE +2024-07-30 12:00:09.224 1 0 9332 SEND +2024-07-30 12:00:09.225 2 1 9334 RECEIVE +2024-07-30 12:00:09.226 3 2 9336 SEND +2024-07-30 12:00:09.227 0 3 9338 RECEIVE +2024-07-30 12:00:09.228 2 0 9340 SEND +2024-07-30 12:00:09.229 1 3 9342 RECEIVE +2024-07-30 12:00:09.230 0 1 9344 SEND +2024-07-30 12:00:09.231 3 2 9346 RECEIVE +2024-07-30 12:00:09.232 0 1 9332 SEND +2024-07-30 12:00:09.233 1 2 9334 RECEIVE +2024-07-30 12:00:09.234 2 3 9336 SEND +2024-07-30 12:00:09.235 3 0 9338 RECEIVE +2024-07-30 12:00:09.236 1 3 9340 SEND +2024-07-30 12:00:09.237 2 0 9342 RECEIVE +2024-07-30 12:00:09.238 0 2 9344 SEND +2024-07-30 12:00:09.239 3 1 9346 RECEIVE +2024-07-30 12:00:09.240 1 0 9348 SEND +2024-07-30 12:00:09.241 2 1 9350 RECEIVE +2024-07-30 12:00:09.242 3 2 9352 SEND +2024-07-30 12:00:09.243 0 3 9354 RECEIVE +2024-07-30 12:00:09.244 2 0 9356 SEND +2024-07-30 12:00:09.245 1 3 9358 RECEIVE +2024-07-30 12:00:09.246 0 1 9360 SEND +2024-07-30 12:00:09.247 3 2 9362 RECEIVE +2024-07-30 12:00:09.248 0 1 9348 SEND +2024-07-30 12:00:09.249 1 2 9350 RECEIVE +2024-07-30 12:00:09.250 2 3 9352 SEND +2024-07-30 12:00:09.251 3 0 9354 RECEIVE +2024-07-30 12:00:09.252 1 3 9356 SEND +2024-07-30 12:00:09.253 2 0 9358 RECEIVE +2024-07-30 12:00:09.254 0 2 9360 SEND +2024-07-30 12:00:09.255 3 1 9362 RECEIVE +2024-07-30 12:00:09.256 1 0 9364 SEND +2024-07-30 12:00:09.257 2 1 9366 RECEIVE +2024-07-30 12:00:09.258 3 2 9368 SEND +2024-07-30 12:00:09.259 0 3 9370 RECEIVE +2024-07-30 12:00:09.260 2 0 9372 SEND +2024-07-30 12:00:09.261 1 3 9374 RECEIVE +2024-07-30 12:00:09.262 0 1 9376 SEND +2024-07-30 12:00:09.263 3 2 9378 RECEIVE +2024-07-30 12:00:09.264 0 1 9364 SEND +2024-07-30 12:00:09.265 1 2 9366 RECEIVE +2024-07-30 12:00:09.266 2 3 9368 SEND +2024-07-30 12:00:09.267 3 0 9370 RECEIVE +2024-07-30 12:00:09.268 1 3 9372 SEND +2024-07-30 12:00:09.269 2 0 9374 RECEIVE +2024-07-30 12:00:09.270 0 2 9376 SEND +2024-07-30 12:00:09.271 3 1 9378 RECEIVE +2024-07-30 12:00:09.272 1 0 9380 SEND +2024-07-30 12:00:09.273 2 1 9382 RECEIVE +2024-07-30 12:00:09.274 3 2 9384 SEND +2024-07-30 12:00:09.275 0 3 9386 RECEIVE +2024-07-30 12:00:09.276 2 0 9388 SEND +2024-07-30 12:00:09.277 1 3 9390 RECEIVE +2024-07-30 12:00:09.278 0 1 9392 SEND +2024-07-30 12:00:09.279 3 2 9394 RECEIVE +2024-07-30 12:00:09.280 0 1 9380 SEND +2024-07-30 12:00:09.281 1 2 9382 RECEIVE +2024-07-30 12:00:09.282 2 3 9384 SEND +2024-07-30 12:00:09.283 3 0 9386 RECEIVE +2024-07-30 12:00:09.284 1 3 9388 SEND +2024-07-30 12:00:09.285 2 0 9390 RECEIVE +2024-07-30 12:00:09.286 0 2 9392 SEND +2024-07-30 12:00:09.287 3 1 9394 RECEIVE +2024-07-30 12:00:09.288 1 0 9396 SEND +2024-07-30 12:00:09.289 2 1 9398 RECEIVE +2024-07-30 12:00:09.290 3 2 9400 SEND +2024-07-30 12:00:09.291 0 3 9402 RECEIVE +2024-07-30 12:00:09.292 2 0 9404 SEND +2024-07-30 12:00:09.293 1 3 9406 RECEIVE +2024-07-30 12:00:09.294 0 1 9408 SEND +2024-07-30 12:00:09.295 3 2 9410 RECEIVE +2024-07-30 12:00:09.296 0 1 9396 SEND +2024-07-30 12:00:09.297 1 2 9398 RECEIVE +2024-07-30 12:00:09.298 2 3 9400 SEND +2024-07-30 12:00:09.299 3 0 9402 RECEIVE +2024-07-30 12:00:09.300 1 3 9404 SEND +2024-07-30 12:00:09.301 2 0 9406 RECEIVE +2024-07-30 12:00:09.302 0 2 9408 SEND +2024-07-30 12:00:09.303 3 1 9410 RECEIVE +2024-07-30 12:00:09.304 1 0 9412 SEND +2024-07-30 12:00:09.305 2 1 9414 RECEIVE +2024-07-30 12:00:09.306 3 2 9416 SEND +2024-07-30 12:00:09.307 0 3 9418 RECEIVE +2024-07-30 12:00:09.308 2 0 9420 SEND +2024-07-30 12:00:09.309 1 3 9422 RECEIVE +2024-07-30 12:00:09.310 0 1 9424 SEND +2024-07-30 12:00:09.311 3 2 9426 RECEIVE +2024-07-30 12:00:09.312 0 1 9412 SEND +2024-07-30 12:00:09.313 1 2 9414 RECEIVE +2024-07-30 12:00:09.314 2 3 9416 SEND +2024-07-30 12:00:09.315 3 0 9418 RECEIVE +2024-07-30 12:00:09.316 1 3 9420 SEND +2024-07-30 12:00:09.317 2 0 9422 RECEIVE +2024-07-30 12:00:09.318 0 2 9424 SEND +2024-07-30 12:00:09.319 3 1 9426 RECEIVE +2024-07-30 12:00:09.320 1 0 9428 SEND +2024-07-30 12:00:09.321 2 1 9430 RECEIVE +2024-07-30 12:00:09.322 3 2 9432 SEND +2024-07-30 12:00:09.323 0 3 9434 RECEIVE +2024-07-30 12:00:09.324 2 0 9436 SEND +2024-07-30 12:00:09.325 1 3 9438 RECEIVE +2024-07-30 12:00:09.326 0 1 9440 SEND +2024-07-30 12:00:09.327 3 2 9442 RECEIVE +2024-07-30 12:00:09.328 0 1 9428 SEND +2024-07-30 12:00:09.329 1 2 9430 RECEIVE +2024-07-30 12:00:09.330 2 3 9432 SEND +2024-07-30 12:00:09.331 3 0 9434 RECEIVE +2024-07-30 12:00:09.332 1 3 9436 SEND +2024-07-30 12:00:09.333 2 0 9438 RECEIVE +2024-07-30 12:00:09.334 0 2 9440 SEND +2024-07-30 12:00:09.335 3 1 9442 RECEIVE +2024-07-30 12:00:09.336 1 0 9444 SEND +2024-07-30 12:00:09.337 2 1 9446 RECEIVE +2024-07-30 12:00:09.338 3 2 9448 SEND +2024-07-30 12:00:09.339 0 3 9450 RECEIVE +2024-07-30 12:00:09.340 2 0 9452 SEND +2024-07-30 12:00:09.341 1 3 9454 RECEIVE +2024-07-30 12:00:09.342 0 1 9456 SEND +2024-07-30 12:00:09.343 3 2 9458 RECEIVE +2024-07-30 12:00:09.344 0 1 9444 SEND +2024-07-30 12:00:09.345 1 2 9446 RECEIVE +2024-07-30 12:00:09.346 2 3 9448 SEND +2024-07-30 12:00:09.347 3 0 9450 RECEIVE +2024-07-30 12:00:09.348 1 3 9452 SEND +2024-07-30 12:00:09.349 2 0 9454 RECEIVE +2024-07-30 12:00:09.350 0 2 9456 SEND +2024-07-30 12:00:09.351 3 1 9458 RECEIVE +2024-07-30 12:00:09.352 1 0 9460 SEND +2024-07-30 12:00:09.353 2 1 9462 RECEIVE +2024-07-30 12:00:09.354 3 2 9464 SEND +2024-07-30 12:00:09.355 0 3 9466 RECEIVE +2024-07-30 12:00:09.356 2 0 9468 SEND +2024-07-30 12:00:09.357 1 3 9470 RECEIVE +2024-07-30 12:00:09.358 0 1 9472 SEND +2024-07-30 12:00:09.359 3 2 9474 RECEIVE +2024-07-30 12:00:09.360 0 1 9460 SEND +2024-07-30 12:00:09.361 1 2 9462 RECEIVE +2024-07-30 12:00:09.362 2 3 9464 SEND +2024-07-30 12:00:09.363 3 0 9466 RECEIVE +2024-07-30 12:00:09.364 1 3 9468 SEND +2024-07-30 12:00:09.365 2 0 9470 RECEIVE +2024-07-30 12:00:09.366 0 2 9472 SEND +2024-07-30 12:00:09.367 3 1 9474 RECEIVE +2024-07-30 12:00:09.368 1 0 9476 SEND +2024-07-30 12:00:09.369 2 1 9478 RECEIVE +2024-07-30 12:00:09.370 3 2 9480 SEND +2024-07-30 12:00:09.371 0 3 9482 RECEIVE +2024-07-30 12:00:09.372 2 0 9484 SEND +2024-07-30 12:00:09.373 1 3 9486 RECEIVE +2024-07-30 12:00:09.374 0 1 9488 SEND +2024-07-30 12:00:09.375 3 2 9490 RECEIVE +2024-07-30 12:00:09.376 0 1 9476 SEND +2024-07-30 12:00:09.377 1 2 9478 RECEIVE +2024-07-30 12:00:09.378 2 3 9480 SEND +2024-07-30 12:00:09.379 3 0 9482 RECEIVE +2024-07-30 12:00:09.380 1 3 9484 SEND +2024-07-30 12:00:09.381 2 0 9486 RECEIVE +2024-07-30 12:00:09.382 0 2 9488 SEND +2024-07-30 12:00:09.383 3 1 9490 RECEIVE +2024-07-30 12:00:09.384 1 0 9492 SEND +2024-07-30 12:00:09.385 2 1 9494 RECEIVE +2024-07-30 12:00:09.386 3 2 9496 SEND +2024-07-30 12:00:09.387 0 3 9498 RECEIVE +2024-07-30 12:00:09.388 2 0 9500 SEND +2024-07-30 12:00:09.389 1 3 9502 RECEIVE +2024-07-30 12:00:09.390 0 1 9504 SEND +2024-07-30 12:00:09.391 3 2 9506 RECEIVE +2024-07-30 12:00:09.392 0 1 9492 SEND +2024-07-30 12:00:09.393 1 2 9494 RECEIVE +2024-07-30 12:00:09.394 2 3 9496 SEND +2024-07-30 12:00:09.395 3 0 9498 RECEIVE +2024-07-30 12:00:09.396 1 3 9500 SEND +2024-07-30 12:00:09.397 2 0 9502 RECEIVE +2024-07-30 12:00:09.398 0 2 9504 SEND +2024-07-30 12:00:09.399 3 1 9506 RECEIVE +2024-07-30 12:00:09.400 1 0 9508 SEND +2024-07-30 12:00:09.401 2 1 9510 RECEIVE +2024-07-30 12:00:09.402 3 2 9512 SEND +2024-07-30 12:00:09.403 0 3 9514 RECEIVE +2024-07-30 12:00:09.404 2 0 9516 SEND +2024-07-30 12:00:09.405 1 3 9518 RECEIVE +2024-07-30 12:00:09.406 0 1 9520 SEND +2024-07-30 12:00:09.407 3 2 9522 RECEIVE +2024-07-30 12:00:09.408 0 1 9508 SEND +2024-07-30 12:00:09.409 1 2 9510 RECEIVE +2024-07-30 12:00:09.410 2 3 9512 SEND +2024-07-30 12:00:09.411 3 0 9514 RECEIVE +2024-07-30 12:00:09.412 1 3 9516 SEND +2024-07-30 12:00:09.413 2 0 9518 RECEIVE +2024-07-30 12:00:09.414 0 2 9520 SEND +2024-07-30 12:00:09.415 3 1 9522 RECEIVE +2024-07-30 12:00:09.416 1 0 9524 SEND +2024-07-30 12:00:09.417 2 1 9526 RECEIVE +2024-07-30 12:00:09.418 3 2 9528 SEND +2024-07-30 12:00:09.419 0 3 9530 RECEIVE +2024-07-30 12:00:09.420 2 0 9532 SEND +2024-07-30 12:00:09.421 1 3 9534 RECEIVE +2024-07-30 12:00:09.422 0 1 9536 SEND +2024-07-30 12:00:09.423 3 2 9538 RECEIVE +2024-07-30 12:00:09.424 0 1 9524 SEND +2024-07-30 12:00:09.425 1 2 9526 RECEIVE +2024-07-30 12:00:09.426 2 3 9528 SEND +2024-07-30 12:00:09.427 3 0 9530 RECEIVE +2024-07-30 12:00:09.428 1 3 9532 SEND +2024-07-30 12:00:09.429 2 0 9534 RECEIVE +2024-07-30 12:00:09.430 0 2 9536 SEND +2024-07-30 12:00:09.431 3 1 9538 RECEIVE +2024-07-30 12:00:09.432 1 0 9540 SEND +2024-07-30 12:00:09.433 2 1 9542 RECEIVE +2024-07-30 12:00:09.434 3 2 9544 SEND +2024-07-30 12:00:09.435 0 3 9546 RECEIVE +2024-07-30 12:00:09.436 2 0 9548 SEND +2024-07-30 12:00:09.437 1 3 9550 RECEIVE +2024-07-30 12:00:09.438 0 1 9552 SEND +2024-07-30 12:00:09.439 3 2 9554 RECEIVE +2024-07-30 12:00:09.440 0 1 9540 SEND +2024-07-30 12:00:09.441 1 2 9542 RECEIVE +2024-07-30 12:00:09.442 2 3 9544 SEND +2024-07-30 12:00:09.443 3 0 9546 RECEIVE +2024-07-30 12:00:09.444 1 3 9548 SEND +2024-07-30 12:00:09.445 2 0 9550 RECEIVE +2024-07-30 12:00:09.446 0 2 9552 SEND +2024-07-30 12:00:09.447 3 1 9554 RECEIVE +2024-07-30 12:00:09.448 1 0 9556 SEND +2024-07-30 12:00:09.449 2 1 9558 RECEIVE +2024-07-30 12:00:09.450 3 2 9560 SEND +2024-07-30 12:00:09.451 0 3 9562 RECEIVE +2024-07-30 12:00:09.452 2 0 9564 SEND +2024-07-30 12:00:09.453 1 3 9566 RECEIVE +2024-07-30 12:00:09.454 0 1 9568 SEND +2024-07-30 12:00:09.455 3 2 9570 RECEIVE +2024-07-30 12:00:09.456 0 1 9556 SEND +2024-07-30 12:00:09.457 1 2 9558 RECEIVE +2024-07-30 12:00:09.458 2 3 9560 SEND +2024-07-30 12:00:09.459 3 0 9562 RECEIVE +2024-07-30 12:00:09.460 1 3 9564 SEND +2024-07-30 12:00:09.461 2 0 9566 RECEIVE +2024-07-30 12:00:09.462 0 2 9568 SEND +2024-07-30 12:00:09.463 3 1 9570 RECEIVE +2024-07-30 12:00:09.464 1 0 9572 SEND +2024-07-30 12:00:09.465 2 1 9574 RECEIVE +2024-07-30 12:00:09.466 3 2 9576 SEND +2024-07-30 12:00:09.467 0 3 9578 RECEIVE +2024-07-30 12:00:09.468 2 0 9580 SEND +2024-07-30 12:00:09.469 1 3 9582 RECEIVE +2024-07-30 12:00:09.470 0 1 9584 SEND +2024-07-30 12:00:09.471 3 2 9586 RECEIVE +2024-07-30 12:00:09.472 0 1 9572 SEND +2024-07-30 12:00:09.473 1 2 9574 RECEIVE +2024-07-30 12:00:09.474 2 3 9576 SEND +2024-07-30 12:00:09.475 3 0 9578 RECEIVE +2024-07-30 12:00:09.476 1 3 9580 SEND +2024-07-30 12:00:09.477 2 0 9582 RECEIVE +2024-07-30 12:00:09.478 0 2 9584 SEND +2024-07-30 12:00:09.479 3 1 9586 RECEIVE +2024-07-30 12:00:09.480 1 0 9588 SEND +2024-07-30 12:00:09.481 2 1 9590 RECEIVE +2024-07-30 12:00:09.482 3 2 9592 SEND +2024-07-30 12:00:09.483 0 3 9594 RECEIVE +2024-07-30 12:00:09.484 2 0 9596 SEND +2024-07-30 12:00:09.485 1 3 9598 RECEIVE +2024-07-30 12:00:09.486 0 1 9600 SEND +2024-07-30 12:00:09.487 3 2 9602 RECEIVE +2024-07-30 12:00:09.488 0 1 9588 SEND +2024-07-30 12:00:09.489 1 2 9590 RECEIVE +2024-07-30 12:00:09.490 2 3 9592 SEND +2024-07-30 12:00:09.491 3 0 9594 RECEIVE +2024-07-30 12:00:09.492 1 3 9596 SEND +2024-07-30 12:00:09.493 2 0 9598 RECEIVE +2024-07-30 12:00:09.494 0 2 9600 SEND +2024-07-30 12:00:09.495 3 1 9602 RECEIVE +2024-07-30 12:00:09.496 1 0 9604 SEND +2024-07-30 12:00:09.497 2 1 9606 RECEIVE +2024-07-30 12:00:09.498 3 2 9608 SEND +2024-07-30 12:00:09.499 0 3 9610 RECEIVE +2024-07-30 12:00:09.500 2 0 9612 SEND +2024-07-30 12:00:09.501 1 3 9614 RECEIVE +2024-07-30 12:00:09.502 0 1 9616 SEND +2024-07-30 12:00:09.503 3 2 9618 RECEIVE +2024-07-30 12:00:09.504 0 1 9604 SEND +2024-07-30 12:00:09.505 1 2 9606 RECEIVE +2024-07-30 12:00:09.506 2 3 9608 SEND +2024-07-30 12:00:09.507 3 0 9610 RECEIVE +2024-07-30 12:00:09.508 1 3 9612 SEND +2024-07-30 12:00:09.509 2 0 9614 RECEIVE +2024-07-30 12:00:09.510 0 2 9616 SEND +2024-07-30 12:00:09.511 3 1 9618 RECEIVE +2024-07-30 12:00:09.512 1 0 9620 SEND +2024-07-30 12:00:09.513 2 1 9622 RECEIVE +2024-07-30 12:00:09.514 3 2 9624 SEND +2024-07-30 12:00:09.515 0 3 9626 RECEIVE +2024-07-30 12:00:09.516 2 0 9628 SEND +2024-07-30 12:00:09.517 1 3 9630 RECEIVE +2024-07-30 12:00:09.518 0 1 9632 SEND +2024-07-30 12:00:09.519 3 2 9634 RECEIVE +2024-07-30 12:00:09.520 0 1 9620 SEND +2024-07-30 12:00:09.521 1 2 9622 RECEIVE +2024-07-30 12:00:09.522 2 3 9624 SEND +2024-07-30 12:00:09.523 3 0 9626 RECEIVE +2024-07-30 12:00:09.524 1 3 9628 SEND +2024-07-30 12:00:09.525 2 0 9630 RECEIVE +2024-07-30 12:00:09.526 0 2 9632 SEND +2024-07-30 12:00:09.527 3 1 9634 RECEIVE +2024-07-30 12:00:09.528 1 0 9636 SEND +2024-07-30 12:00:09.529 2 1 9638 RECEIVE +2024-07-30 12:00:09.530 3 2 9640 SEND +2024-07-30 12:00:09.531 0 3 9642 RECEIVE +2024-07-30 12:00:09.532 2 0 9644 SEND +2024-07-30 12:00:09.533 1 3 9646 RECEIVE +2024-07-30 12:00:09.534 0 1 9648 SEND +2024-07-30 12:00:09.535 3 2 9650 RECEIVE +2024-07-30 12:00:09.536 0 1 9636 SEND +2024-07-30 12:00:09.537 1 2 9638 RECEIVE +2024-07-30 12:00:09.538 2 3 9640 SEND +2024-07-30 12:00:09.539 3 0 9642 RECEIVE +2024-07-30 12:00:09.540 1 3 9644 SEND +2024-07-30 12:00:09.541 2 0 9646 RECEIVE +2024-07-30 12:00:09.542 0 2 9648 SEND +2024-07-30 12:00:09.543 3 1 9650 RECEIVE +2024-07-30 12:00:09.544 1 0 9652 SEND +2024-07-30 12:00:09.545 2 1 9654 RECEIVE +2024-07-30 12:00:09.546 3 2 9656 SEND +2024-07-30 12:00:09.547 0 3 9658 RECEIVE +2024-07-30 12:00:09.548 2 0 9660 SEND +2024-07-30 12:00:09.549 1 3 9662 RECEIVE +2024-07-30 12:00:09.550 0 1 9664 SEND +2024-07-30 12:00:09.551 3 2 9666 RECEIVE +2024-07-30 12:00:09.552 0 1 9652 SEND +2024-07-30 12:00:09.553 1 2 9654 RECEIVE +2024-07-30 12:00:09.554 2 3 9656 SEND +2024-07-30 12:00:09.555 3 0 9658 RECEIVE +2024-07-30 12:00:09.556 1 3 9660 SEND +2024-07-30 12:00:09.557 2 0 9662 RECEIVE +2024-07-30 12:00:09.558 0 2 9664 SEND +2024-07-30 12:00:09.559 3 1 9666 RECEIVE +2024-07-30 12:00:09.560 1 0 9668 SEND +2024-07-30 12:00:09.561 2 1 9670 RECEIVE +2024-07-30 12:00:09.562 3 2 9672 SEND +2024-07-30 12:00:09.563 0 3 9674 RECEIVE +2024-07-30 12:00:09.564 2 0 9676 SEND +2024-07-30 12:00:09.565 1 3 9678 RECEIVE +2024-07-30 12:00:09.566 0 1 9680 SEND +2024-07-30 12:00:09.567 3 2 9682 RECEIVE +2024-07-30 12:00:09.568 0 1 9668 SEND +2024-07-30 12:00:09.569 1 2 9670 RECEIVE +2024-07-30 12:00:09.570 2 3 9672 SEND +2024-07-30 12:00:09.571 3 0 9674 RECEIVE +2024-07-30 12:00:09.572 1 3 9676 SEND +2024-07-30 12:00:09.573 2 0 9678 RECEIVE +2024-07-30 12:00:09.574 0 2 9680 SEND +2024-07-30 12:00:09.575 3 1 9682 RECEIVE +2024-07-30 12:00:09.576 1 0 9684 SEND +2024-07-30 12:00:09.577 2 1 9686 RECEIVE +2024-07-30 12:00:09.578 3 2 9688 SEND +2024-07-30 12:00:09.579 0 3 9690 RECEIVE +2024-07-30 12:00:09.580 2 0 9692 SEND +2024-07-30 12:00:09.581 1 3 9694 RECEIVE +2024-07-30 12:00:09.582 0 1 9696 SEND +2024-07-30 12:00:09.583 3 2 9698 RECEIVE +2024-07-30 12:00:09.584 0 1 9684 SEND +2024-07-30 12:00:09.585 1 2 9686 RECEIVE +2024-07-30 12:00:09.586 2 3 9688 SEND +2024-07-30 12:00:09.587 3 0 9690 RECEIVE +2024-07-30 12:00:09.588 1 3 9692 SEND +2024-07-30 12:00:09.589 2 0 9694 RECEIVE +2024-07-30 12:00:09.590 0 2 9696 SEND +2024-07-30 12:00:09.591 3 1 9698 RECEIVE +2024-07-30 12:00:09.592 1 0 9700 SEND +2024-07-30 12:00:09.593 2 1 9702 RECEIVE +2024-07-30 12:00:09.594 3 2 9704 SEND +2024-07-30 12:00:09.595 0 3 9706 RECEIVE +2024-07-30 12:00:09.596 2 0 9708 SEND +2024-07-30 12:00:09.597 1 3 9710 RECEIVE +2024-07-30 12:00:09.598 0 1 9712 SEND +2024-07-30 12:00:09.599 3 2 9714 RECEIVE +2024-07-30 12:00:09.600 0 1 9700 SEND +2024-07-30 12:00:09.601 1 2 9702 RECEIVE +2024-07-30 12:00:09.602 2 3 9704 SEND +2024-07-30 12:00:09.603 3 0 9706 RECEIVE +2024-07-30 12:00:09.604 1 3 9708 SEND +2024-07-30 12:00:09.605 2 0 9710 RECEIVE +2024-07-30 12:00:09.606 0 2 9712 SEND +2024-07-30 12:00:09.607 3 1 9714 RECEIVE +2024-07-30 12:00:09.608 1 0 9716 SEND +2024-07-30 12:00:09.609 2 1 9718 RECEIVE +2024-07-30 12:00:09.610 3 2 9720 SEND +2024-07-30 12:00:09.611 0 3 9722 RECEIVE +2024-07-30 12:00:09.612 2 0 9724 SEND +2024-07-30 12:00:09.613 1 3 9726 RECEIVE +2024-07-30 12:00:09.614 0 1 9728 SEND +2024-07-30 12:00:09.615 3 2 9730 RECEIVE +2024-07-30 12:00:09.616 0 1 9716 SEND +2024-07-30 12:00:09.617 1 2 9718 RECEIVE +2024-07-30 12:00:09.618 2 3 9720 SEND +2024-07-30 12:00:09.619 3 0 9722 RECEIVE +2024-07-30 12:00:09.620 1 3 9724 SEND +2024-07-30 12:00:09.621 2 0 9726 RECEIVE +2024-07-30 12:00:09.622 0 2 9728 SEND +2024-07-30 12:00:09.623 3 1 9730 RECEIVE +2024-07-30 12:00:09.624 1 0 9732 SEND +2024-07-30 12:00:09.625 2 1 9734 RECEIVE +2024-07-30 12:00:09.626 3 2 9736 SEND +2024-07-30 12:00:09.627 0 3 9738 RECEIVE +2024-07-30 12:00:09.628 2 0 9740 SEND +2024-07-30 12:00:09.629 1 3 9742 RECEIVE +2024-07-30 12:00:09.630 0 1 9744 SEND +2024-07-30 12:00:09.631 3 2 9746 RECEIVE +2024-07-30 12:00:09.632 0 1 9732 SEND +2024-07-30 12:00:09.633 1 2 9734 RECEIVE +2024-07-30 12:00:09.634 2 3 9736 SEND +2024-07-30 12:00:09.635 3 0 9738 RECEIVE +2024-07-30 12:00:09.636 1 3 9740 SEND +2024-07-30 12:00:09.637 2 0 9742 RECEIVE +2024-07-30 12:00:09.638 0 2 9744 SEND +2024-07-30 12:00:09.639 3 1 9746 RECEIVE +2024-07-30 12:00:09.640 1 0 9748 SEND +2024-07-30 12:00:09.641 2 1 9750 RECEIVE +2024-07-30 12:00:09.642 3 2 9752 SEND +2024-07-30 12:00:09.643 0 3 9754 RECEIVE +2024-07-30 12:00:09.644 2 0 9756 SEND +2024-07-30 12:00:09.645 1 3 9758 RECEIVE +2024-07-30 12:00:09.646 0 1 9760 SEND +2024-07-30 12:00:09.647 3 2 9762 RECEIVE +2024-07-30 12:00:09.648 0 1 9748 SEND +2024-07-30 12:00:09.649 1 2 9750 RECEIVE +2024-07-30 12:00:09.650 2 3 9752 SEND +2024-07-30 12:00:09.651 3 0 9754 RECEIVE +2024-07-30 12:00:09.652 1 3 9756 SEND +2024-07-30 12:00:09.653 2 0 9758 RECEIVE +2024-07-30 12:00:09.654 0 2 9760 SEND +2024-07-30 12:00:09.655 3 1 9762 RECEIVE +2024-07-30 12:00:09.656 1 0 9764 SEND +2024-07-30 12:00:09.657 2 1 9766 RECEIVE +2024-07-30 12:00:09.658 3 2 9768 SEND +2024-07-30 12:00:09.659 0 3 9770 RECEIVE +2024-07-30 12:00:09.660 2 0 9772 SEND +2024-07-30 12:00:09.661 1 3 9774 RECEIVE +2024-07-30 12:00:09.662 0 1 9776 SEND +2024-07-30 12:00:09.663 3 2 9778 RECEIVE +2024-07-30 12:00:09.664 0 1 9764 SEND +2024-07-30 12:00:09.665 1 2 9766 RECEIVE +2024-07-30 12:00:09.666 2 3 9768 SEND +2024-07-30 12:00:09.667 3 0 9770 RECEIVE +2024-07-30 12:00:09.668 1 3 9772 SEND +2024-07-30 12:00:09.669 2 0 9774 RECEIVE +2024-07-30 12:00:09.670 0 2 9776 SEND +2024-07-30 12:00:09.671 3 1 9778 RECEIVE +2024-07-30 12:00:09.672 1 0 9780 SEND +2024-07-30 12:00:09.673 2 1 9782 RECEIVE +2024-07-30 12:00:09.674 3 2 9784 SEND +2024-07-30 12:00:09.675 0 3 9786 RECEIVE +2024-07-30 12:00:09.676 2 0 9788 SEND +2024-07-30 12:00:09.677 1 3 9790 RECEIVE +2024-07-30 12:00:09.678 0 1 9792 SEND +2024-07-30 12:00:09.679 3 2 9794 RECEIVE +2024-07-30 12:00:09.680 0 1 9780 SEND +2024-07-30 12:00:09.681 1 2 9782 RECEIVE +2024-07-30 12:00:09.682 2 3 9784 SEND +2024-07-30 12:00:09.683 3 0 9786 RECEIVE +2024-07-30 12:00:09.684 1 3 9788 SEND +2024-07-30 12:00:09.685 2 0 9790 RECEIVE +2024-07-30 12:00:09.686 0 2 9792 SEND +2024-07-30 12:00:09.687 3 1 9794 RECEIVE +2024-07-30 12:00:09.688 1 0 9796 SEND +2024-07-30 12:00:09.689 2 1 9798 RECEIVE +2024-07-30 12:00:09.690 3 2 9800 SEND +2024-07-30 12:00:09.691 0 3 9802 RECEIVE +2024-07-30 12:00:09.692 2 0 9804 SEND +2024-07-30 12:00:09.693 1 3 9806 RECEIVE +2024-07-30 12:00:09.694 0 1 9808 SEND +2024-07-30 12:00:09.695 3 2 9810 RECEIVE +2024-07-30 12:00:09.696 0 1 9796 SEND +2024-07-30 12:00:09.697 1 2 9798 RECEIVE +2024-07-30 12:00:09.698 2 3 9800 SEND +2024-07-30 12:00:09.699 3 0 9802 RECEIVE +2024-07-30 12:00:09.700 1 3 9804 SEND +2024-07-30 12:00:09.701 2 0 9806 RECEIVE +2024-07-30 12:00:09.702 0 2 9808 SEND +2024-07-30 12:00:09.703 3 1 9810 RECEIVE +2024-07-30 12:00:09.704 1 0 9812 SEND +2024-07-30 12:00:09.705 2 1 9814 RECEIVE +2024-07-30 12:00:09.706 3 2 9816 SEND +2024-07-30 12:00:09.707 0 3 9818 RECEIVE +2024-07-30 12:00:09.708 2 0 9820 SEND +2024-07-30 12:00:09.709 1 3 9822 RECEIVE +2024-07-30 12:00:09.710 0 1 9824 SEND +2024-07-30 12:00:09.711 3 2 9826 RECEIVE +2024-07-30 12:00:09.712 0 1 9812 SEND +2024-07-30 12:00:09.713 1 2 9814 RECEIVE +2024-07-30 12:00:09.714 2 3 9816 SEND +2024-07-30 12:00:09.715 3 0 9818 RECEIVE +2024-07-30 12:00:09.716 1 3 9820 SEND +2024-07-30 12:00:09.717 2 0 9822 RECEIVE +2024-07-30 12:00:09.718 0 2 9824 SEND +2024-07-30 12:00:09.719 3 1 9826 RECEIVE +2024-07-30 12:00:09.720 1 0 9828 SEND +2024-07-30 12:00:09.721 2 1 9830 RECEIVE +2024-07-30 12:00:09.722 3 2 9832 SEND +2024-07-30 12:00:09.723 0 3 9834 RECEIVE +2024-07-30 12:00:09.724 2 0 9836 SEND +2024-07-30 12:00:09.725 1 3 9838 RECEIVE +2024-07-30 12:00:09.726 0 1 9840 SEND +2024-07-30 12:00:09.727 3 2 9842 RECEIVE +2024-07-30 12:00:09.728 0 1 9828 SEND +2024-07-30 12:00:09.729 1 2 9830 RECEIVE +2024-07-30 12:00:09.730 2 3 9832 SEND +2024-07-30 12:00:09.731 3 0 9834 RECEIVE +2024-07-30 12:00:09.732 1 3 9836 SEND +2024-07-30 12:00:09.733 2 0 9838 RECEIVE +2024-07-30 12:00:09.734 0 2 9840 SEND +2024-07-30 12:00:09.735 3 1 9842 RECEIVE +2024-07-30 12:00:09.736 1 0 9844 SEND +2024-07-30 12:00:09.737 2 1 9846 RECEIVE +2024-07-30 12:00:09.738 3 2 9848 SEND +2024-07-30 12:00:09.739 0 3 9850 RECEIVE +2024-07-30 12:00:09.740 2 0 9852 SEND +2024-07-30 12:00:09.741 1 3 9854 RECEIVE +2024-07-30 12:00:09.742 0 1 9856 SEND +2024-07-30 12:00:09.743 3 2 9858 RECEIVE +2024-07-30 12:00:09.744 0 1 9844 SEND +2024-07-30 12:00:09.745 1 2 9846 RECEIVE +2024-07-30 12:00:09.746 2 3 9848 SEND +2024-07-30 12:00:09.747 3 0 9850 RECEIVE +2024-07-30 12:00:09.748 1 3 9852 SEND +2024-07-30 12:00:09.749 2 0 9854 RECEIVE +2024-07-30 12:00:09.750 0 2 9856 SEND +2024-07-30 12:00:09.751 3 1 9858 RECEIVE +2024-07-30 12:00:09.752 1 0 9860 SEND +2024-07-30 12:00:09.753 2 1 9862 RECEIVE +2024-07-30 12:00:09.754 3 2 9864 SEND +2024-07-30 12:00:09.755 0 3 9866 RECEIVE +2024-07-30 12:00:09.756 2 0 9868 SEND +2024-07-30 12:00:09.757 1 3 9870 RECEIVE +2024-07-30 12:00:09.758 0 1 9872 SEND +2024-07-30 12:00:09.759 3 2 9874 RECEIVE +2024-07-30 12:00:09.760 0 1 9860 SEND +2024-07-30 12:00:09.761 1 2 9862 RECEIVE +2024-07-30 12:00:09.762 2 3 9864 SEND +2024-07-30 12:00:09.763 3 0 9866 RECEIVE +2024-07-30 12:00:09.764 1 3 9868 SEND +2024-07-30 12:00:09.765 2 0 9870 RECEIVE +2024-07-30 12:00:09.766 0 2 9872 SEND +2024-07-30 12:00:09.767 3 1 9874 RECEIVE +2024-07-30 12:00:09.768 1 0 9876 SEND +2024-07-30 12:00:09.769 2 1 9878 RECEIVE +2024-07-30 12:00:09.770 3 2 9880 SEND +2024-07-30 12:00:09.771 0 3 9882 RECEIVE +2024-07-30 12:00:09.772 2 0 9884 SEND +2024-07-30 12:00:09.773 1 3 9886 RECEIVE +2024-07-30 12:00:09.774 0 1 9888 SEND +2024-07-30 12:00:09.775 3 2 9890 RECEIVE +2024-07-30 12:00:09.776 0 1 9876 SEND +2024-07-30 12:00:09.777 1 2 9878 RECEIVE +2024-07-30 12:00:09.778 2 3 9880 SEND +2024-07-30 12:00:09.779 3 0 9882 RECEIVE +2024-07-30 12:00:09.780 1 3 9884 SEND +2024-07-30 12:00:09.781 2 0 9886 RECEIVE +2024-07-30 12:00:09.782 0 2 9888 SEND +2024-07-30 12:00:09.783 3 1 9890 RECEIVE +2024-07-30 12:00:09.784 1 0 9892 SEND +2024-07-30 12:00:09.785 2 1 9894 RECEIVE +2024-07-30 12:00:09.786 3 2 9896 SEND +2024-07-30 12:00:09.787 0 3 9898 RECEIVE +2024-07-30 12:00:09.788 2 0 9900 SEND +2024-07-30 12:00:09.789 1 3 9902 RECEIVE +2024-07-30 12:00:09.790 0 1 9904 SEND +2024-07-30 12:00:09.791 3 2 9906 RECEIVE +2024-07-30 12:00:09.792 0 1 9892 SEND +2024-07-30 12:00:09.793 1 2 9894 RECEIVE +2024-07-30 12:00:09.794 2 3 9896 SEND +2024-07-30 12:00:09.795 3 0 9898 RECEIVE +2024-07-30 12:00:09.796 1 3 9900 SEND +2024-07-30 12:00:09.797 2 0 9902 RECEIVE +2024-07-30 12:00:09.798 0 2 9904 SEND +2024-07-30 12:00:09.799 3 1 9906 RECEIVE +2024-07-30 12:00:09.800 1 0 9908 SEND +2024-07-30 12:00:09.801 2 1 9910 RECEIVE +2024-07-30 12:00:09.802 3 2 9912 SEND +2024-07-30 12:00:09.803 0 3 9914 RECEIVE +2024-07-30 12:00:09.804 2 0 9916 SEND +2024-07-30 12:00:09.805 1 3 9918 RECEIVE +2024-07-30 12:00:09.806 0 1 9920 SEND +2024-07-30 12:00:09.807 3 2 9922 RECEIVE +2024-07-30 12:00:09.808 0 1 9908 SEND +2024-07-30 12:00:09.809 1 2 9910 RECEIVE +2024-07-30 12:00:09.810 2 3 9912 SEND +2024-07-30 12:00:09.811 3 0 9914 RECEIVE +2024-07-30 12:00:09.812 1 3 9916 SEND +2024-07-30 12:00:09.813 2 0 9918 RECEIVE +2024-07-30 12:00:09.814 0 2 9920 SEND +2024-07-30 12:00:09.815 3 1 9922 RECEIVE +2024-07-30 12:00:09.816 1 0 9924 SEND +2024-07-30 12:00:09.817 2 1 9926 RECEIVE +2024-07-30 12:00:09.818 3 2 9928 SEND +2024-07-30 12:00:09.819 0 3 9930 RECEIVE +2024-07-30 12:00:09.820 2 0 9932 SEND +2024-07-30 12:00:09.821 1 3 9934 RECEIVE +2024-07-30 12:00:09.822 0 1 9936 SEND +2024-07-30 12:00:09.823 3 2 9938 RECEIVE +2024-07-30 12:00:09.824 0 1 9924 SEND +2024-07-30 12:00:09.825 1 2 9926 RECEIVE +2024-07-30 12:00:09.826 2 3 9928 SEND +2024-07-30 12:00:09.827 3 0 9930 RECEIVE +2024-07-30 12:00:09.828 1 3 9932 SEND +2024-07-30 12:00:09.829 2 0 9934 RECEIVE +2024-07-30 12:00:09.830 0 2 9936 SEND +2024-07-30 12:00:09.831 3 1 9938 RECEIVE +2024-07-30 12:00:09.832 1 0 9940 SEND +2024-07-30 12:00:09.833 2 1 9942 RECEIVE +2024-07-30 12:00:09.834 3 2 9944 SEND +2024-07-30 12:00:09.835 0 3 9946 RECEIVE +2024-07-30 12:00:09.836 2 0 9948 SEND +2024-07-30 12:00:09.837 1 3 9950 RECEIVE +2024-07-30 12:00:09.838 0 1 9952 SEND +2024-07-30 12:00:09.839 3 2 9954 RECEIVE +2024-07-30 12:00:09.840 0 1 9940 SEND +2024-07-30 12:00:09.841 1 2 9942 RECEIVE +2024-07-30 12:00:09.842 2 3 9944 SEND +2024-07-30 12:00:09.843 3 0 9946 RECEIVE +2024-07-30 12:00:09.844 1 3 9948 SEND +2024-07-30 12:00:09.845 2 0 9950 RECEIVE +2024-07-30 12:00:09.846 0 2 9952 SEND +2024-07-30 12:00:09.847 3 1 9954 RECEIVE +2024-07-30 12:00:09.848 1 0 9956 SEND +2024-07-30 12:00:09.849 2 1 9958 RECEIVE +2024-07-30 12:00:09.850 3 2 9960 SEND +2024-07-30 12:00:09.851 0 3 9962 RECEIVE +2024-07-30 12:00:09.852 2 0 9964 SEND +2024-07-30 12:00:09.853 1 3 9966 RECEIVE +2024-07-30 12:00:09.854 0 1 9968 SEND +2024-07-30 12:00:09.855 3 2 9970 RECEIVE +2024-07-30 12:00:09.856 0 1 9956 SEND +2024-07-30 12:00:09.857 1 2 9958 RECEIVE +2024-07-30 12:00:09.858 2 3 9960 SEND +2024-07-30 12:00:09.859 3 0 9962 RECEIVE +2024-07-30 12:00:09.860 1 3 9964 SEND +2024-07-30 12:00:09.861 2 0 9966 RECEIVE +2024-07-30 12:00:09.862 0 2 9968 SEND +2024-07-30 12:00:09.863 3 1 9970 RECEIVE +2024-07-30 12:00:09.864 1 0 9972 SEND +2024-07-30 12:00:09.865 2 1 9974 RECEIVE +2024-07-30 12:00:09.866 3 2 9976 SEND +2024-07-30 12:00:09.867 0 3 9978 RECEIVE +2024-07-30 12:00:09.868 2 0 9980 SEND +2024-07-30 12:00:09.869 1 3 9982 RECEIVE +2024-07-30 12:00:09.870 0 1 9984 SEND +2024-07-30 12:00:09.871 3 2 9986 RECEIVE +2024-07-30 12:00:09.872 0 1 9972 SEND +2024-07-30 12:00:09.873 1 2 9974 RECEIVE +2024-07-30 12:00:09.874 2 3 9976 SEND +2024-07-30 12:00:09.875 3 0 9978 RECEIVE +2024-07-30 12:00:09.876 1 3 9980 SEND +2024-07-30 12:00:09.877 2 0 9982 RECEIVE +2024-07-30 12:00:09.878 0 2 9984 SEND +2024-07-30 12:00:09.879 3 1 9986 RECEIVE +2024-07-30 12:00:09.880 1 0 9988 SEND +2024-07-30 12:00:09.881 2 1 9990 RECEIVE +2024-07-30 12:00:09.882 3 2 9992 SEND +2024-07-30 12:00:09.883 0 3 9994 RECEIVE +2024-07-30 12:00:09.884 2 0 9996 SEND +2024-07-30 12:00:09.885 1 3 9998 RECEIVE +2024-07-30 12:00:09.886 0 1 10000 SEND +2024-07-30 12:00:09.887 3 2 10002 RECEIVE +2024-07-30 12:00:09.888 0 1 9988 SEND +2024-07-30 12:00:09.889 1 2 9990 RECEIVE +2024-07-30 12:00:09.890 2 3 9992 SEND +2024-07-30 12:00:09.891 3 0 9994 RECEIVE +2024-07-30 12:00:09.892 1 3 9996 SEND +2024-07-30 12:00:09.893 2 0 9998 RECEIVE +2024-07-30 12:00:09.894 0 2 10000 SEND +2024-07-30 12:00:09.895 3 1 10002 RECEIVE +2024-07-30 12:00:09.896 1 0 10004 SEND +2024-07-30 12:00:09.897 2 1 10006 RECEIVE +2024-07-30 12:00:09.898 3 2 10008 SEND +2024-07-30 12:00:09.899 0 3 10010 RECEIVE +2024-07-30 12:00:09.900 2 0 10012 SEND +2024-07-30 12:00:09.901 1 3 10014 RECEIVE +2024-07-30 12:00:09.902 0 1 10016 SEND +2024-07-30 12:00:09.903 3 2 10018 RECEIVE +2024-07-30 12:00:09.904 0 1 10004 SEND +2024-07-30 12:00:09.905 1 2 10006 RECEIVE +2024-07-30 12:00:09.906 2 3 10008 SEND +2024-07-30 12:00:09.907 3 0 10010 RECEIVE +2024-07-30 12:00:09.908 1 3 10012 SEND +2024-07-30 12:00:09.909 2 0 10014 RECEIVE +2024-07-30 12:00:09.910 0 2 10016 SEND +2024-07-30 12:00:09.911 3 1 10018 RECEIVE +2024-07-30 12:00:09.912 1 0 10020 SEND +2024-07-30 12:00:09.913 2 1 10022 RECEIVE +2024-07-30 12:00:09.914 3 2 10024 SEND +2024-07-30 12:00:09.915 0 3 10026 RECEIVE +2024-07-30 12:00:09.916 2 0 10028 SEND +2024-07-30 12:00:09.917 1 3 10030 RECEIVE +2024-07-30 12:00:09.918 0 1 10032 SEND +2024-07-30 12:00:09.919 3 2 10034 RECEIVE +2024-07-30 12:00:09.920 0 1 10020 SEND +2024-07-30 12:00:09.921 1 2 10022 RECEIVE +2024-07-30 12:00:09.922 2 3 10024 SEND +2024-07-30 12:00:09.923 3 0 10026 RECEIVE +2024-07-30 12:00:09.924 1 3 10028 SEND +2024-07-30 12:00:09.925 2 0 10030 RECEIVE +2024-07-30 12:00:09.926 0 2 10032 SEND +2024-07-30 12:00:09.927 3 1 10034 RECEIVE +2024-07-30 12:00:09.928 1 0 10036 SEND +2024-07-30 12:00:09.929 2 1 10038 RECEIVE +2024-07-30 12:00:09.930 3 2 10040 SEND +2024-07-30 12:00:09.931 0 3 10042 RECEIVE +2024-07-30 12:00:09.932 2 0 10044 SEND +2024-07-30 12:00:09.933 1 3 10046 RECEIVE +2024-07-30 12:00:09.934 0 1 10048 SEND +2024-07-30 12:00:09.935 3 2 10050 RECEIVE +2024-07-30 12:00:09.936 0 1 10036 SEND +2024-07-30 12:00:09.937 1 2 10038 RECEIVE +2024-07-30 12:00:09.938 2 3 10040 SEND +2024-07-30 12:00:09.939 3 0 10042 RECEIVE +2024-07-30 12:00:09.940 1 3 10044 SEND +2024-07-30 12:00:09.941 2 0 10046 RECEIVE +2024-07-30 12:00:09.942 0 2 10048 SEND +2024-07-30 12:00:09.943 3 1 10050 RECEIVE +2024-07-30 12:00:09.944 1 0 10052 SEND +2024-07-30 12:00:09.945 2 1 10054 RECEIVE +2024-07-30 12:00:09.946 3 2 10056 SEND +2024-07-30 12:00:09.947 0 3 10058 RECEIVE +2024-07-30 12:00:09.948 2 0 10060 SEND +2024-07-30 12:00:09.949 1 3 10062 RECEIVE +2024-07-30 12:00:09.950 0 1 10064 SEND +2024-07-30 12:00:09.951 3 2 10066 RECEIVE +2024-07-30 12:00:09.952 0 1 10052 SEND +2024-07-30 12:00:09.953 1 2 10054 RECEIVE +2024-07-30 12:00:09.954 2 3 10056 SEND +2024-07-30 12:00:09.955 3 0 10058 RECEIVE +2024-07-30 12:00:09.956 1 3 10060 SEND +2024-07-30 12:00:09.957 2 0 10062 RECEIVE +2024-07-30 12:00:09.958 0 2 10064 SEND +2024-07-30 12:00:09.959 3 1 10066 RECEIVE +2024-07-30 12:00:09.960 1 0 10068 SEND +2024-07-30 12:00:09.961 2 1 10070 RECEIVE +2024-07-30 12:00:09.962 3 2 10072 SEND +2024-07-30 12:00:09.963 0 3 10074 RECEIVE +2024-07-30 12:00:09.964 2 0 10076 SEND +2024-07-30 12:00:09.965 1 3 10078 RECEIVE +2024-07-30 12:00:09.966 0 1 10080 SEND +2024-07-30 12:00:09.967 3 2 10082 RECEIVE +2024-07-30 12:00:09.968 0 1 10068 SEND +2024-07-30 12:00:09.969 1 2 10070 RECEIVE +2024-07-30 12:00:09.970 2 3 10072 SEND +2024-07-30 12:00:09.971 3 0 10074 RECEIVE +2024-07-30 12:00:09.972 1 3 10076 SEND +2024-07-30 12:00:09.973 2 0 10078 RECEIVE +2024-07-30 12:00:09.974 0 2 10080 SEND +2024-07-30 12:00:09.975 3 1 10082 RECEIVE +2024-07-30 12:00:09.976 1 0 10084 SEND +2024-07-30 12:00:09.977 2 1 10086 RECEIVE +2024-07-30 12:00:09.978 3 2 10088 SEND +2024-07-30 12:00:09.979 0 3 10090 RECEIVE +2024-07-30 12:00:09.980 2 0 10092 SEND +2024-07-30 12:00:09.981 1 3 10094 RECEIVE +2024-07-30 12:00:09.982 0 1 10096 SEND +2024-07-30 12:00:09.983 3 2 10098 RECEIVE +2024-07-30 12:00:09.984 0 1 10084 SEND +2024-07-30 12:00:09.985 1 2 10086 RECEIVE +2024-07-30 12:00:09.986 2 3 10088 SEND +2024-07-30 12:00:09.987 3 0 10090 RECEIVE +2024-07-30 12:00:09.988 1 3 10092 SEND +2024-07-30 12:00:09.989 2 0 10094 RECEIVE +2024-07-30 12:00:09.990 0 2 10096 SEND +2024-07-30 12:00:09.991 3 1 10098 RECEIVE +2024-07-30 12:00:09.992 1 0 10100 SEND +2024-07-30 12:00:09.993 2 1 10102 RECEIVE +2024-07-30 12:00:09.994 3 2 10104 SEND +2024-07-30 12:00:09.995 0 3 10106 RECEIVE +2024-07-30 12:00:09.996 2 0 10108 SEND +2024-07-30 12:00:09.997 1 3 10110 RECEIVE +2024-07-30 12:00:09.998 0 1 10112 SEND +2024-07-30 12:00:09.999 3 2 10114 RECEIVE \ No newline at end of file diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index f023e37c..14e88745 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -1,20 +1,39 @@ +#include +#include #include +#include +#include +#include #include -#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include "draggable_square.h" -#include "process.h" #include "main_window.h" +#include "draggable_square.h" + +// Add this function to your DraggableSquare class +void DraggableSquare::print() const +{ + std::cout << "DraggableSquare:" << std::endl; + std::cout << " Process ID: " << process.getId() << std::endl; + std::cout << " Drag Start Position: (" << dragStartPosition.x() << ", " + << dragStartPosition.y() << ")" << std::endl; + std::cout << " Initial Position: (" << initialPosition.x() << ", " + << initialPosition.y() << ")" << std::endl; + std::cout << " Color: " << label->styleSheet().toStdString() << std::endl; + std::cout << " Size: (" << this->width() << ", " << this->height() << ")" + << std::endl; +} -DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, - int width, int height) - : QWidget(parent), label(new QLabel(this)), dragging(false) +void DraggableSquare::setSquareColor(const QString &color) +{ + setStyleSheet(color); +} +//constructor +DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, + int width, int height) + : QWidget(parent), label(new QLabel(this)) { setFixedSize(width, height); setStyleSheet(color); @@ -24,11 +43,13 @@ DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, setLayout(layout); } - // Copy constructor DraggableSquare::DraggableSquare(const DraggableSquare &other) - : QWidget(other.parentWidget()), dragStartPosition(other.dragStartPosition), initialPosition(other.initialPosition), - label(new QLabel(other.label->text(), this)), process(other.process) // Copy QLabel's text + : QWidget(other.parentWidget()), + dragStartPosition(other.dragStartPosition), + initialPosition(other.initialPosition), + label(new QLabel(other.label->text(), this)), + process(other.process) // Copy QLabel's text { setFixedSize(other.width(), other.height()); setStyleSheet(other.styleSheet()); @@ -44,7 +65,7 @@ DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) dragStartPosition = other.dragStartPosition; initialPosition = other.initialPosition; delete label; - label = new QLabel(other.label->text(), this); // Copy QLabel's text + label = new QLabel(other.label->text(), this); // Copy QLabel's text process = other.process; setFixedSize(other.width(), other.height()); @@ -53,29 +74,16 @@ DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) return *this; } -void DraggableSquare::print() const { - std::cout << "DraggableSquare:" << std::endl; - std::cout << " Process ID: " << process.getId() << std::endl; - std::cout << " Drag Start Position: (" << dragStartPosition.x() << ", " << dragStartPosition.y() << ")" << std::endl; - std::cout << " Initial Position: (" << initialPosition.x() << ", " << initialPosition.y() << ")" << std::endl; - std::cout << " Color: " << label->styleSheet().toStdString() << std::endl; - std::cout << " Size: (" << this->width() << ", " << this->height() << ")" << std::endl; -} - -void DraggableSquare::setSquareColor(const QString &color) { - setStyleSheet(color); -} - void DraggableSquare::setProcess(const Process &process) { this->process = process; this->id = process.getId(); label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") - .arg(process.getId()) - .arg(process.getName()) - .arg(process.getCMakeProject()) - .arg(process.getQEMUPlatform())); + .arg(process.getId()) + .arg(process.getName()) + .arg(process.getCMakeProject()) + .arg(process.getQEMUPlatform())); } const Process DraggableSquare::getProcess() const @@ -88,6 +96,11 @@ const QPoint DraggableSquare::getDragStartPosition() const return dragStartPosition; } +void DraggableSquare::setDragStartPosition(QPoint dragStartPosition) +{ + this->dragStartPosition = dragStartPosition; +} + DraggableSquare::~DraggableSquare() { if (label) { @@ -117,7 +130,6 @@ void DraggableSquare::mousePressEvent(QMouseEvent *event) } } else if (event->button() == Qt::LeftButton) { dragStartPosition = event->pos(); - initialPosition = pos(); dragging = true; } else { QWidget::mousePressEvent(event); @@ -129,13 +141,13 @@ void DraggableSquare::mouseMoveEvent(QMouseEvent *event) if (!dragging) { return; } - if (!(event->buttons() & Qt::LeftButton)) return; QPoint newPos = mapToParent(event->pos() - dragStartPosition); newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); move(newPos); + dragStartPosition = newPos; } void DraggableSquare::mouseReleaseEvent(QMouseEvent *event) diff --git a/src/draggable_square.h b/src/draggable_square.h index cb04424e..a680e74b 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -1,9 +1,9 @@ #ifndef __DRAGGABLE_SQUARE_H__ #define __DRAGGABLE_SQUARE_H__ -#include #include #include +#include #include #include "process.h" @@ -13,19 +13,26 @@ class DraggableSquare : public QWidget Q_OBJECT public: - explicit DraggableSquare(QWidget *parent = nullptr,const QString &color = "background-color: green;",int width=100,int height=100); - DraggableSquare(const DraggableSquare &other); // Copy constructor - DraggableSquare &operator=(const DraggableSquare &other); // Copy assignment operator - + explicit DraggableSquare(QWidget *parent = nullptr, + const QString &color = "background-color: green;", + int width = 100, int height = 100); + DraggableSquare(const DraggableSquare &other); // Copy constructor + DraggableSquare &operator=( + const DraggableSquare &other); // Copy assignment operator + void setProcess(const Process &process); const Process getProcess() const; const QPoint getDragStartPosition() const; + void setDragStartPosition(QPoint dragStartPosition); void setSquareColor(const QString &color); + int getId() const { return id; } + void setId(int _id) { id = _id; } + ~DraggableSquare() override; void print() const; int getId() const { return id; } void setId(int _id) { id = _id; } ~DraggableSquare() override; - + protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; @@ -44,4 +51,4 @@ private slots: void deleteSquare(int id); }; -#endif // __DRAGGABLE_SQUARE_H__ +#endif // __DRAGGABLE_SQUARE_H__ diff --git a/src/dummy_program1/main.cpp b/src/dummy_program1/main.cpp index 5fe229f3..d04b4551 100644 --- a/src/dummy_program1/main.cpp +++ b/src/dummy_program1/main.cpp @@ -1,8 +1,9 @@ +#include #include #include -#include -int main() { +int main() +{ for (int i = 0; i < 10; ++i) { std::cout << "Dummy Program 1 is running: " << i << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); // Simulate work diff --git a/src/dummy_program2/main.cpp b/src/dummy_program2/main.cpp index 2f268002..05716c98 100644 --- a/src/dummy_program2/main.cpp +++ b/src/dummy_program2/main.cpp @@ -1,8 +1,9 @@ +#include #include #include -#include -int main() { +int main() +{ for (int i = 0; i < 10; ++i) { std::cout << "Dummy Program 2 is running: " << i << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); // Simulate work diff --git a/src/frames.cpp b/src/frames.cpp index 291ffa53..7d8efa8a 100644 --- a/src/frames.cpp +++ b/src/frames.cpp @@ -1,66 +1,133 @@ -#include -#include -#include #include "frames.h" +#include +#include +#include // Constructor to initialize Frames with a LogHandler reference -Frames::Frames(LogHandler& logHandler) - : logHandler(logHandler) { // Initialize the logHandler member variable directly +Frames::Frames(LogHandler &logHandler, QWidget *parent) + : logHandler(logHandler), QWidget(parent), differenceTime(0) +{ createSequentialIds(); - fillFramesMat(); - // Initialize currentTime with the first log entry's timestamp, if available + fillFramesMat(); + if (!logHandler.getLogEntries().isEmpty()) { - currentTime = logHandler.getLogEntries().first().timestamp; - } else { - // Handle case where there are no log entries - currentTime = QDateTime::currentDateTime(); // Default to current time + differenceTime = logHandler.getLogEntries().first().timestamp.msecsTo( + QDateTime::currentDateTime()); } + + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &Frames::updateFrames); + timer->start(1000); } -void Frames::initialFramesMat(int size) { +void Frames::initialFramesMat(int size) +{ framesMat.resize(size); for (int i = 0; i < size; ++i) { framesMat[i].resize(i + 1); // Resize each row to i+1 elements } } -// Update frames with logs within a 5-second window around currentTime -void Frames::updateFrames(const QDateTime ¤tTime) { - // Delete logs that have gone beyond the 5 second range - auto it = std::remove_if(activeLogEntriesVector.begin(), activeLogEntriesVector.end(), - [&](const LogHandler::LogEntry &entry) { - return entry.timestamp < currentTime.addSecs(-5); - }); - activeLogEntriesVector.erase(it, activeLogEntriesVector.end()); - - // Add new logs within the 5-second range - const auto &allLogEntries = logHandler.getLogEntries(); - for (const auto &entry : allLogEntries) { - if (entry.timestamp >= currentTime && entry.timestamp < currentTime.addSecs(5)) { - activeLogEntriesVector.push_back(entry); +void Frames::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + + for (const auto &log : logHandler.getLogEntries()) { + int dstId = idMapping[log.dstId]; + int srcId = idMapping[log.srcId]; + + if (dstId != -1 && srcId != -1) { + int row = std::max(dstId, srcId); + int col = std::min(dstId, srcId); + + if (row < framesMat.size() && col < framesMat[row].size()) { + const Frame &frame = framesMat[row][col]; + painter.setPen(QPen(QColor(frame.color), frame.thickness)); + + auto square1 = logHandler.getProcessSquares()[log.srcId]; + auto square2 = logHandler.getProcessSquares()[log.dstId]; + + QRect rect1(square1->getDragStartPosition().x(), + square1->getDragStartPosition().y(), + square1->width(), square1->height()); + QRect rect2(square2->getDragStartPosition().x(), + square2->getDragStartPosition().y(), + square2->width(), square2->height()); + painter.drawRect(rect1); + painter.drawRect(rect2); + } + else { + qDebug() << "Invalid index: row" << row << "col" << col; + } + } + else { + qDebug() << "Invalid ID index:"; } } } -// Create a mapping of original IDs to new sequential IDs -void Frames::createSequentialIds() { +void Frames::updateFrames() +{ + QDateTime currentTime = + QDateTime::currentDateTime().addMSecs(-differenceTime); + + qDebug() << "Updating frames at time:" << currentTime.toString(); + // Decrease thickness for expired log entries + for (auto it = activeLogEntries.begin(); it != activeLogEntries.end();) { + if (it->first.addSecs(5) <= currentTime) { + const LogHandler::LogEntry &logEntry = it->second; + int row = + std::max(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); + int col = + std::min(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); + if (framesMat[row][col].thickness > 1) { + framesMat[row][col].thickness -= 0.01; + } + it = activeLogEntries.erase(it); + } + else { + ++it; + } + } + + // Increase thickness for new log entries + for (const LogHandler::LogEntry &logEntry : logHandler.getLogEntries()) { + if (logEntry.timestamp <= currentTime) { + if (idMapping[logEntry.srcId] < framesMat.size() && + idMapping[logEntry.dstId] < framesMat.size()) { + int row = std::max(idMapping[logEntry.dstId], + idMapping[logEntry.srcId]); + int col = std::min(idMapping[logEntry.dstId], + idMapping[logEntry.srcId]); + framesMat[row][col].thickness += 0.01; + activeLogEntries.emplace(logEntry.timestamp, logEntry); + } + } + } + + update(); +} + +void Frames::createSequentialIds() +{ int newId = 0; - for (auto it = logHandler.getProcessSquares().begin(); - it != logHandler.getProcessSquares().end(); ++it) { - int originalId = it.key(); + for (const DraggableSquare *ds : logHandler.getProcessSquares()) { + int originalId = ds->getProcess().getId(); + qDebug() << originalId; idMapping.insert(originalId, newId); - ++newId; + newId++; } + qDebug() << newId; initialFramesMat(newId); } -// Fill the frames matrix with random colors -void Frames::fillFramesMat() { +void Frames::fillFramesMat() +{ QSet usedColors; - srand(static_cast(time(0))); // Seed for random color generation + srand(static_cast(time(0))); for (int i = 0; i < framesMat.size(); ++i) { - for (int j = 0; j <= i; ++j) { // Fill only the lower triangle (including diagonal) + for (int j = 0; j <= i; ++j) { QString randomColor; do { randomColor = generateRandomColor(); @@ -68,58 +135,63 @@ void Frames::fillFramesMat() { usedColors.insert(randomColor); framesMat[i][j].color = randomColor; + framesMat[i][j].thickness = 1; + + qDebug() << "Color for frame (" << i << "," << j + << "):" << randomColor; } } } -// Generate a random color in hexadecimal format -QString Frames::generateRandomColor() { +QString Frames::generateRandomColor() +{ QString color = QString("#%1%2%3") - .arg(rand() % 256, 2, 16, QChar('0')) - .arg(rand() % 256, 2, 16, QChar('0')) - .arg(rand() % 256, 2, 16, QChar('0')); + .arg(rand() % 256, 2, 16, QChar('0')) + .arg(rand() % 256, 2, 16, QChar('0')) + .arg(rand() % 256, 2, 16, QChar('0')); return color; } -// Implementation of getters -const LogHandler& Frames::getLogHandler() const { +// Getters +const LogHandler &Frames::getLogHandler() const +{ return logHandler; } -const std::vector>& Frames::getFramesMat() const { +const std::vector> &Frames::getFramesMat() const +{ return framesMat; } -const std::vector& Frames::getLogEntriesVector() const { - return activeLogEntriesVector; +const std::multimap + &Frames::getActiveLogEntries() const +{ + return activeLogEntries; } -const QHash Frames::getIdMapping() const { +QMap Frames::getIdMapping() const +{ return idMapping; } -const QDateTime Frames::getCurrentTime() const { - return currentTime; -} - // Setters -void Frames::setLogHandler(LogHandler &logHandler) { +void Frames::setLogHandler(LogHandler &logHandler) +{ this->logHandler = logHandler; - // Optionally update other fields based on the new logHandler if needed } -void Frames::setFramesMat(const std::vector>& framesMat) { +void Frames::setFramesMat(const std::vector> &framesMat) +{ this->framesMat = framesMat; } -void Frames::setLogEntriesVector(const std::vector& logEntriesVector) { - this->activeLogEntriesVector = logEntriesVector; +void Frames::setActiveLogEntries( + const std::multimap &logEntriesVector) +{ + this->activeLogEntries = logEntriesVector; } -void Frames::setIdMapping(QHash &idMapping) { +void Frames::setIdMapping(const QMap &idMapping) +{ this->idMapping = idMapping; -} - -void Frames::setCurrentTime(const QDateTime ¤tTime) { - this->currentTime = currentTime; } \ No newline at end of file diff --git a/src/frames.h b/src/frames.h index bd63a736..5f8c7ef0 100644 --- a/src/frames.h +++ b/src/frames.h @@ -1,47 +1,59 @@ -#ifndef FRAMES_H -#define FRAMES_H +#ifndef __FRAMES_H__ +#define __FRAMES_H__ -#include -#include -#include +#include "log_handler.h" #include #include #include +#include +#include #include #include -#include "log_handler.h" +#include + +class Frames : public QWidget { + Q_OBJECT -class Frames { public: struct Frame { QString color; - int thickness; + double thickness; }; - LogHandler logHandler; - std::vector> framesMat; - std::vector activeLogEntriesVector; - QHash idMapping; - QDateTime currentTime; - Frames(LogHandler &logHandler); - - void updateFrames(const QDateTime ¤tTime); - void fillFramesMat(); + + // Ctor + Frames(LogHandler &logHandler, QWidget *parent = nullptr); + // Getters - const LogHandler& getLogHandler() const; - const std::vector>& getFramesMat() const; - const std::vector& getLogEntriesVector() const; - const QHash getIdMapping() const; - const QDateTime getCurrentTime() const; + const LogHandler &getLogHandler() const; + const std::vector> &getFramesMat() const; + const std::multimap &getActiveLogEntries() + const; + QMap getIdMapping() const; + // Setters void setLogHandler(LogHandler &logHandler); - void setFramesMat(const std::vector>& framesMat); - void setLogEntriesVector(const std::vector& logEntriesVector); - void setIdMapping(QHash &idMapping); - void setCurrentTime(const QDateTime ¤tTime); + void setFramesMat(const std::vector> &framesMat); + void setActiveLogEntries( + const std::multimap &logEntriesVector); + void setIdMapping(const QMap &idMapping); + +protected: + void paintEvent(QPaintEvent *event) override; + +private slots: + void updateFrames(); + private: + LogHandler &logHandler; + std::vector> framesMat; + std::multimap activeLogEntries; + QMap idMapping; + qint64 differenceTime; + void initialFramesMat(int size); void createSequentialIds(); QString generateRandomColor(); + void fillFramesMat(); }; -#endif // FRAMES_H \ No newline at end of file +#endif // __FRAMES_H__ \ No newline at end of file diff --git a/src/log_file.log b/src/log_file.log deleted file mode 100644 index 9101f644..00000000 --- a/src/log_file.log +++ /dev/null @@ -1,6 +0,0 @@ -2024-07-30 12:00:00 1 2 100 SEND -2024-07-30 12:00:01 1 3 101 RECEIVE -2024-07-30 12:00:02 2 4 102 SEND -2024-07-30 12:00:03 3 4 103 RECEIVE -2024-07-30 12:00:04 4 5 104 SEND -2024-07-30 12:00:05 5 6 105 RECEIVE \ No newline at end of file diff --git a/src/log_handler.cpp b/src/log_handler.cpp index 762c5424..3237d1e5 100644 --- a/src/log_handler.cpp +++ b/src/log_handler.cpp @@ -1,165 +1,182 @@ -#include -#include -#include -#include -#include -#include +#include "log_handler.h" +#include "draggable_square.h" +#include "simulation_data_manager.h" #include +#include #include +#include #include #include #include #include +#include +#include +#include #include -#include "draggable_square.h" -#include "simulation_data_manager.h" -#include "log_handler.h" - +#include -QVector LogHandler::getLogEntries() { return logEntries; } +QVector LogHandler::getLogEntries() +{ + return logEntries; +} // Reading data from a file -void LogHandler::readLogFile(const QString &fileName) { - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qDebug() << "Cannot open file:" << fileName; - return; - } - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine().trimmed(); // Trim the entire line - QStringList fields = line.split(' '); - - if (fields.size() < 6) { - qWarning() << "Skipping malformed line:" << line; - continue; +void LogHandler::readLogFile(const QString &fileName) +{ + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug() << "Cannot open file:" << fileName; + return; } - LogEntry entry; - QString dateString = fields[0].trimmed(); // Trim each field - QString timeString = fields[1].trimmed(); - - QString dateTimeString = dateString + " " + timeString; - entry.timestamp = - QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss"); - if (!entry.timestamp.isValid()) { - qWarning() << "Skipping line with invalid timestamp:" << line; - continue; + QByteArray fileData = file.readAll(); + file.close(); + + QList lines = fileData.split('\n'); + for (const QByteArray &line : lines) { + QString trimmedLine = QString(line).trimmed(); + QStringList fields = trimmedLine.split(' '); + + if (fields.size() < 6) { + qWarning() << "Skipping malformed line:" << trimmedLine; + continue; + } + + LogEntry entry; + QString dateString = fields[0].trimmed(); + QString timeString = fields[1].trimmed(); + + QString dateTimeString = dateString + " " + timeString; + entry.timestamp = + QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss.zzz"); + if (!entry.timestamp.isValid()) { + qWarning() << "Skipping line with invalid timestamp:" + << trimmedLine; + continue; + } + + entry.srcId = fields[2].trimmed().toInt(); + entry.dstId = fields[3].trimmed().toInt(); + entry.payload = fields[4].trimmed(); + entry.status = fields[5].trimmed(); + logEntries.push_back(entry); } - entry.srcId = fields[2].trimmed().toInt(); - entry.dstId = fields[3].trimmed().toInt(); - entry.payload = fields[4].trimmed(); - entry.status = fields[5].trimmed(); - logEntries.push_back(entry); - } - - file.close(); - qDebug() << "succesfull read LogFile"; + qDebug() << "Log file successfully read"; } -void LogHandler::sortLogEntries() { - std::sort(logEntries.begin(), logEntries.end()); +void LogHandler::sortLogEntries() +{ + std::sort(logEntries.begin(), logEntries.end()); } void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, - const QString &jsonFileName, bool realTime) { - if (realTime) { - // if the simulation runs time the squares are present on the window - /// Otherwise, quarters are reloaded according to the data in Gison - } else { - SimulationDataManager dataManager; - QJsonObject jsonObject = - dataManager.loadSimulationData(jsonFileName.toStdString()); - if (jsonObject.isEmpty()) { - qWarning() << "Failed to load JSON data"; - return; + const QString &jsonFileName, bool realTime) +{ + if (realTime) { + // if the simulation runs time the squares are present on the window + /// Otherwise, quarters are reloaded according to the data in Gison + } + else { + SimulationDataManager dataManager; + QJsonObject jsonObject = + dataManager.loadSimulationData(jsonFileName.toStdString()); + if (jsonObject.isEmpty()) { + qWarning() << "Failed to load JSON data"; + return; + } + + // עדכון מפת התהליכים לפי מידע מהקובץ JSON + QJsonArray processesArray = jsonObject["processes"].toArray(); + for (const QJsonValue &value : processesArray) { + QJsonObject processObject = value.toObject(); + int id = processObject["id"].toInt(); + QString name = processObject["name"].toString(); + QString cmakeProject = processObject["CMakeProject"].toString(); + QString qemuPlatform = processObject["QEMUPlatform"].toString(); + int x = processObject["coordinate"].toObject()["x"].toInt(); + int y = processObject["coordinate"].toObject()["y"].toInt(); + int width = processObject["width"].toInt(); + int height = processObject["height"].toInt(); + + Process process(id, name, cmakeProject, qemuPlatform); + DraggableSquare *square = + new DraggableSquare(mainWindow, "", width, height); + square->setProcess(process); + square->setDragStartPosition(QPoint(x, y)); + square->move(x, y); + processSquares.insert(id, square); + } } - // עדכון מפת התהליכים לפי מידע מהקובץ JSON - QJsonArray processesArray = jsonObject["processes"].toArray(); - for (const QJsonValue &value : processesArray) { - QJsonObject processObject = value.toObject(); - int id = processObject["id"].toInt(); - QString name = processObject["name"].toString(); - QString cmakeProject = processObject["CMakeProject"].toString(); - QString qemuPlatform = processObject["QEMUPlatform"].toString(); - int x = processObject["coordinate"].toObject()["x"].toInt(); - int y = processObject["coordinate"].toObject()["y"].toInt(); - int width = processObject["width"].toInt(); - int height = processObject["height"].toInt(); - - Process process(id, name, cmakeProject, qemuPlatform); - DraggableSquare *square = - new DraggableSquare(mainWindow, "", width, height); - square->setProcess(process); - square->move(x, y); - processSquares.insert(id, square); + qDebug() << "Size of logEntries:" << logEntries.size(); + for (const auto &logEntry : logEntries) { + int srcId = logEntry.srcId; + int dstId = logEntry.dstId; + + if (!processSquares.contains(srcId) || !processSquares.contains(dstId)) + continue; + + DraggableSquare *srcSquare = processSquares[srcId]; + DraggableSquare *dstSquare = processSquares[dstId]; + + QString color = "background-color: yellow;"; // Default color + if (communicationCounts.contains(srcId) && + communicationCounts[srcId].contains(dstId)) { + int count = communicationCounts[srcId][dstId]; + int colorIntensity = qMin( + count * 25, 255); // Increase color intensity based on count + color = QString("background-color: rgb(%1, %1, 255);") + .arg(colorIntensity); + } + + srcSquare->setSquareColor(color); + dstSquare->setSquareColor(color); + + // Increase communication count + communicationCounts[srcId][dstId]++; } - } - - qDebug() << "Size of logEntries:" << logEntries.size(); - for (const auto &logEntry : logEntries) { - int srcId = logEntry.srcId; - int dstId = logEntry.dstId; - - if (!processSquares.contains(srcId) || !processSquares.contains(dstId)) - continue; - - DraggableSquare *srcSquare = processSquares[srcId]; - DraggableSquare *dstSquare = processSquares[dstId]; - - QString color = "background-color: yellow;"; // Default color - if (communicationCounts.contains(srcId) && - communicationCounts[srcId].contains(dstId)) { - int count = communicationCounts[srcId][dstId]; - int colorIntensity = - qMin(count * 25, 255); // Increase color intensity based on count - color = - QString("background-color: rgb(%1, %1, 255);").arg(colorIntensity); + for (QMap::iterator it = processSquares.begin(); + it != processSquares.end(); ++it) { + // Access key and value + int key = it.key(); + DraggableSquare *square = it.value(); + square + ->print(); // For example, a call to the print function we defined } - - srcSquare->setSquareColor(color); - dstSquare->setSquareColor(color); - - // Increase communication count - communicationCounts[srcId][dstId]++; - } - for (QMap::iterator it = processSquares.begin(); - it != processSquares.end(); ++it) { - // Access key and value - int key = it.key(); - DraggableSquare *square = it.value(); - square->print(); // For example, a call to the print function we defined - } } -QVector LogHandler::findProcessCoordinatesById(int processId, const QString &fileName) { - QVector coordinates; +QVector LogHandler::findProcessCoordinatesById(int processId, + const QString &fileName) +{ + QVector coordinates; - // Load JSON from file - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qWarning("Could not open file"); - return coordinates; - } - QByteArray jsonData = file.readAll(); - file.close(); - - QJsonDocument document = QJsonDocument::fromJson(jsonData); - QJsonObject rootObject = document.object(); - QJsonArray processesArray = rootObject["processes"].toArray(); - - // Searching for the process ID and finding its coordinatesFi - for (const QJsonValue &value : processesArray) { - QJsonObject processObject = value.toObject(); - if (processObject["id"].toInt() == processId) { - coordinates.append(processObject["x"].toInt()); - coordinates.append(processObject["y"].toInt()); - break; + // Load JSON from file + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning("Could not open file"); + return coordinates; } - } + QByteArray jsonData = file.readAll(); + file.close(); + + QJsonDocument document = QJsonDocument::fromJson(jsonData); + QJsonObject rootObject = document.object(); + QJsonArray processesArray = rootObject["processes"].toArray(); - return coordinates; + // Searching for the process ID and finding its coordinatesFi + for (const QJsonValue &value : processesArray) { + QJsonObject processObject = value.toObject(); + if (processObject["id"].toInt() == processId) { + coordinates.append(processObject["x"].toInt()); + coordinates.append(processObject["y"].toInt()); + break; + } + } + + return coordinates; } -const QMap& LogHandler::getProcessSquares() const { return processSquares; } \ No newline at end of file +const QMap &LogHandler::getProcessSquares() const +{ + return processSquares; +} \ No newline at end of file diff --git a/src/log_handler.h b/src/log_handler.h index 03778d41..51de2ac2 100644 --- a/src/log_handler.h +++ b/src/log_handler.h @@ -1,14 +1,14 @@ #ifndef LOGHANDLER_H #define LOGHANDLER_H -#include -#include -#include +#include "draggable_square.h" #include -#include #include #include -#include "draggable_square.h" +#include +#include +#include +#include class LogHandler { public: @@ -19,23 +19,28 @@ class LogHandler { QString payload; QString status; // SEND/RECEIVE - bool operator<(const LogEntry& other) const { + bool operator<(const LogEntry &other) const + { return timestamp < other.timestamp; } }; - void readLogFile(const QString& fileName); + void readLogFile(const QString &fileName); void sortLogEntries(); - void analyzeLogEntries(QMainWindow* mainWindow, const QString& jsonFileName, bool realTime=false); + void analyzeLogEntries(QMainWindow *mainWindow, const QString &jsonFileName, + bool realTime = false); void draw(int xSrc, int ySrc, int xDest, int yDest); - QVector findProcessCoordinatesById(int processId, const QString& fileName); + QVector findProcessCoordinatesById(int processId, + const QString &fileName); QVector getLogEntries(); - const QMap& getProcessSquares() const; + const QMap &getProcessSquares() const; private: QVector logEntries; - QMap processSquares; // Track process squares by their IDs - QMap> communicationCounts; // Track communication counts between process pairs + QMap + processSquares; // Track process squares by their IDs + QMap> + communicationCounts; // Track communication counts between process pairs }; -#endif // LOGHANDLER_H \ No newline at end of file +#endif // LOGHANDLER_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 2bb643de..59fbe3d2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,5 @@ -#include #include "main_window.h" +#include int main(int argc, char *argv[]) { diff --git a/src/main_window.cpp b/src/main_window.cpp index 56af3b21..1f633f54 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -5,11 +5,18 @@ #include #include #include +#include +#include +#include +#include +#include #include "process.h" #include "main_window.h" #include "draggable_square.h" #include "process_dialog.h" +int sizeSquare = 120; + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) { @@ -27,6 +34,7 @@ MainWindow::MainWindow(QWidget *parent) timeLabel = new QLabel("Enter time in seconds:", this); logOutput = new QTextEdit(this); QPushButton *chooseButton = new QPushButton("Choose Image", this); + QPushButton *chooseButton = new QPushButton("Choose Image", this); timeLabel->hide(); timeInput->hide(); @@ -40,9 +48,15 @@ MainWindow::MainWindow(QWidget *parent) connect(addProcessButton, &QPushButton::clicked, this, &MainWindow::createNewProcess); connect(startButton, &QPushButton::clicked, this, &MainWindow::startProcesses); + connect(addProcessButton, &QPushButton::clicked, this, + &MainWindow::createNewProcess); + connect(startButton, &QPushButton::clicked, this, + &MainWindow::startProcesses); connect(endButton, &QPushButton::clicked, this, &MainWindow::endProcesses); - connect(timerButton, &QPushButton::clicked, this, &MainWindow::showTimerInput); - connect(chooseButton, &QPushButton::clicked, this, &MainWindow::openImageDialog); + connect(timerButton, &QPushButton::clicked, this, + &MainWindow::showTimerInput); + connect(chooseButton, &QPushButton::clicked, this, + &MainWindow::openImageDialog); toolbox->setMaximumWidth(100); toolbox->setMinimumWidth(100); @@ -69,42 +83,63 @@ MainWindow::MainWindow(QWidget *parent) int id = 0; Process mainProcess(id, "Main", "../src/dummy_program1", "QEMUPlatform"); addProcessSquare(mainProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(mainProcess, id, + "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " + "stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); Process hsmProcess(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); addProcessSquare(hsmProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(hsmProcess, id, + "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " + "stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); Process logsDbProcess(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); addProcessSquare(logsDbProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + Process logsDbProcess(id, "LogsDb", "../src/dummy_program1", + "QEMUPlatform"); + addProcessSquare(logsDbProcess, id, + "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " + "stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); Process busManagerProcess(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); addProcessSquare(busManagerProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + Process busManagerProcess(id, "Bus_Manager", "../src/dummy_program2", + "QEMUPlatform"); + addProcessSquare(busManagerProcess, id, + "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " + "stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); } -MainWindow::~MainWindow() +MainWindow::~MainWindow() { qDeleteAll(squares); + if (timer) + delete timer; if (timer) { delete timer; } } -void MainWindow::createNewProcess() +void MainWindow::createNewProcess() { ProcessDialog dialog(this); if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { int id = dialog.getId(); if (id <= 4) { - QMessageBox::warning(this, "Invalid ID", "The ID must be greater than 10."); + QMessageBox::warning(this, "Invalid ID", "The ID must be greater than 4."); return; } if (!isUniqueId(id)) { - QMessageBox::warning(this, "Non-unique ID", "The ID entered is already in use. Please choose a different ID."); + QMessageBox::warning(this, "Non-unique ID", + "The ID entered is already in use. Please " + "choose a different ID."); return; } - Process newProcess(id, dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform()); + Process newProcess(id, dialog.getName(), dialog.getCMakeProject(), + dialog.getQEMUPlatform()); addProcessSquare(newProcess); addId(id); } @@ -126,8 +161,6 @@ void MainWindow::addProcessSquare(const Process &process) void MainWindow::addProcessSquare(const Process &process, int index, const QString &color) { DraggableSquare *square = new DraggableSquare(workspace,color,sizeSquare,sizeSquare); - - DraggableSquare *square = new DraggableSquare(workspace,color,120,120); square->setProcess(process); square->setId(process.getId()); int x = (index % 2) * (square->width() + 10); @@ -140,17 +173,17 @@ void MainWindow::addProcessSquare(const Process &process, int index, const QStri squares.push_back(square); } -bool MainWindow::isUniqueId(int id) +bool MainWindow::isUniqueId(int id) { return !usedIds.contains(id); } -void MainWindow::addId(int id) +void MainWindow::addId(int id) { usedIds.insert(id); } -void MainWindow::startProcesses() +void MainWindow::startProcesses() { QString inputText = timeInput->text(); bool ok = true; @@ -161,13 +194,15 @@ void MainWindow::startProcesses() } if (!ok || (time <= 0 && !inputText.isEmpty())) { - QMessageBox::warning(this, "Invalid Input", "Please enter a valid number of seconds."); + QMessageBox::warning(this, "Invalid Input", + "Please enter a valid number of seconds."); timeInput->clear(); return; } if (time > 0) { - logOutput->append("Timer started for " + QString::number(time) + " seconds."); + logOutput->append("Timer started for " + QString::number(time) + + " seconds."); if (timer) { timer->stop(); @@ -184,7 +219,7 @@ void MainWindow::startProcesses() compileBoxes(); } -void MainWindow::endProcesses() +void MainWindow::endProcesses() { logOutput->append("Ending processes..."); @@ -198,14 +233,18 @@ void MainWindow::endProcesses() timeLabel->show(); timeInput->clear(); - dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); - - - QString filePath = "../log_file.log"; + dataManager->saveSimulationData("simulation_data.bson", squares, + currentImagePath); + QString filePath = "./log_file.log"; logHandler.readLogFile(filePath); - logHandler.analyzeLogEntries(this,"simulation_data.bson"); + logHandler.analyzeLogEntries(this, "simulation_data.bson"); - for (QProcess* process : runningProcesses) { + frames = new Frames(logHandler); // Initialize Frames + QVBoxLayout *framesLayout = new QVBoxLayout(workspace); + framesLayout->addWidget(frames); + workspace->setLayout(framesLayout); + + for (QProcess *process : runningProcesses) { if (process->state() != QProcess::NotRunning) { logOutput->append("Ending process..."); process->terminate(); @@ -216,21 +255,22 @@ void MainWindow::endProcesses() runningProcesses.clear(); } -void MainWindow::showTimerInput() +void MainWindow::showTimerInput() { timeLabel->show(); timeInput->show(); } -void MainWindow::timerTimeout() +void MainWindow::timerTimeout() { logOutput->append("Timer timeout reached."); endProcesses(); } -void MainWindow::openImageDialog() +void MainWindow::openImageDialog() { - QString imagePath = QFileDialog::getOpenFileName(this, tr("Select Image"), "", tr("Image Files (*.png *.jpg *.jpeg)")); + QString imagePath = QFileDialog::getOpenFileName( + this, tr("Select Image"), "", tr("Image Files (*.png *.jpg *.jpeg)")); if (!imagePath.isEmpty()) { currentImagePath = imagePath; QPixmap pixmap(imagePath); @@ -272,6 +312,7 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) return QString(); } + QStringList files = buildDir.entryList(QDir::Files | QDir::NoSymLinks); // If the directory is empty or has no files @@ -283,10 +324,7 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) foreach (const QString &file, files) { QFileInfo fileInfo(buildDir.filePath(file)); - - // Skip files with a suffix (i.e., non-executables) if (!fileInfo.suffix().isEmpty()) continue; - // If the file is executable, return its name if (fileInfo.isExecutable()) { return fileInfo.fileName(); @@ -299,6 +337,7 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) return QString(); } + void MainWindow::compileBoxes() { // Clear previous running processes @@ -381,6 +420,7 @@ void MainWindow::compileBoxes() logOutput->append(cmakeProcess->readAllStandardError()); delete cmakeProcess; + // Run make QProcess *makeProcess = new QProcess(this); makeProcess->setWorkingDirectory(buildDirPath); @@ -396,13 +436,12 @@ void MainWindow::compileBoxes() logOutput->append("Successfully compiled " + buildDirPath); delete makeProcess; logOutput->append("Successfully compiled " + buildDirPath); - - // Run the compiled program + // Run the compiled program QString exeFile = getExecutableName(buildDirPath); QString executablePath = buildDir.absoluteFilePath(exeFile); QProcess *runProcess = new QProcess(this); runProcess->setWorkingDirectory(buildDirPath); - + connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() { logOutput->append(runProcess->readAllStandardOutput()); }); connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() @@ -418,7 +457,6 @@ void MainWindow::compileBoxes() } } } - void MainWindow::editSquare(int id) { for (DraggableSquare *square : squares) @@ -429,7 +467,6 @@ void MainWindow::editSquare(int id) dialog.setName(square->getProcess().getName()); dialog.setCMakeProject(square->getProcess().getCMakeProject()); dialog.setQEMUPlatform(square->getProcess().getQEMUPlatform()); - if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { // Update the process details square->setProcess(Process(dialog.getId(), dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform())); @@ -438,19 +475,15 @@ void MainWindow::editSquare(int id) } } } - void MainWindow::deleteSquare(int id) { qDebug() << "Deleting square with ID:" << id; - auto it = std::find_if(squares.begin(), squares.end(), [id](DraggableSquare *square) { return square && square->getProcess().getId() == id; }); - if (it != squares.end()) { DraggableSquare *toDelete = *it; it = squares.erase(it); - if (toDelete) { toDelete->deleteLater(); qDebug() << "Square with ID:" << id << "deleted."; @@ -458,12 +491,8 @@ void MainWindow::deleteSquare(int id) } else { qDebug() << "Square with ID:" << id << "not found."; } - usedIds.remove(id); squarePositions.remove(id); } - - - // Include the generated moc file #include "moc_main_window.cpp" \ No newline at end of file diff --git a/src/main_window.h b/src/main_window.h index b1a09748..7dea6a33 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -1,9 +1,6 @@ #ifndef MAIN_WINDOW_H #define MAIN_WINDOW_H -#include -#include -#include #include #include #include @@ -11,23 +8,28 @@ #include #include #include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include #include #include - #include "process.h" #include "draggable_square.h" +#include "frames.h" +#include "log_handler.h" +#include "process.h" #include "process_dialog.h" #include "simulation_data_manager.h" -#include "log_handler.h" -class MainWindow : public QMainWindow -{ +class MainWindow : public QMainWindow { Q_OBJECT public: @@ -39,7 +41,7 @@ class MainWindow : public QMainWindow void showTimerInput(); void timerTimeout(); void openImageDialog(); - + private slots: void createNewProcess(); @@ -57,8 +59,8 @@ public slots: QVBoxLayout *toolboxLayout; QWidget *workspace; - QVector squares; - QMap squarePositions; + QVector squares; + QMap squarePositions; QSet usedIds; QPushButton *startButton; QPushButton *endButton; @@ -68,10 +70,11 @@ public slots: QTextEdit *logOutput; QTimer *timer; QLabel *imageLabel; - QVector runningProcesses; + QVector runningProcesses; QString currentImagePath; SimulationDataManager *dataManager; LogHandler logHandler; + Frames *frames; }; -#endif // MAIN_WINDOW_H +#endif // MAIN_WINDOW_H diff --git a/src/my_widget.cpp b/src/my_widget.cpp deleted file mode 100644 index 3fad8a82..00000000 --- a/src/my_widget.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "my_widget.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - - -MyWidget::MyWidget(QWidget *parent, int speed) - : QWidget(parent), currentPointIndex(0), animationStep(0) { - timer = new QTimer(this); - connect(timer, &QTimer::timeout, this, &MyWidget::updateDrawing); - timer->setInterval(speed); // קצב עדכון של 100 מ"ל או לפי הצורך - - // התחלת אנימציה לא פעילה - isAnimating = false; -} -void MyWidget::addConnection(int xSrc, int ySrc, int xDest, int yDest, const QString &messageId, const QString &status) { - this->xSrc = xSrc; - this->ySrc = ySrc; - this->xDest = xDest; - this->yDest = yDest; - this->messageId = messageId; - this->status = status; - - // ניקוי נקודות ישנות - points.clear(); - animationStep = 0; - - // מחשב נקודות בין הנקודות מקור ויעד לציור קו מקווקו - int numDashes = 20; - double deltaX = (xDest - xSrc) / static_cast(numDashes); - double deltaY = (yDest - ySrc) / static_cast(numDashes); - - for (int i = 0; i <= numDashes; ++i) { - if (i % 2 == 0) { // קו בכל מקטע - points.append(QPoint(xSrc + static_cast(i * deltaX), ySrc + static_cast(i * deltaY))); - } - } - points.append(QPoint(xDest, yDest)); - - currentPointIndex = 0; - isAnimating = true; - - timer->start(); // מתחיל את הציור האיטי - - update(); // מעדכן את הווידג'ט לציור הקו -} - -void MyWidget::paintEvent(QPaintEvent *event) { - QPainter painter(this); - - // הגדרת עט לציור קו עבה ומקווקו - QPen pen(Qt::black, 4); // קו עבה בצבע שחור - pen.setStyle(Qt::DashLine); // תבנית מקווקו - pen.setDashPattern({5, 5}); // תבנית של 10 פיקסלים קו, 5 פיקסלים רווח - painter.setPen(pen); - - // ציור הקו - if (!points.isEmpty()) { - painter.drawPolyline(points.data(), points.size()); - } -} - -void MyWidget::updateDrawing() { - if (isAnimating) { - animationStep = (animationStep + 1) % 30; // מניחים 30 שלבים באנימציה - update(); // גורם לציור מחדש של הווידג'ט - } -} - -void MyWidget::drawArrow(QPainter &painter, const QPoint &src, const QPoint &dst, const QColor &color) { - QPen pen(color); - pen.setWidth(2); - painter.setPen(pen); - - QLine line(src, dst); - painter.drawLine(line); - - // ציור ראש החץ - double angle = std::atan2(-line.dy(), line.dx()); - double arrowSize = 10; - QPointF arrowP1 = dst - QPointF(sin(angle + M_PI / 3) * arrowSize, cos(angle + M_PI / 3) * arrowSize); - QPointF arrowP2 = dst - QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize, cos(angle + M_PI - M_PI / 3) * arrowSize); - - QPolygon arrowHead; - // arrowHead << dst.toPoint() << arrowP1.toPoint() << arrowP2.toPoint(); - arrowHead << dst << arrowP1.toPoint() << arrowP2.toPoint(); - - painter.drawPolygon(arrowHead); -} diff --git a/src/my_widget.h b/src/my_widget.h deleted file mode 100644 index c61a56e4..00000000 --- a/src/my_widget.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef MY_WIDGET_H -#define MY_WIDGET_H - -#include -#include -#include -#include - -class MyWidget : public QWidget { - Q_OBJECT - -public: - explicit MyWidget(QWidget *parent = nullptr, int speed = 100); // קצב ברירת מחדל הוא 100 מ"ל - void addConnection(int xSrc, int ySrc, int xDest, int yDest, const QString &messageId, const QString &status); - -protected: - void paintEvent(QPaintEvent *event) override; - -private slots: - void updateDrawing(); - -private: - void drawArrow(QPainter &painter, const QPoint &src, const QPoint &dst, const QColor &color); - - QTimer *timer; - int currentPointIndex; - int animationStep; - bool isAnimating; - - int xSrc, ySrc, xDest, yDest; - QString messageId; - QString status; - QVector points; -}; - -#endif // MY_WIDGET_H diff --git a/src/process.cpp b/src/process.cpp index 213848bf..060c2635 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -1,19 +1,22 @@ #include "process.h" -Process::Process(int id, const QString &name, const QString &cmakeProject, const QString &qemuPlatform) +Process::Process(int id, const QString &name, const QString &cmakeProject, + const QString &qemuPlatform) : id(id), name(name), cmakeProject(cmakeProject), qemuPlatform(qemuPlatform) { } // Copy constructor Process::Process(const Process &other) - : id(other.id), name(other.name), cmakeProject(other.cmakeProject), qemuPlatform(other.qemuPlatform) {} - -Process::Process() - : id(-1), name(""), cmakeProject(""), qemuPlatform("") + : id(other.id), + name(other.name), + cmakeProject(other.cmakeProject), + qemuPlatform(other.qemuPlatform) { } +Process::Process() : id(-1), name(""), cmakeProject(""), qemuPlatform("") {} + int Process::getId() const { return id; diff --git a/src/process.h b/src/process.h index 309faa31..a17d2d8c 100644 --- a/src/process.h +++ b/src/process.h @@ -3,12 +3,12 @@ #include -class Process -{ +class Process { public: - Process(int id, const QString &name, const QString &cmakeProject, const QString &qemuPlatform); + Process(int id, const QString &name, const QString &cmakeProject, + const QString &qemuPlatform); Process(); - Process(const Process &other); // Copy constructor + Process(const Process &other); // Copy constructor int getId() const; QString getName() const; @@ -22,4 +22,4 @@ class Process QString qemuPlatform; }; -#endif // PROCESS_H +#endif // PROCESS_H diff --git a/src/process_dialog.cpp b/src/process_dialog.cpp index 41895d34..a8e6168c 100644 --- a/src/process_dialog.cpp +++ b/src/process_dialog.cpp @@ -1,11 +1,11 @@ -#include "process_dialog.h" +#include +#include #include #include -#include -#include -#include #include -#include +#include +#include +#include "process_dialog.h" ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) { @@ -33,11 +33,13 @@ ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) layout->addWidget(qemuPlatformLabel); layout->addWidget(qemuPlatformCombo); - QRegExp regex("[a-zA-Z0-9]*"); // Allows only English letters and numbers + QRegExp regex("[a-zA-Z0-9]*"); // Allows only English letters and numbers QRegExpValidator *validator = new QRegExpValidator(regex, this); - QRegExp cmakeProjectRegex("[\\x20-\\x7E]*"); // Allows any printable ASCII character - QRegExpValidator *cmakeProjectValidator = new QRegExpValidator(cmakeProjectRegex, this); + QRegExp cmakeProjectRegex( + "[\\x20-\\x7E]*"); // Allows any printable ASCII character + QRegExpValidator *cmakeProjectValidator = + new QRegExpValidator(cmakeProjectRegex, this); nameEdit->setValidator(validator); cmakeProjectEdit->setValidator(cmakeProjectValidator); @@ -50,7 +52,8 @@ ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) buttonLayout->addWidget(cancelButton); layout->addLayout(buttonLayout); - connect(okButton, &QPushButton::clicked, this, &ProcessDialog::validateAndAccept); + connect(okButton, &QPushButton::clicked, this, + &ProcessDialog::validateAndAccept); connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject); setLayout(layout); @@ -79,7 +82,8 @@ QString ProcessDialog::getQEMUPlatform() const bool ProcessDialog::isValid() const { return !idEdit->text().isEmpty() && !nameEdit->text().isEmpty() && - !cmakeProjectEdit->text().isEmpty() && !qemuPlatformCombo->currentText().isEmpty(); + !cmakeProjectEdit->text().isEmpty() && + !qemuPlatformCombo->currentText().isEmpty(); } void ProcessDialog::validateAndAccept() @@ -88,7 +92,8 @@ void ProcessDialog::validateAndAccept() accept(); } else { - QMessageBox::warning(this, "Input Error", "Please fill in all fields correctly."); + QMessageBox::warning(this, "Input Error", + "Please fill in all fields correctly."); } } void ProcessDialog::setId(int id) diff --git a/src/process_dialog.h b/src/process_dialog.h index 5c7e470f..e461b11b 100644 --- a/src/process_dialog.h +++ b/src/process_dialog.h @@ -1,15 +1,14 @@ #ifndef PROCESSDIALOG_H #define PROCESSDIALOG_H +#include #include +#include #include #include #include -#include -#include -class ProcessDialog : public QDialog -{ +class ProcessDialog : public QDialog { Q_OBJECT public: @@ -32,8 +31,7 @@ private slots: QLineEdit *idEdit; QLineEdit *nameEdit; QLineEdit *cmakeProjectEdit; - // QLineEdit *qemuPlatformEdit; QComboBox *qemuPlatformCombo; }; -#endif // PROCESSDIALOG_H +#endif // PROCESSDIALOG_H diff --git a/src/simulation_data_manager.cpp b/src/simulation_data_manager.cpp index 70d82c3f..5d32cddc 100644 --- a/src/simulation_data_manager.cpp +++ b/src/simulation_data_manager.cpp @@ -1,21 +1,22 @@ -#include "simulation_data_manager.h" +#include +#include +#include +#include +#include #include #include #include #include -#include -#include #include -#include -#include -#include +#include "simulation_data_manager.h" -SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) +SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) { } void SimulationDataManager::readSimulationData(QVector squares, QString img) { + data.processes.clear(); for(int i = 0; i < squares.size(); i++) { if(squares[i] != nullptr) data.processes.append(squares[i]); @@ -28,7 +29,9 @@ void SimulationDataManager::readSimulationData(QVector squares data.user.img = img; } -void SimulationDataManager::saveSimulationData(const std::string &fileName, QVector squares, QString img) +void SimulationDataManager::saveSimulationData( + const std::string &fileName, QVector squares, + QString img) { readSimulationData(squares, img); @@ -42,14 +45,21 @@ void SimulationDataManager::saveSimulationData(const std::string &fileName, QVec snprintf(key, sizeof(key), "%d", process->getProcess().getId()); BSON_APPEND_DOCUMENT_BEGIN(&processes, key, &proc); BSON_APPEND_INT32(&proc, "id", process->getProcess().getId()); - BSON_APPEND_UTF8(&proc, "name", process->getProcess().getName().toStdString().c_str()); - BSON_APPEND_UTF8(&proc, "CMakeProject", process->getProcess().getCMakeProject().toStdString().c_str()); - BSON_APPEND_UTF8(&proc, "QEMUPlatform", process->getProcess().getQEMUPlatform().toStdString().c_str()); + BSON_APPEND_UTF8(&proc, "name", + process->getProcess().getName().toStdString().c_str()); + BSON_APPEND_UTF8( + &proc, "CMakeProject", + process->getProcess().getCMakeProject().toStdString().c_str()); + BSON_APPEND_UTF8( + &proc, "QEMUPlatform", + process->getProcess().getQEMUPlatform().toStdString().c_str()); bson_t coordinate; BSON_APPEND_DOCUMENT_BEGIN(&proc, "coordinate", &coordinate); - BSON_APPEND_INT32(&coordinate, "x", process->getDragStartPosition().x()); - BSON_APPEND_INT32(&coordinate, "y", process->getDragStartPosition().y()); + BSON_APPEND_INT32(&coordinate, "x", + process->getDragStartPosition().x()); + BSON_APPEND_INT32(&coordinate, "y", + process->getDragStartPosition().y()); bson_append_document_end(&proc, &coordinate); BSON_APPEND_INT32(&proc, "width", process->width()); @@ -74,19 +84,22 @@ void SimulationDataManager::saveSimulationData(const std::string &fileName, QVec file.write(reinterpret_cast(buf), length); file.close(); std::cout << "Successfully saved data to " << fileName << std::endl; - } else { - std::cerr << "Failed to open file for writing: " << fileName << std::endl; + } + else { + std::cerr << "Failed to open file for writing: " << fileName + << std::endl; } bson_free(buf); } -QJsonObject SimulationDataManager::loadSimulationData(const std::string &fileName) +QJsonObject SimulationDataManager::loadSimulationData( + const std::string &fileName) { std::ifstream file(fileName, std::ios::binary | std::ios::ate); if (!file.is_open()) { std::cerr << "Failed to open file: " << fileName << std::endl; - return QJsonObject(); // Return an empty QJsonObject + return QJsonObject(); // Return an empty QJsonObject } std::streamsize size = file.tellg(); @@ -98,29 +111,31 @@ QJsonObject SimulationDataManager::loadSimulationData(const std::string &fileNam bson_t *document = bson_new_from_data(data, size); if (document) { QJsonObject jsonObject = bsonToJsonObject(document); - bson_destroy(document); // Clean up BSON document + bson_destroy(document); // Clean up BSON document return jsonObject; - } else { + } + else { std::cerr << "Failed to parse BSON document" << std::endl; } - } else { + } + else { std::cerr << "Failed to read file: " << fileName << std::endl; } - return QJsonObject(); // Return an empty QJsonObject + return QJsonObject(); // Return an empty QJsonObject } -QJsonObject SimulationDataManager::bsonToJsonObject(const bson_t *document) +QJsonObject SimulationDataManager::bsonToJsonObject(const bson_t *document) { char *json = bson_as_json(document, nullptr); - QJsonDocument jsonDoc = QJsonDocument::fromJson(QByteArray::fromRawData(json, strlen(json))); + QJsonDocument jsonDoc = + QJsonDocument::fromJson(QByteArray::fromRawData(json, strlen(json))); bson_free(json); return jsonDoc.object(); } -void SimulationDataManager::printJson(QJsonObject jsonObject) +void SimulationDataManager::printJson(QJsonObject jsonObject) { QJsonDocument jsonDoc(jsonObject); QByteArray jsonBytes = jsonDoc.toJson(); std::cout << jsonBytes.toStdString() << std::endl; -} - +} \ No newline at end of file diff --git a/src/simulation_data_manager.h b/src/simulation_data_manager.h index b0d88b4b..4c4e8b6b 100644 --- a/src/simulation_data_manager.h +++ b/src/simulation_data_manager.h @@ -1,11 +1,11 @@ #ifndef SIMULATION_DATA_MANAGER_H #define SIMULATION_DATA_MANAGER_H -#include +#include #include #include #include -#include +#include #include #include "draggable_square.h" @@ -15,13 +15,13 @@ class SimulationDataManager : public QWidget { public: SimulationDataManager(QWidget *parent = nullptr); virtual ~SimulationDataManager() = default; - void saveSimulationData(const std::string &fileName, QVector squares, QString img); + void saveSimulationData(const std::string &fileName, + QVector squares, QString img); QJsonObject loadSimulationData(const std::string &fileName); - + void printJson(QJsonObject jsonObject); private: - struct User { int id; QString name; @@ -29,14 +29,14 @@ class SimulationDataManager : public QWidget { }; struct SimulationData { - QVector processes; + QVector processes; User user; }; SimulationData data; QJsonObject bsonToJsonObject(const bson_t *document); - void readSimulationData(QVector squares, QString img); + void readSimulationData(QVector squares, QString img); }; -#endif // SIMULATION_DATA_MANAGER_H +#endif // SIMULATION_DATA_MANAGER_H From 23b0698b9422935503ec37a63a75f58125ae40e9 Mon Sep 17 00:00:00 2001 From: Tamar-Leibovitz Date: Thu, 15 Aug 2024 16:07:09 +0300 Subject: [PATCH 15/33] GUI: Finish with all test functions --- CMakeLists.txt | 43 +++--- src/draggable_square.cpp | 44 +++--- src/draggable_square.h | 19 +-- src/frames.cpp | 2 +- src/log_handler.cpp | 2 +- src/main_window.cpp | 242 ++++++++++++++++++++------------ src/main_window.h | 26 ++-- src/process.h | 13 +- src/process_dialog.cpp | 7 +- src/process_dialog.h | 4 +- src/simulation_data_manager.cpp | 16 ++- test/CMakeLists.txt | 99 +++++++++++++ test/test_draggable_square.cpp | 78 ++++++++++ test/test_main_window.cpp | 120 ++++++++++++++++ test/test_process.cpp | 39 +++++ test/test_process_dialog.cpp | 55 ++++++++ test/user_interaction_tests.cpp | 73 ++++++++++ 17 files changed, 727 insertions(+), 155 deletions(-) create mode 100644 test/CMakeLists.txt create mode 100644 test/test_draggable_square.cpp create mode 100644 test/test_main_window.cpp create mode 100644 test/test_process.cpp create mode 100644 test/test_process_dialog.cpp create mode 100644 test/user_interaction_tests.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cd6ad6b..adb1e27b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,34 +2,45 @@ cmake_minimum_required(VERSION 3.5) # Set the project name and version project(DraggableSquares VERSION 1.0) +# Set C++ standard +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) -# Find the Qt5 library -find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui) +# Enable automatic generation of MOC, UIC, and RCC +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) # Include current source directory set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) + +# Find the Qt5 library +find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui Test) # Find the BSON library find_package(PkgConfig REQUIRED) pkg_check_modules(BSON REQUIRED libbson-1.0) # Add the main application files -add_executable(DraggableSquares - src/main.cpp - src/draggable_square.cpp - src/process.cpp - src/process_dialog.cpp - src/main_window.cpp - src/simulation_data_manager.cpp - src/log_handler.cpp - src/frames.cpp +add_executable(DraggableSquares + src/main.cpp + src/draggable_square.cpp + src/process.cpp + src/process_dialog.cpp + src/main_window.cpp + src/simulation_data_manager.cpp + src/log_handler.cpp + src/frames.cpp ) # Include BSON directories target_include_directories(DraggableSquares PRIVATE ${BSON_INCLUDE_DIRS}) -# Link the BSON library -target_link_libraries(DraggableSquares ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) \ No newline at end of file +# Link the BSON library and Qt5 components +target_link_libraries(DraggableSquares PRIVATE ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) + +# Enable testing +enable_testing() + +# Add test directory +add_subdirectory(test) \ No newline at end of file diff --git a/src/draggable_square.cpp b/src/draggable_square.cpp index 14e88745..79813b88 100644 --- a/src/draggable_square.cpp +++ b/src/draggable_square.cpp @@ -16,7 +16,7 @@ void DraggableSquare::print() const { std::cout << "DraggableSquare:" << std::endl; - std::cout << " Process ID: " << process.getId() << std::endl; + std::cout << " Process ID: " << process->getId() << std::endl; std::cout << " Drag Start Position: (" << dragStartPosition.x() << ", " << dragStartPosition.y() << ")" << std::endl; std::cout << " Initial Position: (" << initialPosition.x() << ", " @@ -74,19 +74,20 @@ DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) return *this; } -void DraggableSquare::setProcess(const Process &process) +void DraggableSquare::setProcess(Process *proc) { - this->process = process; - this->id = process.getId(); - - label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") - .arg(process.getId()) - .arg(process.getName()) - .arg(process.getCMakeProject()) - .arg(process.getQEMUPlatform())); + process = proc; + if (process) { + this->id = process->getId(); + label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") + .arg(process->getId()) + .arg(process->getName()) + .arg(process->getCMakeProject()) + .arg(process->getQEMUPlatform())); + } } -const Process DraggableSquare::getProcess() const +Process *DraggableSquare::getProcess() const { return process; } @@ -107,14 +108,14 @@ DraggableSquare::~DraggableSquare() delete label; label = nullptr; } - + qDebug() << "DraggableSquare with ID" << id << "is being destroyed."; } void DraggableSquare::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { - if (id < 0 || id > 4) { // Prevent menu for IDs 1 to 4 + if (id < 0 || id > 4) { // Prevent menu for IDs 1 to 4 QMenu contextMenu(this); QAction *editAction = contextMenu.addAction("Edit"); @@ -124,14 +125,17 @@ void DraggableSquare::mousePressEvent(QMouseEvent *event) if (selectedAction == editAction) { editSquare(id); - } else if (selectedAction == deleteAction) { + } + else if (selectedAction == deleteAction) { deleteSquare(id); } } - } else if (event->button() == Qt::LeftButton) { + } + else if (event->button() == Qt::LeftButton) { dragStartPosition = event->pos(); dragging = true; - } else { + } + else { QWidget::mousePressEvent(event); } } @@ -145,7 +149,7 @@ void DraggableSquare::mouseMoveEvent(QMouseEvent *event) QPoint newPos = mapToParent(event->pos() - dragStartPosition); newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); - + move(newPos); dragStartPosition = newPos; } @@ -161,7 +165,8 @@ void DraggableSquare::mouseReleaseEvent(QMouseEvent *event) void DraggableSquare::editSquare(int id) { - MainWindow *mainWindow = qobject_cast(parentWidget()->window()); + MainWindow *mainWindow = + qobject_cast(parentWidget()->window()); if (mainWindow) { mainWindow->editSquare(id); } @@ -169,7 +174,8 @@ void DraggableSquare::editSquare(int id) void DraggableSquare::deleteSquare(int id) { - MainWindow *mainWindow = qobject_cast(parentWidget()->window()); + MainWindow *mainWindow = + qobject_cast(parentWidget()->window()); if (mainWindow) { mainWindow->deleteSquare(id); } diff --git a/src/draggable_square.h b/src/draggable_square.h index a680e74b..f457e984 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -12,16 +12,16 @@ class DraggableSquare : public QWidget { Q_OBJECT -public: + public: + friend class DraggableSquareTest; explicit DraggableSquare(QWidget *parent = nullptr, const QString &color = "background-color: green;", int width = 100, int height = 100); DraggableSquare(const DraggableSquare &other); // Copy constructor DraggableSquare &operator=( const DraggableSquare &other); // Copy assignment operator - - void setProcess(const Process &process); - const Process getProcess() const; + void setProcess(Process *process); + Process *getProcess() const; const QPoint getDragStartPosition() const; void setDragStartPosition(QPoint dragStartPosition); void setSquareColor(const QString &color); @@ -33,22 +33,23 @@ class DraggableSquare : public QWidget void setId(int _id) { id = _id; } ~DraggableSquare() override; -protected: + protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; -private: + private: + QPoint dragStartPosition; QPoint initialPosition; QLabel *label; - Process process; + Process *process; int id; bool dragging; -private slots: + private slots: void editSquare(int id); void deleteSquare(int id); }; -#endif // __DRAGGABLE_SQUARE_H__ +#endif // __DRAGGABLE_SQUARE_H__ \ No newline at end of file diff --git a/src/frames.cpp b/src/frames.cpp index 7d8efa8a..5d5b35a6 100644 --- a/src/frames.cpp +++ b/src/frames.cpp @@ -112,7 +112,7 @@ void Frames::createSequentialIds() { int newId = 0; for (const DraggableSquare *ds : logHandler.getProcessSquares()) { - int originalId = ds->getProcess().getId(); + int originalId = ds->getProcess()->getId(); qDebug() << originalId; idMapping.insert(originalId, newId); newId++; diff --git a/src/log_handler.cpp b/src/log_handler.cpp index 3237d1e5..13e71373 100644 --- a/src/log_handler.cpp +++ b/src/log_handler.cpp @@ -101,7 +101,7 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, Process process(id, name, cmakeProject, qemuPlatform); DraggableSquare *square = new DraggableSquare(mainWindow, "", width, height); - square->setProcess(process); + square->setProcess(&process); square->setDragStartPosition(QPoint(x, y)); square->move(x, y); processSquares.insert(id, square); diff --git a/src/main_window.cpp b/src/main_window.cpp index 1f633f54..a9504151 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -17,8 +17,7 @@ int sizeSquare = 120; -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), timer(nullptr) +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) { QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); @@ -48,10 +47,6 @@ MainWindow::MainWindow(QWidget *parent) connect(addProcessButton, &QPushButton::clicked, this, &MainWindow::createNewProcess); connect(startButton, &QPushButton::clicked, this, &MainWindow::startProcesses); - connect(addProcessButton, &QPushButton::clicked, this, - &MainWindow::createNewProcess); - connect(startButton, &QPushButton::clicked, this, - &MainWindow::startProcesses); connect(endButton, &QPushButton::clicked, this, &MainWindow::endProcesses); connect(timerButton, &QPushButton::clicked, this, &MainWindow::showTimerInput); @@ -81,30 +76,26 @@ MainWindow::MainWindow(QWidget *parent) dataManager = new SimulationDataManager(this); int id = 0; - Process mainProcess(id, "Main", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(mainProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + Process *mainProcess = + new Process(id, "Main", "../src/dummy_program1", "QEMUPlatform"); addProcessSquare(mainProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " "stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); - Process hsmProcess(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(hsmProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); + Process *hsmProcess = + new Process(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); addProcessSquare(hsmProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " "stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); - Process logsDbProcess(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(logsDbProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); - Process logsDbProcess(id, "LogsDb", "../src/dummy_program1", - "QEMUPlatform"); + Process *logsDbProcess = + new Process(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); addProcessSquare(logsDbProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " "stop: 0 #0000FF, stop: 1 #800080);"); addId(id++); - Process busManagerProcess(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(busManagerProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #0000FF, stop: 1 #800080);"); - Process busManagerProcess(id, "Bus_Manager", "../src/dummy_program2", - "QEMUPlatform"); + Process *busManagerProcess = + new Process(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); addProcessSquare(busManagerProcess, id, "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " "stop: 0 #0000FF, stop: 1 #800080);"); @@ -115,8 +106,6 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { qDeleteAll(squares); - if (timer) - delete timer; if (timer) { delete timer; } @@ -138,38 +127,52 @@ void MainWindow::createNewProcess() "choose a different ID."); return; } - Process newProcess(id, dialog.getName(), dialog.getCMakeProject(), - dialog.getQEMUPlatform()); + Process *newProcess = + new Process(id, dialog.getName(), dialog.getCMakeProject(), + dialog.getQEMUPlatform()); addProcessSquare(newProcess); addId(id); } } -void MainWindow::addProcessSquare(const Process &process) +Process *MainWindow::getProcessById(int id) +{ + for (DraggableSquare *square : squares) { + if (square->getId() == id) { + return square->getProcess(); + } + } + return nullptr; // Return nullptr if the process with the given ID is not found +} + +void MainWindow::addProcessSquare(Process *&process) { DraggableSquare *square = new DraggableSquare(workspace); square->setProcess(process); - square->setId(process.getId()); - QPoint pos = squarePositions.value(process.getId(), QPoint(0, 0)); + square->setId(process->getId()); + QPoint pos = squarePositions.value(process->getId(), QPoint(0, 0)); square->move(pos); square->show(); - squarePositions[process.getId()] = pos; + squarePositions[process->getId()] = pos; squares.push_back(square); } -void MainWindow::addProcessSquare(const Process &process, int index, const QString &color) +void MainWindow::addProcessSquare(Process *&process, int index, + const QString &color) { - DraggableSquare *square = new DraggableSquare(workspace,color,sizeSquare,sizeSquare); + DraggableSquare *square = + new DraggableSquare(workspace, color, sizeSquare, sizeSquare); + square->setProcess(process); - square->setId(process.getId()); + square->setId(process->getId()); int x = (index % 2) * (square->width() + 10); int y = (index / 2) * (square->height() + 10); - QPoint pos = squarePositions.value(process.getId(), QPoint(x, y)); + QPoint pos = squarePositions.value(process->getId(), QPoint(x, y)); square->move(pos); square->show(); - squarePositions[process.getId()] = pos; + squarePositions[process->getId()] = pos; squares.push_back(square); } @@ -233,18 +236,9 @@ void MainWindow::endProcesses() timeLabel->show(); timeInput->clear(); - dataManager->saveSimulationData("simulation_data.bson", squares, - currentImagePath); - QString filePath = "./log_file.log"; - logHandler.readLogFile(filePath); - logHandler.analyzeLogEntries(this, "simulation_data.bson"); + dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); - frames = new Frames(logHandler); // Initialize Frames - QVBoxLayout *framesLayout = new QVBoxLayout(workspace); - framesLayout->addWidget(frames); - workspace->setLayout(framesLayout); - - for (QProcess *process : runningProcesses) { + for (QProcess* process : runningProcesses) { if (process->state() != QProcess::NotRunning) { logOutput->append("Ending process..."); process->terminate(); @@ -287,7 +281,9 @@ void MainWindow::openImageDialog() // Create a new QLabel to display the image as background QLabel *backgroundLabel = new QLabel(workspace); - backgroundLabel->setPixmap(pixmap.scaled(workspace->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + backgroundLabel->setPixmap(pixmap.scaled(workspace->size(), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation)); backgroundLabel->setGeometry(workspace->rect()); backgroundLabel->setScaledContents(true); backgroundLabel->setAttribute(Qt::WA_TranslucentBackground); @@ -301,14 +297,16 @@ void MainWindow::openImageDialog() } } -QString MainWindow::getExecutableName(const QString &buildDirPath) +QString MainWindow::getExecutableName(const QString &buildDirPath) { QDir buildDir(buildDirPath); // Check if the directory exists if (!buildDir.exists()) { - qWarning() << "Error: The directory" << buildDirPath << "does not exist."; - QMessageBox::critical(this, "Directory Error", "The specified build directory does not exist."); + qWarning() << "Error: The directory" << buildDirPath + << "does not exist."; + QMessageBox::critical(this, "Directory Error", + "The specified build directory does not exist."); return QString(); } @@ -317,14 +315,21 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) // If the directory is empty or has no files if (files.isEmpty()) { - qWarning() << "Error: No files found in the directory" << buildDirPath << "."; - QMessageBox::critical(this, "File Error", "No files found in the specified build directory."); + qWarning() << "Error: No files found in the directory" << buildDirPath + << "."; + QMessageBox::critical( + this, "File Error", + "No files found in the specified build directory."); return QString(); } foreach (const QString &file, files) { QFileInfo fileInfo(buildDir.filePath(file)); - if (!fileInfo.suffix().isEmpty()) continue; + + // Skip files with a suffix (i.e., non-executables) + if (!fileInfo.suffix().isEmpty()) + continue; + // If the file is executable, return its name if (fileInfo.isExecutable()) { return fileInfo.fileName(); @@ -332,8 +337,11 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) } // No executable found - qWarning() << "Error: No executable file found in the directory" << buildDirPath << "."; - QMessageBox::critical(this, "Executable Not Found", "No executable file found in the specified build directory."); + qWarning() << "Error: No executable file found in the directory" + << buildDirPath << "."; + QMessageBox::critical( + this, "Executable Not Found", + "No executable file found in the specified build directory."); return QString(); } @@ -348,12 +356,13 @@ void MainWindow::compileBoxes() runningProcesses.clear(); for (const DraggableSquare *square : squares) { - QString cmakePath = square->getProcess().getCMakeProject(); + QString cmakePath = square->getProcess()->getCMakeProject(); if (cmakePath.endsWith(".sh")) { // Check if it's a shell script QFile scriptFile(cmakePath); if (!scriptFile.exists()) { - logOutput->append("Shell script file does not exist: " + cmakePath); + logOutput->append("Shell script file does not exist: " + + cmakePath); continue; } @@ -361,9 +370,11 @@ void MainWindow::compileBoxes() if ((scriptFile.permissions() & QFileDevice::ExeUser) == 0) { // Make the script executable using chmod command (Linux specific) QProcess makeExecutableProcess; - makeExecutableProcess.start("chmod", QStringList() << "+x" << cmakePath); + makeExecutableProcess.start("chmod", QStringList() + << "+x" << cmakePath); if (!makeExecutableProcess.waitForFinished()) { - logOutput->append("Failed to make the script executable: " + cmakePath); + logOutput->append("Failed to make the script executable: " + + cmakePath); continue; } logOutput->append("Script is now executable: " + cmakePath); @@ -372,11 +383,18 @@ void MainWindow::compileBoxes() // Run the shell script QProcess *scriptProcess = new QProcess(this); scriptProcess->start("bash", QStringList() << cmakePath); - connect(scriptProcess, &QProcess::readyReadStandardOutput, [this, scriptProcess]() - { logOutput->append(scriptProcess->readAllStandardOutput()); }); - connect(scriptProcess, &QProcess::readyReadStandardError, [this, scriptProcess]() - { logOutput->append(scriptProcess->readAllStandardError()); }); - } else { + connect( + scriptProcess, &QProcess::readyReadStandardOutput, + [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardOutput()); + }); + connect( + scriptProcess, &QProcess::readyReadStandardError, + [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardError()); + }); + } + else { logOutput->append("Compiling " + cmakePath); QDir cmakeDir(cmakePath); @@ -384,25 +402,31 @@ void MainWindow::compileBoxes() QDir buildDir(buildDirPath); if (buildDir.exists()) { // Remove all files and subdirectories in the build directory - QFileInfoList fileList = buildDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); + QFileInfoList fileList = buildDir.entryInfoList( + QDir::NoDotAndDotDot | QDir::AllEntries); foreach (const QFileInfo &fileInfo, fileList) { if (fileInfo.isDir()) { QDir dir(fileInfo.absoluteFilePath()); if (!dir.removeRecursively()) { - logOutput->append("Failed to remove directory: " + fileInfo.absoluteFilePath()); + logOutput->append("Failed to remove directory: " + + fileInfo.absoluteFilePath()); continue; } - } else { + } + else { if (!QFile::remove(fileInfo.absoluteFilePath())) { - logOutput->append("Failed to remove file: " + fileInfo.absoluteFilePath()); + logOutput->append("Failed to remove file: " + + fileInfo.absoluteFilePath()); continue; } } } - } else { + } + else { // Create the build directory if it doesn't exist if (!buildDir.mkpath(".")) { - logOutput->append("Failed to create build directory " + buildDirPath); + logOutput->append("Failed to create build directory " + + buildDirPath); continue; } } @@ -441,14 +465,19 @@ void MainWindow::compileBoxes() QString executablePath = buildDir.absoluteFilePath(exeFile); QProcess *runProcess = new QProcess(this); runProcess->setWorkingDirectory(buildDirPath); - - connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() - { logOutput->append(runProcess->readAllStandardOutput()); }); - connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() - { logOutput->append(runProcess->readAllStandardError()); }); + + connect(runProcess, &QProcess::readyReadStandardOutput, + [this, runProcess]() { + logOutput->append(runProcess->readAllStandardOutput()); + }); + connect(runProcess, &QProcess::readyReadStandardError, + [this, runProcess]() { + logOutput->append(runProcess->readAllStandardError()); + }); runProcess->start(executablePath, QStringList()); if (!runProcess->waitForStarted()) { - logOutput->append("Failed to start the program in " + buildDirPath); + logOutput->append("Failed to start the program in " + + buildDirPath); logOutput->append(runProcess->readAllStandardError()); delete runProcess; continue; @@ -459,28 +488,36 @@ void MainWindow::compileBoxes() } void MainWindow::editSquare(int id) { - for (DraggableSquare *square : squares) - { - if (square->getProcess().getId() == id) { + for (DraggableSquare *square : squares) { + if (square->getProcess()->getId() == id) { ProcessDialog dialog(this); - dialog.setId(square->getProcess().getId()); - dialog.setName(square->getProcess().getName()); - dialog.setCMakeProject(square->getProcess().getCMakeProject()); - dialog.setQEMUPlatform(square->getProcess().getQEMUPlatform()); + dialog.setId(square->getProcess()->getId()); + dialog.setName(square->getProcess()->getName()); + dialog.setCMakeProject(square->getProcess()->getCMakeProject()); + dialog.setQEMUPlatform(square->getProcess()->getQEMUPlatform()); + if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { // Update the process details - square->setProcess(Process(dialog.getId(), dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform())); + // square->setProcess(Process(dialog.getId(), dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform())); + Process *updatedProcess = new Process( + dialog.getId(), dialog.getName(), dialog.getCMakeProject(), + dialog.getQEMUPlatform()); + square->setProcess(updatedProcess); } break; } } } -void MainWindow::deleteSquare(int id) + +void MainWindow::deleteSquare(int id) { qDebug() << "Deleting square with ID:" << id; - auto it = std::find_if(squares.begin(), squares.end(), [id](DraggableSquare *square) { - return square && square->getProcess().getId() == id; - }); + + auto it = std::find_if( + squares.begin(), squares.end(), [id](DraggableSquare *square) { + return square && square->getProcess()->getId() == id; + }); + if (it != squares.end()) { DraggableSquare *toDelete = *it; it = squares.erase(it); @@ -488,11 +525,44 @@ void MainWindow::deleteSquare(int id) toDelete->deleteLater(); qDebug() << "Square with ID:" << id << "deleted."; } - } else { + } + else { qDebug() << "Square with ID:" << id << "not found."; } usedIds.remove(id); squarePositions.remove(id); } -// Include the generated moc file + + +// void MainWindow::deleteSquare(int squareId) +// { +// if (runningProcesses.contains(squareId)) { +// Process process = runningProcesses.value(squareId); + +// // Find and remove the corresponding square widget +// QWidget* targetSquare = nullptr; +// for (QWidget* square : squares) { +// // Assuming the square ID can be associated with the widget +// // You may need to modify this based on your implementation +// if (square->property("id").toInt() == squareId) { +// targetSquare = square; +// break; +// } +// } + +// if (targetSquare) { +// squares.removeOne(targetSquare); +// targetSquare->deleteLater(); // Safely delete the widget +// } + +// runningProcesses.remove(squareId); +// squarePositions.remove(squareId); +// usedIds.remove(squareId); + +// // Optionally, update the UI +// update(); +// } +// } + + #include "moc_main_window.cpp" \ No newline at end of file diff --git a/src/main_window.h b/src/main_window.h index 7dea6a33..fad8d9bc 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -32,30 +32,36 @@ class MainWindow : public QMainWindow { Q_OBJECT -public: + public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); - void startProcesses(); void endProcesses(); void showTimerInput(); void timerTimeout(); void openImageDialog(); - -private slots: + QLineEdit *getTimeInput() const { return timeInput; } + QPushButton *getStartButton() const { return startButton; } + QTimer *getTimer() const { return timer; } + QTextEdit *getLogOutput() const { return logOutput; } + QString getCurrentImagePath() const { return currentImagePath; } + public slots: void createNewProcess(); - -public slots: void editSquare(int id); void deleteSquare(int id); -private: - void addProcessSquare(const Process &process); + private: + friend class TestMainWindow; + friend class DraggableSquareTest; + friend class UserInteractionTests; + void addProcessSquare(Process *&process); bool isUniqueId(int id); void addId(int id); - void addProcessSquare(const Process &process, int index, const QString &color = "background-color: green;"); + void addProcessSquare(Process *&process, int index, + const QString &color = "background-color: green;"); void compileBoxes(); QString getExecutableName(const QString &buildDirPath); + Process *getProcessById(int id); QVBoxLayout *toolboxLayout; QWidget *workspace; @@ -77,4 +83,4 @@ public slots: Frames *frames; }; -#endif // MAIN_WINDOW_H +#endif // MAIN_WINDOW_H \ No newline at end of file diff --git a/src/process.h b/src/process.h index a17d2d8c..8da2f11f 100644 --- a/src/process.h +++ b/src/process.h @@ -14,7 +14,18 @@ class Process { QString getName() const; QString getCMakeProject() const; QString getQEMUPlatform() const; - + void setId(int newId) { + id = newId; + } + void setName(const QString& newName) { + name = newName; + } + void setCMakeProject(const QString& newCMakeProject) { + cmakeProject = newCMakeProject; + } + void setQEMUPlatform(const QString& newQEMUPlatform) { + qemuPlatform = newQEMUPlatform; + } private: int id; QString name; diff --git a/src/process_dialog.cpp b/src/process_dialog.cpp index a8e6168c..75f6216d 100644 --- a/src/process_dialog.cpp +++ b/src/process_dialog.cpp @@ -86,14 +86,15 @@ bool ProcessDialog::isValid() const !qemuPlatformCombo->currentText().isEmpty(); } -void ProcessDialog::validateAndAccept() +bool ProcessDialog::validateAndAccept() { if (isValid()) { accept(); + return true; } else { - QMessageBox::warning(this, "Input Error", - "Please fill in all fields correctly."); + QMessageBox::warning(this, "Input Error", "Please fill in all fields correctly."); + return false; } } void ProcessDialog::setId(int id) diff --git a/src/process_dialog.h b/src/process_dialog.h index e461b11b..3abddccd 100644 --- a/src/process_dialog.h +++ b/src/process_dialog.h @@ -25,8 +25,8 @@ class ProcessDialog : public QDialog { void setQEMUPlatform(const QString &qemuPlatform); private slots: - void validateAndAccept(); - + bool validateAndAccept(); + friend class ProcessDialogTests; private: QLineEdit *idEdit; QLineEdit *nameEdit; diff --git a/src/simulation_data_manager.cpp b/src/simulation_data_manager.cpp index 5d32cddc..81a24c34 100644 --- a/src/simulation_data_manager.cpp +++ b/src/simulation_data_manager.cpp @@ -14,7 +14,8 @@ SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) { } -void SimulationDataManager::readSimulationData(QVector squares, QString img) +void SimulationDataManager::readSimulationData( + QVector squares, QString img) { data.processes.clear(); for(int i = 0; i < squares.size(); i++) { @@ -42,17 +43,18 @@ void SimulationDataManager::saveSimulationData( for (const auto &process : data.processes) { bson_t proc; char key[16]; - snprintf(key, sizeof(key), "%d", process->getProcess().getId()); + snprintf(key, sizeof(key), "%d", process->getProcess()->getId()); BSON_APPEND_DOCUMENT_BEGIN(&processes, key, &proc); - BSON_APPEND_INT32(&proc, "id", process->getProcess().getId()); - BSON_APPEND_UTF8(&proc, "name", - process->getProcess().getName().toStdString().c_str()); + BSON_APPEND_INT32(&proc, "id", process->getProcess()->getId()); + BSON_APPEND_UTF8( + &proc, "name", + process->getProcess()->getName().toStdString().c_str()); BSON_APPEND_UTF8( &proc, "CMakeProject", - process->getProcess().getCMakeProject().toStdString().c_str()); + process->getProcess()->getCMakeProject().toStdString().c_str()); BSON_APPEND_UTF8( &proc, "QEMUPlatform", - process->getProcess().getQEMUPlatform().toStdString().c_str()); + process->getProcess()->getQEMUPlatform().toStdString().c_str()); bson_t coordinate; BSON_APPEND_DOCUMENT_BEGIN(&proc, "coordinate", &coordinate); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 00000000..c71cf8e9 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,99 @@ +cmake_minimum_required(VERSION 3.5) +project(DraggableSquaresTests) +# Find the Qt5 package +find_package(Qt5 REQUIRED COMPONENTS Test Widgets Core Gui) +# Find the BSON library +find_package(PkgConfig REQUIRED) +pkg_check_modules(BSON REQUIRED libbson-1.0) +# Define the list of source files +set(src_files + ../src/draggable_square.cpp + ../src/process.cpp + ../src/process_dialog.cpp + ../src/main_window.cpp + ../src/simulation_data_manager.cpp +) +# Set the test executable name for MainWindowTests +add_executable(MainWindowTests + test_main_window.cpp + ${src_files} +) +# Set the test executable name for DraggableSquareTests +add_executable(DraggableSquareTests + test_draggable_square.cpp + ${src_files} +) +# Set the test executable name for UserInteractionTests +add_executable(UserInteractionTests + user_interaction_tests.cpp + ${src_files} +) + +add_executable(ProcessTests + test_process.cpp + ${src_files} +) + +add_executable(ProcessDialogTests + test_process_dialog.cpp + ${src_files} +) +# Include BSON directories for both targets +target_include_directories(MainWindowTests PRIVATE ${BSON_INCLUDE_DIRS}) +target_include_directories(DraggableSquareTests PRIVATE ${BSON_INCLUDE_DIRS}) +target_include_directories(UserInteractionTests PRIVATE ${BSON_INCLUDE_DIRS}) +target_include_directories(ProcessTests PRIVATE ${BSON_INCLUDE_DIRS}) +target_include_directories(ProcessDialogTests PRIVATE ${BSON_INCLUDE_DIRS}) + + +# Link the test executables to the necessary Qt5 components and BSON library +target_link_libraries(MainWindowTests + Qt5::Test + Qt5::Widgets + Qt5::Core + Qt5::Gui + ${BSON_LIBRARIES} +) +target_link_libraries(DraggableSquareTests + Qt5::Test + Qt5::Widgets + Qt5::Core + Qt5::Gui + ${BSON_LIBRARIES} +) +target_link_libraries(UserInteractionTests + Qt5::Test + Qt5::Widgets + Qt5::Core + Qt5::Gui + ${BSON_LIBRARIES} +) +target_link_libraries(ProcessTests + Qt5::Test + Qt5::Widgets + Qt5::Core + Qt5::Gui + ${BSON_LIBRARIES} +) +target_link_libraries(ProcessDialogTests + Qt5::Test + Qt5::Widgets + Qt5::Core + Qt5::Gui + ${BSON_LIBRARIES} +) +set(CMAKE_PREFIX_PATH "/usr/local" ${CMAKE_PREFIX_PATH}) +# Include directories +include_directories(${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS}) +# Link against Google Test and Google Mock +target_link_libraries(MainWindowTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) +target_link_libraries(DraggableSquareTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) +target_link_libraries(UserInteractionTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) +target_link_libraries(ProcessTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) +target_link_libraries(ProcessDialogTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) + +add_test(NAME MainWindowTests COMMAND MainWindowTests) +add_test(NAME DraggableSquareTests COMMAND DraggableSquareTests) +add_test(NAME UserInteractionTests COMMAND UserInteractionTests) +add_test(NAME ProcessTests COMMAND ProcessTests) +add_test(NAME ProcessDialogTests COMMAND ProcessDialogTests) \ No newline at end of file diff --git a/test/test_draggable_square.cpp b/test/test_draggable_square.cpp new file mode 100644 index 00000000..fb5bcd5e --- /dev/null +++ b/test/test_draggable_square.cpp @@ -0,0 +1,78 @@ +#include +#include +#include +#include "../src/draggable_square.h" +#include "../src/process.h" +#include "../src/main_window.h" +class DraggableSquareTest : public QObject +{ + Q_OBJECT +private slots: + void initTestCase(); + void cleanupTestCase(); + void testSetProcess(); + void testMousePressEvent(); + void testMouseMoveEvent(); + void testMouseReleaseEvent(); +private: + QWidget *parentWidget; + DraggableSquare *draggableSquare; + Process *testProcess = new Process(); + MainWindow *mainWindow; +}; +void DraggableSquareTest::initTestCase() +{ + // Initialize a parent widget and the DraggableSquare instance + parentWidget = new QWidget(); + parentWidget->resize(800, 600); + mainWindow = new MainWindow(parentWidget); + mainWindow->resize(800, 600); + parentWidget->show(); + testProcess = new Process(1, "Test Process", "Test CMake", "Test QEMU"); + draggableSquare = new DraggableSquare(parentWidget, "background-color: red;", 100, 100); + draggableSquare->setProcess(testProcess); + draggableSquare->show(); +} +void DraggableSquareTest::cleanupTestCase() +{ + delete draggableSquare; + delete mainWindow; + delete parentWidget; + delete testProcess; +} +void DraggableSquareTest::testSetProcess() +{ + QCOMPARE(draggableSquare->getProcess()->getId(), testProcess->getId()); + QCOMPARE(draggableSquare->getProcess()->getName(), testProcess->getName()); + QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), testProcess->getCMakeProject()); + QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), testProcess->getQEMUPlatform()); +} +void DraggableSquareTest::testMousePressEvent() +{ + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent rightClickEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::RightButton, Qt::RightButton, Qt::NoModifier); + // Test left button press starts dragging + draggableSquare->mousePressEvent(&pressEvent); + QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); + // Test right button press triggers context menu (add additional checks as needed) + draggableSquare->mousePressEvent(&rightClickEvent); + // Since this involves GUI elements, you would typically need to simulate and verify the context menu here +} +void DraggableSquareTest::testMouseMoveEvent() +{ + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + draggableSquare->mousePressEvent(&pressEvent); + QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + draggableSquare->mouseMoveEvent(&moveEvent); + // Assuming the parent widget has a size of 800x600 and draggable square is constrained + QCOMPARE(draggableSquare->pos(), QPoint(20, 20)); +} +void DraggableSquareTest::testMouseReleaseEvent() +{ + draggableSquare->mousePressEvent(new QMouseEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + draggableSquare->mouseReleaseEvent(new QMouseEvent(QEvent::MouseButtonRelease, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); +} + +QTEST_MAIN(DraggableSquareTest) +#include "test_draggable_square.moc" \ No newline at end of file diff --git a/test/test_main_window.cpp b/test/test_main_window.cpp new file mode 100644 index 00000000..ca2bd589 --- /dev/null +++ b/test/test_main_window.cpp @@ -0,0 +1,120 @@ +#include +#include "../src/main_window.h" + +class TestMainWindow : public QObject +{ + Q_OBJECT + +private slots: + + void testCreateNewProcess(); + void testAddProcessSquare(); + void testIsUniqueId(); + void testStartProcesses(); + void testEndProcesses(); + void testDeleteSquare(); + void testShowTimerInput(); + void addId(int id); +}; + + +void TestMainWindow::testCreateNewProcess() +{ + MainWindow window; + int newProcessId = 6; // Ensure this is greater than 5 and unique + QString processName = "NewProcess"; + QString cmakeProject = "../src/dummy_program3"; + QString qemuPlatform = "QEMUPlatform"; + // Create a new Process object with the provided data + Process* newProcess = new Process(newProcessId, processName, cmakeProject, qemuPlatform); + // Simulate adding the process square to the main window + window.addProcessSquare(newProcess); + window.addId(newProcessId); + // Verify that the process was added correctly + Process* retrievedProcess = window.getProcessById(newProcessId); + QVERIFY(retrievedProcess != nullptr); + QCOMPARE(retrievedProcess->getName(), processName); + QCOMPARE(retrievedProcess->getCMakeProject(), cmakeProject); + QCOMPARE(retrievedProcess->getQEMUPlatform(), qemuPlatform); + // Clean up + delete newProcess; +} + +void TestMainWindow::testAddProcessSquare() +{ + MainWindow window; + Process *newProcess = new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); + window.addProcessSquare(newProcess); + QCOMPARE(window.squares.size(), 5); // Check if square is added + +} + +void TestMainWindow::testIsUniqueId() +{ + MainWindow window; + window.addId(5); + QCOMPARE(window.isUniqueId(5), false); // Check if the ID is unique + QCOMPARE(window.isUniqueId(10), true); // Check if a different ID is unique +} + +void TestMainWindow::testStartProcesses() +{ + MainWindow window; + window.startProcesses(); + QVERIFY(!window.runningProcesses.isEmpty()); // Ensure processes are started +} + +void TestMainWindow::testEndProcesses() +{ + MainWindow window; + window.startProcesses(); + window.endProcesses(); + QVERIFY(window.runningProcesses.isEmpty()); // Ensure processes are stopped +} + + + + +void TestMainWindow::testDeleteSquare() +{ + MainWindow window; + Process *process = new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); + window.addProcessSquare(process); + + + window.deleteSquare(5); + + // Ensure that only the initial 4 squares remain + QCOMPARE(window.squares.size(), 4); + QVERIFY(!window.squarePositions.contains(5)); + QVERIFY(!window.usedIds.contains(5)); +} + + +void TestMainWindow::addId(int id){ + MainWindow window; + window.addId(77); + QVERIFY(window.usedIds.contains(77)); +} + +void TestMainWindow::testShowTimerInput() { + MainWindow mainWindow; + + // Initially, the time input and label should be hidden + QVERIFY(!mainWindow.timeInput->isVisible()); + QVERIFY(!mainWindow.timeLabel->isVisible()); + + mainWindow.show(); + // Trigger the showTimerInput function + mainWindow.showTimerInput(); + + // Now, the time input and label should be visible + QVERIFY(mainWindow.timeInput->isVisible()); + QVERIFY(mainWindow.timeLabel->isVisible()); +} + + +QTEST_MAIN(TestMainWindow) +#include "test_main_window.moc" + + diff --git a/test/test_process.cpp b/test/test_process.cpp new file mode 100644 index 00000000..f5ec4c1d --- /dev/null +++ b/test/test_process.cpp @@ -0,0 +1,39 @@ +#include +#include "../src/process.h" + +class ProcessTests : public QObject { + Q_OBJECT + +private slots: + void testProcessConstructor() { + Process process(1, "Test Process", "TestProject", "TestPlatform"); + QCOMPARE(process.getId(), 1); + QCOMPARE(process.getName(), QString("Test Process")); + QCOMPARE(process.getCMakeProject(), QString("TestProject")); + QCOMPARE(process.getQEMUPlatform(), QString("TestPlatform")); + } + + void testDefaultConstructor() { + Process process; + QCOMPARE(process.getId(), -1); + QCOMPARE(process.getName(), QString("")); + QCOMPARE(process.getCMakeProject(), QString("")); + QCOMPARE(process.getQEMUPlatform(), QString("")); + } + + void testSetters() { + Process process; + process.setId(2); + process.setName("New Process"); + process.setCMakeProject("NewProject"); + process.setQEMUPlatform("NewPlatform"); + + QCOMPARE(process.getId(), 2); + QCOMPARE(process.getName(), QString("New Process")); + QCOMPARE(process.getCMakeProject(), QString("NewProject")); + QCOMPARE(process.getQEMUPlatform(), QString("NewPlatform")); + } +}; + +QTEST_MAIN(ProcessTests) +#include "test_process.moc" diff --git a/test/test_process_dialog.cpp b/test/test_process_dialog.cpp new file mode 100644 index 00000000..600c97bd --- /dev/null +++ b/test/test_process_dialog.cpp @@ -0,0 +1,55 @@ +#include +#include "../src/process_dialog.h" + +class ProcessDialogTests : public QObject { + Q_OBJECT + +private slots: + void testGetId() { + ProcessDialog dialog; + dialog.setId(123); + QCOMPARE(dialog.getId(), 123); + } + + void testGetName() { + ProcessDialog dialog; + dialog.setName("Test Process"); + QCOMPARE(dialog.getName(), "Test Process"); + } + + void testGetCMakeProject() { + ProcessDialog dialog; + dialog.setCMakeProject("TestProject"); + QCOMPARE(dialog.getCMakeProject(), "TestProject"); + } + + void testGetQEMUPlatform() { + ProcessDialog dialog; + dialog.setQEMUPlatform("arm"); + QCOMPARE(dialog.getQEMUPlatform(), "arm"); + } + + void testIsValid() { + ProcessDialog dialog; + dialog.setId(123); + dialog.setName("Test Process"); + dialog.setCMakeProject("TestProject"); + dialog.setQEMUPlatform("x86"); + QVERIFY(dialog.isValid()); + } + + void testValidateAndAccept() { + ProcessDialog dialog; + dialog.setId(123); + dialog.setName("Test Process"); + dialog.setCMakeProject("TestProject"); + dialog.setQEMUPlatform("x86"); + QVERIFY(dialog.validateAndAccept() == true); // Assuming true indicates validation success + } +}; + +// הוסף את המאקרו QTEST_MAIN כדי ליצור את פונקציית main +QTEST_MAIN(ProcessDialogTests) + +// הקובץ שכולל את Q_OBJECT צריך להיות מחובר למאקרו +#include "test_process_dialog.moc" diff --git a/test/user_interaction_tests.cpp b/test/user_interaction_tests.cpp new file mode 100644 index 00000000..220a4785 --- /dev/null +++ b/test/user_interaction_tests.cpp @@ -0,0 +1,73 @@ +#include +#include +#include "../src/main_window.h" + +class UserInteractionTests : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void cleanupTestCase(); + void testOpenImageDialog(); + void testGetExecutableName(); +private: + MainWindow *mainWindow; +}; + +void UserInteractionTests::initTestCase() +{ + mainWindow = new MainWindow(); + mainWindow->resize(800, 600); + mainWindow->show(); +} + +void UserInteractionTests::cleanupTestCase() +{ + delete mainWindow; +} + +void UserInteractionTests::testOpenImageDialog() +{ + MainWindow window; + window.openImageDialog(); + QVERIFY(!window.getCurrentImagePath().isEmpty()); // Ensure image path is set +} + +void UserInteractionTests::testGetExecutableName() { + MainWindow window; + QTemporaryDir tempDir; + QVERIFY(tempDir.isValid()); + QString buildDirPath = tempDir.path(); + QDir buildDir(buildDirPath); + // Create an executable file for testing + QString executableFilePath = buildDir.filePath("testExecutable"); + QFile executableFile(executableFilePath); + QVERIFY(executableFile.open(QIODevice::WriteOnly)); + executableFile.write("dummy content"); + executableFile.close(); + QFile::setPermissions(executableFilePath, QFile::ExeUser); + // Create a non-executable file for completeness + QString nonExecutableFilePath = buildDir.filePath("nonExecutable.txt"); + QFile nonExecutableFile(nonExecutableFilePath); + QVERIFY(nonExecutableFile.open(QIODevice::WriteOnly)); + nonExecutableFile.write("dummy content"); + nonExecutableFile.close(); + // Test case: The executable file should be detected + QString executableName = window.getExecutableName(buildDirPath); + QCOMPARE(executableName, QString("testExecutable")); + // Test case: If the directory is empty + QDir emptyDir(tempDir.path() + "/emptyDir"); + QVERIFY(emptyDir.mkpath(".")); + QString emptyDirExecutableName = window.getExecutableName(emptyDir.path()); + QCOMPARE(emptyDirExecutableName, QString()); + // Test case: If the directory contains only non-executable files + QFile::remove(executableFilePath); + QString noExecutableName = window.getExecutableName(buildDirPath); + QCOMPARE(noExecutableName, QString()); + // Clean up + QFile::remove(nonExecutableFilePath); +} + +QTEST_MAIN(UserInteractionTests) +#include "user_interaction_tests.moc" From 0039898124bd6389fee5d877e5b74cce0d33b7c8 Mon Sep 17 00:00:00 2001 From: Bat-Sheva Ravitz Date: Sun, 1 Sep 2024 10:32:14 +0300 Subject: [PATCH 16/33] GUI: Modify code to create project configuration file with project ID --- src/draggable_square.h | 3 -- src/dummy_program1/main.cpp | 23 +++++++++- src/dummy_program2/main.cpp | 24 ++++++++++- src/frames.cpp | 2 +- src/main_window.cpp | 83 ++++++++++++++++++------------------- src/main_window.h | 3 +- 6 files changed, 87 insertions(+), 51 deletions(-) diff --git a/src/draggable_square.h b/src/draggable_square.h index f457e984..6e06c645 100644 --- a/src/draggable_square.h +++ b/src/draggable_square.h @@ -29,9 +29,6 @@ class DraggableSquare : public QWidget void setId(int _id) { id = _id; } ~DraggableSquare() override; void print() const; - int getId() const { return id; } - void setId(int _id) { id = _id; } - ~DraggableSquare() override; protected: void mousePressEvent(QMouseEvent *event) override; diff --git a/src/dummy_program1/main.cpp b/src/dummy_program1/main.cpp index d04b4551..0e6a68ec 100644 --- a/src/dummy_program1/main.cpp +++ b/src/dummy_program1/main.cpp @@ -1,12 +1,31 @@ #include #include +#include +#include #include -int main() -{ +using json = nlohmann::json; + +int main() { + // Read JSON file + std::ifstream file("../config.json"); // Replace with your JSON file name + if (!file.is_open()) { + std::cerr << "Unable to open file!" << std::endl; + return 1; + } + + json jsonObject; + file >> jsonObject; + + // Extract ID from JSON + int id = jsonObject["ID"]; // Assuming the JSON structure has an "id" field + std::cout << "Loaded ID from JSON: " << id << std::endl; + + // Simulate work for (int i = 0; i < 10; ++i) { std::cout << "Dummy Program 1 is running: " << i << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); // Simulate work } + return 0; } diff --git a/src/dummy_program2/main.cpp b/src/dummy_program2/main.cpp index 05716c98..a82a6871 100644 --- a/src/dummy_program2/main.cpp +++ b/src/dummy_program2/main.cpp @@ -1,12 +1,32 @@ #include #include +#include +#include #include +#include + +using json = nlohmann::json; + +int main() { + // Read JSON file + std::ifstream file("../config.json"); // Replace with your JSON file name + if (!file.is_open()) { + std::cerr << "Unable to open file!" << std::endl; + return 1; + } -int main() -{ + json jsonObject; + file >> jsonObject; + + // Extract ID from JSON + int id = jsonObject["ID"]; // Assuming the JSON structure has an "id" field + std::cout << "Loaded ID from JSON: " << id << std::endl; + + // Simulate work for (int i = 0; i < 10; ++i) { std::cout << "Dummy Program 2 is running: " << i << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); // Simulate work } + return 0; } diff --git a/src/frames.cpp b/src/frames.cpp index 5d5b35a6..7ffe68b3 100644 --- a/src/frames.cpp +++ b/src/frames.cpp @@ -1,7 +1,7 @@ -#include "frames.h" #include #include #include +#include "frames.h" // Constructor to initialize Frames with a LogHandler reference Frames::Frames(LogHandler &logHandler, QWidget *parent) diff --git a/src/main_window.cpp b/src/main_window.cpp index a9504151..e0daa1f0 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -5,15 +5,13 @@ #include #include #include -#include -#include -#include -#include -#include +#include #include "process.h" #include "main_window.h" #include "draggable_square.h" #include "process_dialog.h" +#include "frames.h" +#include "log_handler.h" int sizeSquare = 120; @@ -33,7 +31,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) timeLabel = new QLabel("Enter time in seconds:", this); logOutput = new QTextEdit(this); QPushButton *chooseButton = new QPushButton("Choose Image", this); - QPushButton *chooseButton = new QPushButton("Choose Image", this); timeLabel->hide(); timeInput->hide(); @@ -153,9 +150,11 @@ void MainWindow::addProcessSquare(Process *&process) QPoint pos = squarePositions.value(process->getId(), QPoint(0, 0)); square->move(pos); square->show(); - + square->setDragStartPosition(pos); squarePositions[process->getId()] = pos; squares.push_back(square); + + createProcessConfigFile(process->getId(), process->getCMakeProject()); } void MainWindow::addProcessSquare(Process *&process, int index, @@ -174,6 +173,8 @@ void MainWindow::addProcessSquare(Process *&process, int index, squarePositions[process->getId()] = pos; squares.push_back(square); + + createProcessConfigFile(process->getId(), process->getCMakeProject()); } bool MainWindow::isUniqueId(int id) @@ -219,7 +220,8 @@ void MainWindow::startProcesses() timeLabel->hide(); timeInput->hide(); } - compileBoxes(); + + compileAndRunProjects(); } void MainWindow::endProcesses() @@ -238,6 +240,15 @@ void MainWindow::endProcesses() dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); + QString filePath = "../log_file.log"; + logHandler.readLogFile(filePath); + logHandler.analyzeLogEntries(this, "simulation_data.bson"); + + frames = new Frames(logHandler); // Initialize Frames + QVBoxLayout *framesLayout = new QVBoxLayout(workspace); + framesLayout->addWidget(frames); + workspace->setLayout(framesLayout); + for (QProcess* process : runningProcesses) { if (process->state() != QProcess::NotRunning) { logOutput->append("Ending process..."); @@ -345,8 +356,7 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) return QString(); } - -void MainWindow::compileBoxes() +void MainWindow::compileAndRunProjects() { // Clear previous running processes for (QProcess *process : runningProcesses) { @@ -533,36 +543,25 @@ void MainWindow::deleteSquare(int id) squarePositions.remove(id); } - -// void MainWindow::deleteSquare(int squareId) -// { -// if (runningProcesses.contains(squareId)) { -// Process process = runningProcesses.value(squareId); - -// // Find and remove the corresponding square widget -// QWidget* targetSquare = nullptr; -// for (QWidget* square : squares) { -// // Assuming the square ID can be associated with the widget -// // You may need to modify this based on your implementation -// if (square->property("id").toInt() == squareId) { -// targetSquare = square; -// break; -// } -// } - -// if (targetSquare) { -// squares.removeOne(targetSquare); -// targetSquare->deleteLater(); // Safely delete the widget -// } - -// runningProcesses.remove(squareId); -// squarePositions.remove(squareId); -// usedIds.remove(squareId); - -// // Optionally, update the UI -// update(); -// } -// } - - +void MainWindow::createProcessConfigFile(int id, const QString &processPath) { + // Creating a JSON object with the process ID + QJsonObject jsonObject; + jsonObject["ID"] = id; + + // Converting the object to a JSON document + QJsonDocument jsonDoc(jsonObject); + + // Defining the file name and its path + QString filePath = processPath + "/config.json"; + QFile configFile(filePath); + + // Opening the file for writing and checking if the file opened successfully + if (configFile.open(QIODevice::WriteOnly)) { + configFile.write(jsonDoc.toJson()); + configFile.close(); + qDebug() << "Config file created at:" << filePath; + } else { + qWarning() << "Failed to create config file at:" << filePath; + } +} #include "moc_main_window.cpp" \ No newline at end of file diff --git a/src/main_window.h b/src/main_window.h index fad8d9bc..8ce70906 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -40,6 +40,7 @@ class MainWindow : public QMainWindow { void showTimerInput(); void timerTimeout(); void openImageDialog(); + void createProcessConfigFile(int id, const QString &processPath); QLineEdit *getTimeInput() const { return timeInput; } QPushButton *getStartButton() const { return startButton; } QTimer *getTimer() const { return timer; } @@ -59,7 +60,7 @@ class MainWindow : public QMainWindow { void addId(int id); void addProcessSquare(Process *&process, int index, const QString &color = "background-color: green;"); - void compileBoxes(); + void compileAndRunProjects(); QString getExecutableName(const QString &buildDirPath); Process *getProcessById(int id); From 451284d3b8c6b2a490d7a09abc68ee0f0e735602 Mon Sep 17 00:00:00 2001 From: Tamar-Leibovitz Date: Thu, 5 Sep 2024 15:33:23 +0300 Subject: [PATCH 17/33] GUI: Move all source files to gui directory and add include directory --- .clang-format => gui/.clang-format | 0 .gitignore => gui/.gitignore | 9 -------- CMakeLists.txt => gui/CMakeLists.txt | 23 +++++++++++++++---- README.md => gui/README.md | 0 {src => gui/include}/draggable_square.h | 0 {src => gui/include}/frames.h | 0 {src => gui/include}/log_handler.h | 0 {src => gui/include}/main_window.h | 0 {src => gui/include}/process.h | 0 {src => gui/include}/process_dialog.h | 0 .../include}/simulation_data_manager.h | 0 log_file.log => gui/log_file.log | 0 {src => gui/src}/draggable_square.cpp | 0 .../src}/dummy_program1/CMakeLists.txt | 0 gui/src/dummy_program1/config.json | 3 +++ {src => gui/src}/dummy_program1/main.cpp | 2 +- .../src}/dummy_program2/CMakeLists.txt | 0 gui/src/dummy_program2/config.json | 3 +++ {src => gui/src}/dummy_program2/main.cpp | 2 +- {src => gui/src}/dummy_script/hello_script.sh | 0 {src => gui/src}/frames.cpp | 0 {src => gui/src}/log_handler.cpp | 0 {src => gui/src}/main.cpp | 0 {src => gui/src}/main_window.cpp | 0 {src => gui/src}/process.cpp | 0 {src => gui/src}/process_dialog.cpp | 0 {src => gui/src}/simulation_data_manager.cpp | 0 {test => gui/test}/CMakeLists.txt | 0 {test => gui/test}/test_draggable_square.cpp | 0 {test => gui/test}/test_main_window.cpp | 0 {test => gui/test}/test_process.cpp | 0 {test => gui/test}/test_process_dialog.cpp | 0 {test => gui/test}/user_interaction_tests.cpp | 0 33 files changed, 27 insertions(+), 15 deletions(-) rename .clang-format => gui/.clang-format (100%) rename .gitignore => gui/.gitignore (78%) rename CMakeLists.txt => gui/CMakeLists.txt (70%) rename README.md => gui/README.md (100%) rename {src => gui/include}/draggable_square.h (100%) rename {src => gui/include}/frames.h (100%) rename {src => gui/include}/log_handler.h (100%) rename {src => gui/include}/main_window.h (100%) rename {src => gui/include}/process.h (100%) rename {src => gui/include}/process_dialog.h (100%) rename {src => gui/include}/simulation_data_manager.h (100%) rename log_file.log => gui/log_file.log (100%) rename {src => gui/src}/draggable_square.cpp (100%) rename {src => gui/src}/dummy_program1/CMakeLists.txt (100%) create mode 100644 gui/src/dummy_program1/config.json rename {src => gui/src}/dummy_program1/main.cpp (99%) rename {src => gui/src}/dummy_program2/CMakeLists.txt (100%) create mode 100644 gui/src/dummy_program2/config.json rename {src => gui/src}/dummy_program2/main.cpp (99%) rename {src => gui/src}/dummy_script/hello_script.sh (100%) rename {src => gui/src}/frames.cpp (100%) rename {src => gui/src}/log_handler.cpp (100%) rename {src => gui/src}/main.cpp (100%) rename {src => gui/src}/main_window.cpp (100%) rename {src => gui/src}/process.cpp (100%) rename {src => gui/src}/process_dialog.cpp (100%) rename {src => gui/src}/simulation_data_manager.cpp (100%) rename {test => gui/test}/CMakeLists.txt (100%) rename {test => gui/test}/test_draggable_square.cpp (100%) rename {test => gui/test}/test_main_window.cpp (100%) rename {test => gui/test}/test_process.cpp (100%) rename {test => gui/test}/test_process_dialog.cpp (100%) rename {test => gui/test}/user_interaction_tests.cpp (100%) diff --git a/.clang-format b/gui/.clang-format similarity index 100% rename from .clang-format rename to gui/.clang-format diff --git a/.gitignore b/gui/.gitignore similarity index 78% rename from .gitignore rename to gui/.gitignore index a0dfacd9..e5a571b1 100644 --- a/.gitignore +++ b/gui/.gitignore @@ -45,12 +45,3 @@ lib/* bin/* # Test-specific files test/test_runner -#else -src/dummy_program1 -src/dummy_program2 -src/main.cpp -src/process_dialog.cpp -src/process_dialog.h -src/process.h -src/simulation_data_manager.cpp -src/simulation_data_manager.h \ No newline at end of file diff --git a/CMakeLists.txt b/gui/CMakeLists.txt similarity index 70% rename from CMakeLists.txt rename to gui/CMakeLists.txt index adb1e27b..48e4b394 100644 --- a/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -33,14 +33,29 @@ add_executable(DraggableSquares src/frames.cpp ) +# Add headers to the executable target +target_sources(DraggableSquares PRIVATE + include/main_window.h + include/draggable_square.h + include/process_dialog.h + include/simulation_data_manager.h + include/log_handler.h + include/frames.h +) + # Include BSON directories target_include_directories(DraggableSquares PRIVATE ${BSON_INCLUDE_DIRS}) # Link the BSON library and Qt5 components target_link_libraries(DraggableSquares PRIVATE ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) -# Enable testing -enable_testing() -# Add test directory -add_subdirectory(test) \ No newline at end of file +# Add the include directory +target_include_directories(DraggableSquares PRIVATE ${BSON_INCLUDE_DIRS} include) + + +# # Enable testing +# enable_testing() + +# # Add test directory +# add_subdirectory(test) \ No newline at end of file diff --git a/README.md b/gui/README.md similarity index 100% rename from README.md rename to gui/README.md diff --git a/src/draggable_square.h b/gui/include/draggable_square.h similarity index 100% rename from src/draggable_square.h rename to gui/include/draggable_square.h diff --git a/src/frames.h b/gui/include/frames.h similarity index 100% rename from src/frames.h rename to gui/include/frames.h diff --git a/src/log_handler.h b/gui/include/log_handler.h similarity index 100% rename from src/log_handler.h rename to gui/include/log_handler.h diff --git a/src/main_window.h b/gui/include/main_window.h similarity index 100% rename from src/main_window.h rename to gui/include/main_window.h diff --git a/src/process.h b/gui/include/process.h similarity index 100% rename from src/process.h rename to gui/include/process.h diff --git a/src/process_dialog.h b/gui/include/process_dialog.h similarity index 100% rename from src/process_dialog.h rename to gui/include/process_dialog.h diff --git a/src/simulation_data_manager.h b/gui/include/simulation_data_manager.h similarity index 100% rename from src/simulation_data_manager.h rename to gui/include/simulation_data_manager.h diff --git a/log_file.log b/gui/log_file.log similarity index 100% rename from log_file.log rename to gui/log_file.log diff --git a/src/draggable_square.cpp b/gui/src/draggable_square.cpp similarity index 100% rename from src/draggable_square.cpp rename to gui/src/draggable_square.cpp diff --git a/src/dummy_program1/CMakeLists.txt b/gui/src/dummy_program1/CMakeLists.txt similarity index 100% rename from src/dummy_program1/CMakeLists.txt rename to gui/src/dummy_program1/CMakeLists.txt diff --git a/gui/src/dummy_program1/config.json b/gui/src/dummy_program1/config.json new file mode 100644 index 00000000..838e9bc2 --- /dev/null +++ b/gui/src/dummy_program1/config.json @@ -0,0 +1,3 @@ +{ + "ID": 2 +} diff --git a/src/dummy_program1/main.cpp b/gui/src/dummy_program1/main.cpp similarity index 99% rename from src/dummy_program1/main.cpp rename to gui/src/dummy_program1/main.cpp index 0e6a68ec..d60b7114 100644 --- a/src/dummy_program1/main.cpp +++ b/gui/src/dummy_program1/main.cpp @@ -28,4 +28,4 @@ int main() { } return 0; -} +} \ No newline at end of file diff --git a/src/dummy_program2/CMakeLists.txt b/gui/src/dummy_program2/CMakeLists.txt similarity index 100% rename from src/dummy_program2/CMakeLists.txt rename to gui/src/dummy_program2/CMakeLists.txt diff --git a/gui/src/dummy_program2/config.json b/gui/src/dummy_program2/config.json new file mode 100644 index 00000000..58e66efa --- /dev/null +++ b/gui/src/dummy_program2/config.json @@ -0,0 +1,3 @@ +{ + "ID": 3 +} diff --git a/src/dummy_program2/main.cpp b/gui/src/dummy_program2/main.cpp similarity index 99% rename from src/dummy_program2/main.cpp rename to gui/src/dummy_program2/main.cpp index a82a6871..3b8fb833 100644 --- a/src/dummy_program2/main.cpp +++ b/gui/src/dummy_program2/main.cpp @@ -29,4 +29,4 @@ int main() { } return 0; -} +} \ No newline at end of file diff --git a/src/dummy_script/hello_script.sh b/gui/src/dummy_script/hello_script.sh similarity index 100% rename from src/dummy_script/hello_script.sh rename to gui/src/dummy_script/hello_script.sh diff --git a/src/frames.cpp b/gui/src/frames.cpp similarity index 100% rename from src/frames.cpp rename to gui/src/frames.cpp diff --git a/src/log_handler.cpp b/gui/src/log_handler.cpp similarity index 100% rename from src/log_handler.cpp rename to gui/src/log_handler.cpp diff --git a/src/main.cpp b/gui/src/main.cpp similarity index 100% rename from src/main.cpp rename to gui/src/main.cpp diff --git a/src/main_window.cpp b/gui/src/main_window.cpp similarity index 100% rename from src/main_window.cpp rename to gui/src/main_window.cpp diff --git a/src/process.cpp b/gui/src/process.cpp similarity index 100% rename from src/process.cpp rename to gui/src/process.cpp diff --git a/src/process_dialog.cpp b/gui/src/process_dialog.cpp similarity index 100% rename from src/process_dialog.cpp rename to gui/src/process_dialog.cpp diff --git a/src/simulation_data_manager.cpp b/gui/src/simulation_data_manager.cpp similarity index 100% rename from src/simulation_data_manager.cpp rename to gui/src/simulation_data_manager.cpp diff --git a/test/CMakeLists.txt b/gui/test/CMakeLists.txt similarity index 100% rename from test/CMakeLists.txt rename to gui/test/CMakeLists.txt diff --git a/test/test_draggable_square.cpp b/gui/test/test_draggable_square.cpp similarity index 100% rename from test/test_draggable_square.cpp rename to gui/test/test_draggable_square.cpp diff --git a/test/test_main_window.cpp b/gui/test/test_main_window.cpp similarity index 100% rename from test/test_main_window.cpp rename to gui/test/test_main_window.cpp diff --git a/test/test_process.cpp b/gui/test/test_process.cpp similarity index 100% rename from test/test_process.cpp rename to gui/test/test_process.cpp diff --git a/test/test_process_dialog.cpp b/gui/test/test_process_dialog.cpp similarity index 100% rename from test/test_process_dialog.cpp rename to gui/test/test_process_dialog.cpp diff --git a/test/user_interaction_tests.cpp b/gui/test/user_interaction_tests.cpp similarity index 100% rename from test/user_interaction_tests.cpp rename to gui/test/user_interaction_tests.cpp From 072b579e42fb066ee4114a6256aa5ec5212af7be Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Sun, 8 Sep 2024 13:43:06 +0300 Subject: [PATCH 18/33] GUI: Omitting an unnecessary function named findProcessCoordinatesById --- gui/include/log_handler.h | 3 --- gui/src/log_handler.cpp | 35 ++--------------------------------- 2 files changed, 2 insertions(+), 36 deletions(-) diff --git a/gui/include/log_handler.h b/gui/include/log_handler.h index 51de2ac2..a859b160 100644 --- a/gui/include/log_handler.h +++ b/gui/include/log_handler.h @@ -29,9 +29,6 @@ class LogHandler { void sortLogEntries(); void analyzeLogEntries(QMainWindow *mainWindow, const QString &jsonFileName, bool realTime = false); - void draw(int xSrc, int ySrc, int xDest, int yDest); - QVector findProcessCoordinatesById(int processId, - const QString &fileName); QVector getLogEntries(); const QMap &getProcessSquares() const; diff --git a/gui/src/log_handler.cpp b/gui/src/log_handler.cpp index 13e71373..4d532af7 100644 --- a/gui/src/log_handler.cpp +++ b/gui/src/log_handler.cpp @@ -19,7 +19,7 @@ QVector LogHandler::getLogEntries() { return logEntries; } -// Reading data from a file + void LogHandler::readLogFile(const QString &fileName) { QFile file(fileName); @@ -85,7 +85,7 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, return; } - // עדכון מפת התהליכים לפי מידע מהקובץ JSON + // Update the process map according to information from the JSON file QJsonArray processesArray = jsonObject["processes"].toArray(); for (const QJsonValue &value : processesArray) { QJsonObject processObject = value.toObject(); @@ -145,37 +145,6 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, } } -QVector LogHandler::findProcessCoordinatesById(int processId, - const QString &fileName) -{ - QVector coordinates; - - // Load JSON from file - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qWarning("Could not open file"); - return coordinates; - } - QByteArray jsonData = file.readAll(); - file.close(); - - QJsonDocument document = QJsonDocument::fromJson(jsonData); - QJsonObject rootObject = document.object(); - QJsonArray processesArray = rootObject["processes"].toArray(); - - // Searching for the process ID and finding its coordinatesFi - for (const QJsonValue &value : processesArray) { - QJsonObject processObject = value.toObject(); - if (processObject["id"].toInt() == processId) { - coordinates.append(processObject["x"].toInt()); - coordinates.append(processObject["y"].toInt()); - break; - } - } - - return coordinates; -} - const QMap &LogHandler::getProcessSquares() const { return processSquares; From 62fdb49ed80eeabd9ad7edb31e525788510442b3 Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Sun, 8 Sep 2024 20:52:14 +0300 Subject: [PATCH 19/33] GUI: Registering for the logger and using it in MainWindow --- gui/CMakeLists.txt | 2 ++ gui/include/main_window.h | 2 ++ gui/src/main.cpp | 4 ++- gui/src/main_window.cpp | 52 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 48e4b394..f1ebced3 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -31,6 +31,7 @@ add_executable(DraggableSquares src/simulation_data_manager.cpp src/log_handler.cpp src/frames.cpp + ../logger/logger.cpp ) # Add headers to the executable target @@ -41,6 +42,7 @@ target_sources(DraggableSquares PRIVATE include/simulation_data_manager.h include/log_handler.h include/frames.h + ../logger/logger.h ) # Include BSON directories diff --git a/gui/include/main_window.h b/gui/include/main_window.h index 8ce70906..cbd27289 100644 --- a/gui/include/main_window.h +++ b/gui/include/main_window.h @@ -28,6 +28,7 @@ #include "process.h" #include "process_dialog.h" #include "simulation_data_manager.h" +#include "../logger/logger.h" class MainWindow : public QMainWindow { Q_OBJECT @@ -46,6 +47,7 @@ class MainWindow : public QMainWindow { QTimer *getTimer() const { return timer; } QTextEdit *getLogOutput() const { return logOutput; } QString getCurrentImagePath() const { return currentImagePath; } + static logger guiLogger; public slots: void createNewProcess(); void editSquare(int id); diff --git a/gui/src/main.cpp b/gui/src/main.cpp index 59fbe3d2..b408f50f 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -4,10 +4,12 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); + MainWindow::guiLogger.initializeLogFile(); MainWindow window; + window.setFixedSize(600, 600); window.show(); - + MainWindow::guiLogger.cleanUp(); return app.exec(); } \ No newline at end of file diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index e0daa1f0..d498b7f5 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -14,12 +14,15 @@ #include "log_handler.h" int sizeSquare = 120; +logger MainWindow::guiLogger("gui"); MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) { QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow::MainWindow() Log file successfully read"); + QHBoxLayout *mainLayout = new QHBoxLayout(centralWidget); QWidget *toolbox = new QWidget(this); @@ -116,12 +119,14 @@ void MainWindow::createNewProcess() int id = dialog.getId(); if (id <= 4) { QMessageBox::warning(this, "Invalid ID", "The ID must be greater than 4."); + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow", "createNewProcess", "Invalid ID entered: " + std::to_string(id)); return; } if (!isUniqueId(id)) { QMessageBox::warning(this, "Non-unique ID", "The ID entered is already in use. Please " "choose a different ID."); + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow", "createNewProcess", "Non-unique ID entered: " + std::to_string(id)); return; } Process *newProcess = @@ -129,6 +134,7 @@ void MainWindow::createNewProcess() dialog.getQEMUPlatform()); addProcessSquare(newProcess); addId(id); + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow", "createNewProcess", "New process created with ID: " + std::to_string(id)); } } @@ -201,12 +207,14 @@ void MainWindow::startProcesses() QMessageBox::warning(this, "Invalid Input", "Please enter a valid number of seconds."); timeInput->clear(); + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow", "startProcesses", "Invalid timer input: " + inputText.toStdString()); return; } if (time > 0) { logOutput->append("Timer started for " + QString::number(time) + " seconds."); + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow", "startProcesses", "Timer started for " + std::to_string(time) + " seconds"); if (timer) { timer->stop(); @@ -227,6 +235,7 @@ void MainWindow::startProcesses() void MainWindow::endProcesses() { logOutput->append("Ending processes..."); + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow::endProcesses() Ending processes"); if (timer) { timer->stop(); @@ -239,6 +248,7 @@ void MainWindow::endProcesses() timeInput->clear(); dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow::endProcesses Simulation data saved to simulation_data.bson"); QString filePath = "../log_file.log"; logHandler.readLogFile(filePath); @@ -264,11 +274,15 @@ void MainWindow::showTimerInput() { timeLabel->show(); timeInput->show(); + + guiLogger.logMessage(logger::LogLevel::DEBUG, "showTimerInput() called: Timer input elements are shown."); } void MainWindow::timerTimeout() { logOutput->append("Timer timeout reached."); + guiLogger.logMessage(logger::LogLevel::INFO, "Timer timeout reached."); + endProcesses(); } @@ -276,9 +290,11 @@ void MainWindow::openImageDialog() { QString imagePath = QFileDialog::getOpenFileName( this, tr("Select Image"), "", tr("Image Files (*.png *.jpg *.jpeg)")); + if (!imagePath.isEmpty()) { currentImagePath = imagePath; QPixmap pixmap(imagePath); + if (!pixmap.isNull()) { // Clear the workspace before adding the new image QLayout *layout = workspace->layout(); @@ -304,7 +320,13 @@ void MainWindow::openImageDialog() // Add a new layout to the workspace QVBoxLayout *newLayout = new QVBoxLayout(workspace); workspace->setLayout(newLayout); + + guiLogger.logMessage(logger::LogLevel::INFO, "openImageDialog() called: Image loaded and displayed."); + } else { + guiLogger.logMessage(logger::LogLevel::ERROR, "openImageDialog() failed: Unable to load image from path " + imagePath.toStdString()); } + } else { + guiLogger.logMessage(logger::LogLevel::INFO, "openImageDialog() canceled: No image path selected."); } } @@ -318,6 +340,7 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) << "does not exist."; QMessageBox::critical(this, "Directory Error", "The specified build directory does not exist."); + guiLogger.logMessage(logger::LogLevel::ERROR, "getExecutableName() failed: Directory does not exist: " + buildDirPath.toStdString()); return QString(); } @@ -331,6 +354,7 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) QMessageBox::critical( this, "File Error", "No files found in the specified build directory."); + guiLogger.logMessage(logger::LogLevel::ERROR, "getExecutableName() failed: No files found in directory: " + buildDirPath.toStdString()); return QString(); } @@ -353,11 +377,14 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) QMessageBox::critical( this, "Executable Not Found", "No executable file found in the specified build directory."); + guiLogger.logMessage(logger::LogLevel::ERROR, "getExecutableName() failed: No executable file found in directory: " + buildDirPath.toStdString()); return QString(); } void MainWindow::compileAndRunProjects() { + guiLogger.logMessage(logger::LogLevel::INFO, "Compiling and running projects started."); + // Clear previous running processes for (QProcess *process : runningProcesses) { process->terminate(); @@ -371,6 +398,7 @@ void MainWindow::compileAndRunProjects() // Check if it's a shell script QFile scriptFile(cmakePath); if (!scriptFile.exists()) { + guiLogger.logMessage(logger::LogLevel::ERROR, "Shell script file does not exist: " + cmakePath.toStdString()); logOutput->append("Shell script file does not exist: " + cmakePath); continue; @@ -387,6 +415,7 @@ void MainWindow::compileAndRunProjects() cmakePath); continue; } + guiLogger.logMessage(logger::LogLevel::INFO, "Script is now executable: " + cmakePath.toStdString()); logOutput->append("Script is now executable: " + cmakePath); } @@ -405,6 +434,7 @@ void MainWindow::compileAndRunProjects() }); } else { + guiLogger.logMessage(logger::LogLevel::INFO, "Compiling " + cmakePath.toStdString()); logOutput->append("Compiling " + cmakePath); QDir cmakeDir(cmakePath); @@ -418,6 +448,7 @@ void MainWindow::compileAndRunProjects() if (fileInfo.isDir()) { QDir dir(fileInfo.absoluteFilePath()); if (!dir.removeRecursively()) { + guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to remove directory: " + fileInfo.absoluteFilePath().toStdString()); logOutput->append("Failed to remove directory: " + fileInfo.absoluteFilePath()); continue; @@ -425,6 +456,7 @@ void MainWindow::compileAndRunProjects() } else { if (!QFile::remove(fileInfo.absoluteFilePath())) { + guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to remove file: " + fileInfo.absoluteFilePath().toStdString()); logOutput->append("Failed to remove file: " + fileInfo.absoluteFilePath()); continue; @@ -435,6 +467,7 @@ void MainWindow::compileAndRunProjects() else { // Create the build directory if it doesn't exist if (!buildDir.mkpath(".")) { + guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to create build directory " + buildDirPath.toStdString()); logOutput->append("Failed to create build directory " + buildDirPath); continue; @@ -445,6 +478,7 @@ void MainWindow::compileAndRunProjects() cmakeProcess->setWorkingDirectory(buildDirPath); cmakeProcess->start("cmake", QStringList() << ".."); if (!cmakeProcess->waitForFinished()) { + guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to run cmake in " + buildDirPath.toStdString()); logOutput->append("Failed to run cmake in " + buildDirPath); logOutput->append(cmakeProcess->readAllStandardError()); delete cmakeProcess; @@ -460,6 +494,7 @@ void MainWindow::compileAndRunProjects() makeProcess->setWorkingDirectory(buildDirPath); makeProcess->start("make", QStringList()); if (!makeProcess->waitForFinished()) { + guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to compile in " + buildDirPath.toStdString()); logOutput->append("Failed to compile in " + buildDirPath); logOutput->append(makeProcess->readAllStandardError()); delete makeProcess; @@ -467,6 +502,7 @@ void MainWindow::compileAndRunProjects() } logOutput->append(makeProcess->readAllStandardOutput()); logOutput->append(makeProcess->readAllStandardError()); + guiLogger.logMessage(logger::LogLevel::INFO, "Successfully compiled " + buildDirPath.toStdString()); logOutput->append("Successfully compiled " + buildDirPath); delete makeProcess; logOutput->append("Successfully compiled " + buildDirPath); @@ -486,6 +522,7 @@ void MainWindow::compileAndRunProjects() }); runProcess->start(executablePath, QStringList()); if (!runProcess->waitForStarted()) { + guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to start the program in " + buildDirPath.toStdString()); logOutput->append("Failed to start the program in " + buildDirPath); logOutput->append(runProcess->readAllStandardError()); @@ -495,9 +532,14 @@ void MainWindow::compileAndRunProjects() runningProcesses.append(runProcess); } } + + guiLogger.logMessage(logger::LogLevel::INFO, "Compiling and running projects finished."); } + void MainWindow::editSquare(int id) { + guiLogger.logMessage(logger::LogLevel::INFO, "Editing square with ID: " + std::to_string(id)); + for (DraggableSquare *square : squares) { if (square->getProcess()->getId() == id) { ProcessDialog dialog(this); @@ -513,6 +555,7 @@ void MainWindow::editSquare(int id) dialog.getId(), dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform()); square->setProcess(updatedProcess); + guiLogger.logMessage(logger::LogLevel::INFO, "Updated process details for square ID: " + std::to_string(id)); } break; } @@ -521,6 +564,7 @@ void MainWindow::editSquare(int id) void MainWindow::deleteSquare(int id) { + guiLogger.logMessage(logger::LogLevel::INFO, "Deleting square with ID: " + std::to_string(id)); qDebug() << "Deleting square with ID:" << id; auto it = std::find_if( @@ -534,10 +578,12 @@ void MainWindow::deleteSquare(int id) if (toDelete) { toDelete->deleteLater(); qDebug() << "Square with ID:" << id << "deleted."; + guiLogger.logMessage(logger::LogLevel::INFO, "Square with ID: " + std::to_string(id) + " deleted."); } } else { qDebug() << "Square with ID:" << id << "not found."; + guiLogger.logMessage(logger::LogLevel::ERROR, "Square with ID: " + std::to_string(id) + " not found."); } usedIds.remove(id); squarePositions.remove(id); @@ -560,8 +606,14 @@ void MainWindow::createProcessConfigFile(int id, const QString &processPath) { configFile.write(jsonDoc.toJson()); configFile.close(); qDebug() << "Config file created at:" << filePath; + + // Log the successful creation of the config file + guiLogger.logMessage(logger::LogLevel::INFO, "Config file created at: " + filePath.toStdString()); } else { qWarning() << "Failed to create config file at:" << filePath; + + // Log the failure to create the config file + guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to create config file at: " + filePath.toStdString()); } } #include "moc_main_window.cpp" \ No newline at end of file From 9c781fcb5d2ca354612de5eec334223649be4d20 Mon Sep 17 00:00:00 2001 From: RivkiYagelnik Date: Mon, 9 Sep 2024 01:30:43 +0300 Subject: [PATCH 20/33] GUI: Insertion of error debug sentences and information throughout the project Additionally, organized the code according to the agreed conventions. --- gui/include/draggable_square.h | 25 ++-- gui/include/main_window.h | 31 +++-- gui/include/process.h | 13 +- gui/include/process_dialog.h | 3 +- gui/src/draggable_square.cpp | 49 ++++++-- gui/src/dummy_program1/main.cpp | 3 +- gui/src/dummy_program2/main.cpp | 3 +- gui/src/frames.cpp | 37 ++++-- gui/src/log_handler.cpp | 45 +++++-- gui/src/main.cpp | 4 +- gui/src/main_window.cpp | 188 ++++++++++++++++++---------- gui/src/process.cpp | 7 ++ gui/src/process_dialog.cpp | 22 +++- gui/src/simulation_data_manager.cpp | 72 +++++++++-- gui/test/test_draggable_square.cpp | 34 +++-- gui/test/test_main_window.cpp | 43 +++---- gui/test/test_process.cpp | 9 +- gui/test/test_process_dialog.cpp | 21 ++-- gui/test/user_interaction_tests.cpp | 10 +- 19 files changed, 432 insertions(+), 187 deletions(-) diff --git a/gui/include/draggable_square.h b/gui/include/draggable_square.h index 6e06c645..0014802f 100644 --- a/gui/include/draggable_square.h +++ b/gui/include/draggable_square.h @@ -7,13 +7,11 @@ #include #include "process.h" - -class DraggableSquare : public QWidget -{ +class DraggableSquare : public QWidget { Q_OBJECT - public: - friend class DraggableSquareTest; +public: + friend class DraggableSquareTest; explicit DraggableSquare(QWidget *parent = nullptr, const QString &color = "background-color: green;", int width = 100, int height = 100); @@ -25,18 +23,23 @@ class DraggableSquare : public QWidget const QPoint getDragStartPosition() const; void setDragStartPosition(QPoint dragStartPosition); void setSquareColor(const QString &color); - int getId() const { return id; } - void setId(int _id) { id = _id; } + int getId() const + { + return id; + } + void setId(int _id) + { + id = _id; + } ~DraggableSquare() override; void print() const; - protected: +protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; - private: - +private: QPoint dragStartPosition; QPoint initialPosition; QLabel *label; @@ -44,7 +47,7 @@ class DraggableSquare : public QWidget int id; bool dragging; - private slots: +private slots: void editSquare(int id); void deleteSquare(int id); }; diff --git a/gui/include/main_window.h b/gui/include/main_window.h index cbd27289..ab9b50ed 100644 --- a/gui/include/main_window.h +++ b/gui/include/main_window.h @@ -33,7 +33,7 @@ class MainWindow : public QMainWindow { Q_OBJECT - public: +public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); void startProcesses(); @@ -42,18 +42,33 @@ class MainWindow : public QMainWindow { void timerTimeout(); void openImageDialog(); void createProcessConfigFile(int id, const QString &processPath); - QLineEdit *getTimeInput() const { return timeInput; } - QPushButton *getStartButton() const { return startButton; } - QTimer *getTimer() const { return timer; } - QTextEdit *getLogOutput() const { return logOutput; } - QString getCurrentImagePath() const { return currentImagePath; } + QLineEdit *getTimeInput() const + { + return timeInput; + } + QPushButton *getStartButton() const + { + return startButton; + } + QTimer *getTimer() const + { + return timer; + } + QTextEdit *getLogOutput() const + { + return logOutput; + } + QString getCurrentImagePath() const + { + return currentImagePath; + } static logger guiLogger; - public slots: +public slots: void createNewProcess(); void editSquare(int id); void deleteSquare(int id); - private: +private: friend class TestMainWindow; friend class DraggableSquareTest; friend class UserInteractionTests; diff --git a/gui/include/process.h b/gui/include/process.h index 8da2f11f..5d348d8e 100644 --- a/gui/include/process.h +++ b/gui/include/process.h @@ -14,18 +14,23 @@ class Process { QString getName() const; QString getCMakeProject() const; QString getQEMUPlatform() const; - void setId(int newId) { + void setId(int newId) + { id = newId; } - void setName(const QString& newName) { + void setName(const QString &newName) + { name = newName; } - void setCMakeProject(const QString& newCMakeProject) { + void setCMakeProject(const QString &newCMakeProject) + { cmakeProject = newCMakeProject; } - void setQEMUPlatform(const QString& newQEMUPlatform) { + void setQEMUPlatform(const QString &newQEMUPlatform) + { qemuPlatform = newQEMUPlatform; } + private: int id; QString name; diff --git a/gui/include/process_dialog.h b/gui/include/process_dialog.h index 3abddccd..676bdfca 100644 --- a/gui/include/process_dialog.h +++ b/gui/include/process_dialog.h @@ -26,7 +26,8 @@ class ProcessDialog : public QDialog { private slots: bool validateAndAccept(); - friend class ProcessDialogTests; + friend class ProcessDialogTests; + private: QLineEdit *idEdit; QLineEdit *nameEdit; diff --git a/gui/src/draggable_square.cpp b/gui/src/draggable_square.cpp index 79813b88..00485b70 100644 --- a/gui/src/draggable_square.cpp +++ b/gui/src/draggable_square.cpp @@ -6,8 +6,6 @@ #include #include #include -#include -#include #include #include "main_window.h" #include "draggable_square.h" @@ -15,15 +13,17 @@ // Add this function to your DraggableSquare class void DraggableSquare::print() const { - std::cout << "DraggableSquare:" << std::endl; - std::cout << " Process ID: " << process->getId() << std::endl; - std::cout << " Drag Start Position: (" << dragStartPosition.x() << ", " - << dragStartPosition.y() << ")" << std::endl; - std::cout << " Initial Position: (" << initialPosition.x() << ", " - << initialPosition.y() << ")" << std::endl; - std::cout << " Color: " << label->styleSheet().toStdString() << std::endl; - std::cout << " Size: (" << this->width() << ", " << this->height() << ")" - << std::endl; + std::stringstream ss; + ss << "DraggableSquare:\n" + << " Process ID: " << process->getId() << "\n" + << " Drag Start Position: (" << dragStartPosition.x() << ", " + << dragStartPosition.y() << ")\n" + << " Initial Position: (" << initialPosition.x() << ", " + << initialPosition.y() << ")\n" + << " Color: " << label->styleSheet().toStdString() << "\n" + << " Size: (" << this->width() << ", " << this->height() << ")"; + + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, ss.str()); } void DraggableSquare::setSquareColor(const QString &color) @@ -51,6 +51,8 @@ DraggableSquare::DraggableSquare(const DraggableSquare &other) label(new QLabel(other.label->text(), this)), process(other.process) // Copy QLabel's text { + MainWindow::guiLogger.logMessage(logger::LogLevel::DEBUG, + "Copying DraggableSquare"); setFixedSize(other.width(), other.height()); setStyleSheet(other.styleSheet()); } @@ -58,6 +60,8 @@ DraggableSquare::DraggableSquare(const DraggableSquare &other) // Copy assignment operator DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) { + MainWindow::guiLogger.logMessage(logger::LogLevel::DEBUG, + "Assigning DraggableSquare"); if (this == &other) { return *this; } @@ -76,6 +80,8 @@ DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) void DraggableSquare::setProcess(Process *proc) { + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Setting process for DraggableSquare"); process = proc; if (process) { this->id = process->getId(); @@ -104,18 +110,23 @@ void DraggableSquare::setDragStartPosition(QPoint dragStartPosition) DraggableSquare::~DraggableSquare() { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Destroying DraggableSquare with ID: " + std::to_string(id)); if (label) { delete label; label = nullptr; } - - qDebug() << "DraggableSquare with ID" << id << "is being destroyed."; } void DraggableSquare::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { if (id < 0 || id > 4) { // Prevent menu for IDs 1 to 4 + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Right-click on DraggableSquare with ID: " + + std::to_string(id)); QMenu contextMenu(this); QAction *editAction = contextMenu.addAction("Edit"); @@ -132,6 +143,9 @@ void DraggableSquare::mousePressEvent(QMouseEvent *event) } } else if (event->button() == Qt::LeftButton) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Left-click on DraggableSquare with ID: " + std::to_string(id)); dragStartPosition = event->pos(); dragging = true; } @@ -152,12 +166,18 @@ void DraggableSquare::mouseMoveEvent(QMouseEvent *event) move(newPos); dragStartPosition = newPos; + MainWindow::guiLogger.logMessage(logger::LogLevel::DEBUG, + "DraggableSquare moved to: (" + + std::to_string(newPos.x()) + ", " + + std::to_string(newPos.y()) + ")"); } void DraggableSquare::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { dragging = false; + MainWindow::guiLogger.logMessage(logger::LogLevel::DEBUG, + "DraggableSquare drag ended"); } QWidget::mouseReleaseEvent(event); @@ -174,6 +194,9 @@ void DraggableSquare::editSquare(int id) void DraggableSquare::deleteSquare(int id) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Editing DraggableSquare with ID: " + std::to_string(id)); MainWindow *mainWindow = qobject_cast(parentWidget()->window()); if (mainWindow) { diff --git a/gui/src/dummy_program1/main.cpp b/gui/src/dummy_program1/main.cpp index d60b7114..d468371f 100644 --- a/gui/src/dummy_program1/main.cpp +++ b/gui/src/dummy_program1/main.cpp @@ -6,7 +6,8 @@ using json = nlohmann::json; -int main() { +int main() +{ // Read JSON file std::ifstream file("../config.json"); // Replace with your JSON file name if (!file.is_open()) { diff --git a/gui/src/dummy_program2/main.cpp b/gui/src/dummy_program2/main.cpp index 3b8fb833..864b2a4f 100644 --- a/gui/src/dummy_program2/main.cpp +++ b/gui/src/dummy_program2/main.cpp @@ -7,7 +7,8 @@ using json = nlohmann::json; -int main() { +int main() +{ // Read JSON file std::ifstream file("../config.json"); // Replace with your JSON file name if (!file.is_open()) { diff --git a/gui/src/frames.cpp b/gui/src/frames.cpp index 7ffe68b3..ddede8f7 100644 --- a/gui/src/frames.cpp +++ b/gui/src/frames.cpp @@ -2,11 +2,15 @@ #include #include #include "frames.h" +#include "main_window.h" // Constructor to initialize Frames with a LogHandler reference Frames::Frames(LogHandler &logHandler, QWidget *parent) : logHandler(logHandler), QWidget(parent), differenceTime(0) { + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Initializing Frames"); + createSequentialIds(); fillFramesMat(); @@ -18,6 +22,9 @@ Frames::Frames(LogHandler &logHandler, QWidget *parent) QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Frames::updateFrames); timer->start(1000); + + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "Frames initialized with timer set to 1000ms"); } void Frames::initialFramesMat(int size) @@ -57,11 +64,12 @@ void Frames::paintEvent(QPaintEvent *event) painter.drawRect(rect2); } else { - qDebug() << "Invalid index: row" << row << "col" << col; + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Invalid index: row " + std::to_string(row) + " col " + std::to_string(col)); } } else { - qDebug() << "Invalid ID index:"; + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "Invalid ID index"); } } } @@ -71,7 +79,10 @@ void Frames::updateFrames() QDateTime currentTime = QDateTime::currentDateTime().addMSecs(-differenceTime); - qDebug() << "Updating frames at time:" << currentTime.toString(); + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Updating frames at time: " + currentTime.toString().toStdString()); + // Decrease thickness for expired log entries for (auto it = activeLogEntries.begin(); it != activeLogEntries.end();) { if (it->first.addSecs(5) <= currentTime) { @@ -90,6 +101,10 @@ void Frames::updateFrames() } } + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "Active log entries remaining: " + + std::to_string(activeLogEntries.size())); + // Increase thickness for new log entries for (const LogHandler::LogEntry &logEntry : logHandler.getLogEntries()) { if (logEntry.timestamp <= currentTime) { @@ -104,7 +119,6 @@ void Frames::updateFrames() } } } - update(); } @@ -113,16 +127,21 @@ void Frames::createSequentialIds() int newId = 0; for (const DraggableSquare *ds : logHandler.getProcessSquares()) { int originalId = ds->getProcess()->getId(); - qDebug() << originalId; + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "Mapping original ID " + + std::to_string(originalId) + + " to new ID " + std::to_string(newId)); idMapping.insert(originalId, newId); newId++; } - qDebug() << newId; initialFramesMat(newId); } void Frames::fillFramesMat() { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "Filling frames matrix with random colors"); + QSet usedColors; srand(static_cast(time(0))); @@ -137,8 +156,10 @@ void Frames::fillFramesMat() framesMat[i][j].color = randomColor; framesMat[i][j].thickness = 1; - qDebug() << "Color for frame (" << i << "," << j - << "):" << randomColor; + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Assigned color " + randomColor.toStdString() + " to frame (" + + std::to_string(i) + ", " + std::to_string(j) + ")"); } } } diff --git a/gui/src/log_handler.cpp b/gui/src/log_handler.cpp index 4d532af7..7501302a 100644 --- a/gui/src/log_handler.cpp +++ b/gui/src/log_handler.cpp @@ -1,8 +1,8 @@ #include "log_handler.h" #include "draggable_square.h" #include "simulation_data_manager.h" +#include "main_window.h" #include -#include #include #include #include @@ -24,10 +24,16 @@ void LogHandler::readLogFile(const QString &fileName) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qDebug() << "Cannot open file:" << fileName; + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, + "Cannot open file: " + fileName.toStdString()); return; } + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "File successfully opened: " + fileName.toStdString()); + QByteArray fileData = file.readAll(); file.close(); @@ -37,7 +43,9 @@ void LogHandler::readLogFile(const QString &fileName) QStringList fields = trimmedLine.split(' '); if (fields.size() < 6) { - qWarning() << "Skipping malformed line:" << trimmedLine; + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Skipping malformed line: " + trimmedLine.toStdString()); continue; } @@ -49,8 +57,7 @@ void LogHandler::readLogFile(const QString &fileName) entry.timestamp = QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss.zzz"); if (!entry.timestamp.isValid()) { - qWarning() << "Skipping line with invalid timestamp:" - << trimmedLine; + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "Skipping line with invalid timestamp: " + trimmedLine.toStdString()); continue; } @@ -61,7 +68,8 @@ void LogHandler::readLogFile(const QString &fileName) logEntries.push_back(entry); } - qDebug() << "Log file successfully read"; + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Log file successfully read."); } void LogHandler::sortLogEntries() @@ -75,17 +83,28 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, if (realTime) { // if the simulation runs time the squares are present on the window /// Otherwise, quarters are reloaded according to the data in Gison + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Analyzing log entries in real-time."); } else { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "Analyzing log entries from JSON file: " + + jsonFileName.toStdString()); + SimulationDataManager dataManager; QJsonObject jsonObject = dataManager.loadSimulationData(jsonFileName.toStdString()); if (jsonObject.isEmpty()) { - qWarning() << "Failed to load JSON data"; + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to load JSON data"); return; } - // Update the process map according to information from the JSON file + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Successfully loaded simulation data from: " + + jsonFileName.toStdString()); + + // Update process map with JSON data QJsonArray processesArray = jsonObject["processes"].toArray(); for (const QJsonValue &value : processesArray) { QJsonObject processObject = value.toObject(); @@ -108,7 +127,10 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, } } - qDebug() << "Size of logEntries:" << logEntries.size(); + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Size of logEntries: " + std::to_string(logEntries.size())); + for (const auto &logEntry : logEntries) { int srcId = logEntry.srcId; int dstId = logEntry.dstId; @@ -132,6 +154,11 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, srcSquare->setSquareColor(color); dstSquare->setSquareColor(color); + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Updated square colors for srcId: " + std::to_string(srcId) + + " dstId: " + std::to_string(dstId)); + // Increase communication count communicationCounts[srcId][dstId]++; } diff --git a/gui/src/main.cpp b/gui/src/main.cpp index b408f50f..37111390 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -7,9 +7,11 @@ int main(int argc, char *argv[]) MainWindow::guiLogger.initializeLogFile(); MainWindow window; - + window.setFixedSize(600, 600); window.show(); + MainWindow::guiLogger.cleanUp(); + return app.exec(); } \ No newline at end of file diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index d498b7f5..d2a98d77 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -21,8 +20,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow::MainWindow() Log file successfully read"); - QHBoxLayout *mainLayout = new QHBoxLayout(centralWidget); QWidget *toolbox = new QWidget(this); @@ -45,8 +42,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) toolboxLayout->addWidget(addProcessButton); toolboxLayout->addStretch(); - connect(addProcessButton, &QPushButton::clicked, this, &MainWindow::createNewProcess); - connect(startButton, &QPushButton::clicked, this, &MainWindow::startProcesses); + connect(addProcessButton, &QPushButton::clicked, this, + &MainWindow::createNewProcess); + connect(startButton, &QPushButton::clicked, this, + &MainWindow::startProcesses); connect(endButton, &QPushButton::clicked, this, &MainWindow::endProcesses); connect(timerButton, &QPushButton::clicked, this, &MainWindow::showTimerInput); @@ -102,7 +101,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) addId(id++); } - MainWindow::~MainWindow() { qDeleteAll(squares); @@ -118,15 +116,20 @@ void MainWindow::createNewProcess() if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { int id = dialog.getId(); if (id <= 4) { - QMessageBox::warning(this, "Invalid ID", "The ID must be greater than 4."); - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow", "createNewProcess", "Invalid ID entered: " + std::to_string(id)); + QMessageBox::warning(this, "Invalid ID", + "The ID must be greater than 4."); + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, "MainWindow", "createNewProcess", + "Invalid ID entered: " + std::to_string(id)); return; } if (!isUniqueId(id)) { QMessageBox::warning(this, "Non-unique ID", "The ID entered is already in use. Please " "choose a different ID."); - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow", "createNewProcess", "Non-unique ID entered: " + std::to_string(id)); + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, "MainWindow", "createNewProcess", + "Non-unique ID entered: " + std::to_string(id)); return; } Process *newProcess = @@ -134,7 +137,9 @@ void MainWindow::createNewProcess() dialog.getQEMUPlatform()); addProcessSquare(newProcess); addId(id); - MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow", "createNewProcess", "New process created with ID: " + std::to_string(id)); + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "MainWindow", "createNewProcess", + "New process created with ID: " + std::to_string(id)); } } @@ -207,14 +212,18 @@ void MainWindow::startProcesses() QMessageBox::warning(this, "Invalid Input", "Please enter a valid number of seconds."); timeInput->clear(); - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "MainWindow", "startProcesses", "Invalid timer input: " + inputText.toStdString()); + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, "MainWindow", "startProcesses", + "Invalid timer input: " + inputText.toStdString()); return; } if (time > 0) { logOutput->append("Timer started for " + QString::number(time) + " seconds."); - MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow", "startProcesses", "Timer started for " + std::to_string(time) + " seconds"); + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "MainWindow", "startProcesses", + "Timer started for " + std::to_string(time) + " seconds"); if (timer) { timer->stop(); @@ -235,7 +244,9 @@ void MainWindow::startProcesses() void MainWindow::endProcesses() { logOutput->append("Ending processes..."); - MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow::endProcesses() Ending processes"); + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "MainWindow::endProcesses() Ending processes"); if (timer) { timer->stop(); @@ -247,8 +258,11 @@ void MainWindow::endProcesses() timeLabel->show(); timeInput->clear(); - dataManager->saveSimulationData("simulation_data.bson", squares, currentImagePath); - MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow::endProcesses Simulation data saved to simulation_data.bson"); + dataManager->saveSimulationData("simulation_data.bson", squares, + currentImagePath); + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "MainWindow::endProcesses Simulation " + "data saved to simulation_data.bson"); QString filePath = "../log_file.log"; logHandler.readLogFile(filePath); @@ -259,7 +273,7 @@ void MainWindow::endProcesses() framesLayout->addWidget(frames); workspace->setLayout(framesLayout); - for (QProcess* process : runningProcesses) { + for (QProcess *process : runningProcesses) { if (process->state() != QProcess::NotRunning) { logOutput->append("Ending process..."); process->terminate(); @@ -275,7 +289,9 @@ void MainWindow::showTimerInput() timeLabel->show(); timeInput->show(); - guiLogger.logMessage(logger::LogLevel::DEBUG, "showTimerInput() called: Timer input elements are shown."); + guiLogger.logMessage( + logger::LogLevel::DEBUG, + "showTimerInput() called: Timer input elements are shown."); } void MainWindow::timerTimeout() @@ -290,11 +306,11 @@ void MainWindow::openImageDialog() { QString imagePath = QFileDialog::getOpenFileName( this, tr("Select Image"), "", tr("Image Files (*.png *.jpg *.jpeg)")); - + if (!imagePath.isEmpty()) { currentImagePath = imagePath; QPixmap pixmap(imagePath); - + if (!pixmap.isNull()) { // Clear the workspace before adding the new image QLayout *layout = workspace->layout(); @@ -320,13 +336,22 @@ void MainWindow::openImageDialog() // Add a new layout to the workspace QVBoxLayout *newLayout = new QVBoxLayout(workspace); workspace->setLayout(newLayout); - - guiLogger.logMessage(logger::LogLevel::INFO, "openImageDialog() called: Image loaded and displayed."); - } else { - guiLogger.logMessage(logger::LogLevel::ERROR, "openImageDialog() failed: Unable to load image from path " + imagePath.toStdString()); + + guiLogger.logMessage( + logger::LogLevel::INFO, + "openImageDialog() called: Image loaded and displayed."); + } + else { + guiLogger.logMessage( + logger::LogLevel::ERROR, + "openImageDialog() failed: Unable to load image from path " + + imagePath.toStdString()); } - } else { - guiLogger.logMessage(logger::LogLevel::INFO, "openImageDialog() canceled: No image path selected."); + } + else { + guiLogger.logMessage( + logger::LogLevel::INFO, + "openImageDialog() canceled: No image path selected."); } } @@ -336,25 +361,26 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) // Check if the directory exists if (!buildDir.exists()) { - qWarning() << "Error: The directory" << buildDirPath - << "does not exist."; QMessageBox::critical(this, "Directory Error", "The specified build directory does not exist."); - guiLogger.logMessage(logger::LogLevel::ERROR, "getExecutableName() failed: Directory does not exist: " + buildDirPath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "getExecutableName() failed: Directory does not exist: " + + buildDirPath.toStdString()); return QString(); } - QStringList files = buildDir.entryList(QDir::Files | QDir::NoSymLinks); // If the directory is empty or has no files if (files.isEmpty()) { - qWarning() << "Error: No files found in the directory" << buildDirPath - << "."; QMessageBox::critical( this, "File Error", "No files found in the specified build directory."); - guiLogger.logMessage(logger::LogLevel::ERROR, "getExecutableName() failed: No files found in directory: " + buildDirPath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "getExecutableName() failed: No files found in directory: " + + buildDirPath.toStdString()); return QString(); } @@ -372,18 +398,20 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) } // No executable found - qWarning() << "Error: No executable file found in the directory" - << buildDirPath << "."; QMessageBox::critical( this, "Executable Not Found", "No executable file found in the specified build directory."); - guiLogger.logMessage(logger::LogLevel::ERROR, "getExecutableName() failed: No executable file found in directory: " + buildDirPath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "getExecutableName() failed: No executable file found in directory: " + + buildDirPath.toStdString()); return QString(); } void MainWindow::compileAndRunProjects() { - guiLogger.logMessage(logger::LogLevel::INFO, "Compiling and running projects started."); + guiLogger.logMessage(logger::LogLevel::INFO, + "Compiling and running projects started."); // Clear previous running processes for (QProcess *process : runningProcesses) { @@ -398,7 +426,9 @@ void MainWindow::compileAndRunProjects() // Check if it's a shell script QFile scriptFile(cmakePath); if (!scriptFile.exists()) { - guiLogger.logMessage(logger::LogLevel::ERROR, "Shell script file does not exist: " + cmakePath.toStdString()); + guiLogger.logMessage(logger::LogLevel::ERROR, + "Shell script file does not exist: " + + cmakePath.toStdString()); logOutput->append("Shell script file does not exist: " + cmakePath); continue; @@ -415,7 +445,9 @@ void MainWindow::compileAndRunProjects() cmakePath); continue; } - guiLogger.logMessage(logger::LogLevel::INFO, "Script is now executable: " + cmakePath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::INFO, + "Script is now executable: " + cmakePath.toStdString()); logOutput->append("Script is now executable: " + cmakePath); } @@ -434,7 +466,8 @@ void MainWindow::compileAndRunProjects() }); } else { - guiLogger.logMessage(logger::LogLevel::INFO, "Compiling " + cmakePath.toStdString()); + guiLogger.logMessage(logger::LogLevel::INFO, + "Compiling " + cmakePath.toStdString()); logOutput->append("Compiling " + cmakePath); QDir cmakeDir(cmakePath); @@ -448,7 +481,10 @@ void MainWindow::compileAndRunProjects() if (fileInfo.isDir()) { QDir dir(fileInfo.absoluteFilePath()); if (!dir.removeRecursively()) { - guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to remove directory: " + fileInfo.absoluteFilePath().toStdString()); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "Failed to remove directory: " + + fileInfo.absoluteFilePath().toStdString()); logOutput->append("Failed to remove directory: " + fileInfo.absoluteFilePath()); continue; @@ -456,7 +492,10 @@ void MainWindow::compileAndRunProjects() } else { if (!QFile::remove(fileInfo.absoluteFilePath())) { - guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to remove file: " + fileInfo.absoluteFilePath().toStdString()); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "Failed to remove file: " + + fileInfo.absoluteFilePath().toStdString()); logOutput->append("Failed to remove file: " + fileInfo.absoluteFilePath()); continue; @@ -467,7 +506,9 @@ void MainWindow::compileAndRunProjects() else { // Create the build directory if it doesn't exist if (!buildDir.mkpath(".")) { - guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to create build directory " + buildDirPath.toStdString()); + guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to create build directory " + + buildDirPath.toStdString()); logOutput->append("Failed to create build directory " + buildDirPath); continue; @@ -478,7 +519,9 @@ void MainWindow::compileAndRunProjects() cmakeProcess->setWorkingDirectory(buildDirPath); cmakeProcess->start("cmake", QStringList() << ".."); if (!cmakeProcess->waitForFinished()) { - guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to run cmake in " + buildDirPath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "Failed to run cmake in " + buildDirPath.toStdString()); logOutput->append("Failed to run cmake in " + buildDirPath); logOutput->append(cmakeProcess->readAllStandardError()); delete cmakeProcess; @@ -488,13 +531,14 @@ void MainWindow::compileAndRunProjects() logOutput->append(cmakeProcess->readAllStandardError()); delete cmakeProcess; - // Run make QProcess *makeProcess = new QProcess(this); makeProcess->setWorkingDirectory(buildDirPath); makeProcess->start("make", QStringList()); if (!makeProcess->waitForFinished()) { - guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to compile in " + buildDirPath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "Failed to compile in " + buildDirPath.toStdString()); logOutput->append("Failed to compile in " + buildDirPath); logOutput->append(makeProcess->readAllStandardError()); delete makeProcess; @@ -502,11 +546,13 @@ void MainWindow::compileAndRunProjects() } logOutput->append(makeProcess->readAllStandardOutput()); logOutput->append(makeProcess->readAllStandardError()); - guiLogger.logMessage(logger::LogLevel::INFO, "Successfully compiled " + buildDirPath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::INFO, + "Successfully compiled " + buildDirPath.toStdString()); logOutput->append("Successfully compiled " + buildDirPath); delete makeProcess; logOutput->append("Successfully compiled " + buildDirPath); - // Run the compiled program + // Run the compiled program QString exeFile = getExecutableName(buildDirPath); QString executablePath = buildDir.absoluteFilePath(exeFile); QProcess *runProcess = new QProcess(this); @@ -522,7 +568,9 @@ void MainWindow::compileAndRunProjects() }); runProcess->start(executablePath, QStringList()); if (!runProcess->waitForStarted()) { - guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to start the program in " + buildDirPath.toStdString()); + guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to start the program in " + + buildDirPath.toStdString()); logOutput->append("Failed to start the program in " + buildDirPath); logOutput->append(runProcess->readAllStandardError()); @@ -533,12 +581,14 @@ void MainWindow::compileAndRunProjects() } } - guiLogger.logMessage(logger::LogLevel::INFO, "Compiling and running projects finished."); + guiLogger.logMessage(logger::LogLevel::INFO, + "Compiling and running projects finished."); } void MainWindow::editSquare(int id) { - guiLogger.logMessage(logger::LogLevel::INFO, "Editing square with ID: " + std::to_string(id)); + guiLogger.logMessage(logger::LogLevel::INFO, + "Editing square with ID: " + std::to_string(id)); for (DraggableSquare *square : squares) { if (square->getProcess()->getId() == id) { @@ -555,7 +605,9 @@ void MainWindow::editSquare(int id) dialog.getId(), dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform()); square->setProcess(updatedProcess); - guiLogger.logMessage(logger::LogLevel::INFO, "Updated process details for square ID: " + std::to_string(id)); + guiLogger.logMessage(logger::LogLevel::INFO, + "Updated process details for square ID: " + + std::to_string(id)); } break; } @@ -564,9 +616,8 @@ void MainWindow::editSquare(int id) void MainWindow::deleteSquare(int id) { - guiLogger.logMessage(logger::LogLevel::INFO, "Deleting square with ID: " + std::to_string(id)); - qDebug() << "Deleting square with ID:" << id; - + guiLogger.logMessage(logger::LogLevel::INFO, + "Deleting square with ID: " + std::to_string(id)); auto it = std::find_if( squares.begin(), squares.end(), [id](DraggableSquare *square) { return square && square->getProcess()->getId() == id; @@ -577,19 +628,22 @@ void MainWindow::deleteSquare(int id) it = squares.erase(it); if (toDelete) { toDelete->deleteLater(); - qDebug() << "Square with ID:" << id << "deleted."; - guiLogger.logMessage(logger::LogLevel::INFO, "Square with ID: " + std::to_string(id) + " deleted."); + guiLogger.logMessage( + logger::LogLevel::INFO, + "Square with ID: " + std::to_string(id) + " deleted."); } } else { - qDebug() << "Square with ID:" << id << "not found."; - guiLogger.logMessage(logger::LogLevel::ERROR, "Square with ID: " + std::to_string(id) + " not found."); + guiLogger.logMessage( + logger::LogLevel::ERROR, + "Square with ID: " + std::to_string(id) + " not found."); } usedIds.remove(id); squarePositions.remove(id); } -void MainWindow::createProcessConfigFile(int id, const QString &processPath) { +void MainWindow::createProcessConfigFile(int id, const QString &processPath) +{ // Creating a JSON object with the process ID QJsonObject jsonObject; jsonObject["ID"] = id; @@ -605,15 +659,15 @@ void MainWindow::createProcessConfigFile(int id, const QString &processPath) { if (configFile.open(QIODevice::WriteOnly)) { configFile.write(jsonDoc.toJson()); configFile.close(); - qDebug() << "Config file created at:" << filePath; - - // Log the successful creation of the config file - guiLogger.logMessage(logger::LogLevel::INFO, "Config file created at: " + filePath.toStdString()); - } else { - qWarning() << "Failed to create config file at:" << filePath; - // Log the failure to create the config file - guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to create config file at: " + filePath.toStdString()); + guiLogger.logMessage( + logger::LogLevel::INFO, + "Config file created at: " + filePath.toStdString()); + } + else { + guiLogger.logMessage( + logger::LogLevel::ERROR, + "Failed to create config file at: " + filePath.toStdString()); } } #include "moc_main_window.cpp" \ No newline at end of file diff --git a/gui/src/process.cpp b/gui/src/process.cpp index 060c2635..8f7c8d00 100644 --- a/gui/src/process.cpp +++ b/gui/src/process.cpp @@ -1,9 +1,13 @@ #include "process.h" +#include "main_window.h" Process::Process(int id, const QString &name, const QString &cmakeProject, const QString &qemuPlatform) : id(id), name(name), cmakeProject(cmakeProject), qemuPlatform(qemuPlatform) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Process created with ID: " + std::to_string(id)); } // Copy constructor @@ -13,6 +17,9 @@ Process::Process(const Process &other) cmakeProject(other.cmakeProject), qemuPlatform(other.qemuPlatform) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Process copied with ID: " + std::to_string(other.id)); } Process::Process() : id(-1), name(""), cmakeProject(""), qemuPlatform("") {} diff --git a/gui/src/process_dialog.cpp b/gui/src/process_dialog.cpp index 75f6216d..1432fcfe 100644 --- a/gui/src/process_dialog.cpp +++ b/gui/src/process_dialog.cpp @@ -6,11 +6,15 @@ #include #include #include "process_dialog.h" +#include "main_window.h" ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) { QVBoxLayout *layout = new QVBoxLayout(this); + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Initializing ProcessDialog"); + QLabel *idLabel = new QLabel("ID:"); idEdit = new QLineEdit(this); idEdit->setValidator(new QIntValidator(11, 10000, this)); @@ -88,12 +92,28 @@ bool ProcessDialog::isValid() const bool ProcessDialog::validateAndAccept() { + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Validating ProcessDialog inputs"); + if (isValid()) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "Validation successful, accepting dialog"); + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Entered values: ID = " + idEdit->text().toStdString() + + ", Name = " + nameEdit->text().toStdString() + + ", CMake Project = " + cmakeProjectEdit->text().toStdString() + + ", QEMU Platform = " + + qemuPlatformCombo->currentText().toStdString()); accept(); return true; } else { - QMessageBox::warning(this, "Input Error", "Please fill in all fields correctly."); + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, + "Validation failed, missing or incorrect input"); + QMessageBox::warning(this, "Input Error", + "Please fill in all fields correctly."); return false; } } diff --git a/gui/src/simulation_data_manager.cpp b/gui/src/simulation_data_manager.cpp index 81a24c34..1056ec69 100644 --- a/gui/src/simulation_data_manager.cpp +++ b/gui/src/simulation_data_manager.cpp @@ -2,38 +2,66 @@ #include #include #include -#include #include #include #include #include -#include #include "simulation_data_manager.h" +#include "main_window.h" SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) { + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "SimulationDataManager", "Constructor", + "SimulationDataManager instance created"); } void SimulationDataManager::readSimulationData( QVector squares, QString img) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "SimulationDataManager", "readSimulationData", + "Starting to read simulation data"); + data.processes.clear(); - for(int i = 0; i < squares.size(); i++) { - if(squares[i] != nullptr) + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "SimulationDataManager", "readSimulationData", + "Cleared existing processes"); + + for (int i = 0; i < squares.size(); i++) { + if (squares[i] != nullptr) { data.processes.append(squares[i]); - else - qWarning() << "Warning: Null pointer at index" << i; + + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "SimulationDataManager", + "readSimulationData", + "Added process at index " + std::to_string(i)); + } + else { + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, "SimulationDataManager", + "readSimulationData", + "Null pointer encountered at index " + std::to_string(i)); + } } data.user.id = 1; data.user.name = "default user"; data.user.img = img; + + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "SimulationDataManager", "readSimulationData", + "Simulation data read completed. Total processes: " + + std::to_string(data.processes.size())); } void SimulationDataManager::saveSimulationData( const std::string &fileName, QVector squares, QString img) { + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Starting to save simulation data."); + readSimulationData(squares, img); bson_t *document = bson_new(); @@ -85,11 +113,13 @@ void SimulationDataManager::saveSimulationData( if (file.is_open()) { file.write(reinterpret_cast(buf), length); file.close(); - std::cout << "Successfully saved data to " << fileName << std::endl; + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "Successfully saved data to " + fileName); } else { - std::cerr << "Failed to open file for writing: " << fileName - << std::endl; + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, + "Failed to open file for writing: " + fileName); } bson_free(buf); @@ -98,9 +128,14 @@ void SimulationDataManager::saveSimulationData( QJsonObject SimulationDataManager::loadSimulationData( const std::string &fileName) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Attempting to load simulation data from " + fileName); + std::ifstream file(fileName, std::ios::binary | std::ios::ate); if (!file.is_open()) { - std::cerr << "Failed to open file: " << fileName << std::endl; + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to open file: " + fileName); return QJsonObject(); // Return an empty QJsonObject } @@ -112,16 +147,20 @@ QJsonObject SimulationDataManager::loadSimulationData( const uint8_t *data = reinterpret_cast(buffer.data()); bson_t *document = bson_new_from_data(data, size); if (document) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "Successfully loaded simulation data."); QJsonObject jsonObject = bsonToJsonObject(document); bson_destroy(document); // Clean up BSON document return jsonObject; } else { - std::cerr << "Failed to parse BSON document" << std::endl; + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to parse BSON document"); } } else { - std::cerr << "Failed to read file: " << fileName << std::endl; + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to read file: " + fileName); } return QJsonObject(); // Return an empty QJsonObject } @@ -132,6 +171,10 @@ QJsonObject SimulationDataManager::bsonToJsonObject(const bson_t *document) QJsonDocument jsonDoc = QJsonDocument::fromJson(QByteArray::fromRawData(json, strlen(json))); bson_free(json); + + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Converted BSON to JSON object."); + return jsonDoc.object(); } @@ -139,5 +182,8 @@ void SimulationDataManager::printJson(QJsonObject jsonObject) { QJsonDocument jsonDoc(jsonObject); QByteArray jsonBytes = jsonDoc.toJson(); - std::cout << jsonBytes.toStdString() << std::endl; + + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Printing JSON object:\n" + jsonBytes.toStdString()); } \ No newline at end of file diff --git a/gui/test/test_draggable_square.cpp b/gui/test/test_draggable_square.cpp index fb5bcd5e..f64056f8 100644 --- a/gui/test/test_draggable_square.cpp +++ b/gui/test/test_draggable_square.cpp @@ -4,8 +4,7 @@ #include "../src/draggable_square.h" #include "../src/process.h" #include "../src/main_window.h" -class DraggableSquareTest : public QObject -{ +class DraggableSquareTest : public QObject { Q_OBJECT private slots: void initTestCase(); @@ -14,6 +13,7 @@ private slots: void testMousePressEvent(); void testMouseMoveEvent(); void testMouseReleaseEvent(); + private: QWidget *parentWidget; DraggableSquare *draggableSquare; @@ -29,7 +29,8 @@ void DraggableSquareTest::initTestCase() mainWindow->resize(800, 600); parentWidget->show(); testProcess = new Process(1, "Test Process", "Test CMake", "Test QEMU"); - draggableSquare = new DraggableSquare(parentWidget, "background-color: red;", 100, 100); + draggableSquare = + new DraggableSquare(parentWidget, "background-color: red;", 100, 100); draggableSquare->setProcess(testProcess); draggableSquare->show(); } @@ -44,13 +45,18 @@ void DraggableSquareTest::testSetProcess() { QCOMPARE(draggableSquare->getProcess()->getId(), testProcess->getId()); QCOMPARE(draggableSquare->getProcess()->getName(), testProcess->getName()); - QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), testProcess->getCMakeProject()); - QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), testProcess->getQEMUPlatform()); + QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), + testProcess->getCMakeProject()); + QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), + testProcess->getQEMUPlatform()); } void DraggableSquareTest::testMousePressEvent() { - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); - QMouseEvent rightClickEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::RightButton, Qt::RightButton, Qt::NoModifier); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent rightClickEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::RightButton, Qt::RightButton, + Qt::NoModifier); // Test left button press starts dragging draggableSquare->mousePressEvent(&pressEvent); QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); @@ -60,17 +66,23 @@ void DraggableSquareTest::testMousePressEvent() } void DraggableSquareTest::testMouseMoveEvent() { - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); draggableSquare->mousePressEvent(&pressEvent); - QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, + Qt::LeftButton, Qt::NoModifier); draggableSquare->mouseMoveEvent(&moveEvent); // Assuming the parent widget has a size of 800x600 and draggable square is constrained QCOMPARE(draggableSquare->pos(), QPoint(20, 20)); } void DraggableSquareTest::testMouseReleaseEvent() { - draggableSquare->mousePressEvent(new QMouseEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); - draggableSquare->mouseReleaseEvent(new QMouseEvent(QEvent::MouseButtonRelease, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + draggableSquare->mousePressEvent( + new QMouseEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + draggableSquare->mouseReleaseEvent( + new QMouseEvent(QEvent::MouseButtonRelease, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); } diff --git a/gui/test/test_main_window.cpp b/gui/test/test_main_window.cpp index ca2bd589..4bf525ef 100644 --- a/gui/test/test_main_window.cpp +++ b/gui/test/test_main_window.cpp @@ -1,8 +1,7 @@ #include #include "../src/main_window.h" -class TestMainWindow : public QObject -{ +class TestMainWindow : public QObject { Q_OBJECT private slots: @@ -17,7 +16,6 @@ private slots: void addId(int id); }; - void TestMainWindow::testCreateNewProcess() { MainWindow window; @@ -26,12 +24,13 @@ void TestMainWindow::testCreateNewProcess() QString cmakeProject = "../src/dummy_program3"; QString qemuPlatform = "QEMUPlatform"; // Create a new Process object with the provided data - Process* newProcess = new Process(newProcessId, processName, cmakeProject, qemuPlatform); + Process *newProcess = + new Process(newProcessId, processName, cmakeProject, qemuPlatform); // Simulate adding the process square to the main window window.addProcessSquare(newProcess); window.addId(newProcessId); // Verify that the process was added correctly - Process* retrievedProcess = window.getProcessById(newProcessId); + Process *retrievedProcess = window.getProcessById(newProcessId); QVERIFY(retrievedProcess != nullptr); QCOMPARE(retrievedProcess->getName(), processName); QCOMPARE(retrievedProcess->getCMakeProject(), cmakeProject); @@ -43,25 +42,26 @@ void TestMainWindow::testCreateNewProcess() void TestMainWindow::testAddProcessSquare() { MainWindow window; - Process *newProcess = new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); + Process *newProcess = + new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); window.addProcessSquare(newProcess); - QCOMPARE(window.squares.size(), 5); // Check if square is added - + QCOMPARE(window.squares.size(), 5); // Check if square is added } void TestMainWindow::testIsUniqueId() { MainWindow window; window.addId(5); - QCOMPARE(window.isUniqueId(5), false); // Check if the ID is unique - QCOMPARE(window.isUniqueId(10), true); // Check if a different ID is unique + QCOMPARE(window.isUniqueId(5), false); // Check if the ID is unique + QCOMPARE(window.isUniqueId(10), true); // Check if a different ID is unique } void TestMainWindow::testStartProcesses() { MainWindow window; window.startProcesses(); - QVERIFY(!window.runningProcesses.isEmpty()); // Ensure processes are started + QVERIFY( + !window.runningProcesses.isEmpty()); // Ensure processes are started } void TestMainWindow::testEndProcesses() @@ -69,35 +69,33 @@ void TestMainWindow::testEndProcesses() MainWindow window; window.startProcesses(); window.endProcesses(); - QVERIFY(window.runningProcesses.isEmpty()); // Ensure processes are stopped + QVERIFY(window.runningProcesses.isEmpty()); // Ensure processes are stopped } - - - void TestMainWindow::testDeleteSquare() { MainWindow window; - Process *process = new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); + Process *process = + new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); window.addProcessSquare(process); - window.deleteSquare(5); - + // Ensure that only the initial 4 squares remain QCOMPARE(window.squares.size(), 4); QVERIFY(!window.squarePositions.contains(5)); QVERIFY(!window.usedIds.contains(5)); } - -void TestMainWindow::addId(int id){ +void TestMainWindow::addId(int id) +{ MainWindow window; window.addId(77); QVERIFY(window.usedIds.contains(77)); } -void TestMainWindow::testShowTimerInput() { +void TestMainWindow::testShowTimerInput() +{ MainWindow mainWindow; // Initially, the time input and label should be hidden @@ -113,8 +111,5 @@ void TestMainWindow::testShowTimerInput() { QVERIFY(mainWindow.timeLabel->isVisible()); } - QTEST_MAIN(TestMainWindow) #include "test_main_window.moc" - - diff --git a/gui/test/test_process.cpp b/gui/test/test_process.cpp index f5ec4c1d..0b245320 100644 --- a/gui/test/test_process.cpp +++ b/gui/test/test_process.cpp @@ -5,7 +5,8 @@ class ProcessTests : public QObject { Q_OBJECT private slots: - void testProcessConstructor() { + void testProcessConstructor() + { Process process(1, "Test Process", "TestProject", "TestPlatform"); QCOMPARE(process.getId(), 1); QCOMPARE(process.getName(), QString("Test Process")); @@ -13,7 +14,8 @@ private slots: QCOMPARE(process.getQEMUPlatform(), QString("TestPlatform")); } - void testDefaultConstructor() { + void testDefaultConstructor() + { Process process; QCOMPARE(process.getId(), -1); QCOMPARE(process.getName(), QString("")); @@ -21,7 +23,8 @@ private slots: QCOMPARE(process.getQEMUPlatform(), QString("")); } - void testSetters() { + void testSetters() + { Process process; process.setId(2); process.setName("New Process"); diff --git a/gui/test/test_process_dialog.cpp b/gui/test/test_process_dialog.cpp index 600c97bd..f8e5a862 100644 --- a/gui/test/test_process_dialog.cpp +++ b/gui/test/test_process_dialog.cpp @@ -5,31 +5,36 @@ class ProcessDialogTests : public QObject { Q_OBJECT private slots: - void testGetId() { + void testGetId() + { ProcessDialog dialog; dialog.setId(123); QCOMPARE(dialog.getId(), 123); } - void testGetName() { + void testGetName() + { ProcessDialog dialog; dialog.setName("Test Process"); QCOMPARE(dialog.getName(), "Test Process"); } - void testGetCMakeProject() { + void testGetCMakeProject() + { ProcessDialog dialog; dialog.setCMakeProject("TestProject"); QCOMPARE(dialog.getCMakeProject(), "TestProject"); } - void testGetQEMUPlatform() { + void testGetQEMUPlatform() + { ProcessDialog dialog; dialog.setQEMUPlatform("arm"); QCOMPARE(dialog.getQEMUPlatform(), "arm"); } - void testIsValid() { + void testIsValid() + { ProcessDialog dialog; dialog.setId(123); dialog.setName("Test Process"); @@ -38,13 +43,15 @@ private slots: QVERIFY(dialog.isValid()); } - void testValidateAndAccept() { + void testValidateAndAccept() + { ProcessDialog dialog; dialog.setId(123); dialog.setName("Test Process"); dialog.setCMakeProject("TestProject"); dialog.setQEMUPlatform("x86"); - QVERIFY(dialog.validateAndAccept() == true); // Assuming true indicates validation success + QVERIFY(dialog.validateAndAccept() == + true); // Assuming true indicates validation success } }; diff --git a/gui/test/user_interaction_tests.cpp b/gui/test/user_interaction_tests.cpp index 220a4785..150ae858 100644 --- a/gui/test/user_interaction_tests.cpp +++ b/gui/test/user_interaction_tests.cpp @@ -2,8 +2,7 @@ #include #include "../src/main_window.h" -class UserInteractionTests : public QObject -{ +class UserInteractionTests : public QObject { Q_OBJECT private slots: @@ -11,6 +10,7 @@ private slots: void cleanupTestCase(); void testOpenImageDialog(); void testGetExecutableName(); + private: MainWindow *mainWindow; }; @@ -31,10 +31,12 @@ void UserInteractionTests::testOpenImageDialog() { MainWindow window; window.openImageDialog(); - QVERIFY(!window.getCurrentImagePath().isEmpty()); // Ensure image path is set + QVERIFY( + !window.getCurrentImagePath().isEmpty()); // Ensure image path is set } -void UserInteractionTests::testGetExecutableName() { +void UserInteractionTests::testGetExecutableName() +{ MainWindow window; QTemporaryDir tempDir; QVERIFY(tempDir.isValid()); From 5a6f5b6d6b0bc46d91c1cbeb6817b75950504037 Mon Sep 17 00:00:00 2001 From: Tamar-Leibovitz Date: Tue, 10 Sep 2024 14:23:24 +0300 Subject: [PATCH 21/33] GUI: Separate compile and run processes --- gui/include/main_window.h | 10 +-- gui/src/main_window.cpp | 139 ++++++++++++++++++++++---------------- 2 files changed, 87 insertions(+), 62 deletions(-) diff --git a/gui/include/main_window.h b/gui/include/main_window.h index ab9b50ed..82bc9fe2 100644 --- a/gui/include/main_window.h +++ b/gui/include/main_window.h @@ -36,7 +36,7 @@ class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); - void startProcesses(); + void updateTimer(); void endProcesses(); void showTimerInput(); void timerTimeout(); @@ -48,7 +48,7 @@ class MainWindow : public QMainWindow { } QPushButton *getStartButton() const { - return startButton; + return runButton; } QTimer *getTimer() const { @@ -77,7 +77,8 @@ public slots: void addId(int id); void addProcessSquare(Process *&process, int index, const QString &color = "background-color: green;"); - void compileAndRunProjects(); + void compileProjects(); + void runProjects(); QString getExecutableName(const QString &buildDirPath); Process *getProcessById(int id); @@ -86,7 +87,8 @@ public slots: QVector squares; QMap squarePositions; QSet usedIds; - QPushButton *startButton; + QPushButton *compileButton; + QPushButton *runButton; QPushButton *endButton; QPushButton *timerButton; QLineEdit *timeInput; diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index d2a98d77..86df2f2f 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -24,7 +24,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) QWidget *toolbox = new QWidget(this); toolboxLayout = new QVBoxLayout(toolbox); - startButton = new QPushButton("Start", this); + compileButton = new QPushButton("Compile", this); + runButton = new QPushButton("Run", this); endButton = new QPushButton("End", this); timerButton = new QPushButton("Set Timer", this); timeInput = new QLineEdit(this); @@ -42,10 +43,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) toolboxLayout->addWidget(addProcessButton); toolboxLayout->addStretch(); - connect(addProcessButton, &QPushButton::clicked, this, - &MainWindow::createNewProcess); - connect(startButton, &QPushButton::clicked, this, - &MainWindow::startProcesses); + connect(addProcessButton, &QPushButton::clicked, this, &MainWindow::createNewProcess); + connect(compileButton, &QPushButton::clicked, this, &MainWindow::compileProjects); + connect(runButton, &QPushButton::clicked, this, &MainWindow::runProjects); connect(endButton, &QPushButton::clicked, this, &MainWindow::endProcesses); connect(timerButton, &QPushButton::clicked, this, &MainWindow::showTimerInput); @@ -54,7 +54,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) toolbox->setMaximumWidth(100); toolbox->setMinimumWidth(100); - toolboxLayout->addWidget(startButton); + toolboxLayout->addWidget(compileButton); + toolboxLayout->addWidget(runButton); + runButton->setEnabled(false); toolboxLayout->addWidget(endButton); toolboxLayout->addWidget(timerButton); toolboxLayout->addWidget(timeLabel); @@ -198,7 +200,7 @@ void MainWindow::addId(int id) usedIds.insert(id); } -void MainWindow::startProcesses() +void MainWindow::updateTimer() { QString inputText = timeInput->text(); bool ok = true; @@ -237,8 +239,6 @@ void MainWindow::startProcesses() timeLabel->hide(); timeInput->hide(); } - - compileAndRunProjects(); } void MainWindow::endProcesses() @@ -254,7 +254,6 @@ void MainWindow::endProcesses() timer = nullptr; } - timeInput->show(); timeLabel->show(); timeInput->clear(); @@ -407,11 +406,14 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) buildDirPath.toStdString()); return QString(); } - -void MainWindow::compileAndRunProjects() -{ + +void MainWindow::compileProjects() { guiLogger.logMessage(logger::LogLevel::INFO, - "Compiling and running projects started."); + "Compiling and running projects started."); + updateTimer(); + + // Disable the run button until compilation finishes + runButton->setEnabled(false); // Clear previous running processes for (QProcess *process : runningProcesses) { @@ -420,29 +422,31 @@ void MainWindow::compileAndRunProjects() } runningProcesses.clear(); + bool compileSuccessful = true; // Track if all compilations succeed + for (const DraggableSquare *square : squares) { QString cmakePath = square->getProcess()->getCMakeProject(); + if (cmakePath.endsWith(".sh")) { - // Check if it's a shell script + // Shell script processing QFile scriptFile(cmakePath); if (!scriptFile.exists()) { guiLogger.logMessage(logger::LogLevel::ERROR, "Shell script file does not exist: " + cmakePath.toStdString()); - logOutput->append("Shell script file does not exist: " + - cmakePath); + + logOutput->append("Shell script file does not exist: " + cmakePath); + compileSuccessful = false; continue; } - // Check if the script has executable permissions if ((scriptFile.permissions() & QFileDevice::ExeUser) == 0) { - // Make the script executable using chmod command (Linux specific) + // Make the script executable QProcess makeExecutableProcess; - makeExecutableProcess.start("chmod", QStringList() - << "+x" << cmakePath); + makeExecutableProcess.start("chmod", QStringList() << "+x" << cmakePath); if (!makeExecutableProcess.waitForFinished()) { - logOutput->append("Failed to make the script executable: " + - cmakePath); + logOutput->append("Failed to make the script executable: " + cmakePath); + compileSuccessful = false; continue; } guiLogger.logMessage( @@ -450,33 +454,19 @@ void MainWindow::compileAndRunProjects() "Script is now executable: " + cmakePath.toStdString()); logOutput->append("Script is now executable: " + cmakePath); } - - // Run the shell script - QProcess *scriptProcess = new QProcess(this); - scriptProcess->start("bash", QStringList() << cmakePath); - connect( - scriptProcess, &QProcess::readyReadStandardOutput, - [this, scriptProcess]() { - logOutput->append(scriptProcess->readAllStandardOutput()); - }); - connect( - scriptProcess, &QProcess::readyReadStandardError, - [this, scriptProcess]() { - logOutput->append(scriptProcess->readAllStandardError()); - }); } else { guiLogger.logMessage(logger::LogLevel::INFO, "Compiling " + cmakePath.toStdString()); - logOutput->append("Compiling " + cmakePath); + // CMake project processing + logOutput->append("Compiling " + cmakePath); QDir cmakeDir(cmakePath); QString buildDirPath = cmakeDir.absoluteFilePath("build"); QDir buildDir(buildDirPath); + if (buildDir.exists()) { - // Remove all files and subdirectories in the build directory - QFileInfoList fileList = buildDir.entryInfoList( - QDir::NoDotAndDotDot | QDir::AllEntries); + QFileInfoList fileList = buildDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); foreach (const QFileInfo &fileInfo, fileList) { if (fileInfo.isDir()) { QDir dir(fileInfo.absoluteFilePath()); @@ -485,12 +475,12 @@ void MainWindow::compileAndRunProjects() logger::LogLevel::ERROR, "Failed to remove directory: " + fileInfo.absoluteFilePath().toStdString()); - logOutput->append("Failed to remove directory: " + - fileInfo.absoluteFilePath()); + + logOutput->append("Failed to remove directory: " + fileInfo.absoluteFilePath()); + compileSuccessful = false; continue; } - } - else { + } else { if (!QFile::remove(fileInfo.absoluteFilePath())) { guiLogger.logMessage( logger::LogLevel::ERROR, @@ -498,23 +488,25 @@ void MainWindow::compileAndRunProjects() fileInfo.absoluteFilePath().toStdString()); logOutput->append("Failed to remove file: " + fileInfo.absoluteFilePath()); + compileSuccessful = false; continue; } } } - } - else { - // Create the build directory if it doesn't exist + } else { + // Create the build directory if (!buildDir.mkpath(".")) { guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to create build directory " + buildDirPath.toStdString()); logOutput->append("Failed to create build directory " + buildDirPath); + compileSuccessful = false; continue; } } - // Run cmake + + // Run CMake QProcess *cmakeProcess = new QProcess(this); cmakeProcess->setWorkingDirectory(buildDirPath); cmakeProcess->start("cmake", QStringList() << ".."); @@ -525,6 +517,7 @@ void MainWindow::compileAndRunProjects() logOutput->append("Failed to run cmake in " + buildDirPath); logOutput->append(cmakeProcess->readAllStandardError()); delete cmakeProcess; + compileSuccessful = false; continue; } logOutput->append(cmakeProcess->readAllStandardOutput()); @@ -542,6 +535,7 @@ void MainWindow::compileAndRunProjects() logOutput->append("Failed to compile in " + buildDirPath); logOutput->append(makeProcess->readAllStandardError()); delete makeProcess; + compileSuccessful = false; continue; } logOutput->append(makeProcess->readAllStandardOutput()); @@ -551,21 +545,50 @@ void MainWindow::compileAndRunProjects() "Successfully compiled " + buildDirPath.toStdString()); logOutput->append("Successfully compiled " + buildDirPath); delete makeProcess; - logOutput->append("Successfully compiled " + buildDirPath); + } + } + + // Enable the run button only if the compilation was successful + if (compileSuccessful) { + runButton->setEnabled(true); + logOutput->append("Compilation completed successfully. You can now run the projects."); + } else { + logOutput->append("Compilation failed. Please check the logs."); + } +} + +void MainWindow::runProjects() { + updateTimer(); + for (const DraggableSquare *square : squares) { + QString cmakePath = square->getProcess()->getCMakeProject(); + + if (cmakePath.endsWith(".sh")) { + // Run the shell script + QProcess *scriptProcess = new QProcess(this); + scriptProcess->start("bash", QStringList() << cmakePath); + connect(scriptProcess, &QProcess::readyReadStandardOutput, [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardOutput()); + }); + connect(scriptProcess, &QProcess::readyReadStandardError, [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardError()); + }); + } + else { // Run the compiled program + QDir cmakeDir(cmakePath); + QString buildDirPath = cmakeDir.absoluteFilePath("build"); + QDir buildDir(buildDirPath); QString exeFile = getExecutableName(buildDirPath); QString executablePath = buildDir.absoluteFilePath(exeFile); QProcess *runProcess = new QProcess(this); runProcess->setWorkingDirectory(buildDirPath); - connect(runProcess, &QProcess::readyReadStandardOutput, - [this, runProcess]() { - logOutput->append(runProcess->readAllStandardOutput()); - }); - connect(runProcess, &QProcess::readyReadStandardError, - [this, runProcess]() { - logOutput->append(runProcess->readAllStandardError()); - }); + connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() { + logOutput->append(runProcess->readAllStandardOutput()); + }); + connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() { + logOutput->append(runProcess->readAllStandardError()); + }); runProcess->start(executablePath, QStringList()); if (!runProcess->waitForStarted()) { guiLogger.logMessage(logger::LogLevel::ERROR, From 181f49a492d9612b912838919f25194c5e38af93 Mon Sep 17 00:00:00 2001 From: Bat-Sheva Ravitz Date: Thu, 12 Sep 2024 12:03:10 +0300 Subject: [PATCH 22/33] GUI: Allow stopping a single process while running --- gui/include/draggable_square.h | 5 +- gui/include/main_window.h | 5 +- gui/src/draggable_square.cpp | 28 +++++++++- gui/src/dummy_program1/config.json | 2 +- gui/src/main_window.cpp | 90 +++++++++++++++++++++++++++--- gui/test/test_main_window.cpp | 17 +++++- 6 files changed, 133 insertions(+), 14 deletions(-) diff --git a/gui/include/draggable_square.h b/gui/include/draggable_square.h index 0014802f..03d3266d 100644 --- a/gui/include/draggable_square.h +++ b/gui/include/draggable_square.h @@ -33,13 +33,15 @@ class DraggableSquare : public QWidget { } ~DraggableSquare() override; void print() const; - + void setStopButtonVisible(bool visible); protected: + void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; private: + QPushButton *stopButton; QPoint dragStartPosition; QPoint initialPosition; QLabel *label; @@ -50,6 +52,7 @@ class DraggableSquare : public QWidget { private slots: void editSquare(int id); void deleteSquare(int id); + void handleStopButtonClicked(); }; #endif // __DRAGGABLE_SQUARE_H__ \ No newline at end of file diff --git a/gui/include/main_window.h b/gui/include/main_window.h index 82bc9fe2..12207a69 100644 --- a/gui/include/main_window.h +++ b/gui/include/main_window.h @@ -38,6 +38,7 @@ class MainWindow : public QMainWindow { ~MainWindow(); void updateTimer(); void endProcesses(); + void stopProcess(int deleteId); void showTimerInput(); void timerTimeout(); void openImageDialog(); @@ -67,8 +68,8 @@ public slots: void createNewProcess(); void editSquare(int id); void deleteSquare(int id); - private: + void processFinished(int exitCode, QProcess::ExitStatus exitStatus); friend class TestMainWindow; friend class DraggableSquareTest; friend class UserInteractionTests; @@ -96,7 +97,7 @@ public slots: QTextEdit *logOutput; QTimer *timer; QLabel *imageLabel; - QVector runningProcesses; + QVector> runningProcesses; QString currentImagePath; SimulationDataManager *dataManager; LogHandler logHandler; diff --git a/gui/src/draggable_square.cpp b/gui/src/draggable_square.cpp index 00485b70..d0f53370 100644 --- a/gui/src/draggable_square.cpp +++ b/gui/src/draggable_square.cpp @@ -29,18 +29,22 @@ void DraggableSquare::print() const void DraggableSquare::setSquareColor(const QString &color) { setStyleSheet(color); + stopButton->setStyleSheet(QString("background-color: %1; border: none; color: white; font-size: 12px;").arg(color)); } -//constructor +// constructor DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, int width, int height) - : QWidget(parent), label(new QLabel(this)) + : QWidget(parent), label(new QLabel(this)), stopButton(new QPushButton("STOP", this)) { setFixedSize(width, height); setStyleSheet(color); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(label); + layout->addWidget(stopButton); setLayout(layout); + stopButton->hide(); + connect(stopButton, &QPushButton::clicked, this, &DraggableSquare::handleStopButtonClicked); } // Copy constructor @@ -202,4 +206,24 @@ void DraggableSquare::deleteSquare(int id) if (mainWindow) { mainWindow->deleteSquare(id); } +} +void DraggableSquare::setStopButtonVisible(bool visible) +{ + if (process->getId()>3){ + if (visible) { + stopButton->show(); + } else { + stopButton->hide(); + } + } +} +void DraggableSquare::handleStopButtonClicked() +{ + if (process) { + MainWindow* mainWindow = qobject_cast(parentWidget()->window()); + if (mainWindow) { + mainWindow->stopProcess(process->getId()); // Pass the process ID to stopProcess + stopButton->hide(); + } + } } \ No newline at end of file diff --git a/gui/src/dummy_program1/config.json b/gui/src/dummy_program1/config.json index 838e9bc2..0949e6c4 100644 --- a/gui/src/dummy_program1/config.json +++ b/gui/src/dummy_program1/config.json @@ -1,3 +1,3 @@ { - "ID": 2 + "ID": 22 } diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index 86df2f2f..a77a0119 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -272,17 +272,39 @@ void MainWindow::endProcesses() framesLayout->addWidget(frames); workspace->setLayout(framesLayout); - for (QProcess *process : runningProcesses) { + for (const QPair& pair : runningProcesses) { + QProcess* process = pair.first; + int id = pair.second; if (process->state() != QProcess::NotRunning) { - logOutput->append("Ending process..."); process->terminate(); process->waitForFinished(); } + delete process; } runningProcesses.clear(); } +void MainWindow::stopProcess(int deleteId) +{ + for (int i = 0; i < runningProcesses.size(); ++i) { + QProcess* process = runningProcesses[i].first; + int id = runningProcesses[i].second; + + if (id == deleteId && id > 3) { + if (process->state() != QProcess::NotRunning) { + logOutput->append("Ending process..."); + process->terminate(); + process->waitForFinished(); + } + + process->deleteLater(); + runningProcesses.removeAt(i); + break; + } + } +} + void MainWindow::showTimerInput() { timeLabel->show(); @@ -416,15 +438,17 @@ void MainWindow::compileProjects() { runButton->setEnabled(false); // Clear previous running processes - for (QProcess *process : runningProcesses) { + for (const QPair& pair : runningProcesses) { + QProcess* process = pair.first; process->terminate(); process->waitForFinished(); + delete process; } - runningProcesses.clear(); + runningProcesses.clear(); bool compileSuccessful = true; // Track if all compilations succeed - for (const DraggableSquare *square : squares) { + for (DraggableSquare *square : squares) { QString cmakePath = square->getProcess()->getCMakeProject(); if (cmakePath.endsWith(".sh")) { @@ -454,6 +478,23 @@ void MainWindow::compileProjects() { "Script is now executable: " + cmakePath.toStdString()); logOutput->append("Script is now executable: " + cmakePath); } + + // Run the shell script + QProcess *scriptProcess = new QProcess(this); + scriptProcess->start("bash", QStringList() << cmakePath); + connect( + scriptProcess, QOverload::of(&QProcess::finished), + this, &MainWindow::processFinished); + connect( + scriptProcess, &QProcess::readyReadStandardOutput, + [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardOutput()); + }); + connect( + scriptProcess, &QProcess::readyReadStandardError, + [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardError()); + }); } else { guiLogger.logMessage(logger::LogLevel::INFO, @@ -510,6 +551,10 @@ void MainWindow::compileProjects() { QProcess *cmakeProcess = new QProcess(this); cmakeProcess->setWorkingDirectory(buildDirPath); cmakeProcess->start("cmake", QStringList() << ".."); + connect( + cmakeProcess, QOverload::of(&QProcess::finished), + this, &MainWindow::processFinished); + if (!cmakeProcess->waitForFinished()) { guiLogger.logMessage( logger::LogLevel::ERROR, @@ -528,6 +573,11 @@ void MainWindow::compileProjects() { QProcess *makeProcess = new QProcess(this); makeProcess->setWorkingDirectory(buildDirPath); makeProcess->start("make", QStringList()); + connect( + makeProcess, + QOverload::of(&QProcess::finished), + this, &MainWindow::processFinished); + if (!makeProcess->waitForFinished()) { guiLogger.logMessage( logger::LogLevel::ERROR, @@ -559,7 +609,7 @@ void MainWindow::compileProjects() { void MainWindow::runProjects() { updateTimer(); - for (const DraggableSquare *square : squares) { + for (DraggableSquare *square : squares) { QString cmakePath = square->getProcess()->getCMakeProject(); if (cmakePath.endsWith(".sh")) { @@ -589,6 +639,9 @@ void MainWindow::runProjects() { connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() { logOutput->append(runProcess->readAllStandardError()); }); + connect(runProcess, QOverload::of(&QProcess::finished), + this, &MainWindow::processFinished + ); runProcess->start(executablePath, QStringList()); if (!runProcess->waitForStarted()) { guiLogger.logMessage(logger::LogLevel::ERROR, @@ -600,8 +653,9 @@ void MainWindow::runProjects() { delete runProcess; continue; } - runningProcesses.append(runProcess); + runningProcesses.append(qMakePair(runProcess,square->getProcess()->getId())); } + square->setStopButtonVisible(true); } guiLogger.logMessage(logger::LogLevel::INFO, @@ -693,4 +747,26 @@ void MainWindow::createProcessConfigFile(int id, const QString &processPath) "Failed to create config file at: " + filePath.toStdString()); } } + +void MainWindow::processFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + QProcess *finishedProcess = qobject_cast(sender()); + if (finishedProcess) { + // Find the ID of the process that finished + for (const QPair& pair : runningProcesses) { + if (pair.first == finishedProcess) { + int finishedProcessId = pair.second; + // Find the corresponding DraggableSquare + for (DraggableSquare *square : squares) { + if (square->getProcess()->getId() == finishedProcessId) { + square->setStopButtonVisible(false); + break; + } + } + break; + } + } + } +} + #include "moc_main_window.cpp" \ No newline at end of file diff --git a/gui/test/test_main_window.cpp b/gui/test/test_main_window.cpp index 4bf525ef..b6a0e702 100644 --- a/gui/test/test_main_window.cpp +++ b/gui/test/test_main_window.cpp @@ -11,6 +11,7 @@ private slots: void testIsUniqueId(); void testStartProcesses(); void testEndProcesses(); + void testStopProcesses(); void testDeleteSquare(); void testShowTimerInput(); void addId(int id); @@ -72,6 +73,20 @@ void TestMainWindow::testEndProcesses() QVERIFY(window.runningProcesses.isEmpty()); // Ensure processes are stopped } +void TestMainWindow::testStopProcesses() +{ + MainWindow window; + QProcess* testProcess = new QProcess(); + int testId = 6; + + window.runningProcesses.append(QPair(testProcess, testId)); + + window.stopProcess(testId); + + QCOMPARE(window.runningProcesses.size(), 0); // Ensure the process is removed from the list + QCOMPARE(testProcess->state(), QProcess::NotRunning); // Verify that the process is not running +} + void TestMainWindow::testDeleteSquare() { MainWindow window; @@ -112,4 +127,4 @@ void TestMainWindow::testShowTimerInput() } QTEST_MAIN(TestMainWindow) -#include "test_main_window.moc" +#include "test_main_window.moc" \ No newline at end of file From f5abe19de629289ba6aa33aaee30f92fa6bbac47 Mon Sep 17 00:00:00 2001 From: Rivki Yaglnik Date: Thu, 12 Sep 2024 20:17:40 +0300 Subject: [PATCH 23/33] GUI: Change styleSheet to squers --- gui/include/draggable_square.h | 10 +++++++--- gui/src/main_window.cpp | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/gui/include/draggable_square.h b/gui/include/draggable_square.h index 03d3266d..64da9782 100644 --- a/gui/include/draggable_square.h +++ b/gui/include/draggable_square.h @@ -13,11 +13,15 @@ class DraggableSquare : public QWidget { public: friend class DraggableSquareTest; explicit DraggableSquare(QWidget *parent = nullptr, - const QString &color = "background-color: green;", - int width = 100, int height = 100); + const QString &color = "QWidget {" + " background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " + " stop: 0 #E0F7F7, stop: 1 #00BFAE);" // Gradient from mint to cyan + " border: 3px solid silver;" // Silver-colored borders + " border-radius: 10px;" // Rounded corners + "}",int width = 120, int height = 120); DraggableSquare(const DraggableSquare &other); // Copy constructor DraggableSquare &operator=( - const DraggableSquare &other); // Copy assignment operator + const DraggableSquare &other); // Copy assignment operator void setProcess(Process *process); Process *getProcess() const; const QPoint getDragStartPosition() const; diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index a77a0119..cdea3d8c 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -77,29 +77,28 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) dataManager = new SimulationDataManager(this); int id = 0; + const QString styleSheet ="QWidget {" + " background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " + " stop: 0 #FDE1E1, stop: 1 #D4A5FF);" // Gradient from purple to pink + " border: 3px solid silver;" // Silver-colored borders + " border-radius: 10px;" // Rounded corners + "}"; + Process *mainProcess = new Process(id, "Main", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(mainProcess, id, - "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " - "stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(mainProcess, id,styleSheet); addId(id++); Process *hsmProcess = new Process(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(hsmProcess, id, - "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " - "stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(hsmProcess, id,styleSheet); addId(id++); Process *logsDbProcess = new Process(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(logsDbProcess, id, - "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " - "stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(logsDbProcess, id,styleSheet); addId(id++); Process *busManagerProcess = new Process(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(busManagerProcess, id, - "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " - "stop: 0 #0000FF, stop: 1 #800080);"); + addProcessSquare(busManagerProcess, id,styleSheet); addId(id++); } @@ -376,6 +375,7 @@ void MainWindow::openImageDialog() } } + QString MainWindow::getExecutableName(const QString &buildDirPath) { QDir buildDir(buildDirPath); From b894ccd495ad68a7eb3424d164838ed355b7139d Mon Sep 17 00:00:00 2001 From: Rivki Yaglnik Date: Thu, 12 Sep 2024 20:24:54 +0300 Subject: [PATCH 24/33] GUI: Add test to log_handler --- gui/test/CMakeLists.txt | 19 +++++++++-- gui/test/test_log_handler.cpp | 60 +++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 gui/test/test_log_handler.cpp diff --git a/gui/test/CMakeLists.txt b/gui/test/CMakeLists.txt index c71cf8e9..82ba28b5 100644 --- a/gui/test/CMakeLists.txt +++ b/gui/test/CMakeLists.txt @@ -12,6 +12,7 @@ set(src_files ../src/process_dialog.cpp ../src/main_window.cpp ../src/simulation_data_manager.cpp + ../src/log_handler.cpp ) # Set the test executable name for MainWindowTests add_executable(MainWindowTests @@ -38,13 +39,18 @@ add_executable(ProcessDialogTests test_process_dialog.cpp ${src_files} ) + +add_executable(LogHandlerTests + test_log_handler.cpp + ${src_files} +) # Include BSON directories for both targets target_include_directories(MainWindowTests PRIVATE ${BSON_INCLUDE_DIRS}) target_include_directories(DraggableSquareTests PRIVATE ${BSON_INCLUDE_DIRS}) target_include_directories(UserInteractionTests PRIVATE ${BSON_INCLUDE_DIRS}) target_include_directories(ProcessTests PRIVATE ${BSON_INCLUDE_DIRS}) target_include_directories(ProcessDialogTests PRIVATE ${BSON_INCLUDE_DIRS}) - +target_include_directories(LogHandlerTests PRIVATE ${BSON_INCLUDE_DIRS}) # Link the test executables to the necessary Qt5 components and BSON library target_link_libraries(MainWindowTests @@ -82,6 +88,13 @@ target_link_libraries(ProcessDialogTests Qt5::Gui ${BSON_LIBRARIES} ) +target_link_libraries(LogHandlerTests + Qt5::Test + Qt5::Widgets + Qt5::Core + Qt5::Gui + ${BSON_LIBRARIES} +) set(CMAKE_PREFIX_PATH "/usr/local" ${CMAKE_PREFIX_PATH}) # Include directories include_directories(${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS}) @@ -91,9 +104,11 @@ target_link_libraries(DraggableSquareTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} target_link_libraries(UserInteractionTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) target_link_libraries(ProcessTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) target_link_libraries(ProcessDialogTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) +target_link_libraries(LogHandlerTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) add_test(NAME MainWindowTests COMMAND MainWindowTests) add_test(NAME DraggableSquareTests COMMAND DraggableSquareTests) add_test(NAME UserInteractionTests COMMAND UserInteractionTests) add_test(NAME ProcessTests COMMAND ProcessTests) -add_test(NAME ProcessDialogTests COMMAND ProcessDialogTests) \ No newline at end of file +add_test(NAME ProcessDialogTests COMMAND ProcessDialogTests) +add_test(NAME LogHandlerTests COMMAND LogHandlerTests) \ No newline at end of file diff --git a/gui/test/test_log_handler.cpp b/gui/test/test_log_handler.cpp new file mode 100644 index 00000000..124778ef --- /dev/null +++ b/gui/test/test_log_handler.cpp @@ -0,0 +1,60 @@ +#include +#include "../src/log_handler.h" +#include "../src/simulation_data_manager.h" +#include "../src/draggable_square.h" +#include "../src/process.h" +#include +#include +#include +#include +#include + +class LogHandlerTests : public QObject { + Q_OBJECT + SimulationDataManager manager; + +private slots: + void testReadLogFile(); + void testSortLogEntries(); + void testGetProcessSquares(); +}; + +void LogHandlerTests::testReadLogFile() { + LogHandler logHandler; + logHandler.readLogFile("../log_file.log"); + + QVERIFY(!logHandler.getLogEntries().isEmpty()); +} + +void LogHandlerTests::testSortLogEntries() { + LogHandler logHandler; + logHandler.readLogFile("../log_file.log"); + + logHandler.sortLogEntries(); + QVector logEntries = logHandler.getLogEntries(); + + for (int i = 1; i < logEntries.size(); ++i) { + QVERIFY(logEntries[i - 1] < logEntries[i]); + } +} + +void LogHandlerTests::testGetProcessSquares() { + LogHandler logHandler; + + // Create objects to test + Process process1(1, "Process1", "CMakeProject1", "QEMUPlatform1"); + DraggableSquare square1; + square1.setProcess(&process1); + // Let's say you want to check that the DraggableSquare has been added to the QMap. + // Add the DraggableSquare to the map + QMap &processSquares = const_cast &>(logHandler.getProcessSquares()); + processSquares.insert(1, &square1); + + // Now the contents of the map can be checked + const QMap &squares = logHandler.getProcessSquares(); + QVERIFY(squares.contains(1)); + QCOMPARE(squares[1]->getProcess()->getId(), 1); +} + +QTEST_MAIN(LogHandlerTests) +#include "test_log_handler.moc" \ No newline at end of file From 847d14ccfca61ebfefb44ee3f1d1c34e2aa6eb97 Mon Sep 17 00:00:00 2001 From: Tamar-Leibovitz Date: Sun, 15 Sep 2024 14:41:59 +0300 Subject: [PATCH 25/33] GUI: Fix test functions and update CMakeLists.txt file --- gui/CMakeLists.txt | 50 +++++---- gui/include/main_window.h | 4 +- gui/include/process.h | 2 +- gui/include/process_dialog.h | 2 +- gui/include/simulation_data_manager.h | 2 +- gui/src/draggable_square.cpp | 1 - gui/src/dummy_program1/config.json | 2 +- gui/src/process.cpp | 2 +- gui/test/CMakeLists.txt | 148 ++++++++------------------ gui/test/test_draggable_square.cpp | 42 +++----- gui/test/test_log_handler.cpp | 8 +- gui/test/test_main_window.cpp | 124 +++++++++++---------- gui/test/test_process.cpp | 6 +- gui/test/test_process_dialog.cpp | 21 ++-- gui/test/user_interaction_tests.cpp | 13 ++- 15 files changed, 182 insertions(+), 245 deletions(-) diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index f1ebced3..2791b2dc 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.5) # Set the project name and version project(DraggableSquares VERSION 1.0) + # Set C++ standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -14,16 +15,21 @@ set(CMAKE_AUTORCC ON) # Include current source directory set(CMAKE_INCLUDE_CURRENT_DIR ON) +# Set the -fPIC flag to enable Position Independent Code for all targets +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# Set the output directory for executables +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + # Find the Qt5 library find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui Test) -# Find the BSON library +# Find the BSON library using pkg-config find_package(PkgConfig REQUIRED) pkg_check_modules(BSON REQUIRED libbson-1.0) -# Add the main application files -add_executable(DraggableSquares - src/main.cpp +# Create a library for the common code +add_library(DraggableSquaresLib src/draggable_square.cpp src/process.cpp src/process_dialog.cpp @@ -31,33 +37,41 @@ add_executable(DraggableSquares src/simulation_data_manager.cpp src/log_handler.cpp src/frames.cpp - ../logger/logger.cpp + ../logger/logger.cpp # Updated logger source file path ) -# Add headers to the executable target -target_sources(DraggableSquares PRIVATE +# Add headers to the library target +target_sources(DraggableSquaresLib PRIVATE include/main_window.h include/draggable_square.h include/process_dialog.h include/simulation_data_manager.h include/log_handler.h include/frames.h - ../logger/logger.h + ../logger/logger.h ) -# Include BSON directories -target_include_directories(DraggableSquares PRIVATE ${BSON_INCLUDE_DIRS}) +# Include BSON directories and project include directory +target_include_directories(DraggableSquaresLib PRIVATE + ${BSON_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/../logger +) -# Link the BSON library and Qt5 components -target_link_libraries(DraggableSquares PRIVATE ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) +# Link the BSON library and Qt5 components to the library +target_link_libraries(DraggableSquaresLib PRIVATE ${BSON_LIBRARIES} Qt5::Core Qt5::Gui Qt5::Widgets) +# Create the main executable +add_executable(DraggableSquares src/main.cpp) -# Add the include directory -target_include_directories(DraggableSquares PRIVATE ${BSON_INCLUDE_DIRS} include) +# Link the main executable with the library and Qt5 modules +target_link_libraries(DraggableSquares PRIVATE DraggableSquaresLib Qt5::Core Qt5::Gui Qt5::Widgets) +# Make sure the main executable has access to the include directory +target_include_directories(DraggableSquares PRIVATE ${CMAKE_SOURCE_DIR}/include ${BSON_INCLUDE_DIRS}) -# # Enable testing -# enable_testing() +# Enable testing +enable_testing() -# # Add test directory -# add_subdirectory(test) \ No newline at end of file +# Add the test directory +add_subdirectory(test) \ No newline at end of file diff --git a/gui/include/main_window.h b/gui/include/main_window.h index 12207a69..e58f8a84 100644 --- a/gui/include/main_window.h +++ b/gui/include/main_window.h @@ -28,7 +28,7 @@ #include "process.h" #include "process_dialog.h" #include "simulation_data_manager.h" -#include "../logger/logger.h" +#include "../../logger/logger.h" class MainWindow : public QMainWindow { Q_OBJECT @@ -64,10 +64,12 @@ class MainWindow : public QMainWindow { return currentImagePath; } static logger guiLogger; + public slots: void createNewProcess(); void editSquare(int id); void deleteSquare(int id); + private: void processFinished(int exitCode, QProcess::ExitStatus exitStatus); friend class TestMainWindow; diff --git a/gui/include/process.h b/gui/include/process.h index 5d348d8e..6f89f3f6 100644 --- a/gui/include/process.h +++ b/gui/include/process.h @@ -38,4 +38,4 @@ class Process { QString qemuPlatform; }; -#endif // PROCESS_H +#endif // PROCESS_H \ No newline at end of file diff --git a/gui/include/process_dialog.h b/gui/include/process_dialog.h index 676bdfca..62f20744 100644 --- a/gui/include/process_dialog.h +++ b/gui/include/process_dialog.h @@ -35,4 +35,4 @@ private slots: QComboBox *qemuPlatformCombo; }; -#endif // PROCESSDIALOG_H +#endif // PROCESSDIALOG_H \ No newline at end of file diff --git a/gui/include/simulation_data_manager.h b/gui/include/simulation_data_manager.h index 4c4e8b6b..10409bd3 100644 --- a/gui/include/simulation_data_manager.h +++ b/gui/include/simulation_data_manager.h @@ -39,4 +39,4 @@ class SimulationDataManager : public QWidget { void readSimulationData(QVector squares, QString img); }; -#endif // SIMULATION_DATA_MANAGER_H +#endif // SIMULATION_DATA_MANAGER_H \ No newline at end of file diff --git a/gui/src/draggable_square.cpp b/gui/src/draggable_square.cpp index d0f53370..eadef78e 100644 --- a/gui/src/draggable_square.cpp +++ b/gui/src/draggable_square.cpp @@ -10,7 +10,6 @@ #include "main_window.h" #include "draggable_square.h" -// Add this function to your DraggableSquare class void DraggableSquare::print() const { std::stringstream ss; diff --git a/gui/src/dummy_program1/config.json b/gui/src/dummy_program1/config.json index 0949e6c4..838e9bc2 100644 --- a/gui/src/dummy_program1/config.json +++ b/gui/src/dummy_program1/config.json @@ -1,3 +1,3 @@ { - "ID": 22 + "ID": 2 } diff --git a/gui/src/process.cpp b/gui/src/process.cpp index 8f7c8d00..6f55bf42 100644 --- a/gui/src/process.cpp +++ b/gui/src/process.cpp @@ -42,4 +42,4 @@ QString Process::getCMakeProject() const QString Process::getQEMUPlatform() const { return qemuPlatform; -} +} \ No newline at end of file diff --git a/gui/test/CMakeLists.txt b/gui/test/CMakeLists.txt index 82ba28b5..8fca3f24 100644 --- a/gui/test/CMakeLists.txt +++ b/gui/test/CMakeLists.txt @@ -1,114 +1,56 @@ cmake_minimum_required(VERSION 3.5) -project(DraggableSquaresTests) -# Find the Qt5 package -find_package(Qt5 REQUIRED COMPONENTS Test Widgets Core Gui) -# Find the BSON library -find_package(PkgConfig REQUIRED) -pkg_check_modules(BSON REQUIRED libbson-1.0) -# Define the list of source files -set(src_files - ../src/draggable_square.cpp - ../src/process.cpp - ../src/process_dialog.cpp - ../src/main_window.cpp - ../src/simulation_data_manager.cpp - ../src/log_handler.cpp -) -# Set the test executable name for MainWindowTests -add_executable(MainWindowTests - test_main_window.cpp - ${src_files} -) -# Set the test executable name for DraggableSquareTests -add_executable(DraggableSquareTests - test_draggable_square.cpp - ${src_files} -) -# Set the test executable name for UserInteractionTests -add_executable(UserInteractionTests - user_interaction_tests.cpp - ${src_files} -) -add_executable(ProcessTests - test_process.cpp - ${src_files} -) +# Set the project name and version +project(DraggableSquaresTests VERSION 1.0) + +# Set C++ standard +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Enable automatic generation of MOC, UIC, and RCC +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) -add_executable(ProcessDialogTests - test_process_dialog.cpp - ${src_files} -) +# Include current source directory +set(CMAKE_INCLUDE_CURRENT_DIR ON) -add_executable(LogHandlerTests - test_log_handler.cpp - ${src_files} -) -# Include BSON directories for both targets -target_include_directories(MainWindowTests PRIVATE ${BSON_INCLUDE_DIRS}) -target_include_directories(DraggableSquareTests PRIVATE ${BSON_INCLUDE_DIRS}) -target_include_directories(UserInteractionTests PRIVATE ${BSON_INCLUDE_DIRS}) -target_include_directories(ProcessTests PRIVATE ${BSON_INCLUDE_DIRS}) -target_include_directories(ProcessDialogTests PRIVATE ${BSON_INCLUDE_DIRS}) -target_include_directories(LogHandlerTests PRIVATE ${BSON_INCLUDE_DIRS}) +# Find the Qt5 library +find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui Test) + +# Link BSON library +find_package(PkgConfig REQUIRED) +pkg_check_modules(BSON REQUIRED libbson-1.0) -# Link the test executables to the necessary Qt5 components and BSON library -target_link_libraries(MainWindowTests - Qt5::Test - Qt5::Widgets - Qt5::Core - Qt5::Gui - ${BSON_LIBRARIES} -) -target_link_libraries(DraggableSquareTests - Qt5::Test - Qt5::Widgets - Qt5::Core - Qt5::Gui - ${BSON_LIBRARIES} -) -target_link_libraries(UserInteractionTests - Qt5::Test - Qt5::Widgets - Qt5::Core - Qt5::Gui - ${BSON_LIBRARIES} -) -target_link_libraries(ProcessTests - Qt5::Test - Qt5::Widgets - Qt5::Core - Qt5::Gui - ${BSON_LIBRARIES} -) -target_link_libraries(ProcessDialogTests - Qt5::Test - Qt5::Widgets - Qt5::Core - Qt5::Gui - ${BSON_LIBRARIES} -) -target_link_libraries(LogHandlerTests - Qt5::Test - Qt5::Widgets - Qt5::Core - Qt5::Gui - ${BSON_LIBRARIES} -) -set(CMAKE_PREFIX_PATH "/usr/local" ${CMAKE_PREFIX_PATH}) # Include directories -include_directories(${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS}) -# Link against Google Test and Google Mock -target_link_libraries(MainWindowTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) -target_link_libraries(DraggableSquareTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) -target_link_libraries(UserInteractionTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) -target_link_libraries(ProcessTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) -target_link_libraries(ProcessDialogTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) -target_link_libraries(LogHandlerTests ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} pthread) +include_directories(${CMAKE_SOURCE_DIR}/include ${BSON_INCLUDE_DIRS}) +# Test for MainWindow +add_executable(MainWindowTests test_main_window.cpp) +target_link_libraries(MainWindowTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) add_test(NAME MainWindowTests COMMAND MainWindowTests) + +# Test for DraggableSquare +add_executable(DraggableSquareTests test_draggable_square.cpp) +target_link_libraries(DraggableSquareTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) add_test(NAME DraggableSquareTests COMMAND DraggableSquareTests) -add_test(NAME UserInteractionTests COMMAND UserInteractionTests) -add_test(NAME ProcessTests COMMAND ProcessTests) + +# Test for ProcessDialog +add_executable(ProcessDialogTests test_process_dialog.cpp) +target_link_libraries(ProcessDialogTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) add_test(NAME ProcessDialogTests COMMAND ProcessDialogTests) + +# Test for Process +add_executable(ProcessTests test_process.cpp) +target_link_libraries(ProcessTests PRIVATE DraggableSquaresLib Qt5::Test) +add_test(NAME ProcessTests COMMAND ProcessTests) + +# Test for UserInteraction +add_executable(UserInteractionTests user_interaction_tests.cpp) +target_link_libraries(UserInteractionTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) +add_test(NAME UserInteractionTests COMMAND UserInteractionTests) + +# Test for LogHandler +add_executable(LogHandlerTests test_log_handler.cpp) +target_link_libraries(LogHandlerTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) add_test(NAME LogHandlerTests COMMAND LogHandlerTests) \ No newline at end of file diff --git a/gui/test/test_draggable_square.cpp b/gui/test/test_draggable_square.cpp index f64056f8..587e3ec9 100644 --- a/gui/test/test_draggable_square.cpp +++ b/gui/test/test_draggable_square.cpp @@ -1,10 +1,11 @@ #include #include #include -#include "../src/draggable_square.h" -#include "../src/process.h" -#include "../src/main_window.h" -class DraggableSquareTest : public QObject { +#include "draggable_square.h" +#include "process.h" +#include "main_window.h" +class DraggableSquareTest : public QObject +{ Q_OBJECT private slots: void initTestCase(); @@ -13,7 +14,6 @@ private slots: void testMousePressEvent(); void testMouseMoveEvent(); void testMouseReleaseEvent(); - private: QWidget *parentWidget; DraggableSquare *draggableSquare; @@ -28,9 +28,8 @@ void DraggableSquareTest::initTestCase() mainWindow = new MainWindow(parentWidget); mainWindow->resize(800, 600); parentWidget->show(); - testProcess = new Process(1, "Test Process", "Test CMake", "Test QEMU"); - draggableSquare = - new DraggableSquare(parentWidget, "background-color: red;", 100, 100); + testProcess = new Process(1, "Test Process", "../../src/dummy_program1", "QEMUPlatform"); + draggableSquare = new DraggableSquare(parentWidget, "background-color: red;", 100, 100); draggableSquare->setProcess(testProcess); draggableSquare->show(); } @@ -45,18 +44,13 @@ void DraggableSquareTest::testSetProcess() { QCOMPARE(draggableSquare->getProcess()->getId(), testProcess->getId()); QCOMPARE(draggableSquare->getProcess()->getName(), testProcess->getName()); - QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), - testProcess->getCMakeProject()); - QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), - testProcess->getQEMUPlatform()); + QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), testProcess->getCMakeProject()); + QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), testProcess->getQEMUPlatform()); } void DraggableSquareTest::testMousePressEvent() { - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), - Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); - QMouseEvent rightClickEvent(QEvent::MouseButtonPress, QPoint(50, 50), - Qt::RightButton, Qt::RightButton, - Qt::NoModifier); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent rightClickEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::RightButton, Qt::RightButton, Qt::NoModifier); // Test left button press starts dragging draggableSquare->mousePressEvent(&pressEvent); QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); @@ -66,23 +60,17 @@ void DraggableSquareTest::testMousePressEvent() } void DraggableSquareTest::testMouseMoveEvent() { - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), - Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); draggableSquare->mousePressEvent(&pressEvent); - QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, - Qt::LeftButton, Qt::NoModifier); + QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); draggableSquare->mouseMoveEvent(&moveEvent); // Assuming the parent widget has a size of 800x600 and draggable square is constrained QCOMPARE(draggableSquare->pos(), QPoint(20, 20)); } void DraggableSquareTest::testMouseReleaseEvent() { - draggableSquare->mousePressEvent( - new QMouseEvent(QEvent::MouseButtonPress, QPoint(50, 50), - Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); - draggableSquare->mouseReleaseEvent( - new QMouseEvent(QEvent::MouseButtonRelease, QPoint(50, 50), - Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + draggableSquare->mousePressEvent(new QMouseEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + draggableSquare->mouseReleaseEvent(new QMouseEvent(QEvent::MouseButtonRelease, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); } diff --git a/gui/test/test_log_handler.cpp b/gui/test/test_log_handler.cpp index 124778ef..dc6b73c8 100644 --- a/gui/test/test_log_handler.cpp +++ b/gui/test/test_log_handler.cpp @@ -1,8 +1,8 @@ #include -#include "../src/log_handler.h" -#include "../src/simulation_data_manager.h" -#include "../src/draggable_square.h" -#include "../src/process.h" +#include "log_handler.h" +#include "simulation_data_manager.h" +#include "draggable_square.h" +#include "process.h" #include #include #include diff --git a/gui/test/test_main_window.cpp b/gui/test/test_main_window.cpp index b6a0e702..14a2ef19 100644 --- a/gui/test/test_main_window.cpp +++ b/gui/test/test_main_window.cpp @@ -1,129 +1,125 @@ #include -#include "../src/main_window.h" +#include "main_window.h" class TestMainWindow : public QObject { Q_OBJECT private slots: + void init(); // Setup method, runs before each test + void cleanup(); // Cleanup method, runs after each test void testCreateNewProcess(); void testAddProcessSquare(); void testIsUniqueId(); void testStartProcesses(); void testEndProcesses(); - void testStopProcesses(); void testDeleteSquare(); void testShowTimerInput(); void addId(int id); + +private: + MainWindow *window; // Pointer to MainWindow to allow reuse in each test }; +void TestMainWindow::init() { + // Initialize the MainWindow before each test + window = new MainWindow(); +} + +void TestMainWindow::cleanup() { + // Clean up any resources used during the test + delete window; + window = nullptr; +} + void TestMainWindow::testCreateNewProcess() { - MainWindow window; - int newProcessId = 6; // Ensure this is greater than 5 and unique + int newProcessId = 6; QString processName = "NewProcess"; - QString cmakeProject = "../src/dummy_program3"; + QString cmakeProject = "../src/dummy_program1"; QString qemuPlatform = "QEMUPlatform"; - // Create a new Process object with the provided data - Process *newProcess = - new Process(newProcessId, processName, cmakeProject, qemuPlatform); - // Simulate adding the process square to the main window - window.addProcessSquare(newProcess); - window.addId(newProcessId); - // Verify that the process was added correctly - Process *retrievedProcess = window.getProcessById(newProcessId); + + Process* newProcess = new Process(newProcessId, processName, cmakeProject, qemuPlatform); + window->addProcessSquare(newProcess); + window->addId(newProcessId); + + Process* retrievedProcess = window->getProcessById(newProcessId); QVERIFY(retrievedProcess != nullptr); QCOMPARE(retrievedProcess->getName(), processName); QCOMPARE(retrievedProcess->getCMakeProject(), cmakeProject); QCOMPARE(retrievedProcess->getQEMUPlatform(), qemuPlatform); - // Clean up + + // Cleanup for this specific test delete newProcess; } void TestMainWindow::testAddProcessSquare() { - MainWindow window; - Process *newProcess = - new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); - window.addProcessSquare(newProcess); - QCOMPARE(window.squares.size(), 5); // Check if square is added + Process *newProcess = new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); + window->addProcessSquare(newProcess); + QCOMPARE(window->squares.size(), 5); // Check if square is added + + delete newProcess; // Ensure we clean up the process } void TestMainWindow::testIsUniqueId() { - MainWindow window; - window.addId(5); - QCOMPARE(window.isUniqueId(5), false); // Check if the ID is unique - QCOMPARE(window.isUniqueId(10), true); // Check if a different ID is unique + window->addId(5); + QCOMPARE(window->isUniqueId(5), false); // Check if the ID is unique + QCOMPARE(window->isUniqueId(10), true); // Check if a different ID is unique } void TestMainWindow::testStartProcesses() { - MainWindow window; - window.startProcesses(); - QVERIFY( - !window.runningProcesses.isEmpty()); // Ensure processes are started + window->compileProjects(); + window->runProjects(); + QVERIFY(!window->runningProcesses.isEmpty()); // Ensure processes are started + window->endProcesses(); } void TestMainWindow::testEndProcesses() { - MainWindow window; - window.startProcesses(); - window.endProcesses(); - QVERIFY(window.runningProcesses.isEmpty()); // Ensure processes are stopped -} - -void TestMainWindow::testStopProcesses() -{ - MainWindow window; - QProcess* testProcess = new QProcess(); - int testId = 6; - - window.runningProcesses.append(QPair(testProcess, testId)); - - window.stopProcess(testId); - - QCOMPARE(window.runningProcesses.size(), 0); // Ensure the process is removed from the list - QCOMPARE(testProcess->state(), QProcess::NotRunning); // Verify that the process is not running + window->compileProjects(); + window->runProjects(); + window->endProcesses(); + QVERIFY(window->runningProcesses.isEmpty()); // Ensure processes are stopped } void TestMainWindow::testDeleteSquare() { - MainWindow window; - Process *process = - new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); - window.addProcessSquare(process); + QString cmakeProject = "../src/dummy_program1"; + Process *process = new Process(5, "Test Process", cmakeProject, "QEMUPlatform"); + window->addProcessSquare(process); - window.deleteSquare(5); + window->deleteSquare(5); // Ensure that only the initial 4 squares remain - QCOMPARE(window.squares.size(), 4); - QVERIFY(!window.squarePositions.contains(5)); - QVERIFY(!window.usedIds.contains(5)); + QCOMPARE(window->squares.size(), 4); + QVERIFY(!window->squarePositions.contains(5)); + QVERIFY(!window->usedIds.contains(5)); + + delete process; // Cleanup after test } void TestMainWindow::addId(int id) { - MainWindow window; - window.addId(77); - QVERIFY(window.usedIds.contains(77)); + window->addId(77); + QVERIFY(window->usedIds.contains(77)); } void TestMainWindow::testShowTimerInput() { - MainWindow mainWindow; - // Initially, the time input and label should be hidden - QVERIFY(!mainWindow.timeInput->isVisible()); - QVERIFY(!mainWindow.timeLabel->isVisible()); + QVERIFY(!window->timeInput->isVisible()); + QVERIFY(!window->timeLabel->isVisible()); - mainWindow.show(); + window->show(); // Trigger the showTimerInput function - mainWindow.showTimerInput(); + window->showTimerInput(); // Now, the time input and label should be visible - QVERIFY(mainWindow.timeInput->isVisible()); - QVERIFY(mainWindow.timeLabel->isVisible()); + QVERIFY(window->timeInput->isVisible()); + QVERIFY(window->timeLabel->isVisible()); } QTEST_MAIN(TestMainWindow) diff --git a/gui/test/test_process.cpp b/gui/test/test_process.cpp index 0b245320..b907418e 100644 --- a/gui/test/test_process.cpp +++ b/gui/test/test_process.cpp @@ -1,11 +1,11 @@ #include -#include "../src/process.h" +#include "process.h" class ProcessTests : public QObject { Q_OBJECT private slots: - void testProcessConstructor() + void testProcessConstructor() { Process process(1, "Test Process", "TestProject", "TestPlatform"); QCOMPARE(process.getId(), 1); @@ -39,4 +39,4 @@ private slots: }; QTEST_MAIN(ProcessTests) -#include "test_process.moc" +#include "test_process.moc" \ No newline at end of file diff --git a/gui/test/test_process_dialog.cpp b/gui/test/test_process_dialog.cpp index f8e5a862..c4dba2e4 100644 --- a/gui/test/test_process_dialog.cpp +++ b/gui/test/test_process_dialog.cpp @@ -1,39 +1,39 @@ #include -#include "../src/process_dialog.h" +#include "process_dialog.h" class ProcessDialogTests : public QObject { Q_OBJECT private slots: - void testGetId() + void testGetId() { ProcessDialog dialog; dialog.setId(123); QCOMPARE(dialog.getId(), 123); } - void testGetName() + void testGetName() { ProcessDialog dialog; dialog.setName("Test Process"); QCOMPARE(dialog.getName(), "Test Process"); } - void testGetCMakeProject() + void testGetCMakeProject() { ProcessDialog dialog; dialog.setCMakeProject("TestProject"); QCOMPARE(dialog.getCMakeProject(), "TestProject"); } - void testGetQEMUPlatform() + void testGetQEMUPlatform() { ProcessDialog dialog; dialog.setQEMUPlatform("arm"); QCOMPARE(dialog.getQEMUPlatform(), "arm"); } - void testIsValid() + void testIsValid() { ProcessDialog dialog; dialog.setId(123); @@ -43,20 +43,17 @@ private slots: QVERIFY(dialog.isValid()); } - void testValidateAndAccept() + void testValidateAndAccept() { ProcessDialog dialog; dialog.setId(123); dialog.setName("Test Process"); dialog.setCMakeProject("TestProject"); dialog.setQEMUPlatform("x86"); - QVERIFY(dialog.validateAndAccept() == - true); // Assuming true indicates validation success + QVERIFY(dialog.validateAndAccept() == true); // Assuming true indicates validation success } }; -// הוסף את המאקרו QTEST_MAIN כדי ליצור את פונקציית main QTEST_MAIN(ProcessDialogTests) -// הקובץ שכולל את Q_OBJECT צריך להיות מחובר למאקרו -#include "test_process_dialog.moc" +#include "test_process_dialog.moc" \ No newline at end of file diff --git a/gui/test/user_interaction_tests.cpp b/gui/test/user_interaction_tests.cpp index 150ae858..bcbff563 100644 --- a/gui/test/user_interaction_tests.cpp +++ b/gui/test/user_interaction_tests.cpp @@ -1,8 +1,9 @@ #include #include -#include "../src/main_window.h" +#include "main_window.h" -class UserInteractionTests : public QObject { +class UserInteractionTests : public QObject +{ Q_OBJECT private slots: @@ -10,7 +11,6 @@ private slots: void cleanupTestCase(); void testOpenImageDialog(); void testGetExecutableName(); - private: MainWindow *mainWindow; }; @@ -31,11 +31,10 @@ void UserInteractionTests::testOpenImageDialog() { MainWindow window; window.openImageDialog(); - QVERIFY( - !window.getCurrentImagePath().isEmpty()); // Ensure image path is set + QVERIFY(!window.getCurrentImagePath().isEmpty()); // Ensure image path is set } -void UserInteractionTests::testGetExecutableName() +void UserInteractionTests::testGetExecutableName() { MainWindow window; QTemporaryDir tempDir; @@ -72,4 +71,4 @@ void UserInteractionTests::testGetExecutableName() } QTEST_MAIN(UserInteractionTests) -#include "user_interaction_tests.moc" +#include "user_interaction_tests.moc" \ No newline at end of file From 91cbfbab044f697616b19e341c01a667fc8b3786 Mon Sep 17 00:00:00 2001 From: Dvora Novogrotzki Date: Sun, 15 Sep 2024 12:47:50 +0300 Subject: [PATCH 26/33] GUI: Add state save and load functionality - Implemented the 'saveSimulationState' function to save simulation state to a BSON file. - Added 'updateStateFromJson' to load simulation state from JSON data. - Fixed issues with process handling by using Process pointers correctly. - Updated 'DraggableSquare' integration to support new state management logic. --- gui/CMakeLists.txt | 4 +- gui/include/draggable_square.h | 21 ++- gui/include/main_window.h | 10 +- gui/include/simulation_data_manager.h | 42 ----- gui/include/simulation_state_manager.h | 39 +++++ gui/src/draggable_square.cpp | 38 +++-- gui/src/frames.cpp | 9 +- gui/src/log_handler.cpp | 20 ++- gui/src/main_window.cpp | 144 +++++++++------- gui/src/simulation_data_manager.cpp | 189 --------------------- gui/src/simulation_state_manager.cpp | 219 +++++++++++++++++++++++++ gui/test/test_draggable_square.cpp | 37 +++-- gui/test/test_log_handler.cpp | 18 +- gui/test/test_main_window.cpp | 36 ++-- gui/test/test_process.cpp | 2 +- gui/test/test_process_dialog.cpp | 15 +- gui/test/user_interaction_tests.cpp | 6 +- logger/logger.cpp | 185 ++++++++++----------- logger/logger.h | 50 +++--- 19 files changed, 593 insertions(+), 491 deletions(-) delete mode 100644 gui/include/simulation_data_manager.h create mode 100644 gui/include/simulation_state_manager.h delete mode 100644 gui/src/simulation_data_manager.cpp create mode 100644 gui/src/simulation_state_manager.cpp diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 2791b2dc..1603aa0d 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -34,7 +34,7 @@ add_library(DraggableSquaresLib src/process.cpp src/process_dialog.cpp src/main_window.cpp - src/simulation_data_manager.cpp + src/simulation_state_manager.cpp src/log_handler.cpp src/frames.cpp ../logger/logger.cpp # Updated logger source file path @@ -45,7 +45,7 @@ target_sources(DraggableSquaresLib PRIVATE include/main_window.h include/draggable_square.h include/process_dialog.h - include/simulation_data_manager.h + include/simulation_state_manager.h include/log_handler.h include/frames.h ../logger/logger.h diff --git a/gui/include/draggable_square.h b/gui/include/draggable_square.h index 64da9782..68b5a600 100644 --- a/gui/include/draggable_square.h +++ b/gui/include/draggable_square.h @@ -12,16 +12,19 @@ class DraggableSquare : public QWidget { public: friend class DraggableSquareTest; - explicit DraggableSquare(QWidget *parent = nullptr, - const QString &color = "QWidget {" + explicit DraggableSquare( + QWidget *parent = nullptr, + const QString &color = + "QWidget {" " background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " " stop: 0 #E0F7F7, stop: 1 #00BFAE);" // Gradient from mint to cyan - " border: 3px solid silver;" // Silver-colored borders - " border-radius: 10px;" // Rounded corners - "}",int width = 120, int height = 120); + " border: 3px solid silver;" // Silver-colored borders + " border-radius: 10px;" // Rounded corners + "}", + int width = 120, int height = 120); DraggableSquare(const DraggableSquare &other); // Copy constructor DraggableSquare &operator=( - const DraggableSquare &other); // Copy assignment operator + const DraggableSquare &other); // Copy assignment operator void setProcess(Process *process); Process *getProcess() const; const QPoint getDragStartPosition() const; @@ -37,15 +40,15 @@ class DraggableSquare : public QWidget { } ~DraggableSquare() override; void print() const; - void setStopButtonVisible(bool visible); -protected: + void setStopButtonVisible(bool visible); +protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; private: - QPushButton *stopButton; + QPushButton *stopButton; QPoint dragStartPosition; QPoint initialPosition; QLabel *label; diff --git a/gui/include/main_window.h b/gui/include/main_window.h index e58f8a84..0184f37f 100644 --- a/gui/include/main_window.h +++ b/gui/include/main_window.h @@ -27,8 +27,8 @@ #include "log_handler.h" #include "process.h" #include "process_dialog.h" -#include "simulation_data_manager.h" -#include "../../logger/logger.h" +#include "simulation_state_manager.h" +#include "../logger/logger.h" class MainWindow : public QMainWindow { Q_OBJECT @@ -69,7 +69,7 @@ public slots: void createNewProcess(); void editSquare(int id); void deleteSquare(int id); - + private: void processFinished(int exitCode, QProcess::ExitStatus exitStatus); friend class TestMainWindow; @@ -99,9 +99,9 @@ public slots: QTextEdit *logOutput; QTimer *timer; QLabel *imageLabel; - QVector> runningProcesses; + QVector> runningProcesses; QString currentImagePath; - SimulationDataManager *dataManager; + SimulationStateManager *stateManager; LogHandler logHandler; Frames *frames; }; diff --git a/gui/include/simulation_data_manager.h b/gui/include/simulation_data_manager.h deleted file mode 100644 index 10409bd3..00000000 --- a/gui/include/simulation_data_manager.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef SIMULATION_DATA_MANAGER_H -#define SIMULATION_DATA_MANAGER_H - -#include -#include -#include -#include -#include -#include -#include "draggable_square.h" - -class SimulationDataManager : public QWidget { - Q_OBJECT - -public: - SimulationDataManager(QWidget *parent = nullptr); - virtual ~SimulationDataManager() = default; - void saveSimulationData(const std::string &fileName, - QVector squares, QString img); - QJsonObject loadSimulationData(const std::string &fileName); - - void printJson(QJsonObject jsonObject); - -private: - struct User { - int id; - QString name; - QString img; - }; - - struct SimulationData { - QVector processes; - User user; - }; - - SimulationData data; - - QJsonObject bsonToJsonObject(const bson_t *document); - void readSimulationData(QVector squares, QString img); -}; - -#endif // SIMULATION_DATA_MANAGER_H \ No newline at end of file diff --git a/gui/include/simulation_state_manager.h b/gui/include/simulation_state_manager.h new file mode 100644 index 00000000..2be97482 --- /dev/null +++ b/gui/include/simulation_state_manager.h @@ -0,0 +1,39 @@ +#ifndef SIMULATION_STATE_MANAGER_H +#define SIMULATION_STATE_MANAGER_H + +#include +#include +#include +#include +#include +#include +#include "draggable_square.h" + +class SimulationStateManager : public QWidget { + Q_OBJECT + +public: + SimulationStateManager(QWidget *parent = nullptr); + virtual ~SimulationStateManager() = default; + void saveSimulationState(const std::string &fileName, + QVector squares, QString img); + QJsonObject loadSimulationState(const std::string &fileName); + + void printJson(QJsonObject jsonObject); + + struct SimulationData { + QVector squares; + int id; + QString name; + QString img; + }; + + SimulationData data; + +private: + QJsonObject bsonToJsonObject(const bson_t *document); + void readSimulationState(QVector squares, QString img); + void updateStateFromJson(QJsonObject jsonObject); +}; + +#endif // SIMULATION_STATE_MANAGER_H \ No newline at end of file diff --git a/gui/src/draggable_square.cpp b/gui/src/draggable_square.cpp index eadef78e..06560f6f 100644 --- a/gui/src/draggable_square.cpp +++ b/gui/src/draggable_square.cpp @@ -15,35 +15,40 @@ void DraggableSquare::print() const std::stringstream ss; ss << "DraggableSquare:\n" << " Process ID: " << process->getId() << "\n" - << " Drag Start Position: (" << dragStartPosition.x() << ", " + << " Drag Start Position: (" << dragStartPosition.x() << ", " << dragStartPosition.y() << ")\n" - << " Initial Position: (" << initialPosition.x() << ", " + << " Initial Position: (" << initialPosition.x() << ", " << initialPosition.y() << ")\n" << " Color: " << label->styleSheet().toStdString() << "\n" << " Size: (" << this->width() << ", " << this->height() << ")"; - + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, ss.str()); } void DraggableSquare::setSquareColor(const QString &color) { setStyleSheet(color); - stopButton->setStyleSheet(QString("background-color: %1; border: none; color: white; font-size: 12px;").arg(color)); + stopButton->setStyleSheet(QString("background-color: %1; border: none; " + "color: white; font-size: 12px;") + .arg(color)); } // constructor DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, int width, int height) - : QWidget(parent), label(new QLabel(this)), stopButton(new QPushButton("STOP", this)) + : QWidget(parent), + label(new QLabel(this)), + stopButton(new QPushButton("STOP", this)) { setFixedSize(width, height); setStyleSheet(color); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(label); - layout->addWidget(stopButton); + layout->addWidget(stopButton); setLayout(layout); - stopButton->hide(); - connect(stopButton, &QPushButton::clicked, this, &DraggableSquare::handleStopButtonClicked); + stopButton->hide(); + connect(stopButton, &QPushButton::clicked, this, + &DraggableSquare::handleStopButtonClicked); } // Copy constructor @@ -208,21 +213,24 @@ void DraggableSquare::deleteSquare(int id) } void DraggableSquare::setStopButtonVisible(bool visible) { - if (process->getId()>3){ + if (process->getId() > 3) { if (visible) { - stopButton->show(); - } else { - stopButton->hide(); + stopButton->show(); + } + else { + stopButton->hide(); } } } void DraggableSquare::handleStopButtonClicked() { if (process) { - MainWindow* mainWindow = qobject_cast(parentWidget()->window()); + MainWindow *mainWindow = + qobject_cast(parentWidget()->window()); if (mainWindow) { - mainWindow->stopProcess(process->getId()); // Pass the process ID to stopProcess - stopButton->hide(); + mainWindow->stopProcess( + process->getId()); // Pass the process ID to stopProcess + stopButton->hide(); } } } \ No newline at end of file diff --git a/gui/src/frames.cpp b/gui/src/frames.cpp index ddede8f7..e12dfea5 100644 --- a/gui/src/frames.cpp +++ b/gui/src/frames.cpp @@ -64,12 +64,15 @@ void Frames::paintEvent(QPaintEvent *event) painter.drawRect(rect2); } else { - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, - "Invalid index: row " + std::to_string(row) + " col " + std::to_string(col)); + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, "Invalid index: row " + + std::to_string(row) + " col " + + std::to_string(col)); } } else { - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "Invalid ID index"); + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Invalid ID index"); } } } diff --git a/gui/src/log_handler.cpp b/gui/src/log_handler.cpp index 7501302a..ba9aec65 100644 --- a/gui/src/log_handler.cpp +++ b/gui/src/log_handler.cpp @@ -1,7 +1,3 @@ -#include "log_handler.h" -#include "draggable_square.h" -#include "simulation_data_manager.h" -#include "main_window.h" #include #include #include @@ -14,6 +10,10 @@ #include #include #include +#include "log_handler.h" +#include "draggable_square.h" +#include "simulation_state_manager.h" +#include "main_window.h" QVector LogHandler::getLogEntries() { @@ -57,7 +57,10 @@ void LogHandler::readLogFile(const QString &fileName) entry.timestamp = QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss.zzz"); if (!entry.timestamp.isValid()) { - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "Skipping line with invalid timestamp: " + trimmedLine.toStdString()); + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, + "Skipping line with invalid timestamp: " + + trimmedLine.toStdString()); continue; } @@ -91,11 +94,12 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, logger::LogLevel::INFO, "Analyzing log entries from JSON file: " + jsonFileName.toStdString()); - SimulationDataManager dataManager; + SimulationStateManager stateManager; QJsonObject jsonObject = - dataManager.loadSimulationData(jsonFileName.toStdString()); + stateManager.loadSimulationState(jsonFileName.toStdString()); if (jsonObject.isEmpty()) { - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, "Failed to load JSON data"); + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to load JSON data"); return; } diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index cdea3d8c..096df210 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -25,7 +25,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) QWidget *toolbox = new QWidget(this); toolboxLayout = new QVBoxLayout(toolbox); compileButton = new QPushButton("Compile", this); - runButton = new QPushButton("Run", this); + runButton = new QPushButton("Run", this); endButton = new QPushButton("End", this); timerButton = new QPushButton("Set Timer", this); timeInput = new QLineEdit(this); @@ -43,8 +43,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) toolboxLayout->addWidget(addProcessButton); toolboxLayout->addStretch(); - connect(addProcessButton, &QPushButton::clicked, this, &MainWindow::createNewProcess); - connect(compileButton, &QPushButton::clicked, this, &MainWindow::compileProjects); + connect(addProcessButton, &QPushButton::clicked, this, + &MainWindow::createNewProcess); + connect(compileButton, &QPushButton::clicked, this, + &MainWindow::compileProjects); connect(runButton, &QPushButton::clicked, this, &MainWindow::runProjects); connect(endButton, &QPushButton::clicked, this, &MainWindow::endProcesses); connect(timerButton, &QPushButton::clicked, this, @@ -74,31 +76,32 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) mainLayout->addWidget(workspace); centralWidget->setLayout(mainLayout); - dataManager = new SimulationDataManager(this); + stateManager = new SimulationStateManager(this); int id = 0; - const QString styleSheet ="QWidget {" - " background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " - " stop: 0 #FDE1E1, stop: 1 #D4A5FF);" // Gradient from purple to pink - " border: 3px solid silver;" // Silver-colored borders - " border-radius: 10px;" // Rounded corners - "}"; + const QString styleSheet = + "QWidget {" + " background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, " + " stop: 0 #FDE1E1, stop: 1 #D4A5FF);" // Gradient from purple to pink + " border: 3px solid silver;" // Silver-colored borders + " border-radius: 10px;" // Rounded corners + "}"; Process *mainProcess = new Process(id, "Main", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(mainProcess, id,styleSheet); + addProcessSquare(mainProcess, id, styleSheet); addId(id++); Process *hsmProcess = new Process(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(hsmProcess, id,styleSheet); + addProcessSquare(hsmProcess, id, styleSheet); addId(id++); Process *logsDbProcess = new Process(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(logsDbProcess, id,styleSheet); + addProcessSquare(logsDbProcess, id, styleSheet); addId(id++); Process *busManagerProcess = new Process(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(busManagerProcess, id,styleSheet); + addProcessSquare(busManagerProcess, id, styleSheet); addId(id++); } @@ -256,8 +259,8 @@ void MainWindow::endProcesses() timeLabel->show(); timeInput->clear(); - dataManager->saveSimulationData("simulation_data.bson", squares, - currentImagePath); + stateManager->saveSimulationState("simulation_state.bson", squares, + currentImagePath); MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow::endProcesses Simulation " "data saved to simulation_data.bson"); @@ -271,8 +274,8 @@ void MainWindow::endProcesses() framesLayout->addWidget(frames); workspace->setLayout(framesLayout); - for (const QPair& pair : runningProcesses) { - QProcess* process = pair.first; + for (const QPair &pair : runningProcesses) { + QProcess *process = pair.first; int id = pair.second; if (process->state() != QProcess::NotRunning) { process->terminate(); @@ -287,7 +290,7 @@ void MainWindow::endProcesses() void MainWindow::stopProcess(int deleteId) { for (int i = 0; i < runningProcesses.size(); ++i) { - QProcess* process = runningProcesses[i].first; + QProcess *process = runningProcesses[i].first; int id = runningProcesses[i].second; if (id == deleteId && id > 3) { @@ -297,9 +300,9 @@ void MainWindow::stopProcess(int deleteId) process->waitForFinished(); } - process->deleteLater(); - runningProcesses.removeAt(i); - break; + process->deleteLater(); + runningProcesses.removeAt(i); + break; } } } @@ -375,7 +378,6 @@ void MainWindow::openImageDialog() } } - QString MainWindow::getExecutableName(const QString &buildDirPath) { QDir buildDir(buildDirPath); @@ -428,18 +430,19 @@ QString MainWindow::getExecutableName(const QString &buildDirPath) buildDirPath.toStdString()); return QString(); } - -void MainWindow::compileProjects() { + +void MainWindow::compileProjects() +{ guiLogger.logMessage(logger::LogLevel::INFO, - "Compiling and running projects started."); + "Compiling and running projects started."); updateTimer(); // Disable the run button until compilation finishes runButton->setEnabled(false); // Clear previous running processes - for (const QPair& pair : runningProcesses) { - QProcess* process = pair.first; + for (const QPair &pair : runningProcesses) { + QProcess *process = pair.first; process->terminate(); process->waitForFinished(); delete process; @@ -459,7 +462,8 @@ void MainWindow::compileProjects() { "Shell script file does not exist: " + cmakePath.toStdString()); - logOutput->append("Shell script file does not exist: " + cmakePath); + logOutput->append("Shell script file does not exist: " + + cmakePath); compileSuccessful = false; continue; } @@ -467,9 +471,11 @@ void MainWindow::compileProjects() { if ((scriptFile.permissions() & QFileDevice::ExeUser) == 0) { // Make the script executable QProcess makeExecutableProcess; - makeExecutableProcess.start("chmod", QStringList() << "+x" << cmakePath); + makeExecutableProcess.start("chmod", QStringList() + << "+x" << cmakePath); if (!makeExecutableProcess.waitForFinished()) { - logOutput->append("Failed to make the script executable: " + cmakePath); + logOutput->append("Failed to make the script executable: " + + cmakePath); compileSuccessful = false; continue; } @@ -483,7 +489,8 @@ void MainWindow::compileProjects() { QProcess *scriptProcess = new QProcess(this); scriptProcess->start("bash", QStringList() << cmakePath); connect( - scriptProcess, QOverload::of(&QProcess::finished), + scriptProcess, + QOverload::of(&QProcess::finished), this, &MainWindow::processFinished); connect( scriptProcess, &QProcess::readyReadStandardOutput, @@ -507,7 +514,8 @@ void MainWindow::compileProjects() { QDir buildDir(buildDirPath); if (buildDir.exists()) { - QFileInfoList fileList = buildDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); + QFileInfoList fileList = buildDir.entryInfoList( + QDir::NoDotAndDotDot | QDir::AllEntries); foreach (const QFileInfo &fileInfo, fileList) { if (fileInfo.isDir()) { QDir dir(fileInfo.absoluteFilePath()); @@ -517,11 +525,13 @@ void MainWindow::compileProjects() { "Failed to remove directory: " + fileInfo.absoluteFilePath().toStdString()); - logOutput->append("Failed to remove directory: " + fileInfo.absoluteFilePath()); + logOutput->append("Failed to remove directory: " + + fileInfo.absoluteFilePath()); compileSuccessful = false; continue; } - } else { + } + else { if (!QFile::remove(fileInfo.absoluteFilePath())) { guiLogger.logMessage( logger::LogLevel::ERROR, @@ -534,7 +544,8 @@ void MainWindow::compileProjects() { } } } - } else { + } + else { // Create the build directory if (!buildDir.mkpath(".")) { guiLogger.logMessage(logger::LogLevel::ERROR, @@ -552,7 +563,8 @@ void MainWindow::compileProjects() { cmakeProcess->setWorkingDirectory(buildDirPath); cmakeProcess->start("cmake", QStringList() << ".."); connect( - cmakeProcess, QOverload::of(&QProcess::finished), + cmakeProcess, + QOverload::of(&QProcess::finished), this, &MainWindow::processFinished); if (!cmakeProcess->waitForFinished()) { @@ -575,8 +587,8 @@ void MainWindow::compileProjects() { makeProcess->start("make", QStringList()); connect( makeProcess, - QOverload::of(&QProcess::finished), - this, &MainWindow::processFinished); + QOverload::of(&QProcess::finished), + this, &MainWindow::processFinished); if (!makeProcess->waitForFinished()) { guiLogger.logMessage( @@ -601,27 +613,35 @@ void MainWindow::compileProjects() { // Enable the run button only if the compilation was successful if (compileSuccessful) { runButton->setEnabled(true); - logOutput->append("Compilation completed successfully. You can now run the projects."); - } else { + logOutput->append( + "Compilation completed successfully. You can now run the " + "projects."); + } + else { logOutput->append("Compilation failed. Please check the logs."); } } -void MainWindow::runProjects() { +void MainWindow::runProjects() +{ updateTimer(); for (DraggableSquare *square : squares) { QString cmakePath = square->getProcess()->getCMakeProject(); - + if (cmakePath.endsWith(".sh")) { // Run the shell script QProcess *scriptProcess = new QProcess(this); scriptProcess->start("bash", QStringList() << cmakePath); - connect(scriptProcess, &QProcess::readyReadStandardOutput, [this, scriptProcess]() { - logOutput->append(scriptProcess->readAllStandardOutput()); - }); - connect(scriptProcess, &QProcess::readyReadStandardError, [this, scriptProcess]() { - logOutput->append(scriptProcess->readAllStandardError()); - }); + connect( + scriptProcess, &QProcess::readyReadStandardOutput, + [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardOutput()); + }); + connect( + scriptProcess, &QProcess::readyReadStandardError, + [this, scriptProcess]() { + logOutput->append(scriptProcess->readAllStandardError()); + }); } else { // Run the compiled program @@ -633,15 +653,18 @@ void MainWindow::runProjects() { QProcess *runProcess = new QProcess(this); runProcess->setWorkingDirectory(buildDirPath); - connect(runProcess, &QProcess::readyReadStandardOutput, [this, runProcess]() { - logOutput->append(runProcess->readAllStandardOutput()); - }); - connect(runProcess, &QProcess::readyReadStandardError, [this, runProcess]() { - logOutput->append(runProcess->readAllStandardError()); - }); - connect(runProcess, QOverload::of(&QProcess::finished), - this, &MainWindow::processFinished - ); + connect(runProcess, &QProcess::readyReadStandardOutput, + [this, runProcess]() { + logOutput->append(runProcess->readAllStandardOutput()); + }); + connect(runProcess, &QProcess::readyReadStandardError, + [this, runProcess]() { + logOutput->append(runProcess->readAllStandardError()); + }); + connect( + runProcess, + QOverload::of(&QProcess::finished), + this, &MainWindow::processFinished); runProcess->start(executablePath, QStringList()); if (!runProcess->waitForStarted()) { guiLogger.logMessage(logger::LogLevel::ERROR, @@ -653,7 +676,8 @@ void MainWindow::runProjects() { delete runProcess; continue; } - runningProcesses.append(qMakePair(runProcess,square->getProcess()->getId())); + runningProcesses.append( + qMakePair(runProcess, square->getProcess()->getId())); } square->setStopButtonVisible(true); } @@ -753,7 +777,7 @@ void MainWindow::processFinished(int exitCode, QProcess::ExitStatus exitStatus) QProcess *finishedProcess = qobject_cast(sender()); if (finishedProcess) { // Find the ID of the process that finished - for (const QPair& pair : runningProcesses) { + for (const QPair &pair : runningProcesses) { if (pair.first == finishedProcess) { int finishedProcessId = pair.second; // Find the corresponding DraggableSquare diff --git a/gui/src/simulation_data_manager.cpp b/gui/src/simulation_data_manager.cpp deleted file mode 100644 index 1056ec69..00000000 --- a/gui/src/simulation_data_manager.cpp +++ /dev/null @@ -1,189 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "simulation_data_manager.h" -#include "main_window.h" - -SimulationDataManager::SimulationDataManager(QWidget *parent) : QWidget(parent) -{ - MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, - "SimulationDataManager", "Constructor", - "SimulationDataManager instance created"); -} - -void SimulationDataManager::readSimulationData( - QVector squares, QString img) -{ - MainWindow::guiLogger.logMessage( - logger::LogLevel::DEBUG, "SimulationDataManager", "readSimulationData", - "Starting to read simulation data"); - - data.processes.clear(); - MainWindow::guiLogger.logMessage( - logger::LogLevel::DEBUG, "SimulationDataManager", "readSimulationData", - "Cleared existing processes"); - - for (int i = 0; i < squares.size(); i++) { - if (squares[i] != nullptr) { - data.processes.append(squares[i]); - - MainWindow::guiLogger.logMessage( - logger::LogLevel::DEBUG, "SimulationDataManager", - "readSimulationData", - "Added process at index " + std::to_string(i)); - } - else { - MainWindow::guiLogger.logMessage( - logger::LogLevel::ERROR, "SimulationDataManager", - "readSimulationData", - "Null pointer encountered at index " + std::to_string(i)); - } - } - - data.user.id = 1; - data.user.name = "default user"; - data.user.img = img; - - MainWindow::guiLogger.logMessage( - logger::LogLevel::INFO, "SimulationDataManager", "readSimulationData", - "Simulation data read completed. Total processes: " + - std::to_string(data.processes.size())); -} - -void SimulationDataManager::saveSimulationData( - const std::string &fileName, QVector squares, - QString img) -{ - MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, - "Starting to save simulation data."); - - readSimulationData(squares, img); - - bson_t *document = bson_new(); - - bson_t processes; - BSON_APPEND_ARRAY_BEGIN(document, "processes", &processes); - for (const auto &process : data.processes) { - bson_t proc; - char key[16]; - snprintf(key, sizeof(key), "%d", process->getProcess()->getId()); - BSON_APPEND_DOCUMENT_BEGIN(&processes, key, &proc); - BSON_APPEND_INT32(&proc, "id", process->getProcess()->getId()); - BSON_APPEND_UTF8( - &proc, "name", - process->getProcess()->getName().toStdString().c_str()); - BSON_APPEND_UTF8( - &proc, "CMakeProject", - process->getProcess()->getCMakeProject().toStdString().c_str()); - BSON_APPEND_UTF8( - &proc, "QEMUPlatform", - process->getProcess()->getQEMUPlatform().toStdString().c_str()); - - bson_t coordinate; - BSON_APPEND_DOCUMENT_BEGIN(&proc, "coordinate", &coordinate); - BSON_APPEND_INT32(&coordinate, "x", - process->getDragStartPosition().x()); - BSON_APPEND_INT32(&coordinate, "y", - process->getDragStartPosition().y()); - bson_append_document_end(&proc, &coordinate); - - BSON_APPEND_INT32(&proc, "width", process->width()); - BSON_APPEND_INT32(&proc, "height", process->height()); - - bson_append_document_end(&processes, &proc); - } - bson_append_array_end(document, &processes); - - bson_t user; - BSON_APPEND_DOCUMENT_BEGIN(document, "user", &user); - BSON_APPEND_INT32(&user, "id", data.user.id); - BSON_APPEND_UTF8(&user, "name", data.user.name.toStdString().c_str()); - BSON_APPEND_UTF8(&user, "img", data.user.img.toStdString().c_str()); - bson_append_document_end(document, &user); - - uint32_t length; - uint8_t *buf = bson_destroy_with_steal(document, true, &length); - - std::ofstream file(fileName, std::ios::binary); - if (file.is_open()) { - file.write(reinterpret_cast(buf), length); - file.close(); - MainWindow::guiLogger.logMessage( - logger::LogLevel::INFO, "Successfully saved data to " + fileName); - } - else { - MainWindow::guiLogger.logMessage( - logger::LogLevel::ERROR, - "Failed to open file for writing: " + fileName); - } - - bson_free(buf); -} - -QJsonObject SimulationDataManager::loadSimulationData( - const std::string &fileName) -{ - MainWindow::guiLogger.logMessage( - logger::LogLevel::INFO, - "Attempting to load simulation data from " + fileName); - - std::ifstream file(fileName, std::ios::binary | std::ios::ate); - if (!file.is_open()) { - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, - "Failed to open file: " + fileName); - return QJsonObject(); // Return an empty QJsonObject - } - - std::streamsize size = file.tellg(); - file.seekg(0, std::ios::beg); - - std::vector buffer(size); - if (file.read(buffer.data(), size)) { - const uint8_t *data = reinterpret_cast(buffer.data()); - bson_t *document = bson_new_from_data(data, size); - if (document) { - MainWindow::guiLogger.logMessage( - logger::LogLevel::INFO, "Successfully loaded simulation data."); - QJsonObject jsonObject = bsonToJsonObject(document); - bson_destroy(document); // Clean up BSON document - return jsonObject; - } - else { - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, - "Failed to parse BSON document"); - } - } - else { - MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, - "Failed to read file: " + fileName); - } - return QJsonObject(); // Return an empty QJsonObject -} - -QJsonObject SimulationDataManager::bsonToJsonObject(const bson_t *document) -{ - char *json = bson_as_json(document, nullptr); - QJsonDocument jsonDoc = - QJsonDocument::fromJson(QByteArray::fromRawData(json, strlen(json))); - bson_free(json); - - MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, - "Converted BSON to JSON object."); - - return jsonDoc.object(); -} - -void SimulationDataManager::printJson(QJsonObject jsonObject) -{ - QJsonDocument jsonDoc(jsonObject); - QByteArray jsonBytes = jsonDoc.toJson(); - - MainWindow::guiLogger.logMessage( - logger::LogLevel::DEBUG, - "Printing JSON object:\n" + jsonBytes.toStdString()); -} \ No newline at end of file diff --git a/gui/src/simulation_state_manager.cpp b/gui/src/simulation_state_manager.cpp new file mode 100644 index 00000000..d317f655 --- /dev/null +++ b/gui/src/simulation_state_manager.cpp @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "main_window.h" +#include "simulation_state_manager.h" + +SimulationStateManager::SimulationStateManager(QWidget *parent) + : QWidget(parent) +{ + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "SimulationStateManager", "Constructor", + "SimulationStateManager instance created"); +} + +void SimulationStateManager::readSimulationState( + QVector squares, QString img) +{ + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "SimulationStateManager", + "readSimulationState", "Starting to read simulation state"); + data.squares.clear(); + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "SimulationStateManager", + "readSimulationState", "Cleared existing processes"); + for (int i = 0; i < squares.size(); i++) { + if (squares[i] != nullptr) { + data.squares.append(squares[i]); + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, "SimulationStateManager", + "readSimulationState", + "Added process at index " + std::to_string(i)); + } + else + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, "SimulationStateManager", + "readSimulationState", + "Null pointer encountered at index " + std::to_string(i)); + } + + data.id = 1; + data.name = "default name"; + data.img = img; + + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "SimulationStateManager", "readSimulationState", + "Simulation state read completed. Total processes: " + + std::to_string(data.squares.size())); +} + +void SimulationStateManager::saveSimulationState( + const std::string &fileName, QVector squares, + QString img) +{ + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Starting to save simulation state."); + readSimulationState(squares, img); + + bson_t *document = bson_new(); + + bson_t squaresBson; + BSON_APPEND_ARRAY_BEGIN(document, "squares", &squaresBson); + for (const auto &square : data.squares) { + bson_t squareBson; + char key[16]; + snprintf(key, sizeof(key), "%d", square->getProcess()->getId()); + BSON_APPEND_DOCUMENT_BEGIN(&squaresBson, key, &squareBson); + BSON_APPEND_INT32(&squareBson, "id", square->getProcess()->getId()); + BSON_APPEND_UTF8(&squareBson, "name", + square->getProcess()->getName().toStdString().c_str()); + BSON_APPEND_UTF8( + &squareBson, "CMakeProject", + square->getProcess()->getCMakeProject().toStdString().c_str()); + BSON_APPEND_UTF8( + &squareBson, "QEMUPlatform", + square->getProcess()->getQEMUPlatform().toStdString().c_str()); + + bson_t position; + BSON_APPEND_DOCUMENT_BEGIN(&squareBson, "position", &position); + BSON_APPEND_INT32(&position, "x", square->pos().x()); + BSON_APPEND_INT32(&position, "y", square->pos().y()); + bson_append_document_end(&squareBson, &position); + + BSON_APPEND_INT32(&squareBson, "width", square->width()); + BSON_APPEND_INT32(&squareBson, "height", square->height()); + BSON_APPEND_UTF8(&squareBson, "color", + square->styleSheet().toStdString().c_str()); + + bson_append_document_end(&squaresBson, &squareBson); + } + bson_append_array_end(document, &squaresBson); + + BSON_APPEND_INT32(document, "id", data.id); + BSON_APPEND_UTF8(document, "name", data.name.toStdString().c_str()); + BSON_APPEND_UTF8(document, "img", data.img.toStdString().c_str()); + + uint32_t length; + uint8_t *buf = bson_destroy_with_steal(document, true, &length); + + std::ofstream file(fileName, std::ios::binary); + if (file.is_open()) { + file.write(reinterpret_cast(buf), length); + file.close(); + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, "Successfully saved state to " + fileName); + } + else { + MainWindow::guiLogger.logMessage( + logger::LogLevel::ERROR, + "Failed to open file for writing: " + fileName); + } + + bson_free(buf); +} + +QJsonObject SimulationStateManager::loadSimulationState( + const std::string &fileName) +{ + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Attempting to load simulation state from " + fileName); + std::ifstream file(fileName, std::ios::binary | std::ios::ate); + if (!file.is_open()) { + std::cerr << "Failed to open file: " << fileName << std::endl; + return QJsonObject(); // Return an empty QJsonObject + } + + std::streamsize size = file.tellg(); + file.seekg(0, std::ios::beg); + + std::vector buffer(size); + if (file.read(buffer.data(), size)) { + const uint8_t *data = reinterpret_cast(buffer.data()); + bson_t *document = bson_new_from_data(data, size); + if (document) { + MainWindow::guiLogger.logMessage( + logger::LogLevel::INFO, + "Successfully loaded simulation state."); + QJsonObject jsonObject = bsonToJsonObject(document); + bson_destroy(document); // Clean up BSON document + printJson(jsonObject); + updateStateFromJson(jsonObject); + return jsonObject; + } + else { + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to parse BSON document"); + } + } + else { + MainWindow::guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to read file: " + fileName); + } + return QJsonObject(); // Return an empty QJsonObject +} + +void SimulationStateManager::updateStateFromJson(QJsonObject jsonObject) +{ + data.id = jsonObject["id"].toInt(); + data.name = jsonObject["name"].toString(); + data.img = jsonObject["img"].toString(); + + // Update squares data + QJsonArray squaresArray = jsonObject["squares"].toArray(); + data.squares.clear(); + for (int i = 0; i < squaresArray.size(); ++i) { + QJsonObject squareObj = squaresArray[i].toObject(); + + // Create a new DraggableSquare object dynamically + int id = squareObj["id"].toInt(); + QString name = squareObj["name"].toString(); + QString CMakeProject = squareObj["CMakeProject"].toString(); + QString QEMUPlatform = squareObj["QEMUPlatform"].toString(); + + QJsonObject positionObj = squareObj["position"].toObject(); + int x = positionObj["x"].toInt(); + int y = positionObj["y"].toInt(); + + int width = squareObj["width"].toInt(); + int height = squareObj["height"].toInt(); + + // Load color + QString color = squareObj["color"].toString(); + + // Allocate a new DraggableSquare on the heap + DraggableSquare *square = + new DraggableSquare(nullptr, color, width, height); + square->setProcess(new Process(id, name, CMakeProject, QEMUPlatform)); + square->move(QPoint(x, y)); + // Add the pointer to the vector + data.squares.append(square); + } +} + +QJsonObject SimulationStateManager::bsonToJsonObject(const bson_t *document) +{ + char *json = bson_as_json(document, nullptr); + QJsonDocument jsonDoc = + QJsonDocument::fromJson(QByteArray::fromRawData(json, strlen(json))); + MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, + "Converted BSON to JSON object."); + bson_free(json); + return jsonDoc.object(); +} + +void SimulationStateManager::printJson(QJsonObject jsonObject) +{ + QJsonDocument jsonDoc(jsonObject); + QByteArray jsonBytes = jsonDoc.toJson(); + MainWindow::guiLogger.logMessage( + logger::LogLevel::DEBUG, + "Printing JSON object:\n" + jsonBytes.toStdString()); +} \ No newline at end of file diff --git a/gui/test/test_draggable_square.cpp b/gui/test/test_draggable_square.cpp index 587e3ec9..53c6bc2a 100644 --- a/gui/test/test_draggable_square.cpp +++ b/gui/test/test_draggable_square.cpp @@ -4,8 +4,7 @@ #include "draggable_square.h" #include "process.h" #include "main_window.h" -class DraggableSquareTest : public QObject -{ +class DraggableSquareTest : public QObject { Q_OBJECT private slots: void initTestCase(); @@ -14,6 +13,7 @@ private slots: void testMousePressEvent(); void testMouseMoveEvent(); void testMouseReleaseEvent(); + private: QWidget *parentWidget; DraggableSquare *draggableSquare; @@ -28,8 +28,10 @@ void DraggableSquareTest::initTestCase() mainWindow = new MainWindow(parentWidget); mainWindow->resize(800, 600); parentWidget->show(); - testProcess = new Process(1, "Test Process", "../../src/dummy_program1", "QEMUPlatform"); - draggableSquare = new DraggableSquare(parentWidget, "background-color: red;", 100, 100); + testProcess = new Process(1, "Test Process", "../../src/dummy_program1", + "QEMUPlatform"); + draggableSquare = + new DraggableSquare(parentWidget, "background-color: red;", 100, 100); draggableSquare->setProcess(testProcess); draggableSquare->show(); } @@ -44,13 +46,18 @@ void DraggableSquareTest::testSetProcess() { QCOMPARE(draggableSquare->getProcess()->getId(), testProcess->getId()); QCOMPARE(draggableSquare->getProcess()->getName(), testProcess->getName()); - QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), testProcess->getCMakeProject()); - QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), testProcess->getQEMUPlatform()); + QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), + testProcess->getCMakeProject()); + QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), + testProcess->getQEMUPlatform()); } void DraggableSquareTest::testMousePressEvent() { - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); - QMouseEvent rightClickEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::RightButton, Qt::RightButton, Qt::NoModifier); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent rightClickEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::RightButton, Qt::RightButton, + Qt::NoModifier); // Test left button press starts dragging draggableSquare->mousePressEvent(&pressEvent); QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); @@ -60,17 +67,23 @@ void DraggableSquareTest::testMousePressEvent() } void DraggableSquareTest::testMouseMoveEvent() { - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); draggableSquare->mousePressEvent(&pressEvent); - QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent moveEvent(QEvent::MouseMove, QPoint(70, 70), Qt::LeftButton, + Qt::LeftButton, Qt::NoModifier); draggableSquare->mouseMoveEvent(&moveEvent); // Assuming the parent widget has a size of 800x600 and draggable square is constrained QCOMPARE(draggableSquare->pos(), QPoint(20, 20)); } void DraggableSquareTest::testMouseReleaseEvent() { - draggableSquare->mousePressEvent(new QMouseEvent(QEvent::MouseButtonPress, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); - draggableSquare->mouseReleaseEvent(new QMouseEvent(QEvent::MouseButtonRelease, QPoint(50, 50), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + draggableSquare->mousePressEvent( + new QMouseEvent(QEvent::MouseButtonPress, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + draggableSquare->mouseReleaseEvent( + new QMouseEvent(QEvent::MouseButtonRelease, QPoint(50, 50), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); QCOMPARE(draggableSquare->getDragStartPosition(), QPoint(50, 50)); } diff --git a/gui/test/test_log_handler.cpp b/gui/test/test_log_handler.cpp index dc6b73c8..b8433f46 100644 --- a/gui/test/test_log_handler.cpp +++ b/gui/test/test_log_handler.cpp @@ -19,14 +19,16 @@ private slots: void testGetProcessSquares(); }; -void LogHandlerTests::testReadLogFile() { +void LogHandlerTests::testReadLogFile() +{ LogHandler logHandler; logHandler.readLogFile("../log_file.log"); QVERIFY(!logHandler.getLogEntries().isEmpty()); } -void LogHandlerTests::testSortLogEntries() { +void LogHandlerTests::testSortLogEntries() +{ LogHandler logHandler; logHandler.readLogFile("../log_file.log"); @@ -38,7 +40,8 @@ void LogHandlerTests::testSortLogEntries() { } } -void LogHandlerTests::testGetProcessSquares() { +void LogHandlerTests::testGetProcessSquares() +{ LogHandler logHandler; // Create objects to test @@ -47,11 +50,14 @@ void LogHandlerTests::testGetProcessSquares() { square1.setProcess(&process1); // Let's say you want to check that the DraggableSquare has been added to the QMap. // Add the DraggableSquare to the map - QMap &processSquares = const_cast &>(logHandler.getProcessSquares()); + QMap &processSquares = + const_cast &>( + logHandler.getProcessSquares()); processSquares.insert(1, &square1); - // Now the contents of the map can be checked - const QMap &squares = logHandler.getProcessSquares(); + // Now the contents of the map can be checked + const QMap &squares = + logHandler.getProcessSquares(); QVERIFY(squares.contains(1)); QCOMPARE(squares[1]->getProcess()->getId(), 1); } diff --git a/gui/test/test_main_window.cpp b/gui/test/test_main_window.cpp index 14a2ef19..bccfea17 100644 --- a/gui/test/test_main_window.cpp +++ b/gui/test/test_main_window.cpp @@ -5,7 +5,7 @@ class TestMainWindow : public QObject { Q_OBJECT private slots: - void init(); // Setup method, runs before each test + void init(); // Setup method, runs before each test void cleanup(); // Cleanup method, runs after each test void testCreateNewProcess(); @@ -21,12 +21,14 @@ private slots: MainWindow *window; // Pointer to MainWindow to allow reuse in each test }; -void TestMainWindow::init() { +void TestMainWindow::init() +{ // Initialize the MainWindow before each test window = new MainWindow(); } -void TestMainWindow::cleanup() { +void TestMainWindow::cleanup() +{ // Clean up any resources used during the test delete window; window = nullptr; @@ -38,12 +40,13 @@ void TestMainWindow::testCreateNewProcess() QString processName = "NewProcess"; QString cmakeProject = "../src/dummy_program1"; QString qemuPlatform = "QEMUPlatform"; - - Process* newProcess = new Process(newProcessId, processName, cmakeProject, qemuPlatform); + + Process *newProcess = + new Process(newProcessId, processName, cmakeProject, qemuPlatform); window->addProcessSquare(newProcess); window->addId(newProcessId); - Process* retrievedProcess = window->getProcessById(newProcessId); + Process *retrievedProcess = window->getProcessById(newProcessId); QVERIFY(retrievedProcess != nullptr); QCOMPARE(retrievedProcess->getName(), processName); QCOMPARE(retrievedProcess->getCMakeProject(), cmakeProject); @@ -55,25 +58,28 @@ void TestMainWindow::testCreateNewProcess() void TestMainWindow::testAddProcessSquare() { - Process *newProcess = new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); + Process *newProcess = + new Process(5, "Test Process", "../src/dummy_program1", "QEMUPlatform"); window->addProcessSquare(newProcess); - QCOMPARE(window->squares.size(), 5); // Check if square is added - + QCOMPARE(window->squares.size(), 5); // Check if square is added + delete newProcess; // Ensure we clean up the process } void TestMainWindow::testIsUniqueId() { window->addId(5); - QCOMPARE(window->isUniqueId(5), false); // Check if the ID is unique - QCOMPARE(window->isUniqueId(10), true); // Check if a different ID is unique + QCOMPARE(window->isUniqueId(5), false); // Check if the ID is unique + QCOMPARE(window->isUniqueId(10), + true); // Check if a different ID is unique } void TestMainWindow::testStartProcesses() { window->compileProjects(); window->runProjects(); - QVERIFY(!window->runningProcesses.isEmpty()); // Ensure processes are started + QVERIFY( + !window->runningProcesses.isEmpty()); // Ensure processes are started window->endProcesses(); } @@ -82,13 +88,15 @@ void TestMainWindow::testEndProcesses() window->compileProjects(); window->runProjects(); window->endProcesses(); - QVERIFY(window->runningProcesses.isEmpty()); // Ensure processes are stopped + QVERIFY( + window->runningProcesses.isEmpty()); // Ensure processes are stopped } void TestMainWindow::testDeleteSquare() { QString cmakeProject = "../src/dummy_program1"; - Process *process = new Process(5, "Test Process", cmakeProject, "QEMUPlatform"); + Process *process = + new Process(5, "Test Process", cmakeProject, "QEMUPlatform"); window->addProcessSquare(process); window->deleteSquare(5); diff --git a/gui/test/test_process.cpp b/gui/test/test_process.cpp index b907418e..a60bf09c 100644 --- a/gui/test/test_process.cpp +++ b/gui/test/test_process.cpp @@ -5,7 +5,7 @@ class ProcessTests : public QObject { Q_OBJECT private slots: - void testProcessConstructor() + void testProcessConstructor() { Process process(1, "Test Process", "TestProject", "TestPlatform"); QCOMPARE(process.getId(), 1); diff --git a/gui/test/test_process_dialog.cpp b/gui/test/test_process_dialog.cpp index c4dba2e4..e61c6502 100644 --- a/gui/test/test_process_dialog.cpp +++ b/gui/test/test_process_dialog.cpp @@ -5,35 +5,35 @@ class ProcessDialogTests : public QObject { Q_OBJECT private slots: - void testGetId() + void testGetId() { ProcessDialog dialog; dialog.setId(123); QCOMPARE(dialog.getId(), 123); } - void testGetName() + void testGetName() { ProcessDialog dialog; dialog.setName("Test Process"); QCOMPARE(dialog.getName(), "Test Process"); } - void testGetCMakeProject() + void testGetCMakeProject() { ProcessDialog dialog; dialog.setCMakeProject("TestProject"); QCOMPARE(dialog.getCMakeProject(), "TestProject"); } - void testGetQEMUPlatform() + void testGetQEMUPlatform() { ProcessDialog dialog; dialog.setQEMUPlatform("arm"); QCOMPARE(dialog.getQEMUPlatform(), "arm"); } - void testIsValid() + void testIsValid() { ProcessDialog dialog; dialog.setId(123); @@ -43,14 +43,15 @@ private slots: QVERIFY(dialog.isValid()); } - void testValidateAndAccept() + void testValidateAndAccept() { ProcessDialog dialog; dialog.setId(123); dialog.setName("Test Process"); dialog.setCMakeProject("TestProject"); dialog.setQEMUPlatform("x86"); - QVERIFY(dialog.validateAndAccept() == true); // Assuming true indicates validation success + // Assuming true indicates validation success + QVERIFY(dialog.validateAndAccept() == true); } }; diff --git a/gui/test/user_interaction_tests.cpp b/gui/test/user_interaction_tests.cpp index bcbff563..87b2e86e 100644 --- a/gui/test/user_interaction_tests.cpp +++ b/gui/test/user_interaction_tests.cpp @@ -11,6 +11,7 @@ private slots: void cleanupTestCase(); void testOpenImageDialog(); void testGetExecutableName(); + private: MainWindow *mainWindow; }; @@ -31,10 +32,11 @@ void UserInteractionTests::testOpenImageDialog() { MainWindow window; window.openImageDialog(); - QVERIFY(!window.getCurrentImagePath().isEmpty()); // Ensure image path is set + QVERIFY( + !window.getCurrentImagePath().isEmpty()); // Ensure image path is set } -void UserInteractionTests::testGetExecutableName() +void UserInteractionTests::testGetExecutableName() { MainWindow window; QTemporaryDir tempDir; diff --git a/logger/logger.cpp b/logger/logger.cpp index 4d6665e0..ec9bff7b 100644 --- a/logger/logger.cpp +++ b/logger/logger.cpp @@ -2,117 +2,118 @@ std::string logger::logFileName; std::mutex logger::logMutex; -std::chrono::system_clock::time_point logger::initTime=std::chrono::system_clock::now(); +std::chrono::system_clock::time_point logger::initTime = + std::chrono::system_clock::now(); std::string logger::componentName = "out"; -logger::logger(std::string componentName) -{ - logger::componentName=componentName; +logger::logger(std::string componentName) { + logger::componentName = componentName; } -void logger::initializeLogFile() -{ - if (isInitialized) return; - - auto time = std::chrono::system_clock::to_time_t(initTime); - std::tm tm = *std::localtime(&time); - - std::ostringstream oss; - oss << "" << std::put_time(&tm, "%Y_%m_%d_%H_%M_%S") << "_" << componentName << ".log"; - logFileName = oss.str(); - - std::ofstream sharedFile(sharedLogFileName, std::ios::out | std::ios::trunc); - if (sharedFile) { - sharedFile << logFileName; - } else { - std::cerr << logLevelToString(LogLevel::ERROR) << "Failed to open shared log file name file" << std::endl; - } - - isInitialized = true; +void logger::initializeLogFile() { + if (isInitialized) + return; + + auto time = std::chrono::system_clock::to_time_t(initTime); + std::tm tm = *std::localtime(&time); + + std::ostringstream oss; + oss << "" << std::put_time(&tm, "%Y_%m_%d_%H_%M_%S") << "_" << componentName + << ".log"; + logFileName = oss.str(); + + std::ofstream sharedFile(sharedLogFileName, std::ios::out | std::ios::trunc); + if (sharedFile) { + sharedFile << logFileName; + } else { + std::cerr << logLevelToString(LogLevel::ERROR) + << "Failed to open shared log file name file" << std::endl; + } + + isInitialized = true; } -std::string logger::getLogFileName() -{ +std::string logger::getLogFileName() { + if (!isInitialized) { if (!isInitialized) { - if (!isInitialized) { - std::ifstream sharedFile(sharedLogFileName); - if (sharedFile) { - std::getline(sharedFile, logFileName); - } - if (logFileName.empty()) { - initializeLogFile(); - } - } + std::ifstream sharedFile(sharedLogFileName); + if (sharedFile) { + std::getline(sharedFile, logFileName); + } + if (logFileName.empty()) { + initializeLogFile(); + } } + } - return logFileName; + return logFileName; } -void logger::cleanUp() -{ - std::remove(sharedLogFileName.c_str()); +void logger::cleanUp() { std::remove(sharedLogFileName.c_str()); } + +std::string logger::logLevelToString(LogLevel level) { + switch (level) { + case LogLevel::ERROR: + return "[ERROR]"; + case LogLevel::INFO: + return "[INFO]"; + case LogLevel::DEBUG: + return "[DEBUG]"; + default: + return "[UNKNOWN]"; + } } -std::string logger::logLevelToString(LogLevel level) -{ - switch (level) { - case LogLevel::ERROR: return "[ERROR]"; - case LogLevel::INFO: return "[INFO]"; - case LogLevel::DEBUG: return "[DEBUG]"; - default: return "[UNKNOWN]"; - } +bool logger::shouldLog(LogLevel level) { + switch (LOG_LEVEL) { + case LogLevel::ERROR: + return level == LogLevel::ERROR; + case LogLevel::INFO: + return level == LogLevel::ERROR || level == LogLevel::INFO; + case LogLevel::DEBUG: + return true; + default: + return false; + } } -bool logger::shouldLog(LogLevel level) -{ - switch (LOG_LEVEL) { - case LogLevel::ERROR: - return level == LogLevel::ERROR; - case LogLevel::INFO: - return level == LogLevel::ERROR || level == LogLevel::INFO; - case LogLevel::DEBUG: - return true; - default: - return false; - } +std::string logger::getElapsedTime() { + auto now = std::chrono::system_clock::now(); + auto elapsed = + std::chrono::duration_cast(now - initTime) + .count(); + return std::to_string(elapsed) + "ns"; } -std::string logger::getElapsedTime() -{ - auto now = std::chrono::system_clock::now(); - auto elapsed = std::chrono::duration_cast(now - initTime).count(); - return std::to_string(elapsed) + "ns"; +void logger::logMessage(LogLevel level, std::string src, std::string dst, + const std::string &message) { + if (!shouldLog(level)) + return; + + std::lock_guard guard(logMutex); + std::ofstream logFile(getLogFileName(), std::ios_base::app); + if (!logFile) { + std::cerr << logLevelToString(LogLevel::ERROR) << "Failed to open log file" + << std::endl; + return; + } + logFile << "[" << getElapsedTime() << "] " << logLevelToString(level) << " " + << "SRC " << src << " " + << "DST " << dst << " " << message << std::endl; } -void logger::logMessage(LogLevel level, std::string src, std::string dst, const std::string &message) -{ - if (!shouldLog(level)) return; +void logger::logMessage(LogLevel level, const std::string &message) { + if (!shouldLog(level)) + return; - std::lock_guard guard(logMutex); - std::ofstream logFile(getLogFileName(), std::ios_base::app); - if (!logFile) { - std::cerr << logLevelToString(LogLevel::ERROR) << "Failed to open log file" << std::endl; - return; - } - logFile << "[" << getElapsedTime() << "] " - << logLevelToString(level) << " " - << "SRC " << src << " " - << "DST " << dst << " " - << message << std::endl; -} - -void logger::logMessage(LogLevel level, const std::string &message) -{ - if (!shouldLog(level)) return; + std::lock_guard guard(logMutex); - std::lock_guard guard(logMutex); - - std::ofstream logFile(getLogFileName(), std::ios_base::app); - if (!logFile) { - std::cerr << logLevelToString(LogLevel::ERROR) << "Failed to open log file" << std::endl; - return; - } + std::ofstream logFile(getLogFileName(), std::ios_base::app); + if (!logFile) { + std::cerr << logLevelToString(LogLevel::ERROR) << "Failed to open log file" + << std::endl; + return; + } - logFile << "[" << getElapsedTime() << "] " - << logLevelToString(level) << " " - << message << std::endl; + logFile << "[" << getElapsedTime() << "] " << logLevelToString(level) << " " + << message << std::endl; } \ No newline at end of file diff --git a/logger/logger.h b/logger/logger.h index ab79ee59..918d249f 100644 --- a/logger/logger.h +++ b/logger/logger.h @@ -1,13 +1,13 @@ #ifndef LOGGER_H #define LOGGER_H -#include #include -#include -#include #include +#include #include #include +#include +#include #ifndef LOG_LEVEL #define LOG_LEVEL logger::LogLevel::INFO @@ -15,28 +15,30 @@ class logger { public: - enum class LogLevel { - ERROR, - INFO, - DEBUG, - }; - logger(){} - logger(std::string componentName); - void logMessage(LogLevel level, const std::string &message); - void logMessage(LogLevel level, std::string src, std::string dst, const std::string &message); - void initializeLogFile(); - std::string getLogFileName(); - std::string sharedLogFileName = "shared_log_file_name.txt"; - void cleanUp(); + enum class LogLevel { + ERROR, + INFO, + DEBUG, + }; + logger() {} + logger(std::string componentName); + void logMessage(LogLevel level, const std::string &message); + void logMessage(LogLevel level, std::string src, std::string dst, + const std::string &message); + void initializeLogFile(); + std::string getLogFileName(); + std::string sharedLogFileName = "shared_log_file_name.txt"; + void cleanUp(); + private: - static std::string logLevelToString(LogLevel level); - static bool shouldLog(LogLevel level); - static std::string getElapsedTime(); - static std::string componentName; - static std::string logFileName; - bool isInitialized = false; - static std::mutex logMutex; - static std::chrono::system_clock::time_point initTime; + static std::string logLevelToString(LogLevel level); + static bool shouldLog(LogLevel level); + static std::string getElapsedTime(); + static std::string componentName; + static std::string logFileName; + bool isInitialized = false; + static std::mutex logMutex; + static std::chrono::system_clock::time_point initTime; }; #endif // LOGGER_H \ No newline at end of file From 3d31e126e5b49d92c97ea10c95066db80009f585 Mon Sep 17 00:00:00 2001 From: Dvora Novogrotzki Date: Sun, 15 Sep 2024 13:20:41 +0300 Subject: [PATCH 27/33] GUI: Update Square Frames visualisation --- gui/src/frames.cpp | 47 +++++++++++++++------------- gui/src/simulation_state_manager.cpp | 1 + 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/gui/src/frames.cpp b/gui/src/frames.cpp index e12dfea5..3aa758a6 100644 --- a/gui/src/frames.cpp +++ b/gui/src/frames.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "frames.h" #include "main_window.h" @@ -21,10 +22,10 @@ Frames::Frames(LogHandler &logHandler, QWidget *parent) QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Frames::updateFrames); - timer->start(1000); + timer->start(100); MainWindow::guiLogger.logMessage( - logger::LogLevel::DEBUG, "Frames initialized with timer set to 1000ms"); + logger::LogLevel::DEBUG, "Frames initialized with timer set to 100ms"); } void Frames::initialFramesMat(int size) @@ -49,19 +50,21 @@ void Frames::paintEvent(QPaintEvent *event) if (row < framesMat.size() && col < framesMat[row].size()) { const Frame &frame = framesMat[row][col]; - painter.setPen(QPen(QColor(frame.color), frame.thickness)); + + QPen pen(QColor(frame.color), frame.thickness); + pen.setJoinStyle(Qt::RoundJoin); + painter.setPen(pen); auto square1 = logHandler.getProcessSquares()[log.srcId]; auto square2 = logHandler.getProcessSquares()[log.dstId]; - QRect rect1(square1->getDragStartPosition().x(), - square1->getDragStartPosition().y(), + QRect rect1(square1->pos().x() - 8, square1->pos().y() - 8, square1->width(), square1->height()); - QRect rect2(square2->getDragStartPosition().x(), - square2->getDragStartPosition().y(), + QRect rect2(square2->pos().x() - 8, square2->pos().y() - 8, square2->width(), square2->height()); - painter.drawRect(rect1); - painter.drawRect(rect2); + + painter.drawRoundedRect(rect1, 10, 10); + painter.drawRoundedRect(rect2, 10, 10); } else { MainWindow::guiLogger.logMessage( @@ -94,10 +97,10 @@ void Frames::updateFrames() std::max(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); int col = std::min(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); - if (framesMat[row][col].thickness > 1) { - framesMat[row][col].thickness -= 0.01; - } - it = activeLogEntries.erase(it); + + framesMat[row][col].thickness -= 0.001; + if (framesMat[row][col].thickness <= 0.001) + it = activeLogEntries.erase(it); } else { ++it; @@ -117,11 +120,12 @@ void Frames::updateFrames() idMapping[logEntry.srcId]); int col = std::min(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); - framesMat[row][col].thickness += 0.01; + framesMat[row][col].thickness += 0.001; activeLogEntries.emplace(logEntry.timestamp, logEntry); } } } + update(); } @@ -142,14 +146,11 @@ void Frames::createSequentialIds() void Frames::fillFramesMat() { - MainWindow::guiLogger.logMessage( - logger::LogLevel::INFO, "Filling frames matrix with random colors"); - QSet usedColors; srand(static_cast(time(0))); for (int i = 0; i < framesMat.size(); ++i) { - for (int j = 0; j <= i; ++j) { + for (int j = 0; j < i; ++j) { QString randomColor; do { randomColor = generateRandomColor(); @@ -169,11 +170,13 @@ void Frames::fillFramesMat() QString Frames::generateRandomColor() { - QString color = QString("#%1%2%3") + int alpha = 12; + QString color = QString("#%1%2%3%4") .arg(rand() % 256, 2, 16, QChar('0')) .arg(rand() % 256, 2, 16, QChar('0')) - .arg(rand() % 256, 2, 16, QChar('0')); - return color; + .arg(rand() % 256, 2, 16, QChar('0')) + .arg(alpha, 2, 16, QChar('0')); + return color.toUpper(); } // Getters @@ -218,4 +221,4 @@ void Frames::setActiveLogEntries( void Frames::setIdMapping(const QMap &idMapping) { this->idMapping = idMapping; -} \ No newline at end of file +} diff --git a/gui/src/simulation_state_manager.cpp b/gui/src/simulation_state_manager.cpp index d317f655..303f5921 100644 --- a/gui/src/simulation_state_manager.cpp +++ b/gui/src/simulation_state_manager.cpp @@ -10,6 +10,7 @@ #include #include "main_window.h" #include "simulation_state_manager.h" +#include "main_window.h" SimulationStateManager::SimulationStateManager(QWidget *parent) : QWidget(parent) From b40dcdcac0650b74484a59e1b02944e054987088 Mon Sep 17 00:00:00 2001 From: Dvora Novogrotzki Date: Sun, 15 Sep 2024 14:51:13 +0300 Subject: [PATCH 28/33] GUI: Add load and show simulation buttons --- gui/include/draggable_square.h | 3 +- gui/include/main_window.h | 11 ++-- gui/src/draggable_square.cpp | 18 +++--- gui/src/frames.cpp | 34 ++++++----- gui/src/log_handler.cpp | 12 ++-- gui/src/main_window.cpp | 102 ++++++++++++++++++++++++++------- gui/test/test_log_handler.cpp | 4 +- 7 files changed, 124 insertions(+), 60 deletions(-) diff --git a/gui/include/draggable_square.h b/gui/include/draggable_square.h index 68b5a600..93a0bfbc 100644 --- a/gui/include/draggable_square.h +++ b/gui/include/draggable_square.h @@ -49,12 +49,11 @@ class DraggableSquare : public QWidget { private: QPushButton *stopButton; - QPoint dragStartPosition; - QPoint initialPosition; QLabel *label; Process *process; int id; bool dragging; + QPoint dragStartPosition; private slots: void editSquare(int id); diff --git a/gui/include/main_window.h b/gui/include/main_window.h index 0184f37f..480f7442 100644 --- a/gui/include/main_window.h +++ b/gui/include/main_window.h @@ -28,7 +28,7 @@ #include "process.h" #include "process_dialog.h" #include "simulation_state_manager.h" -#include "../logger/logger.h" +#include "../../logger/logger.h" class MainWindow : public QMainWindow { Q_OBJECT @@ -65,6 +65,10 @@ class MainWindow : public QMainWindow { } static logger guiLogger; +private slots: + void showSimulation(); + void loadSimulation(); + public slots: void createNewProcess(); void editSquare(int id); @@ -78,8 +82,8 @@ public slots: void addProcessSquare(Process *&process); bool isUniqueId(int id); void addId(int id); - void addProcessSquare(Process *&process, int index, - const QString &color = "background-color: green;"); + void addProcessSquare(Process *process, QPoint position, int width, + int height, const QString &color); void compileProjects(); void runProjects(); QString getExecutableName(const QString &buildDirPath); @@ -103,7 +107,6 @@ public slots: QString currentImagePath; SimulationStateManager *stateManager; LogHandler logHandler; - Frames *frames; }; #endif // MAIN_WINDOW_H \ No newline at end of file diff --git a/gui/src/draggable_square.cpp b/gui/src/draggable_square.cpp index 06560f6f..d12dbbcb 100644 --- a/gui/src/draggable_square.cpp +++ b/gui/src/draggable_square.cpp @@ -17,8 +17,6 @@ void DraggableSquare::print() const << " Process ID: " << process->getId() << "\n" << " Drag Start Position: (" << dragStartPosition.x() << ", " << dragStartPosition.y() << ")\n" - << " Initial Position: (" << initialPosition.x() << ", " - << initialPosition.y() << ")\n" << " Color: " << label->styleSheet().toStdString() << "\n" << " Size: (" << this->width() << ", " << this->height() << ")"; @@ -55,7 +53,6 @@ DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, DraggableSquare::DraggableSquare(const DraggableSquare &other) : QWidget(other.parentWidget()), dragStartPosition(other.dragStartPosition), - initialPosition(other.initialPosition), label(new QLabel(other.label->text(), this)), process(other.process) // Copy QLabel's text { @@ -75,7 +72,6 @@ DraggableSquare &DraggableSquare::operator=(const DraggableSquare &other) } dragStartPosition = other.dragStartPosition; - initialPosition = other.initialPosition; delete label; label = new QLabel(other.label->text(), this); // Copy QLabel's text process = other.process; @@ -169,15 +165,15 @@ void DraggableSquare::mouseMoveEvent(QMouseEvent *event) } QPoint newPos = mapToParent(event->pos() - dragStartPosition); - newPos.setX(qMax(0, qMin(newPos.x(), parentWidget()->width() - width()))); - newPos.setY(qMax(0, qMin(newPos.y(), parentWidget()->height() - height()))); + QRect parentRect = parentWidget()->rect(); + + // Calculate new position, based on the parent's boundaries + newPos.setX(qMax(parentRect.left(), + qMin(newPos.x(), parentRect.right() - width()))); + newPos.setY(qMax(parentRect.top(), + qMin(newPos.y(), parentRect.bottom() - height()))); move(newPos); - dragStartPosition = newPos; - MainWindow::guiLogger.logMessage(logger::LogLevel::DEBUG, - "DraggableSquare moved to: (" + - std::to_string(newPos.x()) + ", " + - std::to_string(newPos.y()) + ")"); } void DraggableSquare::mouseReleaseEvent(QMouseEvent *event) diff --git a/gui/src/frames.cpp b/gui/src/frames.cpp index 3aa758a6..7b6d711c 100644 --- a/gui/src/frames.cpp +++ b/gui/src/frames.cpp @@ -5,6 +5,15 @@ #include "frames.h" #include "main_window.h" +//Setting constants +const int timerIntervalMs = 100; +const int squareOffset = 8; +const int cornerRadius = 10; +const double minThickness = 0.001; +const double maxThickness = 25; +const int logEntryExpirySecs = 5; +const int alphaValue = 12; + // Constructor to initialize Frames with a LogHandler reference Frames::Frames(LogHandler &logHandler, QWidget *parent) : logHandler(logHandler), QWidget(parent), differenceTime(0) @@ -22,7 +31,7 @@ Frames::Frames(LogHandler &logHandler, QWidget *parent) QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Frames::updateFrames); - timer->start(100); + timer->start(timerIntervalMs); MainWindow::guiLogger.logMessage( logger::LogLevel::DEBUG, "Frames initialized with timer set to 100ms"); @@ -58,13 +67,13 @@ void Frames::paintEvent(QPaintEvent *event) auto square1 = logHandler.getProcessSquares()[log.srcId]; auto square2 = logHandler.getProcessSquares()[log.dstId]; - QRect rect1(square1->pos().x() - 8, square1->pos().y() - 8, + QRect rect1(square1->pos().x() - squareOffset, square1->pos().y() - squareOffset, square1->width(), square1->height()); - QRect rect2(square2->pos().x() - 8, square2->pos().y() - 8, + QRect rect2(square2->pos().x() - squareOffset, square2->pos().y() - squareOffset, square2->width(), square2->height()); - painter.drawRoundedRect(rect1, 10, 10); - painter.drawRoundedRect(rect2, 10, 10); + painter.drawRoundedRect(rect1, cornerRadius, cornerRadius); + painter.drawRoundedRect(rect2, cornerRadius, cornerRadius); } else { MainWindow::guiLogger.logMessage( @@ -91,15 +100,15 @@ void Frames::updateFrames() // Decrease thickness for expired log entries for (auto it = activeLogEntries.begin(); it != activeLogEntries.end();) { - if (it->first.addSecs(5) <= currentTime) { + if (it->first.addSecs(logEntryExpirySecs) <= currentTime) { const LogHandler::LogEntry &logEntry = it->second; int row = std::max(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); int col = std::min(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); - framesMat[row][col].thickness -= 0.001; - if (framesMat[row][col].thickness <= 0.001) + framesMat[row][col].thickness -= minThickness; + if (framesMat[row][col].thickness <= minThickness) it = activeLogEntries.erase(it); } else { @@ -120,12 +129,12 @@ void Frames::updateFrames() idMapping[logEntry.srcId]); int col = std::min(idMapping[logEntry.dstId], idMapping[logEntry.srcId]); - framesMat[row][col].thickness += 0.001; + if(framesMat[row][col].thickness <= maxThickness) + framesMat[row][col].thickness += minThickness; activeLogEntries.emplace(logEntry.timestamp, logEntry); } } } - update(); } @@ -170,12 +179,11 @@ void Frames::fillFramesMat() QString Frames::generateRandomColor() { - int alpha = 12; QString color = QString("#%1%2%3%4") .arg(rand() % 256, 2, 16, QChar('0')) .arg(rand() % 256, 2, 16, QChar('0')) .arg(rand() % 256, 2, 16, QChar('0')) - .arg(alpha, 2, 16, QChar('0')); + .arg(alphaValue, 2, 16, QChar('0')); return color.toUpper(); } @@ -221,4 +229,4 @@ void Frames::setActiveLogEntries( void Frames::setIdMapping(const QMap &idMapping) { this->idMapping = idMapping; -} +} \ No newline at end of file diff --git a/gui/src/log_handler.cpp b/gui/src/log_handler.cpp index ba9aec65..71592ff2 100644 --- a/gui/src/log_handler.cpp +++ b/gui/src/log_handler.cpp @@ -109,23 +109,23 @@ void LogHandler::analyzeLogEntries(QMainWindow *mainWindow, jsonFileName.toStdString()); // Update process map with JSON data - QJsonArray processesArray = jsonObject["processes"].toArray(); + QJsonArray processesArray = jsonObject["squares"].toArray(); for (const QJsonValue &value : processesArray) { QJsonObject processObject = value.toObject(); int id = processObject["id"].toInt(); QString name = processObject["name"].toString(); QString cmakeProject = processObject["CMakeProject"].toString(); QString qemuPlatform = processObject["QEMUPlatform"].toString(); - int x = processObject["coordinate"].toObject()["x"].toInt(); - int y = processObject["coordinate"].toObject()["y"].toInt(); + int x = processObject["position"].toObject()["x"].toInt(); + int y = processObject["position"].toObject()["y"].toInt(); int width = processObject["width"].toInt(); int height = processObject["height"].toInt(); - Process process(id, name, cmakeProject, qemuPlatform); + Process *process = + new Process(id, name, cmakeProject, qemuPlatform); DraggableSquare *square = new DraggableSquare(mainWindow, "", width, height); - square->setProcess(&process); - square->setDragStartPosition(QPoint(x, y)); + square->setProcess(process); square->move(x, y); processSquares.insert(id, square); } diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index 096df210..9547db69 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -32,6 +32,24 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) timeLabel = new QLabel("Enter time in seconds:", this); logOutput = new QTextEdit(this); QPushButton *chooseButton = new QPushButton("Choose Image", this); + QPushButton *showSimulationButton = + new QPushButton("Show\nSimulation", this); + showSimulationButton->setStyleSheet( + "QPushButton {" + "border: 2px solid #8f8f91;" + "border-radius: 25px;" + "background-color: #d1d1d1;" + "min-width: 50px;" + "min-height: 50px;" + "font-size: 14px;" + "}" + "QPushButton:pressed {" + "background-color: #a8a8a8;" + "}"); + QPushButton *loadSimulationButton = + new QPushButton("LOAD\nSIMULATION", toolbox); + loadSimulationButton->setFixedHeight( + loadSimulationButton->sizeHint().height() * 1.5); timeLabel->hide(); timeInput->hide(); @@ -41,6 +59,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) QPushButton *addProcessButton = new QPushButton("Add Process", toolbox); toolboxLayout->addWidget(addProcessButton); + toolboxLayout->insertWidget(1, showSimulationButton); + toolboxLayout->insertWidget(2, loadSimulationButton); toolboxLayout->addStretch(); connect(addProcessButton, &QPushButton::clicked, this, @@ -53,6 +73,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) &MainWindow::showTimerInput); connect(chooseButton, &QPushButton::clicked, this, &MainWindow::openImageDialog); + connect(showSimulationButton, &QPushButton::clicked, this, + &MainWindow::showSimulation); + connect(loadSimulationButton, &QPushButton::clicked, this, + &MainWindow::loadSimulation); toolbox->setMaximumWidth(100); toolbox->setMinimumWidth(100); @@ -89,19 +113,31 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) Process *mainProcess = new Process(id, "Main", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(mainProcess, id, styleSheet); + addProcessSquare( + mainProcess, + QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), + sizeSquare, sizeSquare, styleSheet); addId(id++); Process *hsmProcess = new Process(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(hsmProcess, id, styleSheet); + addProcessSquare( + hsmProcess, + QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), + sizeSquare, sizeSquare, styleSheet); addId(id++); Process *logsDbProcess = new Process(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); - addProcessSquare(logsDbProcess, id, styleSheet); + addProcessSquare( + logsDbProcess, + QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), + sizeSquare, sizeSquare, styleSheet); addId(id++); Process *busManagerProcess = new Process(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); - addProcessSquare(busManagerProcess, id, styleSheet); + addProcessSquare( + busManagerProcess, + QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), + sizeSquare, sizeSquare, styleSheet); addId(id++); } @@ -172,24 +208,20 @@ void MainWindow::addProcessSquare(Process *&process) createProcessConfigFile(process->getId(), process->getCMakeProject()); } -void MainWindow::addProcessSquare(Process *&process, int index, - const QString &color) +void MainWindow::addProcessSquare(Process *process, QPoint position, int width, + int height, const QString &color) { DraggableSquare *square = - new DraggableSquare(workspace, color, sizeSquare, sizeSquare); + new DraggableSquare(workspace, color, width, height); square->setProcess(process); square->setId(process->getId()); - int x = (index % 2) * (square->width() + 10); - int y = (index / 2) * (square->height() + 10); - QPoint pos = squarePositions.value(process->getId(), QPoint(x, y)); + QPoint pos = squarePositions.value(process->getId(), position); square->move(pos); square->show(); squarePositions[process->getId()] = pos; squares.push_back(square); - - createProcessConfigFile(process->getId(), process->getCMakeProject()); } bool MainWindow::isUniqueId(int id) @@ -263,16 +295,7 @@ void MainWindow::endProcesses() currentImagePath); MainWindow::guiLogger.logMessage(logger::LogLevel::INFO, "MainWindow::endProcesses Simulation " - "data saved to simulation_data.bson"); - - QString filePath = "../log_file.log"; - logHandler.readLogFile(filePath); - logHandler.analyzeLogEntries(this, "simulation_data.bson"); - - frames = new Frames(logHandler); // Initialize Frames - QVBoxLayout *framesLayout = new QVBoxLayout(workspace); - framesLayout->addWidget(frames); - workspace->setLayout(framesLayout); + "data saved to simulation_state.bson"); for (const QPair &pair : runningProcesses) { QProcess *process = pair.first; @@ -378,6 +401,41 @@ void MainWindow::openImageDialog() } } +void MainWindow::showSimulation() +{ + QString filePath = "log_file.log"; + logHandler.readLogFile(filePath); + logHandler.analyzeLogEntries(this, "simulation_state.bson"); + + Frames* frames = new Frames(logHandler); // Initialize Frames + QVBoxLayout *framesLayout = new QVBoxLayout(workspace); + framesLayout->addWidget(frames); + workspace->setLayout(framesLayout); +} + +void MainWindow::loadSimulation() +{ + SimulationStateManager *simManager; + simManager = new SimulationStateManager(); + simManager->loadSimulationState("simulation_state.bson"); + for (auto sq : squares) { + delete (sq); + } + squares.clear(); + squarePositions.clear(); + if (!simManager->data.squares.empty()) { + for (auto sqr : simManager->data.squares) { + Process *process = new Process( + sqr->getProcess()->getId(), sqr->getProcess()->getName(), + sqr->getProcess()->getCMakeProject(), + sqr->getProcess()->getQEMUPlatform()); + addProcessSquare(process, sqr->pos(), sqr->width(), sqr->height(), + sqr->styleSheet()); + addId(sqr->getId()); + } + } +} + QString MainWindow::getExecutableName(const QString &buildDirPath) { QDir buildDir(buildDirPath); diff --git a/gui/test/test_log_handler.cpp b/gui/test/test_log_handler.cpp index b8433f46..222356de 100644 --- a/gui/test/test_log_handler.cpp +++ b/gui/test/test_log_handler.cpp @@ -1,6 +1,6 @@ #include #include "log_handler.h" -#include "simulation_data_manager.h" +#include "simulation_state_manager.h" #include "draggable_square.h" #include "process.h" #include @@ -11,7 +11,7 @@ class LogHandlerTests : public QObject { Q_OBJECT - SimulationDataManager manager; + SimulationStateManager state; private slots: void testReadLogFile(); From 29c6fa3d6b6b7e123aedb93d5bca5fd930381922 Mon Sep 17 00:00:00 2001 From: Tamar Leibovitz Date: Mon, 16 Sep 2024 09:55:45 +0300 Subject: [PATCH 29/33] GUI: Support for CTest and individual test execution --- gui/CMakeLists.txt | 10 ++++----- gui/test/CMakeLists.txt | 48 ++++++++++++++++------------------------- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 1603aa0d..b3e9d9e9 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -18,7 +18,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Set the -fPIC flag to enable Position Independent Code for all targets set(CMAKE_POSITION_INDEPENDENT_CODE ON) -# Set the output directory for executables +# Set the output directory for executables to the build directory set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) # Find the Qt5 library @@ -37,7 +37,7 @@ add_library(DraggableSquaresLib src/simulation_state_manager.cpp src/log_handler.cpp src/frames.cpp - ../logger/logger.cpp # Updated logger source file path + ../logger/logger.cpp ) # Add headers to the library target @@ -48,14 +48,14 @@ target_sources(DraggableSquaresLib PRIVATE include/simulation_state_manager.h include/log_handler.h include/frames.h - ../logger/logger.h + ../logger/logger.h ) # Include BSON directories and project include directory target_include_directories(DraggableSquaresLib PRIVATE ${BSON_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/include - ${CMAKE_SOURCE_DIR}/../logger + ${CMAKE_SOURCE_DIR}/../logger ) # Link the BSON library and Qt5 components to the library @@ -74,4 +74,4 @@ target_include_directories(DraggableSquares PRIVATE ${CMAKE_SOURCE_DIR}/include enable_testing() # Add the test directory -add_subdirectory(test) \ No newline at end of file +add_subdirectory(test) diff --git a/gui/test/CMakeLists.txt b/gui/test/CMakeLists.txt index 8fca3f24..14004f9c 100644 --- a/gui/test/CMakeLists.txt +++ b/gui/test/CMakeLists.txt @@ -25,32 +25,22 @@ pkg_check_modules(BSON REQUIRED libbson-1.0) # Include directories include_directories(${CMAKE_SOURCE_DIR}/include ${BSON_INCLUDE_DIRS}) -# Test for MainWindow -add_executable(MainWindowTests test_main_window.cpp) -target_link_libraries(MainWindowTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) -add_test(NAME MainWindowTests COMMAND MainWindowTests) - -# Test for DraggableSquare -add_executable(DraggableSquareTests test_draggable_square.cpp) -target_link_libraries(DraggableSquareTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) -add_test(NAME DraggableSquareTests COMMAND DraggableSquareTests) - -# Test for ProcessDialog -add_executable(ProcessDialogTests test_process_dialog.cpp) -target_link_libraries(ProcessDialogTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) -add_test(NAME ProcessDialogTests COMMAND ProcessDialogTests) - -# Test for Process -add_executable(ProcessTests test_process.cpp) -target_link_libraries(ProcessTests PRIVATE DraggableSquaresLib Qt5::Test) -add_test(NAME ProcessTests COMMAND ProcessTests) - -# Test for UserInteraction -add_executable(UserInteractionTests user_interaction_tests.cpp) -target_link_libraries(UserInteractionTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) -add_test(NAME UserInteractionTests COMMAND UserInteractionTests) - -# Test for LogHandler -add_executable(LogHandlerTests test_log_handler.cpp) -target_link_libraries(LogHandlerTests PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) -add_test(NAME LogHandlerTests COMMAND LogHandlerTests) \ No newline at end of file +# Set the runtime output directory for all test executables to the build directory +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + +# Helper to support both direct and ctest execution +function(add_test_with_working_dir target_name source_file) + add_executable(${target_name} ${source_file}) + target_link_libraries(${target_name} PRIVATE DraggableSquaresLib Qt5::Test Qt5::Gui Qt5::Widgets) + set_target_properties(${target_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test(NAME ${target_name} COMMAND ${target_name}) + set_tests_properties(${target_name} PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +endfunction() + +# Tests +add_test_with_working_dir(MainWindowTests test_main_window.cpp) +add_test_with_working_dir(DraggableSquareTests test_draggable_square.cpp) +add_test_with_working_dir(ProcessDialogTests test_process_dialog.cpp) +add_test_with_working_dir(ProcessTests test_process.cpp) +add_test_with_working_dir(UserInteractionTests user_interaction_tests.cpp) +add_test_with_working_dir(LogHandlerTests test_log_handler.cpp) From cdb6e59b1a92346d038d337382cbce2a9eff6d8d Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Mon, 16 Sep 2024 16:09:58 +0300 Subject: [PATCH 30/33] GUI:Update executable path option and add file selection UI --- gui/include/process.h | 10 +++--- gui/include/process_dialog.h | 7 ++-- gui/src/draggable_square.cpp | 21 ++++++++--- gui/src/dummy_program1/config.json | 2 +- gui/src/main_window.cpp | 14 ++++---- gui/src/process.cpp | 12 +++---- gui/src/process_dialog.cpp | 54 +++++++++++++++++++--------- gui/src/simulation_state_manager.cpp | 2 +- gui/test/test_draggable_square.cpp | 4 +-- gui/test/test_main_window.cpp | 2 +- gui/test/test_process.cpp | 8 ++--- gui/test/test_process_dialog.cpp | 10 +++--- 12 files changed, 90 insertions(+), 56 deletions(-) diff --git a/gui/include/process.h b/gui/include/process.h index 6f89f3f6..e58a62a2 100644 --- a/gui/include/process.h +++ b/gui/include/process.h @@ -5,14 +5,14 @@ class Process { public: - Process(int id, const QString &name, const QString &cmakeProject, + Process(int id, const QString &name, const QString &executionFile, const QString &qemuPlatform); Process(); Process(const Process &other); // Copy constructor int getId() const; QString getName() const; - QString getCMakeProject() const; + QString getExecutionFile() const; QString getQEMUPlatform() const; void setId(int newId) { @@ -22,9 +22,9 @@ class Process { { name = newName; } - void setCMakeProject(const QString &newCMakeProject) + void setExecutionFile(const QString &newExecutionFile) { - cmakeProject = newCMakeProject; + executionFile = newExecutionFile; } void setQEMUPlatform(const QString &newQEMUPlatform) { @@ -34,7 +34,7 @@ class Process { private: int id; QString name; - QString cmakeProject; + QString executionFile; QString qemuPlatform; }; diff --git a/gui/include/process_dialog.h b/gui/include/process_dialog.h index 62f20744..2ba9f2a6 100644 --- a/gui/include/process_dialog.h +++ b/gui/include/process_dialog.h @@ -16,13 +16,14 @@ class ProcessDialog : public QDialog { int getId() const; QString getName() const; - QString getCMakeProject() const; + QString getExecutionFile() const; QString getQEMUPlatform() const; bool isValid() const; void setId(int id); void setName(const QString &name); - void setCMakeProject(const QString &cmakeProject); + void setExecutionFile(const QString &executableFile); void setQEMUPlatform(const QString &qemuPlatform); + void selectExecutableFile(); private slots: bool validateAndAccept(); @@ -31,7 +32,7 @@ private slots: private: QLineEdit *idEdit; QLineEdit *nameEdit; - QLineEdit *cmakeProjectEdit; + QLineEdit *executionFile; QComboBox *qemuPlatformCombo; }; diff --git a/gui/src/draggable_square.cpp b/gui/src/draggable_square.cpp index d12dbbcb..46c2b310 100644 --- a/gui/src/draggable_square.cpp +++ b/gui/src/draggable_square.cpp @@ -27,7 +27,7 @@ void DraggableSquare::setSquareColor(const QString &color) { setStyleSheet(color); stopButton->setStyleSheet(QString("background-color: %1; border: none; " - "color: white; font-size: 12px;") + "color: black; font-size: 11px;") .arg(color)); } // constructor @@ -40,6 +40,15 @@ DraggableSquare::DraggableSquare(QWidget *parent, const QString &color, setFixedSize(width, height); setStyleSheet(color); + + label->setStyleSheet("QLabel {" + " color: black;" + " font-size: 10px;" + " font-family: 'Segoe UI', sans-serif;" + " font-weight: bold;" + " text-align: center;" + "}"); + QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(label); layout->addWidget(stopButton); @@ -89,11 +98,15 @@ void DraggableSquare::setProcess(Process *proc) process = proc; if (process) { this->id = process->getId(); - label->setText(QString("ID: %1\nName: %2\nCMake: %3\nQEMU: %4") + QString executionFilePath = process->getExecutionFile(); + + label->setText(QString("ID: %1\nName: %2\nCMake: %3\n") .arg(process->getId()) .arg(process->getName()) - .arg(process->getCMakeProject()) - .arg(process->getQEMUPlatform())); + .arg(executionFilePath)); + + // Set the tooltip to show the full path of the executable file + label->setToolTip(executionFilePath); } } diff --git a/gui/src/dummy_program1/config.json b/gui/src/dummy_program1/config.json index 838e9bc2..9d7e18e6 100644 --- a/gui/src/dummy_program1/config.json +++ b/gui/src/dummy_program1/config.json @@ -1,3 +1,3 @@ { - "ID": 2 + "ID": 5 } diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index 9547db69..10156be0 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -173,7 +173,7 @@ void MainWindow::createNewProcess() return; } Process *newProcess = - new Process(id, dialog.getName(), dialog.getCMakeProject(), + new Process(id, dialog.getName(), dialog.getExecutionFile(), dialog.getQEMUPlatform()); addProcessSquare(newProcess); addId(id); @@ -205,7 +205,7 @@ void MainWindow::addProcessSquare(Process *&process) squarePositions[process->getId()] = pos; squares.push_back(square); - createProcessConfigFile(process->getId(), process->getCMakeProject()); + createProcessConfigFile(process->getId(), process->getExecutionFile()); } void MainWindow::addProcessSquare(Process *process, QPoint position, int width, @@ -427,7 +427,7 @@ void MainWindow::loadSimulation() for (auto sqr : simManager->data.squares) { Process *process = new Process( sqr->getProcess()->getId(), sqr->getProcess()->getName(), - sqr->getProcess()->getCMakeProject(), + sqr->getProcess()->getExecutionFile(), sqr->getProcess()->getQEMUPlatform()); addProcessSquare(process, sqr->pos(), sqr->width(), sqr->height(), sqr->styleSheet()); @@ -510,7 +510,7 @@ void MainWindow::compileProjects() bool compileSuccessful = true; // Track if all compilations succeed for (DraggableSquare *square : squares) { - QString cmakePath = square->getProcess()->getCMakeProject(); + QString cmakePath = square->getProcess()->getExecutionFile(); if (cmakePath.endsWith(".sh")) { // Shell script processing @@ -684,7 +684,7 @@ void MainWindow::runProjects() { updateTimer(); for (DraggableSquare *square : squares) { - QString cmakePath = square->getProcess()->getCMakeProject(); + QString cmakePath = square->getProcess()->getExecutionFile(); if (cmakePath.endsWith(".sh")) { // Run the shell script @@ -754,14 +754,14 @@ void MainWindow::editSquare(int id) ProcessDialog dialog(this); dialog.setId(square->getProcess()->getId()); dialog.setName(square->getProcess()->getName()); - dialog.setCMakeProject(square->getProcess()->getCMakeProject()); + dialog.setExecutionFile(square->getProcess()->getExecutionFile()); dialog.setQEMUPlatform(square->getProcess()->getQEMUPlatform()); if (dialog.exec() == QDialog::Accepted && dialog.isValid()) { // Update the process details // square->setProcess(Process(dialog.getId(), dialog.getName(), dialog.getCMakeProject(), dialog.getQEMUPlatform())); Process *updatedProcess = new Process( - dialog.getId(), dialog.getName(), dialog.getCMakeProject(), + dialog.getId(), dialog.getName(), dialog.getExecutionFile(), dialog.getQEMUPlatform()); square->setProcess(updatedProcess); guiLogger.logMessage(logger::LogLevel::INFO, diff --git a/gui/src/process.cpp b/gui/src/process.cpp index 6f55bf42..ea940f48 100644 --- a/gui/src/process.cpp +++ b/gui/src/process.cpp @@ -1,9 +1,9 @@ #include "process.h" #include "main_window.h" -Process::Process(int id, const QString &name, const QString &cmakeProject, +Process::Process(int id, const QString &name, const QString &executionFile, const QString &qemuPlatform) - : id(id), name(name), cmakeProject(cmakeProject), qemuPlatform(qemuPlatform) + : id(id), name(name), executionFile(executionFile), qemuPlatform(qemuPlatform) { MainWindow::guiLogger.logMessage( logger::LogLevel::INFO, @@ -14,7 +14,7 @@ Process::Process(int id, const QString &name, const QString &cmakeProject, Process::Process(const Process &other) : id(other.id), name(other.name), - cmakeProject(other.cmakeProject), + executionFile(other.executionFile), qemuPlatform(other.qemuPlatform) { MainWindow::guiLogger.logMessage( @@ -22,7 +22,7 @@ Process::Process(const Process &other) "Process copied with ID: " + std::to_string(other.id)); } -Process::Process() : id(-1), name(""), cmakeProject(""), qemuPlatform("") {} +Process::Process() : id(-1), name(""), executionFile(""), qemuPlatform("") {} int Process::getId() const { @@ -34,9 +34,9 @@ QString Process::getName() const return name; } -QString Process::getCMakeProject() const +QString Process::getExecutionFile() const { - return cmakeProject; + return executionFile; } QString Process::getQEMUPlatform() const diff --git a/gui/src/process_dialog.cpp b/gui/src/process_dialog.cpp index 1432fcfe..d922f976 100644 --- a/gui/src/process_dialog.cpp +++ b/gui/src/process_dialog.cpp @@ -26,28 +26,33 @@ ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) layout->addWidget(nameLabel); layout->addWidget(nameEdit); - QLabel *cmakeProjectLabel = new QLabel("CMake Project:"); - cmakeProjectEdit = new QLineEdit(this); - layout->addWidget(cmakeProjectLabel); - layout->addWidget(cmakeProjectEdit); + QLabel *executableFileLabel = new QLabel("Executable File:"); + executionFile = new QLineEdit(this); + executionFile->setReadOnly(true); + layout->addWidget(executableFileLabel); + layout->addWidget(executionFile); + + QPushButton *selectExecutableFileButton = new QPushButton("Select File", this); + layout->addWidget(selectExecutableFileButton); QLabel *qemuPlatformLabel = new QLabel("QEMU Platform:"); qemuPlatformCombo = new QComboBox(this); qemuPlatformCombo->addItems({"x86_64", "arm", "aarch64"}); + qemuPlatformCombo->setEnabled(false); + + // Adding widgets to layout layout->addWidget(qemuPlatformLabel); layout->addWidget(qemuPlatformCombo); + // Currently, hardware selection is not needed, so the widgets are hidden. + // If you need to use this in the future, remove the following lines: + qemuPlatformCombo->setVisible(false); + qemuPlatformLabel->setVisible(false); + QRegExp regex("[a-zA-Z0-9]*"); // Allows only English letters and numbers QRegExpValidator *validator = new QRegExpValidator(regex, this); - QRegExp cmakeProjectRegex( - "[\\x20-\\x7E]*"); // Allows any printable ASCII character - QRegExpValidator *cmakeProjectValidator = - new QRegExpValidator(cmakeProjectRegex, this); - nameEdit->setValidator(validator); - cmakeProjectEdit->setValidator(cmakeProjectValidator); - // qemuPlatformEdit->setValidator(validator); QHBoxLayout *buttonLayout = new QHBoxLayout(); QPushButton *okButton = new QPushButton("OK", this); @@ -60,9 +65,21 @@ ProcessDialog::ProcessDialog(QWidget *parent) : QDialog(parent) &ProcessDialog::validateAndAccept); connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject); + connect(selectExecutableFileButton, &QPushButton::clicked, this, &ProcessDialog::selectExecutableFile); // Changed the connection for file selection + setLayout(layout); } +void ProcessDialog::selectExecutableFile() +{ + QString fileName = QFileDialog::getOpenFileName(this, "Select Executable File", "", + "Executable Files (*.sh *.cmake);;Text Files (*.txt)"); + if (!fileName.isEmpty()) { + executionFile->setText(fileName); // Update the renamed QLineEdit + } +} + + int ProcessDialog::getId() const { return idEdit->text().toInt(); @@ -73,9 +90,9 @@ QString ProcessDialog::getName() const return nameEdit->text(); } -QString ProcessDialog::getCMakeProject() const +QString ProcessDialog::getExecutionFile() const { - return cmakeProjectEdit->text(); + return executionFile->text(); } QString ProcessDialog::getQEMUPlatform() const @@ -85,8 +102,11 @@ QString ProcessDialog::getQEMUPlatform() const bool ProcessDialog::isValid() const { + if (!idEdit || !nameEdit || !executionFile || !qemuPlatformCombo) { + return false; + } return !idEdit->text().isEmpty() && !nameEdit->text().isEmpty() && - !cmakeProjectEdit->text().isEmpty() && + !executionFile->text().isEmpty() && !qemuPlatformCombo->currentText().isEmpty(); } @@ -102,7 +122,7 @@ bool ProcessDialog::validateAndAccept() logger::LogLevel::DEBUG, "Entered values: ID = " + idEdit->text().toStdString() + ", Name = " + nameEdit->text().toStdString() + - ", CMake Project = " + cmakeProjectEdit->text().toStdString() + + ", Executable File = " + executionFile->text().toStdString() + ", QEMU Platform = " + qemuPlatformCombo->currentText().toStdString()); accept(); @@ -127,9 +147,9 @@ void ProcessDialog::setName(const QString &name) nameEdit->setText(name); } -void ProcessDialog::setCMakeProject(const QString &cmakeProject) +void ProcessDialog::setExecutionFile(const QString &executableFile) { - cmakeProjectEdit->setText(cmakeProject); + executionFile->setText(executableFile); } void ProcessDialog::setQEMUPlatform(const QString &qemuPlatform) diff --git a/gui/src/simulation_state_manager.cpp b/gui/src/simulation_state_manager.cpp index 303f5921..b4a884b7 100644 --- a/gui/src/simulation_state_manager.cpp +++ b/gui/src/simulation_state_manager.cpp @@ -77,7 +77,7 @@ void SimulationStateManager::saveSimulationState( square->getProcess()->getName().toStdString().c_str()); BSON_APPEND_UTF8( &squareBson, "CMakeProject", - square->getProcess()->getCMakeProject().toStdString().c_str()); + square->getProcess()->getExecutionFile().toStdString().c_str()); BSON_APPEND_UTF8( &squareBson, "QEMUPlatform", square->getProcess()->getQEMUPlatform().toStdString().c_str()); diff --git a/gui/test/test_draggable_square.cpp b/gui/test/test_draggable_square.cpp index 53c6bc2a..481c6ca9 100644 --- a/gui/test/test_draggable_square.cpp +++ b/gui/test/test_draggable_square.cpp @@ -46,8 +46,8 @@ void DraggableSquareTest::testSetProcess() { QCOMPARE(draggableSquare->getProcess()->getId(), testProcess->getId()); QCOMPARE(draggableSquare->getProcess()->getName(), testProcess->getName()); - QCOMPARE(draggableSquare->getProcess()->getCMakeProject(), - testProcess->getCMakeProject()); + QCOMPARE(draggableSquare->getProcess()->getExecutionFile(), + testProcess->getExecutionFile()); QCOMPARE(draggableSquare->getProcess()->getQEMUPlatform(), testProcess->getQEMUPlatform()); } diff --git a/gui/test/test_main_window.cpp b/gui/test/test_main_window.cpp index bccfea17..4bc380af 100644 --- a/gui/test/test_main_window.cpp +++ b/gui/test/test_main_window.cpp @@ -49,7 +49,7 @@ void TestMainWindow::testCreateNewProcess() Process *retrievedProcess = window->getProcessById(newProcessId); QVERIFY(retrievedProcess != nullptr); QCOMPARE(retrievedProcess->getName(), processName); - QCOMPARE(retrievedProcess->getCMakeProject(), cmakeProject); + QCOMPARE(retrievedProcess->getExecutionFile(), cmakeProject); QCOMPARE(retrievedProcess->getQEMUPlatform(), qemuPlatform); // Cleanup for this specific test diff --git a/gui/test/test_process.cpp b/gui/test/test_process.cpp index a60bf09c..452b5ee0 100644 --- a/gui/test/test_process.cpp +++ b/gui/test/test_process.cpp @@ -10,7 +10,7 @@ private slots: Process process(1, "Test Process", "TestProject", "TestPlatform"); QCOMPARE(process.getId(), 1); QCOMPARE(process.getName(), QString("Test Process")); - QCOMPARE(process.getCMakeProject(), QString("TestProject")); + QCOMPARE(process.getExecutionFile(), QString("TestProject")); QCOMPARE(process.getQEMUPlatform(), QString("TestPlatform")); } @@ -19,7 +19,7 @@ private slots: Process process; QCOMPARE(process.getId(), -1); QCOMPARE(process.getName(), QString("")); - QCOMPARE(process.getCMakeProject(), QString("")); + QCOMPARE(process.getExecutionFile(), QString("")); QCOMPARE(process.getQEMUPlatform(), QString("")); } @@ -28,12 +28,12 @@ private slots: Process process; process.setId(2); process.setName("New Process"); - process.setCMakeProject("NewProject"); + process.setExecutionFile("NewProject"); process.setQEMUPlatform("NewPlatform"); QCOMPARE(process.getId(), 2); QCOMPARE(process.getName(), QString("New Process")); - QCOMPARE(process.getCMakeProject(), QString("NewProject")); + QCOMPARE(process.getExecutionFile(), QString("NewProject")); QCOMPARE(process.getQEMUPlatform(), QString("NewPlatform")); } }; diff --git a/gui/test/test_process_dialog.cpp b/gui/test/test_process_dialog.cpp index e61c6502..4b5f3255 100644 --- a/gui/test/test_process_dialog.cpp +++ b/gui/test/test_process_dialog.cpp @@ -19,11 +19,11 @@ private slots: QCOMPARE(dialog.getName(), "Test Process"); } - void testGetCMakeProject() + void testGetExecutionFile() { ProcessDialog dialog; - dialog.setCMakeProject("TestProject"); - QCOMPARE(dialog.getCMakeProject(), "TestProject"); + dialog.setExecutionFile("TestProject"); + QCOMPARE(dialog.getExecutionFile(), "TestProject"); } void testGetQEMUPlatform() @@ -38,7 +38,7 @@ private slots: ProcessDialog dialog; dialog.setId(123); dialog.setName("Test Process"); - dialog.setCMakeProject("TestProject"); + dialog.setExecutionFile("TestProject"); dialog.setQEMUPlatform("x86"); QVERIFY(dialog.isValid()); } @@ -48,7 +48,7 @@ private slots: ProcessDialog dialog; dialog.setId(123); dialog.setName("Test Process"); - dialog.setCMakeProject("TestProject"); + dialog.setExecutionFile("TestProject"); dialog.setQEMUPlatform("x86"); // Assuming true indicates validation success QVERIFY(dialog.validateAndAccept() == true); From 955c098c53375e108ad2c57eef168b61be031c81 Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Mon, 16 Sep 2024 17:48:55 +0300 Subject: [PATCH 31/33] GUI:Handle missing build directory creation and execute program from correct path --- gui/src/main_window.cpp | 58 +++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/gui/src/main_window.cpp b/gui/src/main_window.cpp index 10156be0..dc66a19f 100644 --- a/gui/src/main_window.cpp +++ b/gui/src/main_window.cpp @@ -112,28 +112,28 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer(nullptr) "}"; Process *mainProcess = - new Process(id, "Main", "../src/dummy_program1", "QEMUPlatform"); + new Process(id, "Main", "../src/dummy_program1/CMakeLists.txt", "QEMUPlatform"); addProcessSquare( mainProcess, QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), sizeSquare, sizeSquare, styleSheet); addId(id++); Process *hsmProcess = - new Process(id, "HSM", "../src/dummy_program2", "QEMUPlatform"); + new Process(id, "HSM", "../src/dummy_program2/CMakeLists.txt", "QEMUPlatform"); addProcessSquare( hsmProcess, QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), sizeSquare, sizeSquare, styleSheet); addId(id++); Process *logsDbProcess = - new Process(id, "LogsDb", "../src/dummy_program1", "QEMUPlatform"); + new Process(id, "LogsDb", "../src/dummy_program1/CMakeLists.txt", "QEMUPlatform"); addProcessSquare( logsDbProcess, QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), sizeSquare, sizeSquare, styleSheet); addId(id++); Process *busManagerProcess = - new Process(id, "Bus_Manager", "../src/dummy_program2", "QEMUPlatform"); + new Process(id, "Bus_Manager", "../src/dummy_program2/CMakeLists.txt", "QEMUPlatform"); addProcessSquare( busManagerProcess, QPoint((id % 2) * (sizeSquare + 10), (id / 2) * (sizeSquare + 10)), @@ -510,18 +510,20 @@ void MainWindow::compileProjects() bool compileSuccessful = true; // Track if all compilations succeed for (DraggableSquare *square : squares) { - QString cmakePath = square->getProcess()->getExecutionFile(); + QString executionFilePath = square->getProcess()->getExecutionFile(); + QFileInfo fileInfo(executionFilePath); + QString directoryPath = fileInfo.absolutePath(); - if (cmakePath.endsWith(".sh")) { + if (executionFilePath.endsWith(".sh")) { // Shell script processing - QFile scriptFile(cmakePath); + QFile scriptFile(executionFilePath); if (!scriptFile.exists()) { guiLogger.logMessage(logger::LogLevel::ERROR, "Shell script file does not exist: " + - cmakePath.toStdString()); + executionFilePath.toStdString()); logOutput->append("Shell script file does not exist: " + - cmakePath); + executionFilePath); compileSuccessful = false; continue; } @@ -530,22 +532,22 @@ void MainWindow::compileProjects() // Make the script executable QProcess makeExecutableProcess; makeExecutableProcess.start("chmod", QStringList() - << "+x" << cmakePath); + << "+x" << executionFilePath); if (!makeExecutableProcess.waitForFinished()) { logOutput->append("Failed to make the script executable: " + - cmakePath); + executionFilePath); compileSuccessful = false; continue; } guiLogger.logMessage( logger::LogLevel::INFO, - "Script is now executable: " + cmakePath.toStdString()); - logOutput->append("Script is now executable: " + cmakePath); + "Script is now executable: " + executionFilePath.toStdString()); + logOutput->append("Script is now executable: " + executionFilePath); } // Run the shell script QProcess *scriptProcess = new QProcess(this); - scriptProcess->start("bash", QStringList() << cmakePath); + scriptProcess->start("bash", QStringList() << executionFilePath); connect( scriptProcess, QOverload::of(&QProcess::finished), @@ -563,12 +565,11 @@ void MainWindow::compileProjects() } else { guiLogger.logMessage(logger::LogLevel::INFO, - "Compiling " + cmakePath.toStdString()); + "Compiling " + executionFilePath.toStdString()); // CMake project processing - logOutput->append("Compiling " + cmakePath); - QDir cmakeDir(cmakePath); - QString buildDirPath = cmakeDir.absoluteFilePath("build"); + logOutput->append("Compiling " + executionFilePath); + QString buildDirPath = QDir(directoryPath).absoluteFilePath("build"); QDir buildDir(buildDirPath); if (buildDir.exists()) { @@ -684,12 +685,12 @@ void MainWindow::runProjects() { updateTimer(); for (DraggableSquare *square : squares) { - QString cmakePath = square->getProcess()->getExecutionFile(); + QString executionFilePath = square->getProcess()->getExecutionFile(); - if (cmakePath.endsWith(".sh")) { + if (executionFilePath.endsWith(".sh")) { // Run the shell script QProcess *scriptProcess = new QProcess(this); - scriptProcess->start("bash", QStringList() << cmakePath); + scriptProcess->start("bash", QStringList() << executionFilePath); connect( scriptProcess, &QProcess::readyReadStandardOutput, [this, scriptProcess]() { @@ -703,8 +704,21 @@ void MainWindow::runProjects() } else { // Run the compiled program - QDir cmakeDir(cmakePath); + QDir cmakeDir = QFileInfo(executionFilePath).absoluteDir(); QString buildDirPath = cmakeDir.absoluteFilePath("build"); + + if (!QDir(buildDirPath).exists()) { + // Create the build directory if it does not exist + if (!cmakeDir.mkpath(buildDirPath)) { + guiLogger.logMessage(logger::LogLevel::ERROR, + "Failed to create build directory: " + + buildDirPath.toStdString()); + logOutput->append("Failed to create build directory: " + + buildDirPath); + continue; + } + } + QDir buildDir(buildDirPath); QString exeFile = getExecutableName(buildDirPath); QString executablePath = buildDir.absoluteFilePath(exeFile); From 7801aa1724ed1357006532d6a7408cfca931180e Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Wed, 18 Sep 2024 14:35:12 +0300 Subject: [PATCH 32/33] GUI: Fix logger files to comply with coding conventions --- logger/logger.cpp | 193 +++++++++++++++++++++++++--------------------- logger/logger.h | 46 +++++------ 2 files changed, 126 insertions(+), 113 deletions(-) diff --git a/logger/logger.cpp b/logger/logger.cpp index ec9bff7b..4bb1d488 100644 --- a/logger/logger.cpp +++ b/logger/logger.cpp @@ -6,114 +6,127 @@ std::chrono::system_clock::time_point logger::initTime = std::chrono::system_clock::now(); std::string logger::componentName = "out"; -logger::logger(std::string componentName) { - logger::componentName = componentName; +logger::logger(std::string componentName) +{ + logger::componentName = componentName; } -void logger::initializeLogFile() { - if (isInitialized) - return; - - auto time = std::chrono::system_clock::to_time_t(initTime); - std::tm tm = *std::localtime(&time); - - std::ostringstream oss; - oss << "" << std::put_time(&tm, "%Y_%m_%d_%H_%M_%S") << "_" << componentName - << ".log"; - logFileName = oss.str(); - - std::ofstream sharedFile(sharedLogFileName, std::ios::out | std::ios::trunc); - if (sharedFile) { - sharedFile << logFileName; - } else { - std::cerr << logLevelToString(LogLevel::ERROR) - << "Failed to open shared log file name file" << std::endl; - } - - isInitialized = true; +void logger::initializeLogFile() +{ + if (isInitialized) + return; + + auto time = std::chrono::system_clock::to_time_t(initTime); + std::tm tm = *std::localtime(&time); + + std::ostringstream oss; + oss << "" << std::put_time(&tm, "%Y_%m_%d_%H_%M_%S") << "_" << componentName + << ".log"; + logFileName = oss.str(); + + std::ofstream sharedFile(sharedLogFileName, + std::ios::out | std::ios::trunc); + if (sharedFile) { + sharedFile << logFileName; + } + else { + std::cerr << logLevelToString(LogLevel::ERROR) + << "Failed to open shared log file name file" << std::endl; + } + + isInitialized = true; } -std::string logger::getLogFileName() { - if (!isInitialized) { +std::string logger::getLogFileName() +{ if (!isInitialized) { - std::ifstream sharedFile(sharedLogFileName); - if (sharedFile) { - std::getline(sharedFile, logFileName); - } - if (logFileName.empty()) { - initializeLogFile(); - } + if (!isInitialized) { + std::ifstream sharedFile(sharedLogFileName); + if (sharedFile) { + std::getline(sharedFile, logFileName); + } + if (logFileName.empty()) { + initializeLogFile(); + } + } } - } - return logFileName; + return logFileName; } -void logger::cleanUp() { std::remove(sharedLogFileName.c_str()); } - -std::string logger::logLevelToString(LogLevel level) { - switch (level) { - case LogLevel::ERROR: - return "[ERROR]"; - case LogLevel::INFO: - return "[INFO]"; - case LogLevel::DEBUG: - return "[DEBUG]"; - default: - return "[UNKNOWN]"; - } +void logger::cleanUp() +{ + std::remove(sharedLogFileName.c_str()); } -bool logger::shouldLog(LogLevel level) { - switch (LOG_LEVEL) { - case LogLevel::ERROR: - return level == LogLevel::ERROR; - case LogLevel::INFO: - return level == LogLevel::ERROR || level == LogLevel::INFO; - case LogLevel::DEBUG: - return true; - default: - return false; - } +std::string logger::logLevelToString(LogLevel level) +{ + switch (level) { + case LogLevel::ERROR: + return "[ERROR]"; + case LogLevel::INFO: + return "[INFO]"; + case LogLevel::DEBUG: + return "[DEBUG]"; + default: + return "[UNKNOWN]"; + } } -std::string logger::getElapsedTime() { - auto now = std::chrono::system_clock::now(); - auto elapsed = - std::chrono::duration_cast(now - initTime) - .count(); - return std::to_string(elapsed) + "ns"; +bool logger::shouldLog(LogLevel level) +{ + switch (LOG_LEVEL) { + case LogLevel::ERROR: + return level == LogLevel::ERROR; + case LogLevel::INFO: + return level == LogLevel::ERROR || level == LogLevel::INFO; + case LogLevel::DEBUG: + return true; + default: + return false; + } +} + +std::string logger::getElapsedTime() +{ + auto now = std::chrono::system_clock::now(); + auto elapsed = + std::chrono::duration_cast(now - initTime) + .count(); + return std::to_string(elapsed) + "ns"; } void logger::logMessage(LogLevel level, std::string src, std::string dst, - const std::string &message) { - if (!shouldLog(level)) - return; - - std::lock_guard guard(logMutex); - std::ofstream logFile(getLogFileName(), std::ios_base::app); - if (!logFile) { - std::cerr << logLevelToString(LogLevel::ERROR) << "Failed to open log file" - << std::endl; - return; - } - logFile << "[" << getElapsedTime() << "] " << logLevelToString(level) << " " - << "SRC " << src << " " - << "DST " << dst << " " << message << std::endl; + const std::string &message) +{ + if (!shouldLog(level)) + return; + + std::lock_guard guard(logMutex); + std::ofstream logFile(getLogFileName(), std::ios_base::app); + if (!logFile) { + std::cerr << logLevelToString(LogLevel::ERROR) + << "Failed to open log file" << std::endl; + return; + } + logFile << "[" << getElapsedTime() << "] " << logLevelToString(level) << " " + << "SRC " << src << " " + << "DST " << dst << " " << message << std::endl; } -void logger::logMessage(LogLevel level, const std::string &message) { - if (!shouldLog(level)) - return; +void logger::logMessage(LogLevel level, const std::string &message) +{ + if (!shouldLog(level)) + return; - std::lock_guard guard(logMutex); + std::lock_guard guard(logMutex); - std::ofstream logFile(getLogFileName(), std::ios_base::app); - if (!logFile) { - std::cerr << logLevelToString(LogLevel::ERROR) << "Failed to open log file" - << std::endl; - return; - } + std::ofstream logFile(getLogFileName(), std::ios_base::app); + if (!logFile) { + std::cerr << logLevelToString(LogLevel::ERROR) + << "Failed to open log file" << std::endl; + return; + } - logFile << "[" << getElapsedTime() << "] " << logLevelToString(level) << " " - << message << std::endl; + logFile << "[" << getElapsedTime() << "] " << logLevelToString(level) << " " + << message << std::endl; } \ No newline at end of file diff --git a/logger/logger.h b/logger/logger.h index 918d249f..305ea21e 100644 --- a/logger/logger.h +++ b/logger/logger.h @@ -15,30 +15,30 @@ class logger { public: - enum class LogLevel { - ERROR, - INFO, - DEBUG, - }; - logger() {} - logger(std::string componentName); - void logMessage(LogLevel level, const std::string &message); - void logMessage(LogLevel level, std::string src, std::string dst, - const std::string &message); - void initializeLogFile(); - std::string getLogFileName(); - std::string sharedLogFileName = "shared_log_file_name.txt"; - void cleanUp(); + enum class LogLevel { + ERROR, + INFO, + DEBUG, + }; + logger() {} + logger(std::string componentName); + void logMessage(LogLevel level, const std::string &message); + void logMessage(LogLevel level, std::string src, std::string dst, + const std::string &message); + void initializeLogFile(); + std::string getLogFileName(); + std::string sharedLogFileName = "shared_log_file_name.txt"; + void cleanUp(); private: - static std::string logLevelToString(LogLevel level); - static bool shouldLog(LogLevel level); - static std::string getElapsedTime(); - static std::string componentName; - static std::string logFileName; - bool isInitialized = false; - static std::mutex logMutex; - static std::chrono::system_clock::time_point initTime; + static std::string logLevelToString(LogLevel level); + static bool shouldLog(LogLevel level); + static std::string getElapsedTime(); + static std::string componentName; + static std::string logFileName; + bool isInitialized = false; + static std::mutex logMutex; + static std::chrono::system_clock::time_point initTime; }; -#endif // LOGGER_H \ No newline at end of file +#endif // LOGGER_H \ No newline at end of file From 8d38b26ce9378d22267cc87786789ccd9bd0f2dc Mon Sep 17 00:00:00 2001 From: Chaya Roten Date: Wed, 18 Sep 2024 14:45:49 +0300 Subject: [PATCH 33/33] GUI: Move log files into a separate organized directory --- logger/logger.cpp | 30 ++++++++++++++++++++++++++++-- logger/logger.h | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/logger/logger.cpp b/logger/logger.cpp index 4bb1d488..579e9374 100644 --- a/logger/logger.cpp +++ b/logger/logger.cpp @@ -1,26 +1,52 @@ +#include +#include +#include +#include +#include +#include +#include +#include #include "logger.h" + std::string logger::logFileName; std::mutex logger::logMutex; std::chrono::system_clock::time_point logger::initTime = std::chrono::system_clock::now(); std::string logger::componentName = "out"; +std::string logger::logDirectory = "./logs/"; logger::logger(std::string componentName) { logger::componentName = componentName; } + +// Function to create the log directory if it doesn't exist +void logger::createLogDirectory() { + struct stat info; + if (stat(logDirectory.c_str(), &info) != 0) { + // Directory doesn't exist - create it + #ifdef _WIN32 + _mkdir(logDirectory.c_str()); + #else + mkdir(logDirectory.c_str(), 0755); // Linux/Unix permissions + #endif + } +} + void logger::initializeLogFile() { if (isInitialized) return; + // Create the directory (if it doesn't exist) + createLogDirectory(); + auto time = std::chrono::system_clock::to_time_t(initTime); std::tm tm = *std::localtime(&time); std::ostringstream oss; - oss << "" << std::put_time(&tm, "%Y_%m_%d_%H_%M_%S") << "_" << componentName - << ".log"; + oss << logDirectory << std::put_time(&tm, "%Y_%m_%d_%H_%M_%S") << ".log"; logFileName = oss.str(); std::ofstream sharedFile(sharedLogFileName, diff --git a/logger/logger.h b/logger/logger.h index 305ea21e..865731ea 100644 --- a/logger/logger.h +++ b/logger/logger.h @@ -29,6 +29,7 @@ class logger { std::string getLogFileName(); std::string sharedLogFileName = "shared_log_file_name.txt"; void cleanUp(); + void createLogDirectory(); private: static std::string logLevelToString(LogLevel level); @@ -39,6 +40,7 @@ class logger { bool isInitialized = false; static std::mutex logMutex; static std::chrono::system_clock::time_point initTime; + static std::string logDirectory; }; #endif // LOGGER_H \ No newline at end of file