2019-09-19 14:00:26 +02:00
local S = minetest.get_translator ( " unified_inventory " )
2018-04-02 13:33:36 +02:00
local F = minetest.formspec_escape
2021-03-07 14:18:17 +01:00
local ui = unified_inventory
2014-06-21 12:44:31 +02:00
2014-07-06 23:39:20 +02:00
local hud_colors = {
{ " #FFFFFF " , 0xFFFFFF , S ( " White " ) } ,
{ " #DBBB00 " , 0xf1d32c , S ( " Yellow " ) } ,
{ " #DD0000 " , 0xDD0000 , S ( " Red " ) } ,
{ " #2cf136 " , 0x2cf136 , S ( " Green " ) } ,
{ " #2c4df1 " , 0x2c4df1 , S ( " Blue " ) } ,
}
local hud_colors_max = # hud_colors
-- Stores temporary player data (persists until player leaves)
local waypoints_temp = { }
2021-03-07 14:18:17 +01:00
ui.register_page ( " waypoints " , {
2014-05-05 09:39:03 +02:00
get_formspec = function ( player )
2014-07-06 23:39:20 +02:00
local player_name = player : get_player_name ( )
2021-03-07 14:18:17 +01:00
local wp_info_x = ui.style_full . form_header_x + 1.25
local wp_info_y = ui.style_full . form_header_y + 0.5
local wp_bottom_row = ui.style_full . std_inv_y - 1
local wp_buttons_rj = ui.style_full . std_inv_x + 10.1 - ui.style_full . btn_spc
local wp_edit_w = ui.style_full . btn_spc * 4 - 0.1
2015-10-08 11:56:04 +02:00
-- build a "fake" temp entry if the server took too long
-- during sign-on and returned an empty entry
if not waypoints_temp [ player_name ] then waypoints_temp [ player_name ] = { hud = 1 } end
2014-07-06 23:39:20 +02:00
local waypoints = datastorage.get ( player_name , " waypoints " )
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
local formspec = { ui.style_full . standard_inv_bg ,
string.format ( " label[%f,%f;%s] " ,
ui.style_full . form_header_x , ui.style_full . form_header_y ,
F ( S ( " Waypoints " ) ) ) ,
2021-03-05 16:58:18 +01:00
" image[ " .. wp_info_x .. " , " .. wp_info_y .. " ;1,1;ui_waypoints_icon.png] "
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
}
local n = 4
2014-05-05 09:39:03 +02:00
-- Tabs buttons:
2021-03-05 16:58:18 +01:00
for i = 1 , 5 do
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
local sw = " select_waypoint " .. i
formspec [ n ] = string.format ( " image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;] " ,
ui.style_full . main_button_x , wp_bottom_row - ( 5 - i ) * ui.style_full . btn_spc ,
ui.style_full . btn_size , ui.style_full . btn_size ,
( i == waypoints.selected ) and " ui_blue_icon_background.png^ " or " " ,
i , sw )
formspec [ n + 1 ] = " tooltip[ " .. sw .. " ; " .. S ( " Select Waypoint #@1 " , i ) .. " ] "
n = n + 2
2014-05-05 09:39:03 +02:00
end
2014-07-06 23:39:20 +02:00
local i = waypoints.selected or 1
local waypoint = waypoints [ i ] or { }
local temp = waypoints_temp [ player_name ] [ i ] or { }
2019-09-19 14:15:10 +02:00
local default_name = S ( " Waypoint @1 " , i )
2014-07-06 23:39:20 +02:00
2014-05-05 09:39:03 +02:00
-- Main buttons:
2021-03-05 16:58:18 +01:00
local btnlist = {
2021-03-07 18:38:08 +01:00
{ " ui_waypoint_set_icon.png " , " set_waypoint " , S ( " Set waypoint to current location " ) } ,
{ waypoint.active and " ui_on_icon.png " or " ui_off_icon.png " , " toggle_waypoint " , S ( " Make waypoint @1 " , waypoint.active and " invisible " or " visible " ) } ,
{ waypoint.display_pos and " ui_green_icon_background.png " or " ui_red_icon_background.png " , " toggle_display_pos " , S ( " @1 display of waypoint coordinates " , waypoint.display_pos and " Disable " or " Enable " ) } ,
{ " ui_circular_arrows_icon.png " , " toggle_color " , S ( " Change color of waypoint display " ) } ,
{ " ui_pencil_icon.png " , " rename_waypoint " , S ( " Edit waypoint name " ) }
2021-03-05 16:58:18 +01:00
}
local x = 4
for _ , b in pairs ( btnlist ) do
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
formspec [ n ] = string.format ( " image_button[%f,%f;%f,%f;%s;%s%i;] " ,
wp_buttons_rj - ui.style_full . btn_spc * x , wp_bottom_row ,
ui.style_full . btn_size , ui.style_full . btn_size ,
b [ 1 ] , b [ 2 ] , i )
2021-03-07 18:38:08 +01:00
formspec [ n + 1 ] = " tooltip[ " .. b [ 2 ] .. i .. " ; " .. F ( b [ 3 ] ) .. " ] "
2021-03-05 16:58:18 +01:00
x = x - 1
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
n = n + 2
2021-03-05 16:58:18 +01:00
end
2014-07-06 23:39:20 +02:00
-- Waypoint's info:
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
formspec [ n ] = " label[ " .. wp_info_x .. " , " .. ( wp_info_y + 1.1 ) .. " ; "
2014-07-06 23:39:20 +02:00
if waypoint.active then
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
formspec [ n + 1 ] = F ( S ( " Waypoint active " ) ) .. " ] "
2014-07-06 23:39:20 +02:00
else
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
formspec [ n + 1 ] = F ( S ( " Waypoint inactive " ) ) .. " ] "
2014-05-05 09:39:03 +02:00
end
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
n = n + 2
2014-05-05 09:39:03 +02:00
2014-07-06 23:39:20 +02:00
if temp.edit then
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
formspec [ n ] = string.format ( " field[%f,%f;%f,%f;rename_box%i;;%s] " ,
wp_buttons_rj - wp_edit_w - 0.1 , wp_bottom_row - ui.style_full . btn_spc ,
wp_edit_w , ui.style_full . btn_size , i , ( waypoint.name or default_name ) )
formspec [ n + 1 ] = string.format ( " image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;] " ,
wp_buttons_rj , wp_bottom_row - ui.style_full . btn_spc ,
ui.style_full . btn_size , ui.style_full . btn_size , i )
formspec [ n + 2 ] = " tooltip[confirm_rename " .. i .. " ; " .. F ( S ( " Finish editing " ) ) .. " ] "
n = n + 3
2014-05-05 09:39:03 +02:00
end
2014-07-06 23:39:20 +02:00
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
formspec [ n ] = string.format ( " label[%f,%f;%s: %s] " ,
wp_info_x , wp_info_y + 1.6 , F ( S ( " World position " ) ) ,
minetest.pos_to_string ( waypoint.world_pos or vector.new ( ) ) )
formspec [ n + 1 ] = string.format ( " label[%f,%f;%s: %s] " ,
wp_info_x , wp_info_y + 2.10 , F ( S ( " Name " ) ) , ( waypoint.name or default_name ) )
formspec [ n + 2 ] = string.format ( " label[%f,%f;%s: %s] " ,
wp_info_x , wp_info_y + 2.60 , F ( S ( " HUD text color " ) ) , hud_colors [ waypoint.color or 1 ] [ 3 ] )
2014-07-06 23:39:20 +02:00
Multiple related changes to string handling
1) Convert most formspec elements to use string.format(), when the
result would be more readable, or less messy, or at least makes the line
shorter, assuming it looked like it really needed it to begin with.
2) Convert all long `foo..","..bar..";"..baz..bleh..` types of excessive
string concatenation into tables that then get concated only once, when
their containing functions return the final formspec string.
3) In some places in the code, such tables were already being used, and
were named "formspec", while others were named "fs". I settled on just
one name, "formspec", as it's more readable, if longer.
4) There was a mix of styles of adding items to those tables:
* Some places used line after line of `t[#t + 1] = foo/bar/baz`.
* Others places used the form `t[1] = foo, t[2] = bar, ...`.
* Still others used the form `t[n] = foo, t[n+1] = bar...`,
with `n` being increased or reset every so often.
Most of them should now be of the third form, with a few of the second.
2021-03-07 16:37:20 +01:00
return { formspec = table.concat ( formspec ) }
2014-05-05 09:39:03 +02:00
end ,
} )
2021-03-07 14:18:17 +01:00
ui.register_button ( " waypoints " , {
2014-05-05 09:39:03 +02:00
type = " image " ,
image = " ui_waypoints_icon.png " ,
2014-06-22 00:34:35 +02:00
tooltip = S ( " Waypoints " ) ,
2015-10-05 10:24:01 +02:00
hide_lite = true
2014-05-05 09:39:03 +02:00
} )
2014-07-06 23:39:20 +02:00
local function update_hud ( player , waypoints , temp , i )
local waypoint = waypoints [ i ]
if not waypoint then return end
temp [ i ] = temp [ i ] or { }
temp = temp [ i ]
local pos = waypoint.world_pos or vector.new ( )
2014-05-05 09:39:03 +02:00
local name
if waypoint.display_pos then
2014-07-06 23:39:20 +02:00
name = minetest.pos_to_string ( pos )
if waypoint.name then
name = name .. " , " .. waypoint.name
2014-05-05 09:39:03 +02:00
end
else
2014-07-06 23:39:20 +02:00
name = waypoint.name or " Waypoint " .. i
2014-05-05 09:39:03 +02:00
end
2014-07-06 23:39:20 +02:00
if temp.hud then
player : hud_remove ( temp.hud )
2014-05-26 11:43:25 +02:00
end
if waypoint.active then
2014-07-06 23:39:20 +02:00
temp.hud = player : hud_add ( {
2014-05-05 09:39:03 +02:00
hud_elem_type = " waypoint " ,
2014-07-06 23:39:20 +02:00
number = hud_colors [ waypoint.color or 1 ] [ 2 ] ,
2014-05-05 09:39:03 +02:00
name = name ,
text = " m " ,
2014-07-06 23:39:20 +02:00
world_pos = pos
2014-05-05 09:39:03 +02:00
} )
2014-07-06 23:39:20 +02:00
else
temp.hud = nil
2014-05-05 09:39:03 +02:00
end
end
minetest.register_on_player_receive_fields ( function ( player , formname , fields )
2014-07-06 23:39:20 +02:00
if formname ~= " " then return end
2014-05-05 09:39:03 +02:00
2014-07-06 23:39:20 +02:00
local player_name = player : get_player_name ( )
2014-05-05 09:39:03 +02:00
local update_formspec = false
2014-07-06 23:39:20 +02:00
local need_update_hud = false
local hit = false
2014-05-05 09:39:03 +02:00
2014-07-06 23:39:20 +02:00
local waypoints = datastorage.get ( player_name , " waypoints " )
local temp = waypoints_temp [ player_name ]
for i = 1 , 5 , 1 do
2014-05-05 09:39:03 +02:00
if fields [ " select_waypoint " .. i ] then
2014-07-06 23:39:20 +02:00
hit = true
2014-05-05 09:39:03 +02:00
waypoints.selected = i
update_formspec = true
end
if fields [ " toggle_waypoint " .. i ] then
2014-07-06 23:39:20 +02:00
hit = true
waypoints [ i ] = waypoints [ i ] or { }
2014-05-05 09:39:03 +02:00
waypoints [ i ] . active = not ( waypoints [ i ] . active )
2014-07-06 23:39:20 +02:00
need_update_hud = true
2014-05-05 09:39:03 +02:00
update_formspec = true
end
2014-07-06 23:39:20 +02:00
2014-05-05 09:39:03 +02:00
if fields [ " set_waypoint " .. i ] then
2014-07-06 23:39:20 +02:00
hit = true
2019-06-16 10:26:40 +02:00
local pos = player : get_pos ( )
2014-05-05 09:39:03 +02:00
pos.x = math.floor ( pos.x )
pos.y = math.floor ( pos.y )
pos.z = math.floor ( pos.z )
2014-07-06 23:39:20 +02:00
waypoints [ i ] = waypoints [ i ] or { }
2014-05-05 09:39:03 +02:00
waypoints [ i ] . world_pos = pos
2014-07-06 23:39:20 +02:00
need_update_hud = true
2014-05-05 09:39:03 +02:00
update_formspec = true
end
2014-07-06 23:39:20 +02:00
2014-05-05 09:39:03 +02:00
if fields [ " rename_waypoint " .. i ] then
2014-07-06 23:39:20 +02:00
hit = true
2014-09-07 21:08:52 +02:00
temp [ i ] = temp [ i ] or { }
2014-07-06 23:39:20 +02:00
temp [ i ] . edit = true
2014-05-05 09:39:03 +02:00
update_formspec = true
end
if fields [ " toggle_display_pos " .. i ] then
2014-07-06 23:39:20 +02:00
hit = true
waypoints [ i ] = waypoints [ i ] or { }
2014-05-05 09:39:03 +02:00
waypoints [ i ] . display_pos = not waypoints [ i ] . display_pos
2014-07-06 23:39:20 +02:00
need_update_hud = true
2014-05-05 09:39:03 +02:00
update_formspec = true
end
if fields [ " toggle_color " .. i ] then
2014-07-06 23:39:20 +02:00
hit = true
waypoints [ i ] = waypoints [ i ] or { }
local color = waypoints [ i ] . color or 1
2014-05-05 09:39:03 +02:00
color = color + 1
2014-07-06 23:39:20 +02:00
if color > hud_colors_max then
2014-05-05 09:39:03 +02:00
color = 1
end
waypoints [ i ] . color = color
2014-07-06 23:39:20 +02:00
need_update_hud = true
2014-05-05 09:39:03 +02:00
update_formspec = true
end
if fields [ " confirm_rename " .. i ] then
2014-07-06 23:39:20 +02:00
hit = true
waypoints [ i ] = waypoints [ i ] or { }
temp [ i ] . edit = false
waypoints [ i ] . name = fields [ " rename_box " .. i ]
need_update_hud = true
2014-05-05 09:39:03 +02:00
update_formspec = true
end
2014-07-06 23:39:20 +02:00
if need_update_hud then
update_hud ( player , waypoints , temp , i )
2014-05-05 09:39:03 +02:00
end
if update_formspec then
2021-03-07 14:18:17 +01:00
ui.set_inventory_formspec ( player , " waypoints " )
2014-05-05 09:39:03 +02:00
end
2014-07-06 23:39:20 +02:00
if hit then return end
2014-05-05 09:39:03 +02:00
end
end )
2014-07-06 23:39:20 +02:00
2014-05-05 09:39:03 +02:00
minetest.register_on_joinplayer ( function ( player )
2014-07-06 23:39:20 +02:00
local player_name = player : get_player_name ( )
local waypoints = datastorage.get ( player_name , " waypoints " )
local temp = { }
waypoints_temp [ player_name ] = temp
for i = 1 , 5 do
update_hud ( player , waypoints , temp , i )
end
end )
2014-05-05 09:39:03 +02:00
2014-07-06 23:39:20 +02:00
minetest.register_on_leaveplayer ( function ( player )
waypoints_temp [ player : get_player_name ( ) ] = nil
2014-05-05 09:39:03 +02:00
end )
2014-07-06 23:39:20 +02:00