Commit Graph

944 Commits

Author SHA1 Message Date
Bastien Montagne
5c5ecc3465 Usual UI messages fixes... 2013-04-29 14:09:19 +00:00
Campbell Barton
263ea88392 fix/workaround [#34983] bpy.ops.mesh.primitive_torus_add() ignores rotation-parameter 2013-04-22 20:53:30 +00:00
Lukas Toenne
d56ceaab4c Nicer registration mechanism for node categories. The lists of node categories and items are now stored in a dictionary with an identifier key, so they can be registered and unregistered individually. The Add menu is now persistent and gets extended with a draw function for each of the registered node category lists.
This allows pynodes to define their own list of node categories and items and register it at runtime without interfering with the standard nodes.
2013-04-22 16:25:35 +00:00
Bastien Montagne
fba67abf7a Restore usage of difflib's quick_ratio()... Don't actually know what happens here, my tests with timeit showed it much slower than ratio(), but real-life says the contrary... 2013-04-19 16:23:02 +00:00
Bastien Montagne
01ffbab8f5 Some i18n tools fixes (I'm ashamed...), and merge func for I18nMessages objects. 2013-04-18 15:26:22 +00:00
Bastien Montagne
4587ecd45b More i18n tools tweaks:
* Remove difflib's quick_ratio() call, from quick tests looks it is four times slower than ratio(), and yet it gives the same results...
* Moved code to find all po's in a dir into its own func (will be used by i18n addon tools too).
2013-04-18 11:09:25 +00:00
Lukas Toenne
bb1b2529a0 Added back the basic Search operator to the node Add menu. This operator should be implemented a bit nicer using the new categories system as well, but for now works just as before. 2013-04-17 07:47:00 +00:00
Thomas Dinges
e04b7dc209 Node Toolbar:
* Use column() layout, this way it uses a bit less space.
2013-04-14 09:17:03 +00:00
Thomas Dinges
ceacf24e3d Node Toolbar:
* Have panels closed by default.
2013-04-13 16:26:55 +00:00
Lukas Toenne
94931f9f45 Replacing the node Add menu and making the toolbar useful
As some people have already noticed, the "Add" menu for nodes is a bit messy since pynodes merge. The reason for this is that the order of nodes in submenus (categories) was previously defined by the order in which all nodes are registered (at the bottom of blenkernel/intern/node.c). For the dynamic registration of node types now possible this system of defining node order along with registration is no longer viable: while it would still sort of work for C nodes, it is completely meaningless for dynamic (python) nodes, which are basically registered automatically in whatever order modules and addons are loaded, with the added complexity of unloading and reloading.

To fix this problem and add a bunch of desirable features this commit replaces the C menu with a python implementation. The new menu does not rely on any particular order of types in the node registry, but instead uses a simple explicit list of all the available nodes, grouped by categories (in scripts/nodeitems_builtins.py).

There are a number of additional features that become possible with this implementation:

1) Node Toolbar can be populated!
The list of nodes is used to create 2 UI items for each node: 1 entry in a submenu of "Add" menu and 1 item in a node toolbar panel with basically the same functionality. Clicking a button in the toolbar will add a new node of this type, just like selecting an item in the menu. The toolbar has the advantage of having collapsible panels for each category, so users can decide if they don't need certain nodes categories and have the rest more easily accessible.

2) Each node item is a true operator call.
The old Add menu is a pretty old piece of C code which doesn't even use proper operator buttons. Now there is a generic node_add operator which can be used very flexibly for adding any of the available nodes.

3) Node Items support additional settings.
Each "NodeItem" consists of the basic node type plus an optional list of initial settings that shall be applied to a new instance. This gives additional flexibility for creating variants of the same node or for defining preferred initial settings. E.g. it has been requested to disable previews for all nodes except inputs, this would be simple change in the py code and much less intrusive than in C.

4) Node items can be generated with a function.
A callback can be used in any category instead of the fixed list, which generates a set of items based on the context (much like dynamic enum items in bpy.props). Originally this was implemented for group nodes, because these nodes only make sense when linked to a node tree from the library data. This principle could come in handy for a number of other nodes, e.g. Image nodes could provide a similar list of node variants based on images in the library - no need to first add node, then select an image.

WARNING: pynodes scripters will have to rework their "draw_add_menu" callback in node tree types, this has been removed now! It was already pretty redundant, since one can add draw functions to the Add menu just like for any other menu. In the future i'd like to improve the categories system further so scripters can use it for custom node systems too, for now just make a draw callback and attach it to the Add menu.
2013-04-13 15:38:02 +00:00
Bastien Montagne
0e4b092c2d More fixes for addon i18n messages management. 2013-04-12 12:19:50 +00:00
Campbell Barton
2c6a82dd0a py api: minor change to operator attribute access, do identity comparison with None (no functional change). 2013-04-11 10:16:18 +00:00
Campbell Barton
577a1b9239 fix [#34805] Bake action ignores parent motion
in fact this is more feature request.
add an option to bake a parented objects animation, then clear the parent and apply the action.
2013-04-11 08:42:25 +00:00
Campbell Barton
791815c9d4 py api: path_reference_copy() use try/except when copying images, can fail for odd reasons (currently fails if the dest dir is a symlink and not using expected permissions). 2013-04-10 12:16:27 +00:00
Campbell Barton
44a661e6a8 py api: simple function to get an image from an objects for simple formats that only support one image per object. 2013-04-10 11:43:25 +00:00
Bastien Montagne
6382f6bedd Various edits preparing addons' translations tools (not everything yet functionnal/tested, though).
Also workaround a nasty bug, where unregistered py classes remain listed in relevant __subclasses__() calls, which would lead to crash with python addons i18n tools (main translation was not affected, as messages extracting tools are executed in a brand new "factory startup" Blender ;) ).
2013-04-09 08:56:35 +00:00
Thomas Dinges
858ff6b696 Fix for [#34898] Typo in error message of mathutils.Vector
* Also fixed some more cases of "more then" -> "more than".
2013-04-07 15:09:06 +00:00
Bastien Montagne
4a66bf8f4a Usual typo fixes... ;) 2013-04-07 10:21:22 +00:00
Campbell Barton
63d523336f freestyle lineset tag attribute was defined but not used, also some code cleanup. 2013-04-07 01:38:03 +00:00
Campbell Barton
98752a1f30 py api additions needed for fixing [#34864].
- add rna property 'as_bytes' method so you can get a string property as python bytes (bypass encoding).
- make bpy.path.abspath/relpath compatible with bytes.
- add 'relpath' option to bpy_extras.image_utils.load_image(), so you can load an image relative to a path.
2013-04-05 00:30:32 +00:00
Bastien Montagne
932820499a Usual typo fixing... 2013-04-02 07:27:39 +00:00
Campbell Barton
8e3d590b76 code cleanup: python/pep8 and double-promotion warnings. 2013-03-28 19:33:14 +00:00
Bastien Montagne
c54fba6a11 I18n: fix/enhance how predefined contexts are handled in py code. Now they should be specified by an attribute with the same name as the one in bpy.app.translations.contexts named tuple (i18n_contexts.default, .id_windowmanager, etc.).
This way, i18n message extracting code is now able to get the right context!
2013-03-28 15:03:47 +00:00
Bastien Montagne
b4bd43e022 I18n: various "new data translation" fixes... 2013-03-26 14:33:53 +00:00
Bastien Montagne
4cb9414b39 I18n: use id_windowmanager context for keymap idnames. Solves some issues with those names (notably "Clip" one, and "Screen" too) in some translations. Also move "Key" as "Keyboard" (opposed to "Keyframe") to same context. 2013-03-25 11:35:42 +00:00
Bastien Montagne
72a3714695 Update to i18n tools (new [CTX_]DATA_ macros, and some more exceptions to spell check...). 2013-03-25 08:30:38 +00:00
Bastien Montagne
e45da6f40a Small changes/additions to i18n tools. 2013-03-19 15:49:53 +00:00
Bastien Montagne
4857d62ac6 More i18n tools cleanup. Also do not import nl in trunk currently (void translation)! 2013-03-19 10:11:41 +00:00
Bastien Montagne
fbbbb90af3 Some renaming/cleanup in i18n tools. 2013-03-19 08:33:24 +00:00
Bastien Montagne
66c7b54a88 Usual minor UI messages fixes. 2013-03-18 18:43:22 +00:00
Lukas Toenne
4638e5f99a Merge of the PyNodes branch (aka "custom nodes") into trunk.
PyNodes opens up the node system in Blender to scripters and adds a number of UI-level improvements.

=== Dynamic node type registration ===
Node types can now be added at runtime, using the RNA registration mechanism from python. This enables addons such as render engines to create a complete user interface with nodes.

Examples of how such nodes can be defined can be found in my personal wiki docs atm [1] and as a script template in release/scripts/templates_py/custom_nodes.py [2].

=== Node group improvements ===
Each node editor now has a tree history of edited node groups, which allows opening and editing nested node groups. The node editor also supports pinning now, so that different spaces can be used to edit different node groups simultaneously. For more ramblings and rationale see (really old) blog post on code.blender.org [3].

The interface of node groups has been overhauled. Sockets of a node group are no longer displayed in columns on either side, but instead special input/output nodes are used to mirror group sockets inside a node tree. This solves the problem of long node lines in groups and allows more adaptable node layout. Internal sockets can be exposed from a group by either connecting to the extension sockets in input/output nodes (shown as empty circle) or by adding sockets from the node property bar in the "Interface" panel. Further details such as the socket name can also be changed there.

[1] http://wiki.blender.org/index.php/User:Phonybone/Python_Nodes
[2] http://projects.blender.org/scm/viewvc.php/trunk/blender/release/scripts/templates_py/custom_nodes.py?view=markup&root=bf-blender
[3] http://code.blender.org/index.php/2012/01/improving-node-group-interface-editing/
2013-03-18 16:34:57 +00:00
Bastien Montagne
f09f2d1c31 Fix more UI i18n issues (reported by Leon Cheung). 2013-03-11 15:01:03 +00:00
Bastien Montagne
4daef64986 Fix more UI i18n issues (reported by Leon Cheung and Lockal).
We have a glicth with colormanagement's spaces descriptions, though, looks like they are clamped at 64 chars (see raw space), will see that later, if it’s solvable.
2013-03-11 09:06:49 +00:00
Campbell Barton
34f3dc43e7 code cleanup: pep8 & minor changes 2013-03-11 02:19:58 +00:00
Bastien Montagne
6da449b86c More UI message i18n fixes and improvements...
Fix for keyingsets tips, and make them (and a few others) findable by i18n messages extracting code (for some reasons, their bl_rna.description are void???).
2013-03-10 17:42:08 +00:00
Bastien Montagne
874b692e80 More UI message i18n fixes and improvements...
Rendering messages are now translatable.
2013-03-10 16:55:01 +00:00
Bastien Montagne
7a94ad9408 More UI message i18n fixes and improvements... 2013-03-10 16:14:29 +00:00
Bastien Montagne
462e4bee87 More tweaks (gaining about ten seconds for each po in update branches process!). 2013-03-01 14:28:38 +00:00
Bastien Montagne
1039135965 More UI messages fixes... 2013-02-28 15:31:20 +00:00
Bastien Montagne
4238d6d758 Various small enhancements/fixes.
Most notable difference from now on will be that all py is handled from current blender's resource dirs, no more from source dir. Better for consistency, and avoid e.g. cycles' addon to be checked twice...
2013-02-27 16:24:20 +00:00
Campbell Barton
8558fdd4c7 patch [#34437] Fix text editor bug: ctrl+F is not configurable
in fact the keymap editor was missing other keymaps so added these too,
also updated keymap checker to make sure there is no mismatch with region/space types.
2013-02-26 05:22:04 +00:00
Bastien Montagne
095062f0c5 Tame that stupid py code not to eat existing fuzzies in po’s when updating from POT file! 2013-02-25 16:06:59 +00:00
Campbell Barton
83e53afb18 patch [#34380] Fix Python console bug: "autocomplete" doesn't advance cursor properly when completion includes UTF8 characters
from Shinsuke Irie (irie)
2013-02-24 21:51:48 +00:00
Bastien Montagne
b1543f07bf Another bunch of UI translation fixes, thanks to Leon Cheung, Gabriel Gazzán and S. Lockal for spotting them! 2013-02-24 15:40:28 +00:00
Bastien Montagne
2c348d003e Big i18n tools update, I/II.
Notes:
* Everything is still a bit raw and sometimes hackish.
* Not every feature implemented yet.
* A bunch of cleanup is still needed.
* Doc needs to be updated too!
2013-02-24 08:50:55 +00:00
Bastien Montagne
de26f59220 Add CTX_wm_operator_poll_msg_set as auto-detected func for translations. 2013-02-19 15:47:30 +00:00
Sergey Sharybin
58c9691d19 Correction to own r44749 -- layers from view were always used,
shall use active layer now for real.
2013-02-18 17:51:07 +00:00
Campbell Barton
4cd487d731 checking for V3D_LOCAL was duplicated in transform.c, and both checks not quite correct.
- When checking edimode, make sure its mesh editmode.
- Graph editor supports this option but wasn't being checked.
2013-02-18 15:47:13 +00:00
Campbell Barton
4ae3a28fcb fix bpy_extras.mesh_utils.edge_face_count_dict() helper api function.
it was using tessfaces when theres no need to.
2013-02-18 14:52:49 +00:00
Bastien Montagne
3de87ebf64 Minor fix... 2013-02-17 15:04:56 +00:00
Bastien Montagne
7cdff04f9f Fixes for BMO_error_raise extraction regex, and add hindi to "active" translations.
Also enhanced the ugly py ast parsing code, so that it now can handle (up to some extent) "name" function nodes, and add bpy.app.translations.pgettext func familly to extracted ones...

This ast py parsing becomes more and more ugly, should probably try to refactor it a bit. :/
2013-02-17 14:00:40 +00:00
Bastien Montagne
207dca55f4 And more UI messages issues fixing... Thanks again to Gabriel Gazzán and Leon Cheung! 2013-02-15 18:19:20 +00:00
Bastien Montagne
5078174f07 New Hindi translation... 2013-02-14 14:41:04 +00:00
Bastien Montagne
f6624aaacd Gah, forgot some ugly print... 2013-02-13 21:56:12 +00:00
Bastien Montagne
f2d9fc7e25 Update to how similar messages matching is handled when updating po files from pot one (gain something like 20% in heavy update situations, and save a nice bunch of memory!). 2013-02-12 17:32:54 +00:00
Bastien Montagne
08cf8865aa And we now have a valid korean translation! 2013-02-12 14:36:08 +00:00
Campbell Barton
3b8a0f3d67 use import rather then assignment for loading '_' into scripts. 2013-02-10 09:56:05 +00:00
Campbell Barton
a643d28446 Update translation extractor so ternary expressions are not merged.
eg: ("A" if test else "B")
2013-02-10 07:11:32 +00:00
Bastien Montagne
a4a1c66725 Better to return default op context when we can't find a given operator (e.g. console toggling under linux does not exists). 2013-02-09 18:47:40 +00:00
Bastien Montagne
e14b21dd6d Updated py ui message extraction, to find out contexts as much as possible... 2013-02-09 18:32:00 +00:00
Campbell Barton
d26c063121 disable translations for some python buttons. 2013-02-08 16:41:02 +00:00
Campbell Barton
560c022af9 patch [#34163] "Zoom" in Python console startup message
from Shinsuke Irie (irie)
2013-02-08 10:15:44 +00:00
Campbell Barton
4b8fe80e6e code cleanup: use exist_ok keyword arg to os.makedirs() rather then checking if the dir exists first. 2013-02-07 04:02:24 +00:00
Brecht Van Lommel
8e740e9797 Fix #34016: add backwards compatibility for deprecated region.callback_add
python function, this keep addons working. It's better to use the new function
but might as well avoid breaking compatibility here.
2013-01-29 21:34:58 +00:00
Bastien Montagne
97a5cd92bc Some optimization (their is much more possible here, but it will have to wait for complete refactor I’m working on currently). 2013-01-29 08:34:26 +00:00
Bastien Montagne
a2e55171fe Bunch of fixes for UI messages.
Also generate rigid body constraint types in py bullet code from RNA enum values (simpler than having to sync the code when something is changed here!).

Side note: RNA API about icons still needs to expose icons for enum values, and conversion funcs between icon_name and icon_value!
2013-01-27 18:14:24 +00:00
Campbell Barton
4544c234f5 fix [#29950] Linked proxy armature object properties can't be edited 2013-01-23 06:09:53 +00:00
Bastien Montagne
bcdbc57994 Usual minor UI messages fixes... 2013-01-21 16:25:25 +00:00
Joshua Leung
53de752858 Bugfix [#33946] Bake Action fails in SVN for Objects
The problems here were caused by a cleanup commit (r. 53369).
BTW, the code here is pretty convoluted mess.
2013-01-21 02:40:51 +00:00
Campbell Barton
97d62f0183 style cleanup 2013-01-15 23:15:32 +00:00
Campbell Barton
039db0906d add user_preference access to _RestrictContext() so addons can access their own preferences on load. 2013-01-15 17:20:52 +00:00
Campbell Barton
a404e3f780 fix issue reported in '[#33876] bpy.path.ensure_ext adds extension twice / extra period if filename empty, just a period or equal to extension'
For python operators that used the ExportHelper mix-in class, an empty file field would become '.ext', entering and existing the text field would become '.ext.ext',
Now only add an extension if the filename part of the path is set, so '.ext' will still become '.ext.ext' but having only the extension isn't so likely to happen in the first place now.

This is a different fix then the changes suggested in the report but I'd prefer to keep path functions stupid+predictable.
2013-01-15 04:33:08 +00:00
Bastien Montagne
819a75113e Some fixes:
* handle nicely multiple empty lines in po files (still have to figure out why po writer sometime output two lines instead of one!)
* fix rtl processing!
2013-01-14 21:41:21 +00:00
Campbell Barton
3475f5137a fix fox AddonPreferences not getting registered automatically and leak when removing the addon (wasnt freeing ID-props). 2013-01-14 10:36:43 +00:00
Bastien Montagne
884d7caa24 Minor updates:
*Made branches' po update multi-process!
*0.8 looks a bit too much a "similarity cutoff" value for messages, changed to 0.75.
2013-01-13 17:43:04 +00:00
Bastien Montagne
cdb5e557b0 Grumph, going quicker than the music! :P 2013-01-13 14:36:50 +00:00
Bastien Montagne
55e3912f25 Big refactor of bl_i18n_utils, switching to an object-based model. Still a bit wip.
Notes:
* Most tools here have been updated, only a few (unused :p ) features should be missing. But some updates are rough for now, and performances are globally worse currently, will address this later (this is only really noticeable when you work over the whole repo, anyway ;) ).
* This update breaks "edit translations" addon, will fix it later, once core (i.e. this module) is considered stable again!
2013-01-12 16:49:06 +00:00
Bastien Montagne
0e676bf50b Adding Uzbek language 2013-01-04 18:19:07 +00:00
Campbell Barton
9dbe85c17e expose common extensions for image/movie/audio types, since python scripts had to do this internally.
- bpy.path.extensions_image
- bpy.path.extensions_movie
- bpy.path.extensions_audio

eg:

  if os.path.splitext(filename)[1].lower() in bpy.path.extensions_image:
      ... we have an image ...
2013-01-04 03:47:37 +00:00
Campbell Barton
ea2224e28d changes needed for EDL import to work again.
- add sequence.update(data=False) function.
- made some sequence vars editable.
- correct some comments.

also rename rna function sequence.getStripElem() --> strip_elem_from_frame()
2013-01-02 16:15:45 +00:00
Bastien Montagne
b3aa368c8f Usual UI messages-related fixes... 2012-12-30 23:21:33 +00:00
Thomas Dinges
f098407f02 i18 Spell check:
* Wrong comma sequence in spell_check_utils.py
2012-12-28 20:32:29 +00:00
Bastien Montagne
c587c985e8 Fix [#33424] Inadequate bake action.
bake_action tries to make kind of a 'visual keying'... On one side, this is rather stupid when you keep constraints (in this case, keying actual loc/rot/scale transforms, i.e. matrix_basis, is enough, doing more would lead to unexpected behavior with some constraints). On the other one, making a good visual keying of bones is *really* tricky, so now using the new object's convert_space() func to compute that (when the user chooses to remove the constraints).

Incidentally, this greatly simplifies the code of bake_action!
2012-12-28 13:34:19 +00:00
Bastien Montagne
7504cf34b4 This commit frees list ui items from their dependencies to Panel, and hence from all the limitations this implied (mostly, the "only one list per panel" one).
It introduces a new (py-extendable and registrable) RNA type, UIList (roughly similar to Panel one), which currently contains only "standard" list's scroll pos and size (but may be expended to include e.g. some filtering data, etc.). This now makes lists completely independent from Panels!

This UIList has a draw_item callback which allows to customize items' drawing from python, that all addons can now use. Incidentally, this also greatly simplifies the C code of this widget, as we do not code any "special case" here anymore!

To make all this work, other changes were also necessary:

* Now all buttons (uiBut struct) have a 'custom_data' void pointer, used currently to store the uiList struct associated with a given uiLayoutListBox.

* DynamicPaintSurface now exposes a new bool, use_color_preview (readonly), saying whether that surface has some 3D view preview data or not.

* UILayout class has now four new (static) functions, to get the actual icon of any RNA object (important e.g. with materials or textures), and to get an enum item's UI name, description and icon.

* UILayout's label() func now takes an optional 'icon_value' integer parameter, which if not zero will override the 'icon' one (mandatory to use "custom" icons as generated for material/texture/... previews).
  Note: not sure whether we should add that one to all UILayout's prop funcs?

Note: will update addons using template list asap.
2012-12-28 09:20:16 +00:00
Bastien Montagne
f339c63584 We now have some Catalan, but no Amharic nor Estonian yet! 2012-12-24 17:55:00 +00:00
Bastien Montagne
ec4fc2e132 Usual minor UI messages tweaks... 2012-12-24 17:40:47 +00:00
Campbell Barton
f25618f29a make Node.links return a tuple, this may you can't do socket.links.append() by mistake.
removed RNAMeta mixin class since you cant register subclasses.

also some minor code cleanup
2012-12-21 12:16:13 +00:00
Lukas Toenne
74ea6d93da Explicit python class for NodeSocket RNA type in bpy_types. This defines a utility property for getting links to or from a node socket, as discussed on bf-committers:
http://lists.blender.org/pipermail/bf-committers/2012-December/038555.html

Note: NodeTree and Node currently use standard python classes generated by bpy for now. The customnodes branch defines such classes as well, with specialized metaclasses for use with ID properties. Not needed in trunk yet.
2012-12-21 11:31:59 +00:00
Campbell Barton
423994bf39 py api: add restrict state context manager (thats python's context not blenders context),
which restricts bpy.context and bpy.data.

enable this for loading scripts in 'startup' too.
2012-12-20 03:56:22 +00:00
Campbell Barton
ef665b3d18 dissallow access to the context while addons import and register.
Since the window manager is needed for keymaps this is kept as an exception.

some addons will need updating, but in every case I've seen addons should not be accessing the context while registering.
(bad stuff! - declaring the scene as a global variable - which crashes when the users loads a new file, manipulating the active object or scene... tsk tsk)
2012-12-19 07:27:23 +00:00
Bastien Montagne
b7e3967134 Adding Amharic (i.e. ethiopic) language. 2012-12-18 09:13:04 +00:00
Bastien Montagne
cfd6282a80 Minor update to i18n spell check stuff... 2012-12-17 20:32:25 +00:00
Campbell Barton
15634fd22e fix for sequence size mismatch when loading themes, addition of alpha channel caused themes not to load. 2012-12-13 09:46:24 +00:00
Campbell Barton
7c2e4e28ba bpy.ops module/caller classes incorrectly had __keys__ rather then __slots__.
also added comments about texface drawing when theres no origindex.
2012-12-06 03:09:06 +00:00
Campbell Barton
0b9be70591 typo's and some style cleanup, also added asserts into BLI_vsnprintf and BLI_sprintfN when invalid args are given. 2012-11-28 06:43:04 +00:00
Campbell Barton
4fe35721e6 bmesh operator api reference - add in 'bmesh' arg at the start of each operator, also use :class: references. 2012-11-28 01:14:11 +00:00
Bastien Montagne
eab58bf994 Spell check updates... 2012-11-26 21:25:50 +00:00
Bastien Montagne
bb7fdc7935 Handle of new BLF_I18N_MSGID_MULTI_CTXT macro, which allows to define a same msgid in up to 16 different contexts at once. 2012-11-23 15:35:16 +00:00
Campbell Barton
b867f9f17e style cleanup: comments & spelling 2012-11-18 01:22:31 +00:00
Campbell Barton
7c3db355b1 remove ifdef'd bevel code, current bevel works better then the previous code.
reduce strlen check in texttool_suggest_add()
use 'del list[:]' rather then 'list[:] = []' in python scripts which clear lists.
2012-11-14 09:45:15 +00:00