From c24c3156f5ea210869c63f985d26bf39b6a7669a Mon Sep 17 00:00:00 2001 From: aunefyren Date: Sat, 13 Mar 2021 23:40:46 +0100 Subject: [PATCH] Dynamic time strings, CSS tweaks, show buddy bug - Changed API response - Fixed bug where no shows created error message when retrieving show buddy - Tweaked username retrieved from Tautulli - Moved stat modules to function - All timecodes are converted to strings dynamically --- admin.html | 9 +- admin.js | 1 - api/get_functions.php | 2 +- api/get_stats.php | 18 +- assets/css/wrapped.css | 11 +- get_stats.js | 613 ++++++++++++++++++++++++----------------- index.html | 13 +- 7 files changed, 388 insertions(+), 279 deletions(-) diff --git a/admin.html b/admin.html index 2efcda5..37e4835 100644 --- a/admin.html +++ b/admin.html @@ -19,7 +19,7 @@ -
+
@@ -48,6 +48,10 @@
+ +
@@ -92,8 +96,5 @@ $(document).ready(function() { - diff --git a/admin.js b/admin.js index 7d3de97..858fb27 100644 --- a/admin.js +++ b/admin.js @@ -338,7 +338,6 @@ function test_tautulli_connection() { } }; xhttp.withCredentials = true; - console.log(url); xhttp.open("post", 'api/get_connection.php'); xhttp.send(config_data); } diff --git a/api/get_functions.php b/api/get_functions.php index f38b47f..0da7bf7 100644 --- a/api/get_functions.php +++ b/api/get_functions.php @@ -3,7 +3,7 @@ $data = json_decode(file_get_contents("php://input")); $config = json_decode(file_get_contents("../config/config.json")); if (empty($config)) { - echo json_encode(array("message" => "Config not configured.", "error" => true)); + echo json_encode(array("message" => "Plex Wrapped is not configured.", "error" => true)); exit(0); } diff --git a/api/get_stats.php b/api/get_stats.php index 8c1947f..03bfff5 100644 --- a/api/get_stats.php +++ b/api/get_stats.php @@ -10,7 +10,7 @@ $arrContextOptions= [ ]; if (empty($config)) { - echo json_encode(array("message" => "Config not configured.", "error" => true)); + echo json_encode(array("message" => "Plex Wrapped is not configured.", "error" => true)); exit(0); } @@ -71,7 +71,7 @@ if($config->get_user_show_stats) { $user_shows = array("error" => True, "message" => "Disabled in config.", "data" => array()); } -if($config->get_user_show_buddy && $config->get_user_show_stats && !empty($user_shows["data"])) { +if($config->get_user_show_buddy && $config->get_user_show_stats && !empty($user_shows["data"]["shows"])) { $user_shows["data"] = $user_shows["data"] + array("show_buddy" => array("user" => tautulli_get_user_show_buddy($id, $user_shows["data"]["shows"]), "error" => False, "Message" => "Buddy is loaded.")); } else { $user_shows["data"] = $user_shows["data"] + array("show_buddy" => array("message" => "Disabled in config.", "error" => True)); @@ -157,7 +157,8 @@ function tautulli_get_user($input) { return $response->response->data[$i]->user_id; } } - return False; + + return false; } function tautulli_get_name($id) { @@ -172,11 +173,14 @@ function tautulli_get_name($id) { $response = json_decode(file_get_contents($url)); } - $name = $response->response->data->data[0]->friendly_name; - if($name != "" && $name != Null) { - return $name; + if(!empty($response->response->data->data[0]->friendly_name)) { + return $response->response->data->data[0]->friendly_name; + } else if(!empty($response->response->data->data[0]->username)) { + return $response->response->data->data[0]->username; + } else if(!empty($response->response->data->data[0]->email)) { + return $response->response->data->data[0]->email; } else { - return False; + return false; } } diff --git a/assets/css/wrapped.css b/assets/css/wrapped.css index de4740e..7671c8f 100644 --- a/assets/css/wrapped.css +++ b/assets/css/wrapped.css @@ -1,17 +1,19 @@ html { height: 100%; + width: 100%; margin: 0; + box-sizing: border-box; } body { padding: 0; margin: 0; height: 100%; + width: 100%; font-family: 'Roboto', serif; font-weight: normal; background: #a2d1d0; box-sizing: border-box; - padding-bottom:2em; } h1{ @@ -80,6 +82,13 @@ img { box-sizing: border-box; } +.content_landing { + width: 100%; + margin: 0; + height: 95%; + box-sizing: border-box; +} + .boks { margin: auto; width: 100%; diff --git a/get_stats.js b/get_stats.js index 96f9763..b02f626 100644 --- a/get_stats.js +++ b/get_stats.js @@ -41,7 +41,7 @@ function load_page(data){ $('#results_error').html(results.message); loading_icon.style.display = "none"; search_button("SEARCH"); - exit(1); + return } var search_box = document.getElementById("search_input"); @@ -51,7 +51,6 @@ function load_page(data){ login_content.style.display = "none"; footer.style.display = "none"; - load_introduction(); if(!results.user.user_movies.error && functions.get_user_movie_stats) { @@ -65,7 +64,6 @@ function load_page(data){ load_users(); } - load_outro(); } //INTRODUCTION @@ -110,99 +108,32 @@ function load_movies() { text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "
"; - text += "
Your top movies
"; - text += "
"; - for(i = 0; (i < results.user.user_movies.data.movies.length && i < 10); i++) { - text += "
"; - text += "
"; - text += i+1 + ". "; - text += "
"; - text += "
"; - text += results.user.user_movies.data.movies[i].title; - var movie_hour = time_hours(results.user.user_movies.data.movies[i].duration) - text += " (" + results.user.user_movies.data.movies[i].year + ")
" + movie_hour[0] + " hours, " + movie_hour[1] + " minutes
" + results.user.user_movies.data.movies[i].plays + " plays"; - text += "
"; - text += "
"; - } - text += "
"; - text += "
"; - text += "
"; + text += "
"; + text += top_list(results.user.user_movies.data.movies, "Your top movies"); text += "
"; text += "
"; text += "
"; - text += "
"; - text += "
"; - var str = JSON.stringify(results.user.user_movies.data.user_movie_finishing_percent); - var percent = str.split('.'); - text += "Your average movie finishing percentage was " + percent[0] + "%"; - if(percent[0] > 89) { - text += '

'; - } - text += "

You're not watching the credits like a nerd, are you?"; - text += "
"; - text += "
"; + text += completion_movie(results.user.user_movies.data.user_movie_finishing_percent, false); text += "
"; text += "
"; - text += "
"; - - var str = JSON.stringify(results.user.user_movies.data.user_movie_most_paused.paused_counter / 60); - var minutes = str.split('.'); - - if(minutes[0] > 0) { - text += "
"; - text += "Your longest movie pause was watching
" + results.user.user_movies.data.user_movie_most_paused.title + " (" + results.user.user_movies.data.user_movie_most_paused.year + ")"; - - text += "

It was paused for " + minutes[0] + " minutes..."; - text += "
"; - } else { - text += "
"; - text += "Bladder of steel"; - text += '

'; - text += "
You never paused a single movie."; - text += "
"; - } - text += "
"; + text += paused_movie(results.user.user_movies.data.user_movie_most_paused, false); text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "The oldest movie you watched was
" + results.user.user_movies.data.user_movie_oldest.title + " (" + results.user.user_movies.data.user_movie_oldest.year + ")
"; - if(results.user.user_movies.data.user_movie_oldest.year < 1950) { - text += "
I didn't even know they made movies back then."; - text += '

'; - } else if(results.user.user_movies.data.user_movie_oldest.year < 1975) { - text += "
Did it even have color?"; - text += '

'; - } else if(results.user.user_movies.data.user_movie_oldest.year < 2000) { - text += "
Was it a 4K, UHD, 3D, Dolby Atmos remaster?"; - } else { - text += "
Enjoying the classics, huh?"; - } - text += "
"; - text += "
"; + text += oldest_movie(results.user.user_movies.data.user_movie_oldest); text += "
"; var sum = 0; for(i = 0; (i < results.user.user_movies.data.movies.length); i++) { sum += results.user.user_movies.data.movies[i].duration; } - var sum_split = time_hours(sum); + text += "
"; - text += "
"; - text += "
"; - text += "You spent " + sum_split[0] + " hours and " + sum_split[1] + " minutes"; - text += " watching movies"; - text += '
'; - text += "
"; - text += "
"; + text += you_spent(sum, 'movies'); text += "
"; text += "
"; @@ -222,65 +153,19 @@ function load_movies() { text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "
"; - text += "
Your movie
"; - text += "
"; - for(i = 0; (i < results.user.user_movies.data.movies.length && i < 10); i++) { - text += "
"; - text += "
"; - text += i+1 + ". "; - text += "
"; - text += "
"; - text += results.user.user_movies.data.movies[i].title; - var movie_hour = time_hours(results.user.user_movies.data.movies[i].duration) - text += " (" + results.user.user_movies.data.movies[i].year + ")
" + movie_hour[0] + " hours, " + movie_hour[1] + " minutes
" + results.user.user_movies.data.movies[i].plays + " plays"; - text += "
"; - text += "
"; - } - text += "
"; - text += "
"; - text += "
"; + text += "
"; + text += top_list(results.user.user_movies.data.movies, "Your movie"); text += "
"; text += "
"; text += "
"; - text += "
"; - text += "
"; - var str = JSON.stringify(results.user.user_movies.data.user_movie_finishing_percent); - var percent = str.split('.'); - text += "Your saw " + percent[0] + "%"; - if(percent[0] > 89) { - text += '

'; - } - text += "

You're not watching the credits like a nerd, are you?"; - text += "
"; - text += "
"; + text += completion_movie(results.user.user_movies.data.user_movie_finishing_percent, true); text += "
"; text += "
"; - text += "
"; - - var str = JSON.stringify(results.user.user_movies.data.user_movie_most_paused.paused_counter / 60); - var minutes = str.split('.'); - - if(minutes[0] > 0) { - text += "
"; - text += "Your longest movie pause was watching
" + results.user.user_movies.data.user_movie_most_paused.title + " (" + results.user.user_movies.data.user_movie_most_paused.year + ")"; - - text += "

It was paused for " + minutes[0] + " minutes..."; - text += "
"; - } else { - text += "
"; - text += "Bladder of steel"; - text += '

'; - text += "
You never paused the movie."; - text += "
"; - } - text += "
"; + text += paused_movie(results.user.user_movies.data.user_movie_most_paused, true); text += "
"; text += "
"; @@ -319,27 +204,9 @@ function load_shows() { text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "
"; - text += "
Your top shows
"; - text += "
"; - for(i = 0; (i < results.user.user_shows.data.shows.length && i < 10); i++) { - text += "
"; - text += "
"; - text += i+1 + ". "; - text += "
"; - text += "
"; - text += results.user.user_shows.data.shows[i].title; - var show_hour = time_hours(results.user.user_shows.data.shows[i].duration) - text += "
" + show_hour[0] + " hours, " + show_hour[1] + " minutes
" + results.user.user_shows.data.shows[i].plays + " plays"; - text += "
"; - text += "
"; - } - text += "
"; - text += "
"; - text += "
"; + text += "
"; + text += top_list(results.user.user_shows.data.shows, "Your top shows"); text += "
"; text += "
"; @@ -354,15 +221,9 @@ function load_shows() { for(i = 0; (i < results.user.user_shows.data.shows.length); i++) { sum += results.user.user_shows.data.shows[i].duration; } - var sum_split = time_hours(sum); + text += "
"; - text += "
"; - text += "
"; - text += "You spent " + sum_split[0] + " hours and " + sum_split[1] + " minutes"; - text += " watching shows"; - text += '
'; - text += "
"; - text += "
"; + text += you_spent(sum, 'shows'); text += "
"; text += "
"; @@ -380,34 +241,14 @@ function load_shows() { text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "
"; - text += "
Your show
"; - text += "
"; - for(i = 0; (i < results.user.user_shows.data.shows.length && i < 10); i++) { - text += "
"; - text += "
"; - text += i+1 + ". "; - text += "
"; - text += "
"; - text += results.user.user_shows.data.shows[i].title; - var show_hour = time_hours(results.user.user_shows.data.shows[i].duration) - text += "
" + show_hour[0] + " hours, " + show_hour[1] + " minutes
" + results.user.user_shows.data.shows[i].plays + " plays"; - text += "
"; - text += "
"; - } - text += "
"; - text += "
"; - text += "
"; + text += "
"; + text += top_list(results.user.user_shows.data.shows, "Your show"); text += "
"; if(results.user.user_shows.data.shows.length > 0 && !results.user.user_shows.data.show_buddy.error && functions.get_user_show_buddy) { text += "
"; - - text += load_showbuddy(); - + text += load_showbuddy(); text += "
"; } @@ -433,8 +274,82 @@ function load_shows() { document.getElementById("search_results").innerHTML += text; } +function oldest_movie(array) { + var html = ""; + + html += "
"; + html += "
"; + html += "The oldest movie you watched was
" + array.title + " (" + array.year + ")
"; + if(array.year < 1950) { + html += "
I didn't even know they made movies back then."; + html += '

'; + } else if(array.year < 1975) { + html += "
Did it even have color?"; + html += '

'; + } else if(array.year < 2000) { + html += "
Was it a 4K, UHD, 3D, Dolby Atmos remaster?"; + } else { + html += "
Enjoying the classics, huh?"; + } + html += "
"; + html += "
"; + + return html; +} + +function completion_movie(user_movie_finishing_percent, single) { + var html = ""; + + html += "
"; + html += "
"; + var str = JSON.stringify(user_movie_finishing_percent); + var percent = str.split('.'); + if(!single) { + html += "Your average movie finishing percentage was " + percent[0] + "%"; + } else { + html += "Your saw " + percent[0] + "%"; + } + if(percent[0] > 89) { + html += '

'; + } + html += "

You're not watching the credits like a nerd, are you?"; + html += "
"; + html += "
"; + + return html; +} + +function paused_movie(array, single) { + var html = ""; + + html += "
"; + if(array.paused_counter > 0) { + var pause_time = seconds_to_time(array.paused_counter, false); + if(!single) { + html += "
"; + html += "Your longest movie pause was watching
" + array.title + " (" + array.year + ")"; + html += "

It was paused for " + pause_time + "..."; + html += "
"; + } else { + html += "
"; + html += "One movie, but you still paused it
"; + html += "

It was paused for " + pause_time + "..."; + html += "
"; + } + } else { + html += "
"; + html += "Bladder of steel"; + html += '

'; + html += "
You never paused a single movie."; + html += "
"; + } + html += "
"; + + return html; +} function load_showbuddy() { var html = ""; + html += "
"; html += "
"; html += "Your show was " + results.user.user_shows.data.shows[0].title + "
"; @@ -446,13 +361,102 @@ function load_showbuddy() { html += "And you're not alone! Your " + results.user.user_shows.data.shows[0].title + "-buddy is "; html += "" + results.user.user_shows.data.show_buddy.user.user + "!

"; var combined = results.user.user_shows.data.show_buddy.user.duration + parseInt(results.user.user_shows.data.shows[0].duration); - var combined_2 = time_hours(combined); + var combined_2 = seconds_to_time(combined); html += ''; - html += "
Your combined efforts resulted in " + combined_2[0] + " hours and " + combined_2[1] + " minutes of " + results.user.user_shows.data.shows[0].title + "!"; + html += "
Your combined efforts resulted in " + combined_2 + " of " + results.user.user_shows.data.shows[0].title + "!"; } } html += "
"; html += "
"; + + return html; +} + +function you_spent(time, category) { + var html = ""; + + var time = seconds_to_time(time, false); + + html += "
"; + html += "
"; + html += "You spent " + time + ""; + html += " watching " + category; + html += '
'; + html += "
"; + html += "
"; + + return html; +} + +function top_list(array, title) { + var html = ""; + + html += "
"; + html += "
"; + html += "
" + title + "
"; + html += "
"; + for(i = 0; (i < array.length && i < 10); i++) { + html += "
"; + html += "
"; + html += i+1 + ". "; + html += "
"; + + html += "
"; + html += array[i].title; + html += ""; + var movie_hour = seconds_to_time(array[i].duration, true); + + if(typeof(array[i].year) != "undefined") { + html += " (" + array[i].year + ")"; + } + + html += "
" + movie_hour + "
" + play_plays(array[i].plays); + html += "
"; + html += "
"; + } + html += "
"; + html += "
"; + html += "
"; + + return html; +} + +function top_list_names(array, title) { + var html = ""; + + html += "
"; + html += "
"; + html += "
" + title + "
"; + html += "
"; + for(i = 0; i < 10 && i < array.length; i++) { + if(i == 0) { + html += "
"; + } else if(i == 1) { + html += "
"; + } else if(i == 2) { + html += "
"; + } else { + html += "
"; + } + html += "
"; + html += i+1 + ". "; + html += "
"; + + if(array[i].user == results.user.name) { + html += "
"; + html += array[i].user; + html += "
"; + }else { + html += "
"; + html += array[i].user; + html += "
"; + } + html += "
"; + } + html += "
"; + html += "
"; + html += "
"; + return html; } @@ -468,59 +472,31 @@ function load_users() { text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "
Top users
"; - text += "
"; - for(i = 0; i < 10 && i < results.year_stats.data.users.length; i++) { - if(i == 0) { - text += "
"; - } else if(i == 1) { - text += "
"; - } else if(i == 2) { - text += "
"; - } else { - text += "
"; - } - text += "
"; - text += i+1 + ". "; - text += "
"; - - if(results.year_stats.data.users[i].user == results.user.name) { - text += "
"; - text += results.year_stats.data.users[i].user; - text += "
"; - }else { - text += "
"; - text += results.year_stats.data.users[i].user; - text += "
"; - } - text += "
"; - } - text += "
"; - text += "
"; - text += "
"; + text += top_list_names(results.year_stats.data.users, 'Top users'); text += "
"; var sum_movies = 0; for(i = 0; (i < results.year_stats.data.top_movies.length); i++) { sum_movies += results.year_stats.data.top_movies[i].duration; } - var sum_movies_split = time_days(sum_movies); var sum_shows = 0; for(i = 0; (i < results.year_stats.data.top_shows.length); i++) { sum_shows += results.year_stats.data.top_shows[i].duration; } - var sum_shows_split = time_days(sum_shows); + + var time_movies = seconds_to_time(sum_movies, false); + var time_shows = seconds_to_time(sum_shows, false); + var time_all = seconds_to_time(Math.floor(sum_movies + sum_shows), false); + text += "
"; text += "
"; text += "
"; - text += "All the different users combined spent " + sum_movies_split[0] + " days and " + sum_movies_split[1] + " hours"; + text += "All the different users combined spent " + time_movies + ""; text += " watching movies."; - text += "

And, the users spent " + sum_shows_split[0] + " days and " + sum_shows_split[1] + " hours"; + text += "

And, the users spent " + time_shows + ""; text += " watching shows."; - text += "

That is " + Number(sum_shows_split[0] + sum_movies_split[0]) + " days and " + Number(sum_shows_split[1] + sum_movies_split[1]) + " hours
of content!"; + text += "

That is " + time_all + "
of content!"; text += ''; text += "
"; text += "
"; @@ -530,49 +506,11 @@ function load_users() { text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "
Top movies
"; - text += "
"; - for(i = 0; i < 10 && i < results.year_stats.data.top_movies.length; i++) { - text += "
"; - text += "
"; - text += i+1 + ". "; - text += "
"; - - text += "
"; - text += results.year_stats.data.top_movies[i].title; - var movie_hour = time_hours(results.year_stats.data.top_movies[i].duration) - text += "
" + movie_hour[0] + " hours and " + movie_hour[1] + " minutes
" + results.year_stats.data.top_movies[i].plays + " plays"; - text += "
"; - text += "
"; - } - text += '
'; - text += "
"; - text += "
"; + text += top_list(results.year_stats.data.top_movies, "Top movies"); text += "
"; text += "
"; - text += "
"; - text += "
"; - text += "
Top shows
"; - text += "
"; - for(i = 0; i < 10 && i < results.year_stats.data.top_shows.length; i++) { - text += "
"; - text += "
"; - text += i+1 + ". "; - text += "
"; - - text += "
"; - text += results.year_stats.data.top_shows[i].title; - var show_hour = time_hours(results.year_stats.data.top_shows[i].duration) - text += "
" + show_hour[0] + " hours and " + show_hour[1] + " minutes
" + results.year_stats.data.top_shows[i].plays + " plays"; - text += "
"; - text += "
"; - } - text += '
'; - text += "
"; - text += "
"; + text += top_list(results.year_stats.data.top_shows, "Top shows"); text += "
"; text += "
"; @@ -597,4 +535,165 @@ function load_outro() { text += "
"; document.getElementById("search_results").innerHTML += text; +} + +function play_plays(plays) { + plays = parseInt(plays); + + if(plays == 1) { + var play_string = plays + ' play'; + } else { + var play_string = plays + ' plays'; + } + + return play_string; +} + +//Converting seconds to time in string +var seconds_in_day = 86400; +var seconds_in_hour = 3600; +var seconds_in_minute = 60; + +function seconds_to_time(seconds, comma) { + + if(seconds >= seconds_in_day) { + var time = seconds_to_days(seconds, comma); + } else if(seconds >= seconds_in_hour) { + var time = seconds_to_hours(seconds, comma); + } else if(seconds >= seconds_in_minute) { + var time = seconds_to_minutes(seconds, comma); + } else { + var time = seconds_to_seconds(seconds); + } + + return time; +} + +function seconds_to_days(seconds, comma) { + var day = Math.floor(seconds / seconds_in_day); + var rest = Math.floor(seconds % seconds_in_day); + + var hour = Math.floor(rest / seconds_in_hour); + rest = Math.floor(rest % seconds_in_hour); + + var minute = Math.floor(rest / seconds_in_minute); + rest = Math.floor(rest % seconds_in_minute); + + var day_string = ''; + var hour_string = ''; + var minute_string = ''; + + if(day < 2) { + day_string += day + ' day'; + } else { + day_string += day + ' days'; + } + + if(hour < 2) { + hour_string += hour + ' hour'; + } else { + hour_string += hour + ' hours'; + } + + if(minute < 2) { + minute_string += minute + ' minute'; + } else { + minute_string += minute + ' minutes'; + } + + if(!hour == 0) { + if(!minute == 0) { + if(comma) { + return day_string + ', ' + hour_string + ', ' + minute_string; + } else { + return day_string + ', ' + hour_string + ' and ' + minute_string; + } + } else { + if(comma) { + return day_string + ', ' + hour_string; + } else { + return day_string + ' and ' + hour_string; + } + } + } else { + return day_string; + } +} + +function seconds_to_hours(seconds, comma) { + var hour = Math.floor(seconds / seconds_in_hour); + var rest = Math.floor(seconds % seconds_in_hour); + + var minute = Math.floor(rest / seconds_in_minute); + rest = Math.floor(rest % seconds_in_minute); + + var hour_string = ''; + var minute_string = ''; + + if(hour < 2) { + hour_string += hour + ' hour'; + } else { + hour_string += hour + ' hours'; + } + + if(minute < 2) { + minute_string += minute + ' minute'; + } else { + minute_string += minute + ' minutes'; + } + + if(!minute == 0) { + if(comma) { + return hour_string + ', ' + minute_string; + } else { + return hour_string + ' and ' + minute_string; + } + } else { + return hour_string; + } +} + +function seconds_to_minutes(seconds, comma) { + seconds = parseInt(seconds); + + var minute = Math.floor(seconds / seconds_in_minute); + var rest = Math.floor(seconds % seconds_in_minute); + + var minute_string = ''; + var second_string = ''; + + + if(minute < 2) { + minute_string += minute + ' minute'; + } else { + minute_string += minute + ' minutes'; + } + + if(seconds < 2) { + second_string += rest + ' second'; + } else { + second_string += rest + ' seconds'; + } + + if(!seconds == 0) { + if(comma) { + return minute_string + ', ' + second_string; + } else { + return minute_string + ' and ' + second_string; + } + } else { + return minute_string; + } +} + +function seconds_to_seconds(seconds) { + var second_string = ''; + + if(seconds == 1) { + second_string += seconds + ' second'; + } else { + second_string += seconds + ' seconds'; + } + + return second_string; } \ No newline at end of file diff --git a/index.html b/index.html index 240b392..b3a8892 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,7 @@ -
+
@@ -81,23 +81,20 @@
+ +
- - -