forked from puppylinux-woof-CE/woof-CE
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
312 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,280 @@ | ||
diff -rupN ExpenseTracker-0.1.0-orig/Makefile ExpenseTracker-0.1.0/Makefile | ||
--- ExpenseTracker-0.1.0-orig/Makefile 2007-04-07 14:29:16.000000000 +0300 | ||
+++ ExpenseTracker-0.1.0/Makefile 2023-02-10 15:41:57.007492421 +0200 | ||
@@ -1,6 +1,6 @@ | ||
GCC := g++ | ||
-CFLAGS := -pg -g -Wall `pkg-config --cflags gtk+-2.0` | ||
-LDFLAGS := `pkg-config --libs gtk+-2.0` -lsqlite3 | ||
+CFLAGS := -fpermissive -g -Wall `pkg-config --cflags gtk+-3.0` | ||
+LDFLAGS := `pkg-config --libs gtk+-3.0` -lsqlite3 | ||
|
||
SRC := src/ExpenseTracker.cpp \ | ||
src/MainWindow.cpp \ | ||
@@ -9,7 +9,7 @@ SRC := src/ExpenseTracker.cpp \ | ||
src/ExpenseDialog.cpp | ||
|
||
ExpenseTracker: $(SRC) | ||
- $(GCC) $(CFLAGS) $(LDFLAGS) -o ExpenseTracker $(SRC) | ||
+ $(GCC) $(CFLAGS) -o ExpenseTracker $(SRC) $(LDFLAGS) | ||
|
||
clean: | ||
rm ExpenseTracker *.out src/*.o src/*~ *~ | ||
diff -rupN ExpenseTracker-0.1.0-orig/src/ExpenseDialog.cpp ExpenseTracker-0.1.0/src/ExpenseDialog.cpp | ||
--- ExpenseTracker-0.1.0-orig/src/ExpenseDialog.cpp 2007-04-07 14:29:16.000000000 +0300 | ||
+++ ExpenseTracker-0.1.0/src/ExpenseDialog.cpp 2023-02-10 15:31:32.741336729 +0200 | ||
@@ -79,7 +79,7 @@ gint CExpenseDialog::Create(GtkWindow* p | ||
gtk_table_set_row_spacings (GTK_TABLE (table), 2); | ||
gtk_table_set_col_spacings (GTK_TABLE (table), 2); | ||
gtk_widget_show (table); | ||
- gtk_container_add (GTK_CONTAINER (GTK_DIALOG (m_gtkDialog)->vbox), table); | ||
+ gtk_container_add (GTK_CONTAINER (gtk_dialog_get_action_area (GTK_DIALOG (m_gtkDialog))), table); | ||
|
||
GtkWidget* label; | ||
|
||
@@ -97,7 +97,8 @@ gint CExpenseDialog::Create(GtkWindow* p | ||
(GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), | ||
GTK_FILL, 0, 0); | ||
|
||
- m_gtkExpenseDateEntry = gtk_entry_new_with_max_length (10); | ||
+ m_gtkExpenseDateEntry = gtk_entry_new (); | ||
+ gtk_entry_set_max_length (GTK_ENTRY (m_gtkExpenseDateEntry), 10); | ||
gtk_widget_show (m_gtkExpenseDateEntry); | ||
gtk_table_attach (GTK_TABLE (dateRowTable), m_gtkExpenseDateEntry, 0, 1, 0, 1, | ||
(GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), | ||
@@ -210,30 +211,30 @@ gint CExpenseDialog::Create(GtkWindow* p | ||
g_signal_connect_swapped (G_OBJECT (menuItem), "activate", | ||
G_CALLBACK (OnExpenseDateToday), this); | ||
gtk_widget_show (menuItem); | ||
- gtk_menu_append (GTK_MENU (m_gtkExpenseDatePopupMenu), menuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (m_gtkExpenseDatePopupMenu), menuItem); | ||
|
||
menuItem = gtk_menu_item_new_with_label ("Yesterday"); | ||
g_signal_connect_swapped (G_OBJECT (menuItem), "activate", | ||
G_CALLBACK (OnExpenseDateYesterday), this); | ||
gtk_widget_show (menuItem); | ||
- gtk_menu_append (GTK_MENU (m_gtkExpenseDatePopupMenu), menuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (m_gtkExpenseDatePopupMenu), menuItem); | ||
|
||
menuItem = gtk_menu_item_new_with_label ("Day Before Yesterday"); | ||
g_signal_connect_swapped (G_OBJECT (menuItem), "activate", | ||
G_CALLBACK (OnExpenseDateDayBeforeYesterday), | ||
this); | ||
gtk_widget_show (menuItem); | ||
- gtk_menu_append (GTK_MENU (m_gtkExpenseDatePopupMenu), menuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (m_gtkExpenseDatePopupMenu), menuItem); | ||
|
||
menuItem = gtk_separator_menu_item_new (); | ||
gtk_widget_show (menuItem); | ||
- gtk_menu_append (GTK_MENU (m_gtkExpenseDatePopupMenu), menuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (m_gtkExpenseDatePopupMenu), menuItem); | ||
|
||
menuItem = gtk_menu_item_new_with_label ("Calendar"); | ||
g_signal_connect_swapped (G_OBJECT (menuItem), "activate", | ||
G_CALLBACK (OnExpenseDateDayCalendar), this); | ||
gtk_widget_show (menuItem); | ||
- gtk_menu_append (GTK_MENU (m_gtkExpenseDatePopupMenu), menuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (m_gtkExpenseDatePopupMenu), menuItem); | ||
|
||
|
||
// Auto focus mapping | ||
@@ -609,8 +610,7 @@ gboolean CExpenseDialog::MatchSelected(G | ||
|
||
if (newTag) | ||
{ | ||
- gtk_entry_append_text (GTK_ENTRY (entry), " "); | ||
- modelTagLen++; | ||
+ gtk_editable_insert_text (GTK_EDITABLE (entry), " ", 1, &tagStartPos); | ||
} | ||
|
||
gtk_editable_set_position (GTK_EDITABLE (entry), tagStartPos + modelTagLen); | ||
@@ -693,12 +693,14 @@ void CExpenseDialog::DatePopupMenuPosFun | ||
gint buttonX; | ||
gint buttonY; | ||
|
||
- gdk_window_get_position (pThis->m_gtkExpenseDateButton->window, | ||
+ gdk_window_get_position (gtk_widget_get_window (pThis->m_gtkExpenseDateButton), | ||
&buttonX, &buttonY); | ||
|
||
- *x = buttonX + pThis->m_gtkExpenseDateButton->allocation.x; | ||
- *y = buttonY + pThis->m_gtkExpenseDateButton->allocation.y | ||
- + pThis->m_gtkExpenseDateButton->allocation.height; | ||
+ GtkAllocation allocation; | ||
+ gtk_widget_get_allocation (pThis->m_gtkExpenseDateButton, &allocation); | ||
+ *x = buttonX + allocation.x; | ||
+ *y = buttonY + allocation.y | ||
+ + allocation.height; | ||
} | ||
|
||
//////////////////////////////////////////////////////////////////////////////// | ||
diff -rupN ExpenseTracker-0.1.0-orig/src/Globals.h ExpenseTracker-0.1.0/src/Globals.h | ||
--- ExpenseTracker-0.1.0-orig/src/Globals.h 2007-04-07 14:29:16.000000000 +0300 | ||
+++ ExpenseTracker-0.1.0/src/Globals.h 2023-02-10 16:02:12.053539917 +0200 | ||
@@ -30,10 +30,10 @@ | ||
|
||
#include <gtk/gtk.h> | ||
|
||
-#define ERROR(format, args...) fprintf (stderr, "[%d:%-15s:%4d] ERROR: "format"\n", getpid(), __FILE__, __LINE__ , ## args) | ||
-#define WARN(format, args...) fprintf (stderr, "[%d:%-15s:%4d] WARNING: "format"\n", getpid(), __FILE__, __LINE__ , ## args) | ||
-#define INFO(format, args...) fprintf (stdout, "[%d:%-15s:%4d] INFO: "format"\n", getpid(), __FILE__, __LINE__ , ## args) | ||
-#define CRITICAL(format, args...) fprintf (stdout, "[%d:%-15s:%4d] CRITICAL: "format"\n", getpid(), __FILE__, __LINE__ , ## args); exit (-1); | ||
+#define ERROR g_error | ||
+#define WARN g_warning | ||
+#define INFO g_info | ||
+#define CRITICIAL g_critical | ||
|
||
gint GtkMessageBox(GtkWindow* parent, GtkDialogFlags flags, GtkMessageType type, | ||
GtkButtonsType buttons, const gchar *message_format, ...); | ||
diff -rupN ExpenseTracker-0.1.0-orig/src/MainWindow.cpp ExpenseTracker-0.1.0/src/MainWindow.cpp | ||
--- ExpenseTracker-0.1.0-orig/src/MainWindow.cpp 2007-04-07 14:29:16.000000000 +0300 | ||
+++ ExpenseTracker-0.1.0/src/MainWindow.cpp 2023-02-10 15:37:01.070332100 +0200 | ||
@@ -202,20 +202,20 @@ gint CMainWindow::Create() | ||
|
||
profileMenuItem = gtk_menu_item_new_with_mnemonic ("_Profile"); | ||
gtk_widget_show (profileMenuItem); | ||
- gtk_menu_bar_append (GTK_MENU_BAR (menubar), profileMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (menubar), profileMenuItem); | ||
|
||
GtkWidget* expenseMenuItem; | ||
|
||
expenseMenuItem = gtk_menu_item_new_with_mnemonic ("_Expense"); | ||
gtk_widget_show (expenseMenuItem); | ||
- gtk_menu_bar_append (GTK_MENU_BAR (menubar), expenseMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (menubar), expenseMenuItem); | ||
m_gtkExpenseMenuItem = expenseMenuItem; | ||
|
||
GtkWidget* viewMenuItem; | ||
|
||
viewMenuItem = gtk_menu_item_new_with_mnemonic ("_View"); | ||
gtk_widget_show (viewMenuItem); | ||
- gtk_menu_bar_append (GTK_MENU_BAR (menubar), viewMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (menubar), viewMenuItem); | ||
m_gtkViewMenuItem = viewMenuItem; | ||
|
||
// Profile Menu Items | ||
@@ -230,47 +230,47 @@ gint CMainWindow::Create() | ||
profileMenu = gtk_menu_new (); | ||
|
||
profileNewMenuitem = gtk_image_menu_item_new_from_stock ("gtk-new", NULL); | ||
- gtk_menu_append (GTK_MENU (profileMenu), profileNewMenuitem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (profileMenu), profileNewMenuitem); | ||
g_signal_connect_swapped (G_OBJECT (profileNewMenuitem), "activate", | ||
G_CALLBACK (OnProfileNew), this); | ||
gtk_widget_add_accelerator (profileNewMenuitem, "activate", accekGroup, | ||
- GDK_N, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_N, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (profileNewMenuitem); | ||
|
||
profileOpenMenuItem = gtk_image_menu_item_new_from_stock ("gtk-open", NULL); | ||
- gtk_menu_append (GTK_MENU (profileMenu), profileOpenMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (profileMenu), profileOpenMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (profileOpenMenuItem), "activate", | ||
G_CALLBACK (OnProfileOpen), this); | ||
gtk_widget_add_accelerator (profileOpenMenuItem, "activate", accekGroup, | ||
- GDK_O, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_O, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (profileOpenMenuItem); | ||
|
||
profileSaveMenuItem = gtk_image_menu_item_new_from_stock ("gtk-save", NULL); | ||
- gtk_menu_append (GTK_MENU (profileMenu), profileSaveMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (profileMenu), profileSaveMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (profileSaveMenuItem), "activate", | ||
G_CALLBACK (OnProfileSave), this); | ||
gtk_widget_add_accelerator (profileSaveMenuItem, "activate", accekGroup, | ||
- GDK_S, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_S, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (profileSaveMenuItem); | ||
|
||
profileCloseMenuItem = gtk_image_menu_item_new_from_stock ("gtk-close", NULL); | ||
- gtk_menu_append (GTK_MENU (profileMenu), profileCloseMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (profileMenu), profileCloseMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (profileCloseMenuItem), "activate", | ||
G_CALLBACK (OnProfileClose), this); | ||
gtk_widget_add_accelerator (profileCloseMenuItem, "activate", accekGroup, | ||
- GDK_C, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_C, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (profileCloseMenuItem); | ||
|
||
separatorMenuItem = gtk_separator_menu_item_new (); | ||
- gtk_menu_append (GTK_MENU (profileMenu), separatorMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (profileMenu), separatorMenuItem); | ||
gtk_widget_show (separatorMenuItem); | ||
|
||
profileQuitMenuitem = gtk_image_menu_item_new_from_stock ("gtk-quit", NULL); | ||
- gtk_menu_append (GTK_MENU (profileMenu), profileQuitMenuitem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (profileMenu), profileQuitMenuitem); | ||
g_signal_connect_swapped (G_OBJECT (profileQuitMenuitem), "activate", | ||
G_CALLBACK (OnProfileQuit), this); | ||
gtk_widget_add_accelerator (profileQuitMenuitem, "activate", accekGroup, | ||
- GDK_Q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_Q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (profileQuitMenuitem); | ||
|
||
gtk_menu_item_set_submenu (GTK_MENU_ITEM (profileMenuItem), profileMenu); | ||
@@ -287,27 +287,27 @@ gint CMainWindow::Create() | ||
expenseMenu = gtk_menu_new (); | ||
|
||
expenseAddMenuItem = gtk_image_menu_item_new_from_stock ("gtk-add", NULL); | ||
- gtk_menu_append (GTK_MENU (expenseMenu), expenseAddMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (expenseMenu), expenseAddMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (expenseAddMenuItem), "activate", | ||
G_CALLBACK (OnExpenseAdd), this); | ||
gtk_widget_add_accelerator (expenseAddMenuItem, "activate", accekGroup, | ||
- GDK_A, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_A, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (expenseAddMenuItem); | ||
|
||
expenseModifyMenuItem = gtk_image_menu_item_new_from_stock ("gtk-edit", NULL); | ||
- gtk_menu_append (GTK_MENU (expenseMenu), expenseModifyMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (expenseMenu), expenseModifyMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (expenseModifyMenuItem), "activate", | ||
G_CALLBACK (OnExpenseModify), this); | ||
gtk_widget_add_accelerator (expenseModifyMenuItem, "activate", accekGroup, | ||
- GDK_E, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_E, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (expenseModifyMenuItem); | ||
|
||
expenseDeleteMenuItem = gtk_image_menu_item_new_from_stock ("gtk-delete", NULL); | ||
- gtk_menu_append (GTK_MENU (expenseMenu), expenseDeleteMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (expenseMenu), expenseDeleteMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (expenseDeleteMenuItem), "activate", | ||
G_CALLBACK (OnExpenseDelete), this); | ||
gtk_widget_add_accelerator (expenseDeleteMenuItem, "activate", accekGroup, | ||
- GDK_D, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
+ GDK_KEY_D, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (expenseDeleteMenuItem); | ||
|
||
m_gtkExpenseAddMenuItem = expenseAddMenuItem; | ||
@@ -324,20 +324,20 @@ gint CMainWindow::Create() | ||
viewMenu = gtk_menu_new (); | ||
|
||
viewByDateMenuItem = gtk_check_menu_item_new_with_label ("By Date"); | ||
- gtk_menu_append (GTK_MENU (viewMenu), viewByDateMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (viewMenu), viewByDateMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (viewByDateMenuItem), "activate", | ||
G_CALLBACK (OnViewByDate), this); | ||
gtk_widget_add_accelerator (viewByDateMenuItem, "activate", accekGroup, | ||
- GDK_D, (GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), | ||
+ GDK_KEY_D, (GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), | ||
GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (viewByDateMenuItem); | ||
|
||
viewByTagMenuItem = gtk_check_menu_item_new_with_label ("By Tag"); | ||
- gtk_menu_append (GTK_MENU (viewMenu), viewByTagMenuItem); | ||
+ gtk_menu_shell_append (GTK_MENU_SHELL (viewMenu), viewByTagMenuItem); | ||
g_signal_connect_swapped (G_OBJECT (viewByTagMenuItem), "activate", | ||
G_CALLBACK (OnViewByTag), this); | ||
gtk_widget_add_accelerator (viewByTagMenuItem, "activate", accekGroup, | ||
- GDK_T, (GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), | ||
+ GDK_KEY_T, (GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), | ||
GTK_ACCEL_VISIBLE); | ||
gtk_widget_show (viewByTagMenuItem); | ||
|
||
@@ -1027,7 +1027,7 @@ gboolean CMainWindow::OnTreeViewKeyPress | ||
GdkEventKey* event, | ||
gpointer pointer) | ||
{ | ||
- if (event->keyval == GDK_Delete) | ||
+ if (event->keyval == GDK_KEY_Delete) | ||
OnExpenseDelete (pointer); | ||
|
||
return FALSE; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
ExpenseTracker-0.1.0|ExpenseTracker|0.1.0||Business|44||ExpenseTracker-0.1.0.pet||Tag based personal expense tracking software|puppy||| |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
download() { | ||
[ -f ExpenseTracker-0.1.0.tar.gz ] || wget -t 3 -T 60 -O ExpenseTracker-0.1.0.tar.gz https://sourceforge.net/projects/etracker/files/Source/Version%200.1.0/ExpenseTracker-0.1.0.tar.gz/download | ||
} | ||
|
||
build() { | ||
tar -xzf ExpenseTracker-0.1.0.tar.gz | ||
cd ExpenseTracker-0.1.0 | ||
patch -p1 < ../gtk3.patch | ||
$CXX $CXXFLAGS -fpermissive `pkg-config --cflags gtk+-3.0 sqlite3` src/ExpenseTracker.cpp src/MainWindow.cpp src/Globals.cpp src/Profile.cpp src/ExpenseDialog.cpp $LDFLAGS `pkg-config --libs gtk+-3.0 sqlite3` -o /usr/bin/ExpenseTracker | ||
cat << EOF > /usr/share/applications/ExpenseTracker.desktop | ||
[Desktop Entry] | ||
Name=ExpenseTracker | ||
Comment=Tag based personal expense tracker | ||
Exec=ExpenseTracker | ||
Icon=currency_dollar | ||
Terminal=false | ||
Type=Application | ||
Categories=X-Business | ||
StartupNotify=true | ||
Encoding=UTF-8 | ||
GenericName=ExpenseTracker | ||
EOF | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
2a4721942b9dd5cc547ea844c433747586d3d2918c77bd3863735a47f688ac60 ExpenseTracker-0.1.0.tar.gz |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters