| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
| |
Passing a random GtkWidget and then searching its ancestors for an
EAlertSink turned out to be not as useful as I thought. Most of the
time we know about and have access to the widget that implements
EAlertSink, so just pass it directly as an EAlertSink.
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
Restore the update() method in ECanvasBackground. Without a redraw
request the draw() method is never called. For some reason this isn't
noticeable on gtk+-3.0 -- ETable and ETree backgrounds are still white
-- but on gtk+-2.0 the backgrounds are grey.
|
|
|
|
| |
Fill color properties should be write-only, not read-only.
|
| |
|
| |
|
|
|
|
| |
It's not necessary anymore.
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
- "color" and "color-gdk" properties aren't readable (Their values would
be wrong if an alpha channel was set).
- Use the rgba color when rendering
- Don't allocate the color in the colormap anymore.
|
|
|
|
|
| |
No need to use magic visuals and colormaps anymore, we're all cairo
these days.
|
|
|
|
| |
It's not used by themes so I don't see the need to port it.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Instead of hacky magic, we now use cairo and a naïve implementation of
tweening.
|
|
|
|
|
|
|
| |
Way easier than to try to get the coordinates right.
Includes refactoring to introduce e_map_world_to_render_surface() that
computes coordinates on the background surface to make this stuff
easier.
|
|
|
|
| |
... and use it when zooming out
|
|
|
|
| |
Nothing but a massive code cleanup
|
|
|
|
|
|
|
| |
The in_view() check is broken because it doesn't repaint points that are
1px outside the window. The point take 2 extra pixels in every direction
after all. And gtk_widget_queue_draw_area() will automatically discard
out-of-range rects anyway.
|
|
|
|
| |
Doing performance optimizations on the client is not a good idea...
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
The signal handler will no-op the operations anyway, because nothing
changed.
|
|
|
|
|
| |
For the zoom, we now use the long-deprecated gtk_widget_draw() to force
repaints.
|
|
|
|
| |
We cannot move parts of the window with GTK3 APIs, so stop doing it.
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Also update the GnomeCanvasItem.update vfunc to take a cairo_matrix_t
and no longer pass the clip_path (what was it used for anyway?).
|
| |
|
|
|
|
|
| |
x1 and y1 were never set, only used. Replace all users with 0 and remove
the members.
|
|
|
|
| |
Gets rid of the need for GdkGC completely.
|
|
|
|
|
| |
It's used without specifying a clip rectangle every time, so remove that
property. Also do all drawing with Cairo.
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
Previously the function returned the distance to the nearest item. Now
it only returns an item that is hit. This slightly changes semantics
(button events are no longer dispatched to the nearest item, but only to
the item actually clicked on), but makes the code way simpler and
actually does what one would expect.
|
|
|
|
| |
It's never set, so just replace it with its default value 0 everywhere.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
...when marking a header for deletion. Not that this does currently not
work (it uses opaque red instead), but this change is required so
stippling can be removed. And that is necessary to switch to Cairo
drawing.
|
|
|
|
| |
The anti-aliased code was never used, so remove it.
|
| |
|
| |
|
|
|
|
| |
gtk+-3.0 removed it for being "unused".
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
With unintrusive error dialogs gone, we can cut some unnecessary bits
out of EActivity.
I'm also adding a new enum property called "state", which is one of:
E_ACTIVITY_RUNNING
E_ACTIVITY_WAITING
E_ACTIVITY_CANCELLED
E_ACTIVITY_COMPLETED
The state of an activity must be explicitly changed. In particular,
when the user cancels an activity the state should be set only after
confirming the operation has been cancelled and not when cancellation
is requested (e.g. after receiving a G_IO_ERROR_CANCELLED, not when
the GCancellable emits "cancelled"). EActivityBar and EActivityProxy
widgets have been updated to make this distinction clearer in the UI.
E_ACTIVITY_WAITING will be used when activities have to be queued and
dispatched in sequence, which I haven't written yet.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
This marks the end of unintrusive error dialogs, which were too
unintrusive. We now show errors directly in the main window using
the EAlert / EAlertSink framework.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
You can now amend the predefined actions in an EAlert by calling
e_alert_add_action(). Useful for adding actions from an existing
GtkUIManager.
Call e_alert_peek_actions() to obtain a combined list of predefined
and custom actions. These will typically serve as "related" actions
for GtkButtons (cf. gtk_activatable_set_related_action()).
Also, both EShellWindow and EShellView now implement EAlertSink. Use
EShellWindow for application-wide alerts, EShellView for view-specific
alerts.
|
|
|
|
|
|
| |
GObject now does property bindings itself.
Requires GLib >= 2.26.
|
|
|
|
| |
Make it work like a stack instead of a queue.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
'Send' and 'Save Draft' are now asynchronous and run outside of
Evolution's MailMsg infrastructure.
Add an EActivityBar to the composer window so these asynchronous
operations can be tracked and cancelled even in the absense of a main
window. Also add an EAlertBar to the composer window so error messages
can be shown directly in the window.
Instead of calling e_alert_dialog_run_for_args(), call e_alert_submit()
and pass the EMsgComposer as the widget argument. The EMsgComposer will
decide whether to show an EAlertDialog or use the EAlertBar, depending
on the GtkMessageType of the alert.
|
| |
|
|
|
|
|
|
|
| |
Remove GtkObject::destroy() handler. Move disconnecting
signal handlers to e_map_finalize().
https://bugzilla.gnome.org/show_bug.cgi?id=630766
|
| |
|
|
|
|
|
| |
Use the new GtkExpander:label-fill property in GTK+ 2.22, which was
added specifically to get rid of my evil hack in EAttachmentPaned.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Trying out a new interface called EAlertSink. The idea is to centralize
how errors are shown to the user. A GtkWindow subclass would implement
the EAlertSink interface, which consists of a single method:
void (*submit_alert) (EAlertSink *alert_sink, EAlert *alert);
The subclass has complete control over what to do with the EAlert,
although I imagine we'll wind up implementing various alert-handling
policies as standalone widgets such as EAlertDialog. I'd like to try
an EAlertInfoBar.
Code that would otherwise display an error dialog itself would instead
pass the EAlert to an appropriate EAlertSink and be done with it.
Nothing is final yet. Still hacking on EAlert trying to find an API
that feels right for these use cases.
|
|
|
|
| |
Remove backward-compatibility hacks for older GTK+ versions.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
EActivity now uses a GCancellable to manage cancellations, instead of
having its own redundant cancellation API. API changes are as follows:
+ e_activity_get_cancellable()
+ e_activity_set_cancellable()
- e_activity_cancel()
- e_activity_is_cancelled()
- e_activity_get_allow_cancel()
- e_activity_set_allow_cancel()
EActivity's "cancelled" signal remains, but only as a repeater for
GCancellable::cancelled signals. It should not be emitted directly.
The presence of a GCancellable implies that cancellation is allowed.
EActivity does not create its own default GCancellable, it has to be
given one.
If a CamelOperation (cast as a GCancellable) is given, EActivity will
configure itself to listen for status updates from the CamelOperation
and propagate the information to its own "primary-text" and "percent"
properties.
These changes allowed me to start cleaning up some of the incredibly
convoluted logic in mail-mt.c -- in particular, mail_operation_status()
is completely gone now. mail-mt.c is still in a transitional state --
much more significant changes coming soon.
|
|
|
|
|
|
|
| |
In GTK+ 2.21.8, the keysym names were renamed from GDK_* to GDK_KEY_*.
I've added backward-compatibility macors to gtk-compat.h, which can be
dumped as soon as we require GTK+ >= 2.22.0.
|
|
|
|
|
| |
This works if Tasks/ Memos/ Contacts are grouped till level 1.
If grouping level is increased then some text would be missing.
|
| |
|
|
|
|
| |
To eliminate the floating-reference-on-finalize run-time warnings.
|
|
|
|
|
|
|
| |
If we're using GTK+ 2.21.8 (where gtk_dialog_set_has_separator() is
deprecated but the property is still present and defaults to TRUE), we
still need to set the property to FALSE. So instead use g_object_set()
up through GTK+ 2.90.6, after which the property itself is gone.
|
|
|
|
|
|
| |
Unfortunately the default value for this property is TRUE (bzzt, WRONG!)
so we can't just remove the function outright until we require GTK+ 2.22.
It was deprecated in GTK+ 2.21.8.
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
This goes with the previous commit.
|
|
|
|
|
|
|
|
|
|
|
|
| |
EAttachmentHandler predates EExtension, so this is really just a code
cleanup to use the extension framework. But this also demonstrates that
extensions can target interfaces as well as instantiable types, since
EAttachmentView is an interface.
What's also nice is EAttachmentView no longer has to directly interact
with attachment handlers. Instead of EAttachmentView having to query
each attachment handler for drag-and-drop info, each handler now pushes
its own drag-and-drop info to its EAttachmentView during initialization.
|
|
|
|
|
|
|
| |
Prefer thread-safe G_DEFINE_TYPE and G_DEFINE_INTERFACE macros over
manual GType registration.
This is just a start... lots more to do.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Adds a boolean "dragging" property to the EAttachmentView interface,
which becomes TRUE when the user start a drag from the attachment view.
e_attachment_view_drag_motion() and e_attachment_view_drag_drop() both
return FALSE when this property is set.
Also, do not register the entire EMsgComposer window as a drag
destination. Just intercept drag signals from the GtkHTML widget.
Requires gtkhtml commit 344eb5e to fully work correctly.
|
| |
|
|
|
|
|
| |
chaining hack; sub-set this only for when we have a hint visible
ie. fix alt-c + type-new-search
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
e_preferences_window to take factory callbacks and store a reference
to the shell. - This makes start-up substantially faster, particularly
on Atom (eg.).
Remove a number of idle handlers used to create these UIs in the
first instance, cleaning the code.
|
|
|
|
|
|
|
| |
Since gnome-icon-theme 2.30.x the icon name for the default avatar has changed
from stock_person to avatar-default
Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=616822
|
| |
|
|
|
|
| |
We preview imported files by other means now.
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
The new height-for-width logic in GTK3 doesn't like my trick to center a
GtkExpander's label widget, so I have to disable it entirely for GTK3 or
else Evolution crashes when opening a composer window.
Bug #614049 has a GtkExpander patch that would let me do it properly.
|
| |
|
| |
|
| |
|
|
|
|
| |
API was deprecated and removed in less than two hours! Sheesh!
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
At least until we have another way to insert signatures.
Obvious solution: Insert -> Signature -> (list of your signatures)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Work around the issue of GnomeCanvasItem amending its own flags to
GtkObject::flags (which is sealed) by giving it its own flags field.
This breaks libgnomecanvas ABI and API, but I see no other way.
This commit didn't work the first time because gnome-pilot libraries
were still pulling in the system-wide libgnomecanvas, and that was
interfereing with our bundled version which has a different ABI.
But gnome-pilot integration was dropped in the previous commit, so
everything is now using the bundled libgnomecanvas.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
It just doesn't belong in Evolution anymore. We don't support syncing
with more modern devices -- see Conduits or SyncEvolution for that -- so
it does not make sense for older model Palm Pilot PDAs to be the lone
exception.
I have repackaged the Evolution-Data-Server conduit modules to be
provided by gnome-pilot itself in bug #619315. This should provide
eqivalent Palm Pilot syncing functionality; it's just being moved to
gnome-pilot.
This completely severs our dependency on deprecated GNOME 2.x libraries
which were still being dragged in by way of gnome-pilot dependencies.
It was also interfereing with our bundling of libgnomecanvas.
|
|
|
|
|
|
|
| |
This reverts commit fd8b55edaa88906b588aa07d9eadcacd34a7a774.
Something in this commit seriously hosed ETable, making Evolution pretty
much unusable. Reverting this until I can track down the problem.
|
| |
|
| |
|
|
|
|
|
|
| |
Work around the issue of GnomeCanvasItem amending its own flags to
GtkObject::flags (which is sealed) by giving it its own flags field.
This breaks libgnomecanvas ABI and API, but I see no other way.
|
|
|
|
|
|
| |
Both of these modules are deprecated and going away in GNOME 3 but we
still rely heavily on them for GnomeCalendar and ETable. So, welcome
to the island of unwanted libraries...
|
| |
|
|
|
|
|
| |
This uses the new gtk_assistant_commit() I had added to GTK+ for our
EImportAssistant progress page.
|
| |
|
| |
|
| |
|
| |
|
|\ |
|
| | |
|
| | |
|
| |\ |
|
| | |
| | |
| | |
| | | |
Based on EggTreeMultiDragSource in libegg.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Some improvements made while investigating bug #608855. This does not
solve the bug however, and in fact I now believe the bug is actually a
GTK+ issue after reproducing the bug in gtk-demo.
These improvements restore multiple selections via Ctrl+Click and
Shift+Click, and also reduces the frequency that we synchronize the
selection between Icon View and Tree View.
|
| |\| |
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | | |
pet widget we are going to steal the gc from, so it actually has it.
|
| |\ \ |
|
| | | |
| | | |
| | | |
| | | | |
preferences for calendar. Bit of a hack, but proves very useful.
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | | |
We will need this to see how many accounts are shown in the From header
in the mail composer.
Signed-off-by: Federico Mena Quintero <federico@novell.com>
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | | |
pet widget we are going to steal the gc from, so it actually has it.
|
| |\|
| | |
| | |
| | |
| | |
| | | |
Note that express2 got some documentation for EExtensible and friends,
and that documentation is not in gnome-2-30 yet. We need to cherry-pick
those commits into gnome-2-30 and elsewhere.
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Add a load_string() method to EWebView. Have EMailDisplay override
load_string() and check that the formatter is not busy before loading
the string. Have EMailReader call e_web_view_load_string() directly
on the EMailDisplay instance, and eliminate update_webview_content().
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Make EWebView extensible and register an extension to automatically
bind every EWebView instance to the appropriate EShellSettings.
Conflicts:
widgets/misc/e-web-view.c
|
| |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Make ECalendarItem, ECalendarView, ECalModel, EDateEdit, EMeetingStore,
and EMeetingTimeSelector extensible and register extensions to
automatically bind every instance to the appropriate EShellSettings.
Conflicts:
calendar/gui/gnome-cal.c
modules/calendar/e-cal-shell-content.c
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| | |
Based on EggTreeMultiDragSource in libegg.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Some improvements made while investigating bug #608855. This does not
solve the bug however, and in fact I now believe the bug is actually a
GTK+ issue after reproducing the bug in gtk-demo.
These improvements restore multiple selections via Ctrl+Click and
Shift+Click, and also reduces the frequency that we synchronize the
selection between Icon View and Tree View.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| |
| | |
This also removes the boxed CamelObject GType, since CamelObject is an
honest-to-goodness GObject now.
|
| |
| |
| |
| | |
Lot of improvements in contact printing. A few more to follow suit.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| | |
pet widget we are going to steal the gc from, so it actually has it.
|
| | |
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Still remaining:
GtkAccessible::widget
GtkAssistant::forward
GtkAssistant::back
GtkObject::flags
GtkTreeStore::stamp
The GtkAssistant fields are related to bug #596428. We don't
need accessor functions so much as the enhancement described
there implemented.
https://bugzilla.gnome.org/show_bug.cgi?id=615613
|
| | |
|
| | |
|
| |
| |
| |
| | |
Also, bump our GTK+ requirement to 2.20.
|
| | |
|
| | |
|
| |
| |
| |
| | |
This reverts commit 0e239e555149729fb536d6a48b3640b5462a2e47.
|
| | |
|
| | |
|
| |
| |
| |
| | |
Remove old ChangeLog files that predate our switch to git.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| |
| |
| |
| | |
Add a load_string() method to EWebView. Have EMailDisplay override
load_string() and check that the formatter is not busy before loading
the string. Have EMailReader call e_web_view_load_string() directly
on the EMailDisplay instance, and eliminate update_webview_content().
|
| | |
|
| | |
|
| |
| |
| |
| |
| | |
Make EWebView extensible and register an extension to automatically
bind every EWebView instance to the appropriate EShellSettings.
|
| | |
|
|/
|
|
|
|
| |
Make ECalendarItem, ECalendarView, ECalModel, EDateEdit, EMeetingStore,
and EMeetingTimeSelector extensible and register extensions to
automatically bind every instance to the appropriate EShellSettings.
|
|
|
|
|
|
|
|
|
| |
We can't require the use of EUIManager everywhere because we don't
control all the UI manager instances -- the most compelling example
being the composer, whose UI manager comes from GtkhtmlEditor.
Instead, EPluginUI will check the instance type and pick an appropriate
"load_from_string" function.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replace the EVO_EXPRESS environment variable with an --express command
line option. (Note, this adds a new translatable string for --help.)
Add an EUIManager class with an "express-mode" property and custom load
functions that use our new "express" preprocessor. This replaces the UI
manager functions in e-utils.c.
(Also going to see if I can get GTK+ to add an "add_ui_from_string"
method to GtkUIManagerClass that we can override. Then we could just
call gtk_ui_manager_add_ui_from_string() and the preprocessor would
automatically do its thing and chain up.)
Add an "express-mode" read-only GObject property to EShell.
Add e_shell_configure_ui_manager() to e-shell-utils.c. For now this
just creates a one-way property binding:
EShell:express-mode -> EUIManager:express-mode
Call this immediately after e_ui_manager_new(). (EUIManager can't do
this itself because it lives too low in the dependency hierarchy and
doesn't know about EShell.)
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Adds a GalViewInstance::loaded signal so EShellView gets notified when
the initial view is loaded.
|
|
|
|
|
| |
It seems that the dummy libraries are not needed anymore on windows
nowadays.
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
To avoid another case like bug #587014, add GSignalAccumulator functions
to all ETable and ETree signals that return a flag to indicate the signal
has been handled.
See commit e9dc381d3ace3404d0eafe94eb6da3b9a843abb8 for an example of
the kind of problems not having a GSignalAccumulator can cause.
Signals changed:
ETree::click
ETree::right-click
ETree::white-space-event
ETable::click
ETable::key-press
ETable::right-click
ETable::start-drag
ETable::white-space-event
ETableItem::click
ETableItem::right-click
ETableItem::start-drag
ETableGroup::click
ETableGroup::key-press
ETableGroup::right-click
ETableGroup::start-drag
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Neither ETree::key-press nor ETableItem::key-press signal definitions
specify a GSignalAccumulator that terminates the signal emission when
a handler returns TRUE, and Evolution 2.29 connects multiple handlers
to ETree::key-press.
When the space key is pressed, the first handler implements the magic
space bar behavior and returns TRUE, which should terminate signal
emission but doesn't because there's no accumulator function on the
signal. So the second handler runs and checks for other keys besides
space. It returns FALSE since it didn't handle the key press.
End result: emission site gets back FALSE (from the second handler) as
the return value, so it thinks the key press was not handled at all and
invokes the fallback handler -- e_selection_model_toggle_single_row() --
which -unselects- the newly selected row, making it appear the next
unread message was never selected.
Several other ETable-related signals that return "handled" flags also
lack GSignalAccumulator functions. I've made a note to myself to fix
those as well.
|
|
|
|
|
|
| |
This reverts commit 2ee273db7c3175d323e55d87432961cfa94e8be1.
That commit caused the side-effect reported in bug #610251.
|
|
|
|
|
|
| |
The "deactivate" handler for EAttachmentButton's popup menu was never
disconnected, and I suspect it may be getting invoked after the button
has been finalized.
|
| |
|
|
|
|
|
|
| |
GtkAssistant's initial reference is floating, so if command-line import
fails to find a suitable importer, sink the reference before finalizing
the GtkAssistant.
|
| |
|
|
|
|
|
|
| |
Avoid listing calendar and directory targets explicitly, so that
e-selection.c contains the one and only master list. Still need
to figure out how to centralize "text/x-source-vcard".
|
| |
|
| |
|
| |
|
|
|
|
| |
Also, let EShellSearchbar handle search state persistence.
|
| |
|
| |
|
| |
|
|
|
|
| |
Part of https://bugzilla.gnome.org/show_bug.cgi?id=608175
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Use Shift+Ctrl+F as the accelerator for consistency with the mailer.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add "copy-target-list" and "paste-target-list" to the ESelectable
interface. These are underutilized for the moment, but will eventually
be used to help integrate drag-and-drop support into ESelectable.
Add cut and paste support to EWebView, along with a new "editable"
property and new clipboard signals "copy-clipboard", "cut-clipboard" and
"paste-clipboard".
In EFocusTracker, listen for "owner-changed" signals from the default
clipboard as another trigger to update actions, particularly the Paste
action. (Unfortunately this doesn't work for EWebView since GtkHtml
implements its own clipboard.)
In EMsgComposer, convert GtkhtmlEditor's clipboard methods to empty
stubs, since EFocusTracker will now trigger EWebView's clipboard
actions. Also, intercept EWebView::paste-clipboard signals and improve
the interaction between the HTML editor and the attachment bar based on
use cases in bug #603715.
|
|
|
|
| |
Caught by the Clang Static Analyzer.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|