matchLenList;
+ /**
+ * The current index used for tracking the position within a list or array.
+ * This variable is typically used to keep track of the current item being
+ * processed or displayed.
+ */
+ private int currentIndex;
+
+ // ========================================
+ // Constructors
+ // ========================================
+ /**
+ * Constructs a new FindBar with the specified JXEditorPane.
+ *
+ *
+ * The FindBar consists of a JTextField for entering the search text, and two buttons
+ * for navigating to the next and previous matches. It also highlights the current match
+ * in the editor pane.
+ *
+ *
+ *
+ * Features:
+ *
+ *
+ * - Real-time search and highlight as the user types in the search field.
+ * - Navigation buttons to find the next and previous matches.
+ *
+ *
+ * @param editorPane The JXEditorPane in which the search will be performed.
+ */
+ public FindBar(JXEditorPane editorPane) {
+ this.editorPane = editorPane;
+ setLayout(new FlowLayout(FlowLayout.LEFT));
+
+ searchField = new JTextField(20);
+ findNextButton = new JButton("Find Next");
+ findPreviousButton = new JButton("Find Previous");
+
+ // Add a DocumentListener to the search field to trigger search and highlight on
+ // text change as real-time search.
+ // The search field background color is set to red if no matches are found
+ // otherwise it is set to white.
+ searchField.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ searchAndHighlight();
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ searchAndHighlight();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ searchAndHighlight();
+ }
+
+ private void searchAndHighlight() {
+ String searchText = searchField.getText();
+ findMatches(searchText);
+ highlightCurrentMatch();
+ if (matchPosList == null || matchPosList.isEmpty()) {
+ searchField.setBackground(Color.RED);
+ } else {
+ searchField.setBackground(Color.WHITE);
+ }
+ }
+ });
+
+ // Add an ActionListener to the search field to trigger search and highlight on Enter key press.
+ searchField.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ String searchText = searchField.getText();
+ findMatches(searchText);
+ highlightCurrentMatch();
+ }
+ });
+
+ // Add ActionListeners to the find next button.
+ findNextButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (matchPosList != null && !matchPosList.isEmpty()) {
+ currentIndex = (currentIndex + 1) % matchPosList.size();
+ highlightCurrentMatch();
+ }
+ }
+ });
+
+ // Add ActionListeners to the find previous button.
+ findPreviousButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (matchPosList != null && !matchPosList.isEmpty()) {
+ currentIndex = (currentIndex - 1 + matchPosList.size()) % matchPosList.size();
+ highlightCurrentMatch();
+ }
+ }
+ });
+
+ add(new JLabel("Find:"));
add(searchField);
- add(findNext);
- add(findPrevious);
- }
-
- private void buildBarWithOption() {
- //anchorCheck = new JCheckBox("Anchor");
- //anchorCheck.addActionListener(this);
-
- wrapCheck = new JCheckBox();
- backCheck = new JCheckBox();
- Box lBox = new Box(BoxLayout.LINE_AXIS);
- //lBox.add(anchorCheck);
- lBox.add(matchCheck);
- lBox.add(wrapCheck);
- lBox.add(backCheck);
- lBox.setAlignmentY(Component.TOP_ALIGNMENT);
-
- Box mBox = new Box(BoxLayout.LINE_AXIS);
- mBox.add(searchLabel);
- mBox.add(new JLabel(": "));
- mBox.add(searchField);
- mBox.add(findNext);
- mBox.add(findPrevious);
- mBox.setAlignmentY(Component.TOP_ALIGNMENT);
-
- setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
-
- add(lBox);
- add(mBox);
- }
-
- public void actionPerformed(ActionEvent e) {
- /*if (e.getSource() == anchorCheck) {
- if (anchorCheck.isSelected()) {
- getPatternModel().setRegexCreatorKey(PatternModel.REGEX_ANCHORED);
- } else {
- getPatternModel().setMatchRule(PatternModel.REGEX_MATCH_RULES);
- }
- }*/
- }
-}
+ add(findNextButton);
+ add(findPreviousButton);
+ }
+
+ // ========================================
+ // Set/Get methods
+ // ========================================
+
+ // ========================================
+ // Methods
+ // ========================================
+ /**
+ * Finds and highlights all matches of the given search text in the editor pane.
+ *
+ * @param searchText The text to search for within the editor pane.
+ * @throws PatternSyntaxException If the regular expression's syntax is invalid.
+ * @throws BadLocationException If the document's text cannot be retrieved.
+ */
+ private void findMatches(String searchText) {
+ try {
+ Highlighter highlighter = editorPane.getHighlighter();
+ Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
+ highlighter.removeAllHighlights();
+
+ Document doc = editorPane.getDocument();
+ String text = doc.getText(0, doc.getLength());
+ matchPosList = new ArrayList<>();
+ matchLenList = new ArrayList<>();
+ Pattern pattern = Pattern.compile(searchText, Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(text);
+
+ // Find all matches of the search text in the document.
+ // Add the start to matchPosList and the length to matchLenList.
+ while (matcher.find()) {
+ matchPosList.add(matcher.start());
+ matchLenList.add(matcher.end() - matcher.start());
+ }
+
+ // Reset the current index to 0 and highlight the first match if available.
+ currentIndex = 0;
+ if (!matchPosList.isEmpty()) {
+ // Highlight the current match.
+ int pos = matchPosList.get(currentIndex);
+ highlighter.addHighlight(pos, pos + matchLenList.get(currentIndex), painter);
+ // Set the caret position to the start of the current match.
+ editorPane.setCaretPosition(pos);
+ }
+ } catch (PatternSyntaxException e) {
+ JOptionPane.showMessageDialog(this, "Invalid regular expression: " + e.getDescription(), "Error",
+ JOptionPane.ERROR_MESSAGE);
+ } catch (BadLocationException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Highlights the current match in the editor pane.
+ *
+ * This method uses the Highlighter to highlight the text in the editor pane
+ * that matches the current search term. It removes any existing highlights
+ * before applying the new highlight. If there are positions available in the
+ * list, it highlights the text at the current index position and sets the
+ * caret position to the start of the highlighted text.
+ *
+ * @throws BadLocationException if the position is invalid in the document model
+ */
+ private void highlightCurrentMatch() {
+ try {
+ Highlighter highlighter = editorPane.getHighlighter();
+ Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
+ highlighter.removeAllHighlights();
+
+ if (matchPosList != null && !matchPosList.isEmpty()) {
+ int pos = matchPosList.get(currentIndex);
+ // Highlight the current match.
+ highlighter.addHighlight(pos, pos + searchField.getText().length(), painter);
+ // Set the caret position to the start of the current match.
+ editorPane.setCaretPosition(pos);
+ }
+ } catch (BadLocationException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/trick_source/java/src/main/java/trick/sie/SieApplication.java b/trick_source/java/src/main/java/trick/sie/SieApplication.java
index 4d772792d..f0fd71fd4 100644
--- a/trick_source/java/src/main/java/trick/sie/SieApplication.java
+++ b/trick_source/java/src/main/java/trick/sie/SieApplication.java
@@ -444,7 +444,7 @@ private void setupForViewingEnumeratedTypes(JComponent comp, Collection roots = new ConcurrentLinkedQueue(rootTemplates);
executorService = Executors.newFixedThreadPool(threads);
diff --git a/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java b/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java
index b6b0ae9c6..8a77fd743 100644
--- a/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java
+++ b/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java
@@ -1207,7 +1207,9 @@ private JPanel createStatusMsgPanel() {
Font font = new Font("Monospaced", Font.PLAIN, curr_font_size);
statusMsgPane.setFont(font);
- JPanel statusMsgPanel = UIUtils.createSearchableTitledPanel("Status Messages", statusMsgPane, new FindBar(statusMsgPane.getSearchable()));
+ // Create a customized search bar for the status message pane.
+ FindBar findBar = new FindBar(statusMsgPane);
+ JPanel statusMsgPanel = UIUtils.createSearchableTitledPanel("Status Messages", statusMsgPane, findBar);
return statusMsgPanel;
}
diff --git a/trick_source/sim_services/DataRecord/DRAscii.cpp b/trick_source/sim_services/DataRecord/DRAscii.cpp
index 1d6f80ceb..55ce144a2 100644
--- a/trick_source/sim_services/DataRecord/DRAscii.cpp
+++ b/trick_source/sim_services/DataRecord/DRAscii.cpp
@@ -18,7 +18,7 @@
#include "trick/message_type.h"
#include "trick/bitfield_proto.h"
-Trick::DRAscii::DRAscii( std::string in_name ) : Trick::DataRecordGroup( in_name ) {
+Trick::DRAscii::DRAscii( std::string in_name, Trick::DR_Type dr_type ) : Trick::DataRecordGroup( in_name, dr_type ) {
ascii_float_format = "%20.8g" ;
ascii_double_format = "%20.16g" ;
diff --git a/trick_source/sim_services/DataRecord/DRBinary.cpp b/trick_source/sim_services/DataRecord/DRBinary.cpp
index eaa8f314a..2b9b2038a 100644
--- a/trick_source/sim_services/DataRecord/DRBinary.cpp
+++ b/trick_source/sim_services/DataRecord/DRBinary.cpp
@@ -22,7 +22,7 @@
Other classes inherit from DRBinary. In these cases, we don't want to register the memory as DRBinary,
so register_group will be set to false.
*/
-Trick::DRBinary::DRBinary( std::string in_name , bool register_group ) : Trick::DataRecordGroup(in_name) {
+Trick::DRBinary::DRBinary( std::string in_name, bool register_group, Trick::DR_Type dr_type ) : Trick::DataRecordGroup(in_name, dr_type) {
if ( register_group ) {
register_group_with_mm(this, "Trick::DRBinary") ;
}
@@ -190,4 +190,4 @@ int Trick::DRBinary::format_specific_shutdown() {
close(fd) ;
}
return(0) ;
-}
\ No newline at end of file
+}
diff --git a/trick_source/sim_services/DataRecord/DRHDF5.cpp b/trick_source/sim_services/DataRecord/DRHDF5.cpp
index 8f70f1966..0ea955f67 100644
--- a/trick_source/sim_services/DataRecord/DRHDF5.cpp
+++ b/trick_source/sim_services/DataRecord/DRHDF5.cpp
@@ -14,7 +14,7 @@
#include "trick/memorymanager_c_intf.h"
#include "trick/message_proto.h"
-Trick::DRHDF5::DRHDF5( std::string in_name ) : Trick::DataRecordGroup(in_name) {
+Trick::DRHDF5::DRHDF5( std::string in_name, Trick::DR_Type dr_type ) : Trick::DataRecordGroup(in_name, dr_type) {
register_group_with_mm(this, "Trick::DRHDF5") ;
}
diff --git a/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp b/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp
index ac75689c0..9669ba705 100644
--- a/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp
+++ b/trick_source/sim_services/DataRecord/DataRecordDispatcher.cpp
@@ -180,6 +180,10 @@ void Trick::DataRecordDispatcher::remove_all_groups() {
}
}
+/**
+ @details
+ -# Gets the data recording group by its name
+ */
Trick::DataRecordGroup * Trick::DataRecordDispatcher::get_group(std::string in_name) {
std::vector ::iterator it ;
for ( it = groups.begin() ; it != groups.end() ; ++it ) {
@@ -189,6 +193,25 @@ Trick::DataRecordGroup * Trick::DataRecordDispatcher::get_group(std::string in_n
return NULL ;
}
+/**
+ @details
+ -# Gets the data recording group by its id number
+ */
+Trick::DataRecordGroup * Trick::DataRecordDispatcher::get_group(int in_idx) {
+ if (!groups.empty() && in_idx > -1 && in_idx < groups.size()) {
+ return groups[in_idx];
+ }
+ return NULL ;
+}
+
+/**
+ @details
+ -# Gets the size of all added data recroding groups
+ */
+int Trick::DataRecordDispatcher::get_groups_size() {
+ return groups.size();
+}
+
/**
@details
-# If the writer thread condition variable is unlocked
diff --git a/trick_source/sim_services/DataRecord/DataRecordGroup.cpp b/trick_source/sim_services/DataRecord/DataRecordGroup.cpp
index 5808e9dcd..13d057fe7 100644
--- a/trick_source/sim_services/DataRecord/DataRecordGroup.cpp
+++ b/trick_source/sim_services/DataRecord/DataRecordGroup.cpp
@@ -54,7 +54,7 @@ Trick::DataRecordBuffer::~DataRecordBuffer() {
free(ref) ;
}
-Trick::DataRecordGroup::DataRecordGroup( std::string in_name ) :
+Trick::DataRecordGroup::DataRecordGroup( std::string in_name, Trick::DR_Type dr_type ) :
record(true) ,
inited(false) ,
group_name(in_name) ,
@@ -96,18 +96,7 @@ Trick::DataRecordGroup::DataRecordGroup( std::string in_name ) :
// sim object name
name = std::string("trick_data_record_group_") + in_name ;
- // add_jobs_to_queue will fill in job_id later
- // make the init job run after all other initialization jobs but before the post init checkpoint
- // job so users can allocate memory in initialization jobs and checkpointing data rec groups will work
- add_job(0, 1, (char *)"initialization", NULL, cycle, (char *)"init", (char *)"TRK", 65534) ;
- add_job(0, 2, (char *)"end_of_frame", NULL, 1.0, (char *)"write_data", (char *)"TRK") ;
- add_job(0, 3, (char *)"checkpoint", NULL, 1.0, (char *)"checkpoint", (char *)"TRK") ;
- add_job(0, 4, (char *)"post_checkpoint", NULL, 1.0, (char *)"clear_checkpoint_vars", (char *)"TRK") ;
- // run the restart job in phase 60001
- add_job(0, 5, (char *)"restart", NULL, 1.0, (char *)"restart", (char *)"TRK", 60001) ;
- add_job(0, 6, (char *)"shutdown", NULL, 1.0, (char *)"shutdown", (char *)"TRK") ;
-
- write_job = add_job(0, 99, (char *)job_class.c_str(), NULL, cycle, (char *)"data_record" , (char *)"TRK") ;
+ configure_jobs(dr_type) ;
add_time_variable() ;
}
@@ -429,6 +418,27 @@ int Trick::DataRecordGroup::init() {
}
+void Trick::DataRecordGroup::configure_jobs(DR_Type type) {
+ switch(type) {
+ default:
+ // run the restart job in phase 60001
+ add_job(0, 5, (char *)"restart", NULL, 1.0, (char *)"restart", (char *)"TRK", 60001) ;
+
+ case DR_Type::DR_Type_FrameLogDataRecord:
+ // add_jobs_to_queue will fill in job_id later
+ // make the init job run after all other initialization jobs but before the post init checkpoint
+ // job so users can allocate memory in initialization jobs and checkpointing data rec groups will work
+ add_job(0, 1, (char *)"initialization", NULL, cycle, (char *)"init", (char *)"TRK", 65534) ;
+ add_job(0, 2, (char *)"end_of_frame", NULL, 1.0, (char *)"write_data", (char *)"TRK") ;
+ add_job(0, 3, (char *)"checkpoint", NULL, 1.0, (char *)"checkpoint", (char *)"TRK") ;
+ add_job(0, 4, (char *)"post_checkpoint", NULL, 1.0, (char *)"clear_checkpoint_vars", (char *)"TRK") ;
+ add_job(0, 6, (char *)"shutdown", NULL, 1.0, (char *)"shutdown", (char *)"TRK") ;
+
+ write_job = add_job(0, 99, (char *)job_class.c_str(), NULL, cycle, (char *)"data_record" , (char *)"TRK") ;
+ break ;
+ }
+}
+
int Trick::DataRecordGroup::checkpoint() {
unsigned int jj ;
diff --git a/trick_source/sim_services/DataRecord/data_record_utilities.cpp b/trick_source/sim_services/DataRecord/data_record_utilities.cpp
index 479ac758d..1077861e9 100644
--- a/trick_source/sim_services/DataRecord/data_record_utilities.cpp
+++ b/trick_source/sim_services/DataRecord/data_record_utilities.cpp
@@ -79,6 +79,20 @@ extern "C" Trick::DataRecordGroup * get_data_record_group( std::string in_name )
return NULL ;
}
+extern "C" Trick::DataRecordGroup * get_data_record_group_by_idx( int in_idx ) {
+ if ( the_drd != NULL ) {
+ return the_drd->get_group(in_idx) ;
+ }
+ return NULL ;
+}
+
+extern "C" int get_num_data_record_groups() {
+ if ( the_drd != NULL ) {
+ return the_drd->get_groups_size() ;
+ }
+ return 0 ;
+}
+
extern "C" int set_max_size_record_group (const char * in_name, uint64_t bytes ) {
if ( the_drd != NULL ) {
return the_drd->set_group_max_file_size(in_name, bytes ) ;
diff --git a/trick_source/sim_services/DataTypes/makefile b/trick_source/sim_services/DataTypes/makefile
index b5050c78f..c18d9b8e3 100644
--- a/trick_source/sim_services/DataTypes/makefile
+++ b/trick_source/sim_services/DataTypes/makefile
@@ -1,6 +1,6 @@
RM = rm -rf
-CC = cc
+CC = gcc
CPP = c++
diff --git a/trick_source/sim_services/DebugPause/DebugPause.cpp b/trick_source/sim_services/DebugPause/DebugPause.cpp
index b95bcbd20..91d4751ee 100644
--- a/trick_source/sim_services/DebugPause/DebugPause.cpp
+++ b/trick_source/sim_services/DebugPause/DebugPause.cpp
@@ -68,7 +68,7 @@ int Trick::DebugPause::debug_pause_on() {
debug_pause_flag = true ;
- sem_name_stream << "itimersepmaphore_" << getpid() ;
+ sem_name_stream << "debugstepmaphore_" << getpid() ;
sem_name = sem_name_stream.str() ;
debug_sem = sem_open(sem_name.c_str(), O_CREAT, S_IRWXU , 0);
diff --git a/trick_source/sim_services/ExternalApplications/ExternalApplication.cpp b/trick_source/sim_services/ExternalApplications/ExternalApplication.cpp
index ac377799f..1e540e92d 100644
--- a/trick_source/sim_services/ExternalApplications/ExternalApplication.cpp
+++ b/trick_source/sim_services/ExternalApplications/ExternalApplication.cpp
@@ -19,25 +19,13 @@ Trick::ExternalApplication::ExternalApplication() :
host_source = port_source = AUTO;
cycle_period_set = minimum_cycle_period_set = disconnect_behavior_set = height_set =
width_set = x_set = y_set = auto_reconnect_set = false;
-
- // c_intf uses char *, we manage the memory here in external application
- command_c_str = (char*)trick_MM->declare_var("char", (command.size() + 1) );
- strcpy(command_c_str, command.c_str());
- allocations.push_back(command_c_str);
}
Trick::ExternalApplication::~ExternalApplication() {
- for(std::vector::iterator it = allocations.begin(); it != allocations.end(); ++it) {
- trick_MM->delete_var( (void*)*it );
- }
- allocations.clear();
}
void Trick::ExternalApplication::set_startup_command(std::string in_command) {
command = in_command;
- command_c_str = (char*)trick_MM->declare_var("char", (command.size() + 1) );
- strcpy(command_c_str, command.c_str());
- allocations.push_back((command_c_str));
}
std::string Trick::ExternalApplication::get_startup_command() {
@@ -45,7 +33,7 @@ std::string Trick::ExternalApplication::get_startup_command() {
}
const char * Trick::ExternalApplication::get_startup_command_c_str() {
- return command_c_str;
+ return command.c_str();
}
void Trick::ExternalApplication::add_arguments(std::string args) {
diff --git a/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp b/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp
index c0da71b28..f66cb6a66 100644
--- a/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp
+++ b/trick_source/sim_services/FrameLog/FrameDataRecordGroup.cpp
@@ -9,7 +9,7 @@
-# All instances get the end_of_frame frame_log_clear job.
*/
Trick::FrameDataRecordGroup::FrameDataRecordGroup( int in_thread_id , std::string in_name )
- : Trick::DRBinary(in_name, false) , thread_id(in_thread_id ) {
+ : Trick::DRBinary(in_name, false, Trick::DR_Type::DR_Type_FrameLogDataRecord ), thread_id(in_thread_id ) {
if ( thread_id > 0 ) {
add_job(thread_id, 1000, (char *)"top_of_frame", NULL, 1.0, (char *)"start_timer", (char *)"TRK", 1) ;
// Frame logging uses phase 65533 in FrameLog.ccp. Stop the timer just before that.
diff --git a/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp b/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp
index 4bde1c45c..008485bf7 100644
--- a/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp
+++ b/trick_source/sim_services/MemoryManager/MemoryManager_delete_var.cpp
@@ -37,19 +37,18 @@ int Trick::MemoryManager::delete_var(void* address ) {
MemoryManager allocated it.
*/
if ( alloc_info->stcl == TRICK_LOCAL ) {
- if ( alloc_info->alloc_type == TRICK_ALLOC_MALLOC ) {
+ // The destructor that we just called MAY have deleted addresses
+ // that are already planned for deletion, say during reset_memory.
+ // So, keep a record of what we've recently deleted so we don't
+ // to warn that we can't find it, when reset_memory also tries to
+ // delete that same address. Same for TRICK_ALLOC_NEW block
+ deleted_addr_list.push_back(address);
+ if ( alloc_info->alloc_type == TRICK_ALLOC_MALLOC ) {
// This will call a destructor ONLY if alloc_info->type is TRICK_STRUCTURED.
// Otherwise it does nothing.
io_src_destruct_class( alloc_info );
- // The destructor that we just called MAY have deleted addresses
- // that are already planned for deletion, say during reset_memory.
- // So, keep a record of what we've recently deleted so we don't
- // to warn that we can't find it, when reset_memory also tries to
- // delete that same address.
- deleted_addr_list.push_back(address);
-
free( address);
} else if ( alloc_info->alloc_type == TRICK_ALLOC_NEW ) {
io_src_delete_class( alloc_info );
diff --git a/trick_source/sim_services/ScheduledJobQueue/ScheduledJobQueue.cpp b/trick_source/sim_services/ScheduledJobQueue/ScheduledJobQueue.cpp
index 85824cf89..45660248d 100644
--- a/trick_source/sim_services/ScheduledJobQueue/ScheduledJobQueue.cpp
+++ b/trick_source/sim_services/ScheduledJobQueue/ScheduledJobQueue.cpp
@@ -91,6 +91,11 @@ int Trick::ScheduledJobQueue::push( JobData * new_job ) {
/* Increment the size of the queue */
list_size++ ;
+
+ int new_job_index = ((unsigned long)insert_pt - (unsigned long)list) / sizeof(JobData**);
+ if(new_job_index < curr_index) {
+ curr_index++;
+ }
return(0) ;
diff --git a/trick_source/sim_services/ScheduledJobQueue/test/ScheduledJobQueue_test.cpp b/trick_source/sim_services/ScheduledJobQueue/test/ScheduledJobQueue_test.cpp
index ba1c3cc51..a1086b1c8 100644
--- a/trick_source/sim_services/ScheduledJobQueue/test/ScheduledJobQueue_test.cpp
+++ b/trick_source/sim_services/ScheduledJobQueue/test/ScheduledJobQueue_test.cpp
@@ -70,6 +70,117 @@ TEST_F( ScheduledJobQueueTest , PushJobsbyJobOrder ) {
EXPECT_TRUE( sjq.empty() ) ;
}
+TEST_F( ScheduledJobQueueTest , PushJobOntoSameIndex_CurrIndex0 ) {
+
+ Trick::JobData * job_ptr ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)0) ;
+ EXPECT_TRUE( sjq.empty() ) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_4") ;
+ job_ptr->sim_object_id = 4 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)1) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)0) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_3") ;
+ job_ptr->sim_object_id = 3 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)2) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)0) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_2") ;
+ job_ptr->sim_object_id = 2 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)3) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)0) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_1") ;
+ job_ptr->sim_object_id = 1 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)4) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)0) ;
+
+ job_ptr = sjq.get_next_job() ;
+ EXPECT_STREQ( job_ptr->name.c_str() , "job_1") ;
+
+ job_ptr = sjq.get_next_job() ;
+ EXPECT_STREQ( job_ptr->name.c_str() , "job_2") ;
+
+ job_ptr = sjq.get_next_job() ;
+ EXPECT_STREQ( job_ptr->name.c_str() , "job_3") ;
+
+ job_ptr = sjq.get_next_job() ;
+ EXPECT_STREQ( job_ptr->name.c_str() , "job_4") ;
+
+ sjq.clear() ;
+ EXPECT_EQ( sjq.size() , (unsigned int)0) ;
+ EXPECT_TRUE( sjq.empty() ) ;
+}
+
+TEST_F( ScheduledJobQueueTest , PushJobOntoSameIndex_CurrIndex1 ) {
+
+ Trick::JobData * job_ptr ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)0) ;
+ EXPECT_TRUE( sjq.empty() ) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_1") ;
+ job_ptr->sim_object_id = 1 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ sjq.get_next_job() ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)1) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)1) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_4") ;
+ job_ptr->sim_object_id = 4 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)2) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)1) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_3") ;
+ job_ptr->sim_object_id = 3 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)3) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)1) ;
+
+ job_ptr = new Trick::JobData(0, 2 , "class_100", NULL, 1.0 , "job_2") ;
+ job_ptr->sim_object_id = 2 ;
+ job_ptr->job_class = 100 ;
+ sjq.push(job_ptr) ;
+
+ EXPECT_EQ( sjq.size() , (unsigned int)4) ;
+ EXPECT_EQ( sjq.get_curr_index() , (unsigned int)1) ;
+
+ job_ptr = sjq.get_next_job() ;
+ EXPECT_STREQ( job_ptr->name.c_str() , "job_2") ;
+
+ job_ptr = sjq.get_next_job() ;
+ EXPECT_STREQ( job_ptr->name.c_str() , "job_3") ;
+
+ job_ptr = sjq.get_next_job() ;
+ EXPECT_STREQ( job_ptr->name.c_str() , "job_4") ;
+
+ sjq.clear() ;
+ EXPECT_EQ( sjq.size() , (unsigned int)0) ;
+ EXPECT_TRUE( sjq.empty() ) ;
+}
+
TEST_F( ScheduledJobQueueTest , PushJobsbySimObjectOrder ) {
//req.add_requirement("512154259");
diff --git a/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp b/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp
index 643df11a2..0dbc11390 100644
--- a/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp
+++ b/trick_source/sim_services/VariableServer/VariableServerListenThread.cpp
@@ -112,21 +112,24 @@ int Trick::VariableServerListenThread::init_listen_device() {
// Called from init jobs
int Trick::VariableServerListenThread::check_and_move_listen_device() {
- int ret ;
+ int ret = 0;
if (_user_requested_address) {
/* The user has requested a different source address or port in the input file */
_listener->disconnect();
ret = _listener->initialize(_requested_source_address, _requested_port);
- _requested_port = _listener->getPort();
- _requested_source_address = _listener->getHostname();
+
if (ret != 0) {
message_publish(MSG_ERROR, "ERROR: Could not establish variable server source_address %s: port %d. Aborting.\n",
_requested_source_address.c_str(), _requested_port);
- return -1 ;
+
+ ret = -1;
}
+
+ _requested_port = _listener->getPort();
+ _requested_source_address = _listener->getHostname();
}
- return 0 ;
+ return ret ;
}
void * Trick::VariableServerListenThread::thread_body() {
@@ -248,7 +251,10 @@ int Trick::VariableServerListenThread::restart() {
message_publish(MSG_INFO, "restart variable server message port = %d\n", _listener->getPort());
}
- initializeMulticast();
+ // Don't initialize the multicast group if it's already initialized
+ if (!_multicast->isInitialized()) {
+ initializeMulticast();
+ }
return 0 ;
}
diff --git a/trick_source/trick_utils/SAIntegrator/makefile b/trick_source/trick_utils/SAIntegrator/makefile
index cdd6eaeb9..98506b78b 100644
--- a/trick_source/trick_utils/SAIntegrator/makefile
+++ b/trick_source/trick_utils/SAIntegrator/makefile
@@ -1,6 +1,6 @@
RM = rm -rf
-CC = cc
+CC = gcc
CPP = c++
CFLAGS = -g -Wall -std=c++11 ${TRICK_CXXFLAGS}
diff --git a/trick_source/web/CivetServer/makefile b/trick_source/web/CivetServer/makefile
index fce4065f4..11db671d9 100644
--- a/trick_source/web/CivetServer/makefile
+++ b/trick_source/web/CivetServer/makefile
@@ -1,7 +1,7 @@
include ${TRICK_HOME}/share/trick/makefiles/Makefile.common
RM = rm -rf
-CC = cc
+CC = gcc
CPP = c++
CURL = curl
MV = mv
diff --git a/trick_source/web/dashboard/package-lock.json b/trick_source/web/dashboard/package-lock.json
index 31567b33d..a1bed67cb 100644
--- a/trick_source/web/dashboard/package-lock.json
+++ b/trick_source/web/dashboard/package-lock.json
@@ -6052,9 +6052,9 @@
}
},
"cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="
},
"cookie-signature": {
"version": "1.0.6",
@@ -6101,9 +6101,9 @@
"integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA=="
},
"cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -6906,6 +6906,11 @@
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
},
+ "encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
+ },
"end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -7883,16 +7888,16 @@
}
},
"express": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
- "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.6.0",
+ "cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
@@ -7906,7 +7911,7 @@
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
"qs": "6.13.0",
"range-parser": "~1.2.1",
@@ -7925,18 +7930,6 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
- "call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "requires": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- }
- },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -7945,128 +7938,20 @@
"ms": "2.0.0"
}
},
- "encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
- },
- "finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- }
- },
- "function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
- },
- "get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "requires": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- }
- },
- "has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
- },
- "merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="
- },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w=="
- },
- "qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "requires": {
- "side-channel": "^1.0.6"
- }
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- },
- "send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "requires": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "dependencies": {
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- }
- }
- },
- "serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "requires": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- }
- },
- "side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "requires": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
- }
}
}
},
@@ -8218,6 +8103,35 @@
"resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
"integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ=="
},
+ "finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
"find-cache-dir": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
@@ -9335,9 +9249,9 @@
}
},
"http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
"requires": {
"@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
@@ -11901,6 +11815,11 @@
"fs-monkey": "^1.0.4"
}
},
+ "merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="
+ },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -12092,9 +12011,9 @@
}
},
"nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="
},
"native-promise-only": {
"version": "0.8.1",
@@ -14225,6 +14144,61 @@
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
"integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
},
+ "qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "requires": {
+ "side-channel": "^1.0.6"
+ },
+ "dependencies": {
+ "call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "requires": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ }
+ },
+ "function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+ },
+ "get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "requires": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ }
+ }
+ }
+ },
"querystringify": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -15006,9 +14980,9 @@
}
},
"rollup": {
- "version": "2.79.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
- "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
"requires": {
"fsevents": "~2.3.2"
}
@@ -15206,6 +15180,53 @@
}
}
},
+ "send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
"serialize-javascript": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
@@ -15274,6 +15295,17 @@
}
}
},
+ "serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "requires": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ }
+ },
"set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",