From 008afc8855487501aa4dbfba9c2399bd6e8f7f77 Mon Sep 17 00:00:00 2001 From: Brage Date: Wed, 19 Jul 2023 21:14:51 +0200 Subject: [PATCH] Adjusted deserializer --- .../reader/analyzer/EncodedDeserializers.kt | 7 ++-- .../analyzer/EncodedDeserializersTest.kt | 35 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializersTest.kt diff --git a/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializers.kt b/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializers.kt index a6c85829..b60635d3 100644 --- a/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializers.kt +++ b/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializers.kt @@ -31,8 +31,11 @@ class EncodedDeserializers { if (incomingMessage.status.statusType != StatusType.SUCCESS) { return null } - /*return gson.fromJson(streams.value().data as String, MediaStreams::class.java)*/ - val jsonObject = gson.fromJson(incomingMessage.dataAsJson(), JsonObject::class.java) + val jsonObject = if (incomingMessage.data is String) { + gson.fromJson(incomingMessage.data as String, JsonObject::class.java) + } else { + gson.fromJson(incomingMessage.dataAsJson(), JsonObject::class.java) + } val streamsJsonArray = jsonObject.getAsJsonArray("streams") diff --git a/Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializersTest.kt b/Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializersTest.kt new file mode 100644 index 00000000..4bf4db21 --- /dev/null +++ b/Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/EncodedDeserializersTest.kt @@ -0,0 +1,35 @@ +package no.iktdev.streamit.content.reader.analyzer + +import no.iktdev.streamit.content.common.streams.MediaStreams +import no.iktdev.streamit.library.kafka.consumers.DefaultConsumer +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class EncodedDeserializersTest { + + val deserializer = EncodedDeserializers() + val consumer = DefaultConsumer.GsonDeserializer() + + @Test + fun testDeserializationOfMediaStreams() { + val message = consumer.deserialize("demo", messageMediaStream.toByteArray()) + val result = deserializer.mediaStreams.deserialize(message) + assertInstanceOf(MediaStreams::class.java, result) + assertThat(result?.streams).isNotNull() + assertThat(result?.streams).isNotEmpty() + } + + + + val messageMediaStream = """ + { + "referenceId": "18c1af44-7a5f-4896-a34c-9a527ef618aa", + "actionType": "ALL", + "status": { + "statusType": "SUCCESS" + }, + "data": "{\n \"streams\": [\n {\n \"index\": 0,\n \"codec_name\": \"hevc\",\n \"codec_long_name\": \"H.265 / HEVC (High Efficiency Video Coding)\",\n \"profile\": \"Main 10\",\n \"codec_type\": \"video\",\n \"codec_time_base\": \"1001/24000\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"width\": 1920,\n \"height\": 1080,\n \"coded_width\": 1920,\n \"coded_height\": 1080,\n \"closed_captions\": 0,\n \"has_b_frames\": 2,\n \"sample_aspect_ratio\": \"1:1\",\n \"display_aspect_ratio\": \"16:9\",\n \"pix_fmt\": \"yuv420p10le\",\n \"level\": 150,\n \"color_range\": \"tv\",\n \"color_space\": \"bt709\",\n \"color_transfer\": \"bt709\",\n \"color_primaries\": \"bt709\",\n \"chroma_location\": \"left\",\n \"field_order\": \"progressive\",\n \"refs\": 1,\n \"r_frame_rate\": \"24000/1001\",\n \"avg_frame_rate\": \"24000/1001\",\n \"time_base\": \"1/1000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"disposition\": {\n \"default\": 1,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"ENCODER\": \"Lavc60.3.100 libx265\",\n \"BPS\": \"1712472\",\n \"DURATION\": \"00:24:00.063708333\",\n \"NUMBER_OF_FRAMES\": \"34527\",\n \"NUMBER_OF_BYTES\": \"308258548\",\n \"_STATISTICS_WRITING_APP\": \"mkvpropedit v76.0 ('Celebration') 64-bit\",\n \"_STATISTICS_WRITING_DATE_UTC\": \"2023-06-28 18:08:19\",\n \"_STATISTICS_TAGS\": \"BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES\"\n }\n },\n {\n \"index\": 1,\n \"codec_name\": \"aac\",\n \"codec_long_name\": \"AAC (Advanced Audio Coding)\",\n \"profile\": \"LC\",\n \"codec_type\": \"audio\",\n \"codec_time_base\": \"1/44100\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"sample_fmt\": \"fltp\",\n \"sample_rate\": \"44100\",\n \"channels\": 2,\n \"channel_layout\": \"stereo\",\n \"bits_per_sample\": 0,\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/1000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"disposition\": {\n \"default\": 1,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"language\": \"jpn\",\n \"BPS\": \"128002\",\n \"DURATION\": \"00:24:00.101000000\",\n \"NUMBER_OF_FRAMES\": \"62021\",\n \"NUMBER_OF_BYTES\": \"23041997\",\n \"_STATISTICS_WRITING_APP\": \"mkvpropedit v76.0 ('Celebration') 64-bit\",\n \"_STATISTICS_WRITING_DATE_UTC\": \"2023-06-28 18:08:19\",\n \"_STATISTICS_TAGS\": \"BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES\"\n }\n },\n {\n \"index\": 2,\n \"codec_name\": \"ass\",\n \"codec_long_name\": \"ASS (Advanced SSA) subtitle\",\n \"codec_type\": \"subtitle\",\n \"codec_time_base\": \"0/1\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/1000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 1440125,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 1,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"language\": \"eng\",\n \"title\": \"English subs\",\n \"BPS\": \"91\",\n \"DURATION\": \"00:23:27.220000000\",\n \"NUMBER_OF_FRAMES\": \"267\",\n \"NUMBER_OF_BYTES\": \"16015\",\n \"_STATISTICS_WRITING_APP\": \"mkvpropedit v76.0 ('Celebration') 64-bit\",\n \"_STATISTICS_WRITING_DATE_UTC\": \"2023-06-28 18:08:19\",\n \"_STATISTICS_TAGS\": \"BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES\"\n }\n },\n {\n \"index\": 3,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"Roboto-Medium.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 4,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"Roboto-MediumItalic.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 5,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"arial.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 6,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"arialbd.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 7,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"comic.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 8,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"comicbd.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 9,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"times.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 10,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"timesbd.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 11,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"trebuc.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 12,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"trebucbd.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 13,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"verdana.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 14,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"verdanab.ttf\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 15,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"CONSOLA.TTF\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n },\n {\n \"index\": 16,\n \"codec_name\": \"ttf\",\n \"codec_long_name\": \"TrueType font\",\n \"codec_type\": \"attachment\",\n \"codec_tag_string\": \"[0][0][0][0]\",\n \"codec_tag\": \"0x0000\",\n \"r_frame_rate\": \"0/0\",\n \"avg_frame_rate\": \"0/0\",\n \"time_base\": \"1/90000\",\n \"start_pts\": 0,\n \"start_time\": \"0.000000\",\n \"duration_ts\": 129611250,\n \"duration\": \"1440.125000\",\n \"disposition\": {\n \"default\": 0,\n \"dub\": 0,\n \"original\": 0,\n \"comment\": 0,\n \"lyrics\": 0,\n \"karaoke\": 0,\n \"forced\": 0,\n \"hearing_impaired\": 0,\n \"visual_impaired\": 0,\n \"clean_effects\": 0,\n \"attached_pic\": 0,\n \"timed_thumbnails\": 0\n },\n \"tags\": {\n \"filename\": \"CONSOLAB.TTF\",\n \"mimetype\": \"application/x-truetype-font\"\n }\n }\n ]\n}" + } + """.trimIndent() +} \ No newline at end of file