From 374ebacc51cea921414e64806caab254569b23f2 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 24 Feb 2018 18:04:07 +0100 Subject: [PATCH 001/156] :sparkles: added a SAX parser #971 --- include/nlohmann/detail/input/parser.hpp | 223 ++++++++++++++ include/nlohmann/json.hpp | 21 ++ single_include/nlohmann/json.hpp | 244 +++++++++++++++ test/src/unit-deserialization.cpp | 369 ++++++++++++++++++++++- 4 files changed, 854 insertions(+), 3 deletions(-) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 63e8541f..009ea994 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -52,6 +52,53 @@ class parser value }; + struct SAX + { + /// a null value was read + virtual bool null() = 0; + + /// a boolean value was read + virtual bool boolean(bool) = 0; + + /// an integer number was read + virtual bool number_integer(number_integer_t) = 0; + + /// an unsigned integer number was read + virtual bool number_unsigned(number_unsigned_t) = 0; + + /// a floating-point number was read + /// the string parameter contains the raw number value + virtual bool number_float(number_float_t, const std::string&) = 0; + + /// a string value was read + virtual bool string(const std::string&) = 0; + + /// the beginning of an object was read + /// binary formats may report the number of elements + virtual bool start_object(std::size_t elements) = 0; + + /// an object key was read + virtual bool key(const std::string&) = 0; + + /// the end of an object was read + virtual bool end_object() = 0; + + /// the beginning of an array was read + /// binary formats may report the number of elements + virtual bool start_array(std::size_t elements) = 0; + + /// the end of an array was read + virtual bool end_array() = 0; + + /// a binary value was read + /// examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON array + virtual bool binary(const std::vector& vec) = 0; + + /// a parse error occurred + /// the byte position and the last token are reported + virtual bool parse_error(int position, const std::string& last_token) = 0; + }; + using parser_callback_t = std::function; @@ -62,6 +109,10 @@ class parser : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) {} + parser(detail::input_adapter_t adapter, SAX* s) + : m_lexer(adapter), sax(s) + {} + /*! @brief public parser interface @@ -122,6 +173,14 @@ class parser return not strict or (get_token() == token_type::end_of_input); } + bool sax_parse() + { + // read first token + get_token(); + + return sax_parse_internal(); + } + private: /*! @brief the actual parser @@ -520,6 +579,168 @@ class parser } } + bool sax_parse_internal() + { + switch (last_token) + { + case token_type::begin_object: + { + if (not sax->start_object(-1)) + { + return false; + } + + // read next token + get_token(); + + // closing } -> we are done + if (last_token == token_type::end_object) + { + return sax->end_object(); + } + + // parse values + while (true) + { + // parse key + if (last_token != token_type::value_string) + { + if (not sax->key(m_lexer.move_string())) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (last_token != token_type::name_separator) + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + + // parse value + get_token(); + if (not sax_parse_internal()) + { + return false; + } + + // comma -> next value + get_token(); + if (last_token == token_type::value_separator) + { + get_token(); + continue; + } + + // closing } + if (last_token == token_type::end_object) + { + return sax->end_object(); + } + else + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + } + } + + case token_type::begin_array: + { + if (not sax->start_array(-1)) + { + return false; + } + + // read next token + get_token(); + + // closing ] -> we are done + if (last_token == token_type::end_array) + { + return sax->end_array(); + } + + // parse values + while (true) + { + // parse value + if (not sax_parse_internal()) + { + return false; + } + + // comma -> next value + get_token(); + if (last_token == token_type::value_separator) + { + get_token(); + continue; + } + + // closing ] + if (last_token == token_type::end_array) + { + return sax->end_array(); + } + else + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + } + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_UNLIKELY(not std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + else + { + return sax->number_float(res, m_lexer.move_string()); + } + } + + case token_type::literal_false: + { + return sax->boolean(false); + } + + case token_type::literal_null: + { + return sax->null(); + } + + case token_type::literal_true: + { + return sax->boolean(true); + } + + case token_type::value_integer: + { + return sax->number_integer(m_lexer.get_number_integer()); + } + + case token_type::value_string: + { + return sax->string(m_lexer.move_string()); + } + + case token_type::value_unsigned: + { + return sax->number_unsigned(m_lexer.get_number_unsigned()); + } + + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + } + } + /// get next token from lexer token_type get_token() { @@ -584,6 +805,8 @@ class parser token_type expected = token_type::uninitialized; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; + /// associated SAX parse event receiver + SAX* sax = nullptr; }; } } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index f92729f3..e43d37e7 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -1054,6 +1054,8 @@ class basic_json */ using parse_event_t = typename parser::parse_event_t; + using SAX = typename parser::SAX; + /*! @brief per-element parser callback type @@ -5925,6 +5927,16 @@ class basic_json return parser(i).accept(true); } + static bool sax_parse(detail::input_adapter i, SAX* sax) + { + return parser(i, sax).sax_parse(); + } + + static bool sax_parse(detail::input_adapter& i, SAX* sax) + { + return parser(i, sax).sax_parse(); + } + /*! @brief deserialize from an iterator range with contiguous storage @@ -5994,6 +6006,15 @@ class basic_json return parser(detail::input_adapter(first, last)).accept(true); } + template::iterator_category>::value, int>::type = 0> + static bool sax_parse(IteratorType first, IteratorType last, SAX* sax) + { + return parser(detail::input_adapter(first, last), sax).sax_parse(); + } + /*! @brief deserialize from stream @deprecated This stream operator is deprecated and will be removed in diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 3dcb834b..53b03421 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3175,6 +3175,53 @@ class parser value }; + struct SAX + { + /// a null value was read + virtual bool null() = 0; + + /// a boolean value was read + virtual bool boolean(bool) = 0; + + /// an integer number was read + virtual bool number_integer(number_integer_t) = 0; + + /// an unsigned integer number was read + virtual bool number_unsigned(number_unsigned_t) = 0; + + /// a floating-point number was read + /// the string parameter contains the raw number value + virtual bool number_float(number_float_t, const std::string&) = 0; + + /// a string value was read + virtual bool string(const std::string&) = 0; + + /// the beginning of an object was read + /// binary formats may report the number of elements + virtual bool start_object(std::size_t elements) = 0; + + /// an object key was read + virtual bool key(const std::string&) = 0; + + /// the end of an object was read + virtual bool end_object() = 0; + + /// the beginning of an array was read + /// binary formats may report the number of elements + virtual bool start_array(std::size_t elements) = 0; + + /// the end of an array was read + virtual bool end_array() = 0; + + /// a binary value was read + /// examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON array + virtual bool binary(const std::vector& vec) = 0; + + /// a parse error occurred + /// the byte position and the last token are reported + virtual bool parse_error(int position, const std::string& last_token) = 0; + }; + using parser_callback_t = std::function; @@ -3185,6 +3232,10 @@ class parser : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) {} + parser(detail::input_adapter_t adapter, SAX* s) + : m_lexer(adapter), sax(s) + {} + /*! @brief public parser interface @@ -3245,6 +3296,14 @@ class parser return not strict or (get_token() == token_type::end_of_input); } + bool sax_parse() + { + // read first token + get_token(); + + return sax_parse_internal(); + } + private: /*! @brief the actual parser @@ -3643,6 +3702,168 @@ class parser } } + bool sax_parse_internal() + { + switch (last_token) + { + case token_type::begin_object: + { + if (not sax->start_object(-1)) + { + return false; + } + + // read next token + get_token(); + + // closing } -> we are done + if (last_token == token_type::end_object) + { + return sax->end_object(); + } + + // parse values + while (true) + { + // parse key + if (last_token != token_type::value_string) + { + if (not sax->key(m_lexer.move_string())) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (last_token != token_type::name_separator) + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + + // parse value + get_token(); + if (not sax_parse_internal()) + { + return false; + } + + // comma -> next value + get_token(); + if (last_token == token_type::value_separator) + { + get_token(); + continue; + } + + // closing } + if (last_token == token_type::end_object) + { + return sax->end_object(); + } + else + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + } + } + + case token_type::begin_array: + { + if (not sax->start_array(-1)) + { + return false; + } + + // read next token + get_token(); + + // closing ] -> we are done + if (last_token == token_type::end_array) + { + return sax->end_array(); + } + + // parse values + while (true) + { + // parse value + if (not sax_parse_internal()) + { + return false; + } + + // comma -> next value + get_token(); + if (last_token == token_type::value_separator) + { + get_token(); + continue; + } + + // closing ] + if (last_token == token_type::end_array) + { + return sax->end_array(); + } + else + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + } + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_UNLIKELY(not std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + else + { + return sax->number_float(res, m_lexer.move_string()); + } + } + + case token_type::literal_false: + { + return sax->boolean(false); + } + + case token_type::literal_null: + { + return sax->null(); + } + + case token_type::literal_true: + { + return sax->boolean(true); + } + + case token_type::value_integer: + { + return sax->number_integer(m_lexer.get_number_integer()); + } + + case token_type::value_string: + { + return sax->string(m_lexer.move_string()); + } + + case token_type::value_unsigned: + { + return sax->number_unsigned(m_lexer.get_number_unsigned()); + } + + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + } + } + } + /// get next token from lexer token_type get_token() { @@ -3707,6 +3928,8 @@ class parser token_type expected = token_type::uninitialized; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; + /// associated SAX parse event receiver + SAX* sax = nullptr; }; } } @@ -10652,6 +10875,8 @@ class basic_json */ using parse_event_t = typename parser::parse_event_t; + using SAX = typename parser::SAX; + /*! @brief per-element parser callback type @@ -15523,6 +15748,16 @@ class basic_json return parser(i).accept(true); } + static bool sax_parse(detail::input_adapter i, SAX* sax) + { + return parser(i, sax).sax_parse(); + } + + static bool sax_parse(detail::input_adapter& i, SAX* sax) + { + return parser(i, sax).sax_parse(); + } + /*! @brief deserialize from an iterator range with contiguous storage @@ -15592,6 +15827,15 @@ class basic_json return parser(detail::input_adapter(first, last)).accept(true); } + template::iterator_category>::value, int>::type = 0> + static bool sax_parse(IteratorType first, IteratorType last, SAX* sax) + { + return parser(detail::input_adapter(first, last), sax).sax_parse(); + } + /*! @brief deserialize from stream @deprecated This stream operator is deprecated and will be removed in diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 6e46abe3..fd42af2f 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -34,18 +34,114 @@ using nlohmann::json; #include #include +class SaxEventLogger : public nlohmann::json::SAX +{ + public: + bool null() override + { + events.push_back("null()"); + return true; + } + + bool boolean(bool val) override + { + events.push_back(val ? "boolean(true)" : "boolean(false)"); + return true; + } + + bool number_integer(json::number_integer_t val) override + { + events.push_back("number_integer(" + std::to_string(val) + ")"); + return true; + } + + bool number_unsigned(json::number_unsigned_t val) override + { + events.push_back("number_unsigned(" + std::to_string(val) + ")"); + return true; + } + + bool number_float(json::number_float_t val, const std::string& s) override + { + events.push_back("number_float(" + s + ")"); + return true; + } + + bool string(const std::string& val) override + { + events.push_back("string(" + val + ")"); + return true; + } + + bool start_object(std::size_t elements) override + { + events.push_back("start_object(" + std::to_string(elements) + ")"); + return true; + } + + bool key(const std::string& val) override + { + events.push_back("key(" + val + ")"); + return true; + } + + bool end_object()override + { + events.push_back("end_object()"); + return true; + } + + bool start_array(std::size_t elements) override + { + events.push_back("start_array(" + std::to_string(elements) + ")"); + return true; + } + + bool end_array() override + { + events.push_back("end_array()"); + return true; + } + + bool binary(const std::vector& vec) override + { + events.push_back("binary()"); + return true; + } + + bool parse_error(int position, const std::string& last_token) override + { + events.push_back("parse_error(" + std::to_string(position) + ")"); + return false; + } + + std::vector events; +}; + TEST_CASE("deserialization") { SECTION("successful deserialization") { SECTION("stream") { - std::stringstream ss1, ss2; + std::stringstream ss1, ss2, ss3; ss1 << "[\"foo\",1,2,3,false,{\"one\":1}]"; ss2 << "[\"foo\",1,2,3,false,{\"one\":1}]"; + ss3 << "[\"foo\",1,2,3,false,{\"one\":1}]"; json j = json::parse(ss1); CHECK(json::accept(ss2)); CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); + + SaxEventLogger l; + CHECK(json::sax_parse(ss3, &l)); + CHECK(l.events.size() == 10); + CHECK(l.events == std::vector( + { + "start_array(18446744073709551615)", "string(foo)", + "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", + "boolean(false)", "start_object(18446744073709551615)", + "number_unsigned(1)", "end_object()", "end_array()" + })); } SECTION("string literal") @@ -54,6 +150,17 @@ TEST_CASE("deserialization") json j = json::parse(s); CHECK(json::accept(s)); CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); + + SaxEventLogger l; + CHECK(json::sax_parse(s, &l)); + CHECK(l.events.size() == 10); + CHECK(l.events == std::vector( + { + "start_array(18446744073709551615)", "string(foo)", + "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", + "boolean(false)", "start_object(18446744073709551615)", + "number_unsigned(1)", "end_object()", "end_array()" + })); } SECTION("string_t") @@ -62,6 +169,17 @@ TEST_CASE("deserialization") json j = json::parse(s); CHECK(json::accept(s)); CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}})); + + SaxEventLogger l; + CHECK(json::sax_parse(s, &l)); + CHECK(l.events.size() == 10); + CHECK(l.events == std::vector( + { + "start_array(18446744073709551615)", "string(foo)", + "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", + "boolean(false)", "start_object(18446744073709551615)", + "number_unsigned(1)", "end_object()", "end_array()" + })); } SECTION("operator<<") @@ -92,19 +210,31 @@ TEST_CASE("deserialization") { SECTION("stream") { - std::stringstream ss1, ss2, ss3, ss4; + std::stringstream ss1, ss2, ss3, ss4, ss5; ss1 << "[\"foo\",1,2,3,false,{\"one\":1}"; ss2 << "[\"foo\",1,2,3,false,{\"one\":1}"; ss3 << "[\"foo\",1,2,3,false,{\"one\":1}"; ss4 << "[\"foo\",1,2,3,false,{\"one\":1}"; + ss5 << "[\"foo\",1,2,3,false,{\"one\":1}"; CHECK_THROWS_AS(json::parse(ss1), json::parse_error&); CHECK_THROWS_WITH(json::parse(ss2), "[json.exception.parse_error.101] parse error at 29: syntax error - unexpected end of input; expected ']'"); CHECK(not json::accept(ss3)); json j_error; - CHECK_NOTHROW(j_error = json::parse(ss1, nullptr, false)); + CHECK_NOTHROW(j_error = json::parse(ss4, nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(ss5, &l)); + CHECK(l.events.size() == 10); + CHECK(l.events == std::vector( + { + "start_array(18446744073709551615)", "string(foo)", + "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", + "boolean(false)", "start_object(18446744073709551615)", + "number_unsigned(1)", "end_object()", "parse_error(29)" + })); } SECTION("string") @@ -118,6 +248,17 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(s, nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(s, &l)); + CHECK(l.events.size() == 10); + CHECK(l.events == std::vector( + { + "start_array(18446744073709551615)", "string(foo)", + "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", + "boolean(false)", "start_object(18446744073709551615)", + "number_unsigned(1)", "end_object()", "parse_error(29)" + })); } SECTION("operator<<") @@ -159,6 +300,11 @@ TEST_CASE("deserialization") std::vector v = {'t', 'r', 'u', 'e'}; CHECK(json::parse(v) == json(true)); CHECK(json::accept(v)); + + SaxEventLogger l; + CHECK(json::sax_parse(v, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from std::array") @@ -166,6 +312,11 @@ TEST_CASE("deserialization") std::array v { {'t', 'r', 'u', 'e'} }; CHECK(json::parse(v) == json(true)); CHECK(json::accept(v)); + + SaxEventLogger l; + CHECK(json::sax_parse(v, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from array") @@ -173,6 +324,11 @@ TEST_CASE("deserialization") uint8_t v[] = {'t', 'r', 'u', 'e'}; CHECK(json::parse(v) == json(true)); CHECK(json::accept(v)); + + SaxEventLogger l; + CHECK(json::sax_parse(v, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from chars") @@ -185,6 +341,12 @@ TEST_CASE("deserialization") v[4] = '\0'; CHECK(json::parse(v) == json(true)); CHECK(json::accept(v)); + + SaxEventLogger l; + CHECK(json::sax_parse(v, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); + delete[] v; } @@ -193,6 +355,11 @@ TEST_CASE("deserialization") std::string v = {'t', 'r', 'u', 'e'}; CHECK(json::parse(v) == json(true)); CHECK(json::accept(v)); + + SaxEventLogger l; + CHECK(json::sax_parse(v, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from std::initializer_list") @@ -200,6 +367,11 @@ TEST_CASE("deserialization") std::initializer_list v = {'t', 'r', 'u', 'e'}; CHECK(json::parse(v) == json(true)); CHECK(json::accept(v)); + + SaxEventLogger l; + CHECK(json::sax_parse(v, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("empty container") @@ -207,6 +379,11 @@ TEST_CASE("deserialization") std::vector v; CHECK_THROWS_AS(json::parse(v), json::parse_error&); CHECK(not json::accept(v)); + + SaxEventLogger l; + CHECK(not json::sax_parse(v, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(1)"})); } } @@ -217,6 +394,12 @@ TEST_CASE("deserialization") std::vector v = {'t', 'r', 'u', 'e'}; CHECK(json::parse(std::begin(v), std::end(v)) == json(true)); CHECK(json::accept(std::begin(v), std::end(v))); + + SaxEventLogger l; + CHECK(json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); + } SECTION("from std::array") @@ -224,6 +407,11 @@ TEST_CASE("deserialization") std::array v { {'t', 'r', 'u', 'e'} }; CHECK(json::parse(std::begin(v), std::end(v)) == json(true)); CHECK(json::accept(std::begin(v), std::end(v))); + + SaxEventLogger l; + CHECK(json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from array") @@ -231,6 +419,11 @@ TEST_CASE("deserialization") uint8_t v[] = {'t', 'r', 'u', 'e'}; CHECK(json::parse(std::begin(v), std::end(v)) == json(true)); CHECK(json::accept(std::begin(v), std::end(v))); + + SaxEventLogger l; + CHECK(json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from std::string") @@ -238,6 +431,11 @@ TEST_CASE("deserialization") std::string v = {'t', 'r', 'u', 'e'}; CHECK(json::parse(std::begin(v), std::end(v)) == json(true)); CHECK(json::accept(std::begin(v), std::end(v))); + + SaxEventLogger l; + CHECK(json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from std::initializer_list") @@ -245,6 +443,11 @@ TEST_CASE("deserialization") std::initializer_list v = {'t', 'r', 'u', 'e'}; CHECK(json::parse(std::begin(v), std::end(v)) == json(true)); CHECK(json::accept(std::begin(v), std::end(v))); + + SaxEventLogger l; + CHECK(json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("from std::valarray") @@ -252,6 +455,11 @@ TEST_CASE("deserialization") std::valarray v = {'t', 'r', 'u', 'e'}; CHECK(json::parse(std::begin(v), std::end(v)) == json(true)); CHECK(json::accept(std::begin(v), std::end(v))); + + SaxEventLogger l; + CHECK(json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"boolean(true)"})); } SECTION("with empty range") @@ -259,6 +467,11 @@ TEST_CASE("deserialization") std::vector v; CHECK_THROWS_AS(json::parse(std::begin(v), std::end(v)), json::parse_error&); CHECK(not json::accept(std::begin(v), std::end(v))); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(1)"})); } } @@ -274,6 +487,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(10)"})); } SECTION("case 2") @@ -285,6 +503,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(11)"})); } SECTION("case 3") @@ -296,6 +519,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(18)"})); } SECTION("case 4") @@ -307,6 +535,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(18)"})); } SECTION("case 5") @@ -318,6 +551,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(3)"})); } SECTION("case 6") @@ -331,6 +569,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 7") @@ -342,6 +585,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 8") @@ -353,6 +601,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 9") @@ -364,6 +617,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 10") @@ -375,6 +633,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 11") @@ -386,6 +649,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 12") @@ -397,6 +665,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 13") @@ -408,6 +681,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 14") @@ -419,6 +697,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 15") @@ -430,6 +713,11 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector({"parse_error(4)"})); } SECTION("case 16") @@ -441,6 +729,15 @@ TEST_CASE("deserialization") json j_error; CHECK_NOTHROW(j_error = json::parse(std::begin(v), std::end(v), nullptr, false)); CHECK(j_error.is_discarded()); + + SaxEventLogger l; + CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); + CHECK(l.events.size() == 3); + CHECK(l.events == std::vector( + { + "start_object(18446744073709551615)", "number_unsigned(11)", + "parse_error(7)" + })); } } } @@ -458,12 +755,34 @@ TEST_CASE("deserialization") CHECK_THROWS_AS(json::parse(std::istringstream(bom)), json::parse_error&); CHECK_THROWS_WITH(json::parse(std::istringstream(bom)), "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + + SaxEventLogger l; + CHECK(not json::sax_parse(bom, &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector( + { + "parse_error(1)" + })); } SECTION("BOM and content") { CHECK(json::parse(bom + "1") == 1); CHECK(json::parse(std::istringstream(bom + "1")) == 1); + + SaxEventLogger l1, l2; + CHECK(json::sax_parse(std::istringstream(bom + "1"), &l1)); + CHECK(json::sax_parse(bom + "1", &l2)); + CHECK(l1.events.size() == 1); + CHECK(l1.events == std::vector( + { + "number_unsigned(1)" + })); + CHECK(l2.events.size() == 1); + CHECK(l2.events == std::vector( + { + "number_unsigned(1)" + })); } SECTION("2 byte of BOM") @@ -475,6 +794,20 @@ TEST_CASE("deserialization") CHECK_THROWS_AS(json::parse(std::istringstream(bom.substr(0, 2))), json::parse_error&); CHECK_THROWS_WITH(json::parse(std::istringstream(bom)), "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + + SaxEventLogger l1, l2; + CHECK(not json::sax_parse(std::istringstream(bom.substr(0, 2)), &l1)); + CHECK(not json::sax_parse(bom.substr(0, 2), &l2)); + CHECK(l1.events.size() == 1); + CHECK(l1.events == std::vector( + { + "parse_error(1)" + })); + CHECK(l2.events.size() == 1); + CHECK(l2.events == std::vector( + { + "parse_error(1)" + })); } SECTION("1 byte of BOM") @@ -486,6 +819,20 @@ TEST_CASE("deserialization") CHECK_THROWS_AS(json::parse(std::istringstream(bom.substr(0, 1))), json::parse_error&); CHECK_THROWS_WITH(json::parse(std::istringstream(bom)), "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + + SaxEventLogger l1, l2; + CHECK(not json::sax_parse(std::istringstream(bom.substr(0, 1)), &l1)); + CHECK(not json::sax_parse(bom.substr(0, 1), &l2)); + CHECK(l1.events.size() == 1); + CHECK(l1.events == std::vector( + { + "parse_error(1)" + })); + CHECK(l2.events.size() == 1); + CHECK(l2.events == std::vector( + { + "parse_error(1)" + })); } SECTION("variations") @@ -513,12 +860,28 @@ TEST_CASE("deserialization") // without any variation, we skip the BOM CHECK(json::parse(s + "null") == json()); CHECK(json::parse(std::istringstream(s + "null")) == json()); + + SaxEventLogger l; + CHECK(json::sax_parse(s + "null", &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector( + { + "null()" + })); } else { // any variation is an error CHECK_THROWS_AS(json::parse(s + "null"), json::parse_error&); CHECK_THROWS_AS(json::parse(std::istringstream(s + "null")), json::parse_error&); + + SaxEventLogger l; + CHECK(not json::sax_parse(s + "null", &l)); + CHECK(l.events.size() == 1); + CHECK(l.events == std::vector( + { + "parse_error(1)" + })); } } } From ac230e8b4b0428ee05abf01136288a69939a7a9b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 25 Feb 2018 10:44:47 +0100 Subject: [PATCH 002/156] :hammer: fixed test cases to be more robust --- test/src/unit-deserialization.cpp | 40 +++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index fd42af2f..64cb243d 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -75,7 +75,14 @@ class SaxEventLogger : public nlohmann::json::SAX bool start_object(std::size_t elements) override { - events.push_back("start_object(" + std::to_string(elements) + ")"); + if (elements == -1) + { + events.push_back("start_object()"); + } + else + { + events.push_back("start_object(" + std::to_string(elements) + ")"); + } return true; } @@ -93,7 +100,14 @@ class SaxEventLogger : public nlohmann::json::SAX bool start_array(std::size_t elements) override { - events.push_back("start_array(" + std::to_string(elements) + ")"); + if (elements == -1) + { + events.push_back("start_array()"); + } + else + { + events.push_back("start_array(" + std::to_string(elements) + ")"); + } return true; } @@ -137,9 +151,9 @@ TEST_CASE("deserialization") CHECK(l.events.size() == 10); CHECK(l.events == std::vector( { - "start_array(18446744073709551615)", "string(foo)", + "start_array()", "string(foo)", "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object(18446744073709551615)", + "boolean(false)", "start_object()", "number_unsigned(1)", "end_object()", "end_array()" })); } @@ -156,9 +170,9 @@ TEST_CASE("deserialization") CHECK(l.events.size() == 10); CHECK(l.events == std::vector( { - "start_array(18446744073709551615)", "string(foo)", + "start_array()", "string(foo)", "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object(18446744073709551615)", + "boolean(false)", "start_object()", "number_unsigned(1)", "end_object()", "end_array()" })); } @@ -175,9 +189,9 @@ TEST_CASE("deserialization") CHECK(l.events.size() == 10); CHECK(l.events == std::vector( { - "start_array(18446744073709551615)", "string(foo)", + "start_array()", "string(foo)", "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object(18446744073709551615)", + "boolean(false)", "start_object()", "number_unsigned(1)", "end_object()", "end_array()" })); } @@ -230,9 +244,9 @@ TEST_CASE("deserialization") CHECK(l.events.size() == 10); CHECK(l.events == std::vector( { - "start_array(18446744073709551615)", "string(foo)", + "start_array()", "string(foo)", "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object(18446744073709551615)", + "boolean(false)", "start_object()", "number_unsigned(1)", "end_object()", "parse_error(29)" })); } @@ -254,9 +268,9 @@ TEST_CASE("deserialization") CHECK(l.events.size() == 10); CHECK(l.events == std::vector( { - "start_array(18446744073709551615)", "string(foo)", + "start_array()", "string(foo)", "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object(18446744073709551615)", + "boolean(false)", "start_object()", "number_unsigned(1)", "end_object()", "parse_error(29)" })); } @@ -735,7 +749,7 @@ TEST_CASE("deserialization") CHECK(l.events.size() == 3); CHECK(l.events == std::vector( { - "start_object(18446744073709551615)", "number_unsigned(11)", + "start_object()", "number_unsigned(11)", "parse_error(7)" })); } From 922f7a3d0eca33fc359ac2b64a258227da44aefb Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 25 Feb 2018 14:21:30 +0100 Subject: [PATCH 003/156] :white_check_mark: added more tests for SAX parsing --- test/src/unit-class_parser.cpp | 109 ++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 3e309469..27c1ee8d 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -34,6 +34,106 @@ using nlohmann::json; #include +class SaxEventLogger : public nlohmann::json::SAX +{ + public: + bool null() override + { + events.push_back("null()"); + return true; + } + + bool boolean(bool val) override + { + events.push_back(val ? "boolean(true)" : "boolean(false)"); + return true; + } + + bool number_integer(json::number_integer_t val) override + { + events.push_back("number_integer(" + std::to_string(val) + ")"); + return true; + } + + bool number_unsigned(json::number_unsigned_t val) override + { + events.push_back("number_unsigned(" + std::to_string(val) + ")"); + return true; + } + + bool number_float(json::number_float_t val, const std::string& s) override + { + events.push_back("number_float(" + s + ")"); + return true; + } + + bool string(const std::string& val) override + { + events.push_back("string(" + val + ")"); + return true; + } + + bool start_object(std::size_t elements) override + { + if (elements == -1) + { + events.push_back("start_object()"); + } + else + { + events.push_back("start_object(" + std::to_string(elements) + ")"); + } + return true; + } + + bool key(const std::string& val) override + { + events.push_back("key(" + val + ")"); + return true; + } + + bool end_object()override + { + events.push_back("end_object()"); + return true; + } + + bool start_array(std::size_t elements) override + { + if (elements == -1) + { + events.push_back("start_array()"); + } + else + { + events.push_back("start_array(" + std::to_string(elements) + ")"); + } + return true; + } + + bool end_array() override + { + events.push_back("end_array()"); + return true; + } + + bool binary(const std::vector& vec) override + { + events.push_back("binary()"); + return true; + } + + bool parse_error(int position, const std::string& last_token) override + { + errored = true; + events.push_back("parse_error(" + std::to_string(position) + ")"); + return false; + } + + std::vector events; + bool errored = false; +}; + json parser_helper(const std::string& s); bool accept_helper(const std::string& s); @@ -53,6 +153,8 @@ json parser_helper(const std::string& s) bool accept_helper(const std::string& s) { + CAPTURE(s); + // 1. parse s without exceptions json j; CHECK_NOTHROW(json::parser(nlohmann::detail::input_adapter(s), nullptr, false).parse(true, j)); @@ -64,7 +166,12 @@ bool accept_helper(const std::string& s) // 3. check if both approaches come to the same result CHECK(ok_noexcept == ok_accept); - // 4. return result + // 4. parse with SAX (compare with relaxed accept result) + SaxEventLogger el; + CHECK_NOTHROW(json::sax_parse(s, &el)); + CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == not el.errored); + + // 5. return result return ok_accept; } From 8c7f46f7d0291fe2d022dc5c2eb77bab213ed8eb Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 25 Feb 2018 17:10:30 +0100 Subject: [PATCH 004/156] :hammer: removed a logic error and improved coverage --- include/nlohmann/detail/input/parser.hpp | 30 +++-- include/nlohmann/json.hpp | 3 +- single_include/nlohmann/json.hpp | 33 ++++-- test/src/unit-deserialization.cpp | 143 ++++++++++++++++++----- 4 files changed, 156 insertions(+), 53 deletions(-) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 009ea994..1cd6868f 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -594,7 +594,7 @@ class parser get_token(); // closing } -> we are done - if (last_token == token_type::end_object) + if (JSON_UNLIKELY(last_token == token_type::end_object)) { return sax->end_object(); } @@ -603,7 +603,12 @@ class parser while (true) { // parse key - if (last_token != token_type::value_string) + if (JSON_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); + } + else { if (not sax->key(m_lexer.move_string())) { @@ -613,9 +618,10 @@ class parser // parse separator (:) get_token(); - if (last_token != token_type::name_separator) + if (JSON_UNLIKELY(last_token != token_type::name_separator)) { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } // parse value @@ -634,13 +640,14 @@ class parser } // closing } - if (last_token == token_type::end_object) + if (JSON_LIKELY(last_token == token_type::end_object)) { return sax->end_object(); } else { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } } } @@ -679,13 +686,14 @@ class parser } // closing ] - if (last_token == token_type::end_array) + if (JSON_LIKELY(last_token == token_type::end_array)) { return sax->end_array(); } else { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } } } @@ -696,7 +704,8 @@ class parser if (JSON_UNLIKELY(not std::isfinite(res))) { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } else { @@ -736,7 +745,8 @@ class parser default: // the last token was unexpected { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } } } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index e43d37e7..9515d29e 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -1054,8 +1054,6 @@ class basic_json */ using parse_event_t = typename parser::parse_event_t; - using SAX = typename parser::SAX; - /*! @brief per-element parser callback type @@ -1107,6 +1105,7 @@ class basic_json */ using parser_callback_t = typename parser::parser_callback_t; + using SAX = typename parser::SAX; ////////////////// // constructors // diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 53b03421..79581142 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3717,7 +3717,7 @@ class parser get_token(); // closing } -> we are done - if (last_token == token_type::end_object) + if (JSON_UNLIKELY(last_token == token_type::end_object)) { return sax->end_object(); } @@ -3726,7 +3726,12 @@ class parser while (true) { // parse key - if (last_token != token_type::value_string) + if (JSON_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); + } + else { if (not sax->key(m_lexer.move_string())) { @@ -3736,9 +3741,10 @@ class parser // parse separator (:) get_token(); - if (last_token != token_type::name_separator) + if (JSON_UNLIKELY(last_token != token_type::name_separator)) { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } // parse value @@ -3757,13 +3763,14 @@ class parser } // closing } - if (last_token == token_type::end_object) + if (JSON_LIKELY(last_token == token_type::end_object)) { return sax->end_object(); } else { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } } } @@ -3802,13 +3809,14 @@ class parser } // closing ] - if (last_token == token_type::end_array) + if (JSON_LIKELY(last_token == token_type::end_array)) { return sax->end_array(); } else { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } } } @@ -3819,7 +3827,8 @@ class parser if (JSON_UNLIKELY(not std::isfinite(res))) { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } else { @@ -3859,7 +3868,8 @@ class parser default: // the last token was unexpected { - return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string()); + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string()); } } } @@ -10875,8 +10885,6 @@ class basic_json */ using parse_event_t = typename parser::parse_event_t; - using SAX = typename parser::SAX; - /*! @brief per-element parser callback type @@ -10928,6 +10936,7 @@ class basic_json */ using parser_callback_t = typename parser::parser_callback_t; + using SAX = typename parser::SAX; ////////////////// // constructors // diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 64cb243d..9f0bc175 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -34,9 +34,8 @@ using nlohmann::json; #include #include -class SaxEventLogger : public nlohmann::json::SAX +struct SaxEventLogger : public nlohmann::json::SAX { - public: bool null() override { events.push_back("null()"); @@ -132,6 +131,47 @@ class SaxEventLogger : public nlohmann::json::SAX std::vector events; }; +struct SaxEventLoggerExitAfterStartObject : public SaxEventLogger +{ + bool start_object(std::size_t elements) override + { + if (elements == -1) + { + events.push_back("start_object()"); + } + else + { + events.push_back("start_object(" + std::to_string(elements) + ")"); + } + return false; + } +}; + +struct SaxEventLoggerExitAfterKey : public SaxEventLogger +{ + bool key(const std::string& val) override + { + events.push_back("key(" + val + ")"); + return false; + } +}; + +struct SaxEventLoggerExitAfterStartArray : public SaxEventLogger +{ + bool start_array(std::size_t elements) override + { + if (elements == -1) + { + events.push_back("start_array()"); + } + else + { + events.push_back("start_array(" + std::to_string(elements) + ")"); + } + return false; + } +}; + TEST_CASE("deserialization") { SECTION("successful deserialization") @@ -148,13 +188,13 @@ TEST_CASE("deserialization") SaxEventLogger l; CHECK(json::sax_parse(ss3, &l)); - CHECK(l.events.size() == 10); + CHECK(l.events.size() == 11); CHECK(l.events == std::vector( { - "start_array()", "string(foo)", - "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object()", - "number_unsigned(1)", "end_object()", "end_array()" + "start_array()", "string(foo)", "number_unsigned(1)", + "number_unsigned(2)", "number_unsigned(3)", "boolean(false)", + "start_object()", "key(one)", "number_unsigned(1)", + "end_object()", "end_array()" })); } @@ -167,13 +207,13 @@ TEST_CASE("deserialization") SaxEventLogger l; CHECK(json::sax_parse(s, &l)); - CHECK(l.events.size() == 10); + CHECK(l.events.size() == 11); CHECK(l.events == std::vector( { - "start_array()", "string(foo)", - "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object()", - "number_unsigned(1)", "end_object()", "end_array()" + "start_array()", "string(foo)", "number_unsigned(1)", + "number_unsigned(2)", "number_unsigned(3)", "boolean(false)", + "start_object()", "key(one)", "number_unsigned(1)", + "end_object()", "end_array()" })); } @@ -186,13 +226,13 @@ TEST_CASE("deserialization") SaxEventLogger l; CHECK(json::sax_parse(s, &l)); - CHECK(l.events.size() == 10); + CHECK(l.events.size() == 11); CHECK(l.events == std::vector( { - "start_array()", "string(foo)", - "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object()", - "number_unsigned(1)", "end_object()", "end_array()" + "start_array()", "string(foo)", "number_unsigned(1)", + "number_unsigned(2)", "number_unsigned(3)", "boolean(false)", + "start_object()", "key(one)", "number_unsigned(1)", + "end_object()", "end_array()" })); } @@ -241,13 +281,13 @@ TEST_CASE("deserialization") SaxEventLogger l; CHECK(not json::sax_parse(ss5, &l)); - CHECK(l.events.size() == 10); + CHECK(l.events.size() == 11); CHECK(l.events == std::vector( { - "start_array()", "string(foo)", - "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object()", - "number_unsigned(1)", "end_object()", "parse_error(29)" + "start_array()", "string(foo)", "number_unsigned(1)", + "number_unsigned(2)", "number_unsigned(3)", "boolean(false)", + "start_object()", "key(one)", "number_unsigned(1)", + "end_object()", "parse_error(29)" })); } @@ -265,13 +305,13 @@ TEST_CASE("deserialization") SaxEventLogger l; CHECK(not json::sax_parse(s, &l)); - CHECK(l.events.size() == 10); + CHECK(l.events.size() == 11); CHECK(l.events == std::vector( { - "start_array()", "string(foo)", - "number_unsigned(1)", "number_unsigned(2)", "number_unsigned(3)", - "boolean(false)", "start_object()", - "number_unsigned(1)", "end_object()", "parse_error(29)" + "start_array()", "string(foo)", "number_unsigned(1)", + "number_unsigned(2)", "number_unsigned(3)", "boolean(false)", + "start_object()", "key(one)", "number_unsigned(1)", + "end_object()", "parse_error(29)" })); } @@ -746,10 +786,10 @@ TEST_CASE("deserialization") SaxEventLogger l; CHECK(not json::sax_parse(std::begin(v), std::end(v), &l)); - CHECK(l.events.size() == 3); + CHECK(l.events.size() == 4); CHECK(l.events == std::vector( { - "start_object()", "number_unsigned(11)", + "start_object()", "key()", "number_unsigned(11)", "parse_error(7)" })); } @@ -912,4 +952,49 @@ TEST_CASE("deserialization") CHECK(j == 456); } } + + SECTION("SAX and early abort") + { + std::string s = "[1, [\"string\", 43.12], null, {\"key1\": true, \"key2\": false}]"; + + SaxEventLogger default_logger; + SaxEventLoggerExitAfterStartObject exit_after_start_object; + SaxEventLoggerExitAfterKey exit_after_key; + SaxEventLoggerExitAfterStartArray exit_after_start_array; + + json::sax_parse(s, &default_logger); + CHECK(default_logger.events.size() == 14); + CHECK(default_logger.events == std::vector( + { + "start_array()", "number_unsigned(1)", "start_array()", + "string(string)", "number_float(43.12)", "end_array()", "null()", + "start_object()", "key(key1)", "boolean(true)", "key(key2)", + "boolean(false)", "end_object()", "end_array()" + })); + + json::sax_parse(s, &exit_after_start_object); + CHECK(exit_after_start_object.events.size() == 8); + CHECK(exit_after_start_object.events == std::vector( + { + "start_array()", "number_unsigned(1)", "start_array()", + "string(string)", "number_float(43.12)", "end_array()", "null()", + "start_object()" + })); + + json::sax_parse(s, &exit_after_key); + CHECK(exit_after_key.events.size() == 9); + CHECK(exit_after_key.events == std::vector( + { + "start_array()", "number_unsigned(1)", "start_array()", + "string(string)", "number_float(43.12)", "end_array()", "null()", + "start_object()", "key(key1)" + })); + + json::sax_parse(s, &exit_after_start_array); + CHECK(exit_after_start_array.events.size() == 1); + CHECK(exit_after_start_array.events == std::vector( + { + "start_array()" + })); + } } From 8d6b3d44d6255a540c620ad4c683b4a669b6acdc Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 25 Feb 2018 18:35:16 +0100 Subject: [PATCH 005/156] :ok_hand: fixed some compiler warnings --- include/nlohmann/detail/input/parser.hpp | 8 +++++--- single_include/nlohmann/json.hpp | 8 +++++--- test/src/unit-class_parser.cpp | 10 +++++----- test/src/unit-deserialization.cpp | 14 +++++++------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 1cd6868f..67bdcd49 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -96,7 +96,9 @@ class parser /// a parse error occurred /// the byte position and the last token are reported - virtual bool parse_error(int position, const std::string& last_token) = 0; + virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; + + virtual ~SAX() = default; }; using parser_callback_t = @@ -585,7 +587,7 @@ class parser { case token_type::begin_object: { - if (not sax->start_object(-1)) + if (not sax->start_object(std::size_t(-1))) { return false; } @@ -654,7 +656,7 @@ class parser case token_type::begin_array: { - if (not sax->start_array(-1)) + if (not sax->start_array(std::size_t(-1))) { return false; } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 79581142..9c04cd9b 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3219,7 +3219,9 @@ class parser /// a parse error occurred /// the byte position and the last token are reported - virtual bool parse_error(int position, const std::string& last_token) = 0; + virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; + + virtual ~SAX() = default; }; using parser_callback_t = @@ -3708,7 +3710,7 @@ class parser { case token_type::begin_object: { - if (not sax->start_object(-1)) + if (not sax->start_object(std::size_t(-1))) { return false; } @@ -3777,7 +3779,7 @@ class parser case token_type::begin_array: { - if (not sax->start_array(-1)) + if (not sax->start_array(std::size_t(-1))) { return false; } diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 27c1ee8d..94acaaa5 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -61,7 +61,7 @@ class SaxEventLogger : public nlohmann::json::SAX return true; } - bool number_float(json::number_float_t val, const std::string& s) override + bool number_float(json::number_float_t, const std::string& s) override { events.push_back("number_float(" + s + ")"); return true; @@ -75,7 +75,7 @@ class SaxEventLogger : public nlohmann::json::SAX bool start_object(std::size_t elements) override { - if (elements == -1) + if (elements == std::size_t(-1)) { events.push_back("start_object()"); } @@ -100,7 +100,7 @@ class SaxEventLogger : public nlohmann::json::SAX bool start_array(std::size_t elements) override { - if (elements == -1) + if (elements == std::size_t(-1)) { events.push_back("start_array()"); } @@ -117,13 +117,13 @@ class SaxEventLogger : public nlohmann::json::SAX return true; } - bool binary(const std::vector& vec) override + bool binary(const std::vector&) override { events.push_back("binary()"); return true; } - bool parse_error(int position, const std::string& last_token) override + bool parse_error(std::size_t position, const std::string&) override { errored = true; events.push_back("parse_error(" + std::to_string(position) + ")"); diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 9f0bc175..603773b9 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -60,7 +60,7 @@ struct SaxEventLogger : public nlohmann::json::SAX return true; } - bool number_float(json::number_float_t val, const std::string& s) override + bool number_float(json::number_float_t, const std::string& s) override { events.push_back("number_float(" + s + ")"); return true; @@ -74,7 +74,7 @@ struct SaxEventLogger : public nlohmann::json::SAX bool start_object(std::size_t elements) override { - if (elements == -1) + if (elements == std::size_t(-1)) { events.push_back("start_object()"); } @@ -99,7 +99,7 @@ struct SaxEventLogger : public nlohmann::json::SAX bool start_array(std::size_t elements) override { - if (elements == -1) + if (elements == std::size_t(-1)) { events.push_back("start_array()"); } @@ -116,13 +116,13 @@ struct SaxEventLogger : public nlohmann::json::SAX return true; } - bool binary(const std::vector& vec) override + bool binary(const std::vector&) override { events.push_back("binary()"); return true; } - bool parse_error(int position, const std::string& last_token) override + bool parse_error(std::size_t position, const std::string&) override { events.push_back("parse_error(" + std::to_string(position) + ")"); return false; @@ -135,7 +135,7 @@ struct SaxEventLoggerExitAfterStartObject : public SaxEventLogger { bool start_object(std::size_t elements) override { - if (elements == -1) + if (elements == std::size_t(-1)) { events.push_back("start_object()"); } @@ -160,7 +160,7 @@ struct SaxEventLoggerExitAfterStartArray : public SaxEventLogger { bool start_array(std::size_t elements) override { - if (elements == -1) + if (elements == std::size_t(-1)) { events.push_back("start_array()"); } From 21352c4d8ed7b0d5fef6138f5f665285f112567b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 26 Feb 2018 20:08:12 +0100 Subject: [PATCH 006/156] :recycle: refactored SAX parser --- Makefile | 1 + include/nlohmann/detail/input/json_sax.hpp | 120 ++++++++++++++ include/nlohmann/detail/input/parser.hpp | 54 +----- include/nlohmann/json.hpp | 8 +- single_include/nlohmann/json.hpp | 183 +++++++++++++++------ test/src/unit-class_parser.cpp | 2 +- test/src/unit-deserialization.cpp | 2 +- 7 files changed, 260 insertions(+), 110 deletions(-) create mode 100644 include/nlohmann/detail/input/json_sax.hpp diff --git a/Makefile b/Makefile index 63c9cd78..ee9a64f1 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ SRCS = include/nlohmann/json.hpp \ include/nlohmann/detail/exceptions.hpp \ include/nlohmann/detail/input/binary_reader.hpp \ include/nlohmann/detail/input/input_adapters.hpp \ + include/nlohmann/detail/input/json_sax.hpp \ include/nlohmann/detail/input/lexer.hpp \ include/nlohmann/detail/input/parser.hpp \ include/nlohmann/detail/iterators/internal_iterator.hpp \ diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp new file mode 100644 index 00000000..3aad6648 --- /dev/null +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -0,0 +1,120 @@ +#pragma once + +#include +#include +#include + +namespace nlohmann +{ + +/*! +@brief SAX interface +*/ +template +struct json_sax +{ + /// type for (signed) integers + using number_integer_t = typename BasicJsonType::number_integer_t; + /// type for unsigned integers + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + /// type for floating-point numbers + using number_float_t = typename BasicJsonType::number_float_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief an floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const std::string& s) = 0; + + /*! + @brief a string was read + @param[in] val string value + @return whether parsing should proceed + */ + virtual bool string(const std::string& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + */ + virtual bool key(const std::string& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a binary value was read + @param[in] val byte vector + @return whether parsing should proceed + @note examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON + array + */ + virtual bool binary(const std::vector& val) = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @return whether parsing should proceed + */ + virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; + + virtual ~json_sax() = default; +}; +} + diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 67bdcd49..aa84a2be 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -52,54 +53,7 @@ class parser value }; - struct SAX - { - /// a null value was read - virtual bool null() = 0; - - /// a boolean value was read - virtual bool boolean(bool) = 0; - - /// an integer number was read - virtual bool number_integer(number_integer_t) = 0; - - /// an unsigned integer number was read - virtual bool number_unsigned(number_unsigned_t) = 0; - - /// a floating-point number was read - /// the string parameter contains the raw number value - virtual bool number_float(number_float_t, const std::string&) = 0; - - /// a string value was read - virtual bool string(const std::string&) = 0; - - /// the beginning of an object was read - /// binary formats may report the number of elements - virtual bool start_object(std::size_t elements) = 0; - - /// an object key was read - virtual bool key(const std::string&) = 0; - - /// the end of an object was read - virtual bool end_object() = 0; - - /// the beginning of an array was read - /// binary formats may report the number of elements - virtual bool start_array(std::size_t elements) = 0; - - /// the end of an array was read - virtual bool end_array() = 0; - - /// a binary value was read - /// examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON array - virtual bool binary(const std::vector& vec) = 0; - - /// a parse error occurred - /// the byte position and the last token are reported - virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; - - virtual ~SAX() = default; - }; + using json_sax = json_sax; using parser_callback_t = std::function; @@ -111,7 +65,7 @@ class parser : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) {} - parser(detail::input_adapter_t adapter, SAX* s) + parser(detail::input_adapter_t adapter, json_sax* s) : m_lexer(adapter), sax(s) {} @@ -818,7 +772,7 @@ class parser /// whether to throw exceptions in case of errors const bool allow_exceptions = true; /// associated SAX parse event receiver - SAX* sax = nullptr; + json_sax* sax = nullptr; }; } } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 9515d29e..8f5aee0c 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -1105,7 +1105,7 @@ class basic_json */ using parser_callback_t = typename parser::parser_callback_t; - using SAX = typename parser::SAX; + using json_sax = typename parser::json_sax; ////////////////// // constructors // @@ -5926,12 +5926,12 @@ class basic_json return parser(i).accept(true); } - static bool sax_parse(detail::input_adapter i, SAX* sax) + static bool sax_parse(detail::input_adapter i, json_sax* sax) { return parser(i, sax).sax_parse(); } - static bool sax_parse(detail::input_adapter& i, SAX* sax) + static bool sax_parse(detail::input_adapter& i, json_sax* sax) { return parser(i, sax).sax_parse(); } @@ -6009,7 +6009,7 @@ class basic_json std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits::iterator_category>::value, int>::type = 0> - static bool sax_parse(IteratorType first, IteratorType last, SAX* sax) + static bool sax_parse(IteratorType first, IteratorType last, json_sax* sax) { return parser(detail::input_adapter(first, last), sax).sax_parse(); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 9c04cd9b..01e77f41 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3131,6 +3131,128 @@ scan_number_done: // #include +// #include + + +#include +#include +#include + +namespace nlohmann +{ + +/*! +@brief SAX interface +*/ +template +struct json_sax +{ + /// type for (signed) integers + using number_integer_t = typename BasicJsonType::number_integer_t; + /// type for unsigned integers + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + /// type for floating-point numbers + using number_float_t = typename BasicJsonType::number_float_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief an floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const std::string& s) = 0; + + /*! + @brief a string was read + @param[in] val string value + @return whether parsing should proceed + */ + virtual bool string(const std::string& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + */ + virtual bool key(const std::string& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a binary value was read + @param[in] val byte vector + @return whether parsing should proceed + @note examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON + array + */ + virtual bool binary(const std::vector& val) = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @return whether parsing should proceed + */ + virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; + + virtual ~json_sax() = default; +}; +} + + // #include // #include @@ -3175,54 +3297,7 @@ class parser value }; - struct SAX - { - /// a null value was read - virtual bool null() = 0; - - /// a boolean value was read - virtual bool boolean(bool) = 0; - - /// an integer number was read - virtual bool number_integer(number_integer_t) = 0; - - /// an unsigned integer number was read - virtual bool number_unsigned(number_unsigned_t) = 0; - - /// a floating-point number was read - /// the string parameter contains the raw number value - virtual bool number_float(number_float_t, const std::string&) = 0; - - /// a string value was read - virtual bool string(const std::string&) = 0; - - /// the beginning of an object was read - /// binary formats may report the number of elements - virtual bool start_object(std::size_t elements) = 0; - - /// an object key was read - virtual bool key(const std::string&) = 0; - - /// the end of an object was read - virtual bool end_object() = 0; - - /// the beginning of an array was read - /// binary formats may report the number of elements - virtual bool start_array(std::size_t elements) = 0; - - /// the end of an array was read - virtual bool end_array() = 0; - - /// a binary value was read - /// examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON array - virtual bool binary(const std::vector& vec) = 0; - - /// a parse error occurred - /// the byte position and the last token are reported - virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; - - virtual ~SAX() = default; - }; + using json_sax = json_sax; using parser_callback_t = std::function; @@ -3234,7 +3309,7 @@ class parser : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) {} - parser(detail::input_adapter_t adapter, SAX* s) + parser(detail::input_adapter_t adapter, json_sax* s) : m_lexer(adapter), sax(s) {} @@ -3941,7 +4016,7 @@ class parser /// whether to throw exceptions in case of errors const bool allow_exceptions = true; /// associated SAX parse event receiver - SAX* sax = nullptr; + json_sax* sax = nullptr; }; } } @@ -10938,7 +11013,7 @@ class basic_json */ using parser_callback_t = typename parser::parser_callback_t; - using SAX = typename parser::SAX; + using json_sax = typename parser::json_sax; ////////////////// // constructors // @@ -15759,12 +15834,12 @@ class basic_json return parser(i).accept(true); } - static bool sax_parse(detail::input_adapter i, SAX* sax) + static bool sax_parse(detail::input_adapter i, json_sax* sax) { return parser(i, sax).sax_parse(); } - static bool sax_parse(detail::input_adapter& i, SAX* sax) + static bool sax_parse(detail::input_adapter& i, json_sax* sax) { return parser(i, sax).sax_parse(); } @@ -15842,7 +15917,7 @@ class basic_json std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits::iterator_category>::value, int>::type = 0> - static bool sax_parse(IteratorType first, IteratorType last, SAX* sax) + static bool sax_parse(IteratorType first, IteratorType last, json_sax* sax) { return parser(detail::input_adapter(first, last), sax).sax_parse(); } diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 94acaaa5..cfa90f26 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -34,7 +34,7 @@ using nlohmann::json; #include -class SaxEventLogger : public nlohmann::json::SAX +class SaxEventLogger : public nlohmann::json::json_sax { public: bool null() override diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 603773b9..e48d6348 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -34,7 +34,7 @@ using nlohmann::json; #include #include -struct SaxEventLogger : public nlohmann::json::SAX +struct SaxEventLogger : public nlohmann::json::json_sax { bool null() override { From 3ff94553325b98ab03c70deac689f71b4eb790d8 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 26 Feb 2018 23:39:23 +0100 Subject: [PATCH 007/156] :hammer: added a SAX-DOM-Parser --- include/nlohmann/detail/input/json_sax.hpp | 15 ++- include/nlohmann/detail/input/lexer.hpp | 2 +- include/nlohmann/detail/input/parser.hpp | 10 +- include/nlohmann/json.hpp | 8 +- single_include/nlohmann/json.hpp | 35 +++--- test/src/unit-class_parser.cpp | 139 ++++++++++++++++++++- test/src/unit-deserialization.cpp | 12 +- 7 files changed, 177 insertions(+), 44 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 3aad6648..87f2119f 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -20,6 +20,9 @@ struct json_sax /// type for floating-point numbers using number_float_t = typename BasicJsonType::number_float_t; + /// constant to indicate that no size limit is given for array or object + static constexpr auto no_limit = std::size_t(-1); + /*! @brief a null value was read @return whether parsing should proceed @@ -60,22 +63,22 @@ struct json_sax @param[in] val string value @return whether parsing should proceed */ - virtual bool string(const std::string& val) = 0; + virtual bool string(std::string&& val) = 0; /*! @brief the beginning of an object was read - @param[in] elements number of object elements or -1 if unknown + @param[in] elements number of object elements or no_limit if unknown @return whether parsing should proceed @note binary formats may report the number of elements */ - virtual bool start_object(std::size_t elements) = 0; + virtual bool start_object(std::size_t elements = no_limit) = 0; /*! @brief an object key was read @param[in] val object key @return whether parsing should proceed */ - virtual bool key(const std::string& val) = 0; + virtual bool key(std::string&& val) = 0; /*! @brief the end of an object was read @@ -85,11 +88,11 @@ struct json_sax /*! @brief the beginning of an array was read - @param[in] elements number of array elements or -1 if unknown + @param[in] elements number of array elements or no_limit if unknown @return whether parsing should proceed @note binary formats may report the number of elements */ - virtual bool start_array(std::size_t elements) = 0; + virtual bool start_array(std::size_t elements = no_limit) = 0; /*! @brief the end of an array was read diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 75001652..ea116093 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1130,7 +1130,7 @@ scan_number_done: } /// return current string value (implicitly resets the token; useful only once) - std::string move_string() + std::string&& move_string() { return std::move(token_buffer); } diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index aa84a2be..8fc29981 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -53,7 +53,7 @@ class parser value }; - using json_sax = json_sax; + using json_sax_t = json_sax; using parser_callback_t = std::function; @@ -65,7 +65,7 @@ class parser : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) {} - parser(detail::input_adapter_t adapter, json_sax* s) + parser(detail::input_adapter_t adapter, json_sax_t* s) : m_lexer(adapter), sax(s) {} @@ -541,7 +541,7 @@ class parser { case token_type::begin_object: { - if (not sax->start_object(std::size_t(-1))) + if (not sax->start_object()) { return false; } @@ -610,7 +610,7 @@ class parser case token_type::begin_array: { - if (not sax->start_array(std::size_t(-1))) + if (not sax->start_array()) { return false; } @@ -772,7 +772,7 @@ class parser /// whether to throw exceptions in case of errors const bool allow_exceptions = true; /// associated SAX parse event receiver - json_sax* sax = nullptr; + json_sax_t* sax = nullptr; }; } } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 8f5aee0c..f1b7e5dd 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -1105,7 +1105,7 @@ class basic_json */ using parser_callback_t = typename parser::parser_callback_t; - using json_sax = typename parser::json_sax; + using json_sax_t = typename parser::json_sax_t; ////////////////// // constructors // @@ -5926,12 +5926,12 @@ class basic_json return parser(i).accept(true); } - static bool sax_parse(detail::input_adapter i, json_sax* sax) + static bool sax_parse(detail::input_adapter i, json_sax_t* sax) { return parser(i, sax).sax_parse(); } - static bool sax_parse(detail::input_adapter& i, json_sax* sax) + static bool sax_parse(detail::input_adapter& i, json_sax_t* sax) { return parser(i, sax).sax_parse(); } @@ -6009,7 +6009,7 @@ class basic_json std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits::iterator_category>::value, int>::type = 0> - static bool sax_parse(IteratorType first, IteratorType last, json_sax* sax) + static bool sax_parse(IteratorType first, IteratorType last, json_sax_t* sax) { return parser(detail::input_adapter(first, last), sax).sax_parse(); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 01e77f41..92123591 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -2969,7 +2969,7 @@ scan_number_done: } /// return current string value (implicitly resets the token; useful only once) - std::string move_string() + std::string&& move_string() { return std::move(token_buffer); } @@ -3154,6 +3154,9 @@ struct json_sax /// type for floating-point numbers using number_float_t = typename BasicJsonType::number_float_t; + /// constant to indicate that no size limit is given for array or object + static constexpr auto no_limit = std::size_t(-1); + /*! @brief a null value was read @return whether parsing should proceed @@ -3194,22 +3197,22 @@ struct json_sax @param[in] val string value @return whether parsing should proceed */ - virtual bool string(const std::string& val) = 0; + virtual bool string(std::string&& val) = 0; /*! @brief the beginning of an object was read - @param[in] elements number of object elements or -1 if unknown + @param[in] elements number of object elements or no_limit if unknown @return whether parsing should proceed @note binary formats may report the number of elements */ - virtual bool start_object(std::size_t elements) = 0; + virtual bool start_object(std::size_t elements = no_limit) = 0; /*! @brief an object key was read @param[in] val object key @return whether parsing should proceed */ - virtual bool key(const std::string& val) = 0; + virtual bool key(std::string&& val) = 0; /*! @brief the end of an object was read @@ -3219,11 +3222,11 @@ struct json_sax /*! @brief the beginning of an array was read - @param[in] elements number of array elements or -1 if unknown + @param[in] elements number of array elements or no_limit if unknown @return whether parsing should proceed @note binary formats may report the number of elements */ - virtual bool start_array(std::size_t elements) = 0; + virtual bool start_array(std::size_t elements = no_limit) = 0; /*! @brief the end of an array was read @@ -3297,7 +3300,7 @@ class parser value }; - using json_sax = json_sax; + using json_sax_t = json_sax; using parser_callback_t = std::function; @@ -3309,7 +3312,7 @@ class parser : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) {} - parser(detail::input_adapter_t adapter, json_sax* s) + parser(detail::input_adapter_t adapter, json_sax_t* s) : m_lexer(adapter), sax(s) {} @@ -3785,7 +3788,7 @@ class parser { case token_type::begin_object: { - if (not sax->start_object(std::size_t(-1))) + if (not sax->start_object()) { return false; } @@ -3854,7 +3857,7 @@ class parser case token_type::begin_array: { - if (not sax->start_array(std::size_t(-1))) + if (not sax->start_array()) { return false; } @@ -4016,7 +4019,7 @@ class parser /// whether to throw exceptions in case of errors const bool allow_exceptions = true; /// associated SAX parse event receiver - json_sax* sax = nullptr; + json_sax_t* sax = nullptr; }; } } @@ -11013,7 +11016,7 @@ class basic_json */ using parser_callback_t = typename parser::parser_callback_t; - using json_sax = typename parser::json_sax; + using json_sax_t = typename parser::json_sax_t; ////////////////// // constructors // @@ -15834,12 +15837,12 @@ class basic_json return parser(i).accept(true); } - static bool sax_parse(detail::input_adapter i, json_sax* sax) + static bool sax_parse(detail::input_adapter i, json_sax_t* sax) { return parser(i, sax).sax_parse(); } - static bool sax_parse(detail::input_adapter& i, json_sax* sax) + static bool sax_parse(detail::input_adapter& i, json_sax_t* sax) { return parser(i, sax).sax_parse(); } @@ -15917,7 +15920,7 @@ class basic_json std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits::iterator_category>::value, int>::type = 0> - static bool sax_parse(IteratorType first, IteratorType last, json_sax* sax) + static bool sax_parse(IteratorType first, IteratorType last, json_sax_t* sax) { return parser(detail::input_adapter(first, last), sax).sax_parse(); } diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index cfa90f26..bbf10589 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -34,7 +34,7 @@ using nlohmann::json; #include -class SaxEventLogger : public nlohmann::json::json_sax +class SaxEventLogger : public nlohmann::json::json_sax_t { public: bool null() override @@ -67,7 +67,7 @@ class SaxEventLogger : public nlohmann::json::json_sax return true; } - bool string(const std::string& val) override + bool string(std::string&& val) override { events.push_back("string(" + val + ")"); return true; @@ -75,7 +75,7 @@ class SaxEventLogger : public nlohmann::json::json_sax bool start_object(std::size_t elements) override { - if (elements == std::size_t(-1)) + if (elements == no_limit) { events.push_back("start_object()"); } @@ -86,13 +86,13 @@ class SaxEventLogger : public nlohmann::json::json_sax return true; } - bool key(const std::string& val) override + bool key(std::string&& val) override { events.push_back("key(" + val + ")"); return true; } - bool end_object()override + bool end_object() override { events.push_back("end_object()"); return true; @@ -100,7 +100,7 @@ class SaxEventLogger : public nlohmann::json::json_sax bool start_array(std::size_t elements) override { - if (elements == std::size_t(-1)) + if (elements == no_limit) { events.push_back("start_array()"); } @@ -134,6 +134,129 @@ class SaxEventLogger : public nlohmann::json::json_sax bool errored = false; }; +class SaxDomParser : public nlohmann::json::json_sax_t +{ + public: + bool null() override + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) override + { + handle_value(val); + return true; + } + + bool number_integer(json::number_integer_t val) override + { + handle_value(val); + return true; + } + + bool number_unsigned(json::number_unsigned_t val) override + { + handle_value(val); + return true; + } + + bool number_float(json::number_float_t val, const std::string&) override + { + handle_value(val); + return true; + } + + bool string(std::string&& val) override + { + handle_value(val); + return true; + } + + bool start_object(std::size_t) override + { + ref_stack.push_back(handle_value(json::value_t::object)); + return true; + } + + bool key(std::string&& val) override + { + last_key = val; + return true; + } + + bool end_object() override + { + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t) override + { + ref_stack.push_back(handle_value(json::value_t::array)); + return true; + } + + bool end_array() override + { + ref_stack.pop_back(); + return true; + } + + bool binary(const std::vector&) override + { + return true; + } + + bool parse_error(std::size_t position, const std::string&) override + { + return false; + } + + json& get_value() + { + return root; + } + + private: + /// the parsed JSON value + json root; + /// stack to model hierarchy of values + std::vector ref_stack; + /// helper variable for object keys + std::string last_key; + + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + json* handle_value(json&& j) + { + if (ref_stack.empty()) + { + assert(root.is_null()); + root = j; + return &root; + } + else + { + assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); + if (ref_stack.back()->is_array()) + { + ref_stack.back()->push_back(j); + return &(ref_stack.back()->back()); + } + else + { + json& r = ref_stack.back()->operator[](last_key) = j; + return &r; + } + } + } +}; + json parser_helper(const std::string& s); bool accept_helper(const std::string& s); @@ -148,6 +271,10 @@ json parser_helper(const std::string& s) CHECK_NOTHROW(json::parser(nlohmann::detail::input_adapter(s), nullptr, false).parse(true, j_nothrow)); CHECK(j_nothrow == j); + SaxDomParser sdp; + json::sax_parse(s, &sdp); + CHECK(sdp.get_value() == j); + return j; } diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index e48d6348..d50e6924 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -34,7 +34,7 @@ using nlohmann::json; #include #include -struct SaxEventLogger : public nlohmann::json::json_sax +struct SaxEventLogger : public nlohmann::json::json_sax_t { bool null() override { @@ -66,7 +66,7 @@ struct SaxEventLogger : public nlohmann::json::json_sax return true; } - bool string(const std::string& val) override + bool string(std::string&& val) override { events.push_back("string(" + val + ")"); return true; @@ -85,7 +85,7 @@ struct SaxEventLogger : public nlohmann::json::json_sax return true; } - bool key(const std::string& val) override + bool key(std::string&& val) override { events.push_back("key(" + val + ")"); return true; @@ -135,7 +135,7 @@ struct SaxEventLoggerExitAfterStartObject : public SaxEventLogger { bool start_object(std::size_t elements) override { - if (elements == std::size_t(-1)) + if (elements == no_limit) { events.push_back("start_object()"); } @@ -149,7 +149,7 @@ struct SaxEventLoggerExitAfterStartObject : public SaxEventLogger struct SaxEventLoggerExitAfterKey : public SaxEventLogger { - bool key(const std::string& val) override + bool key(std::string&& val) override { events.push_back("key(" + val + ")"); return false; @@ -160,7 +160,7 @@ struct SaxEventLoggerExitAfterStartArray : public SaxEventLogger { bool start_array(std::size_t elements) override { - if (elements == std::size_t(-1)) + if (elements == no_limit) { events.push_back("start_array()"); } From 9d27429527bd00c1fe90b1e280e0ba512e96425d Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 5 Mar 2018 16:46:35 +0100 Subject: [PATCH 008/156] :hammer: added error messages to SAX interface --- include/nlohmann/detail/input/json_sax.hpp | 5 ++- include/nlohmann/detail/input/parser.hpp | 35 ++++++++++++------- single_include/nlohmann/json.hpp | 40 +++++++++++++++------- test/src/unit-class_parser.cpp | 4 +-- test/src/unit-deserialization.cpp | 2 +- 5 files changed, 57 insertions(+), 29 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 87f2119f..af2e7f24 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -113,9 +113,12 @@ struct json_sax @brief a parse error occurred @param[in] position the position in the input where the error occurs @param[in] last_token the last read token + @param[in] error_msg a detailed error message @return whether parsing should proceed */ - virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const std::string& error_msg) = 0; virtual ~json_sax() = default; }; diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 8fc29981..ece475bb 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -562,7 +562,8 @@ class parser if (JSON_UNLIKELY(last_token != token_type::value_string)) { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::value_string)); } else { @@ -577,7 +578,8 @@ class parser if (JSON_UNLIKELY(last_token != token_type::name_separator)) { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::name_separator)); } // parse value @@ -603,7 +605,8 @@ class parser else { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::end_object)); } } } @@ -649,7 +652,8 @@ class parser else { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::end_array)); } } } @@ -661,7 +665,8 @@ class parser if (JSON_UNLIKELY(not std::isfinite(res))) { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + "number overflow"); } else { @@ -699,10 +704,19 @@ class parser return sax->number_unsigned(m_lexer.get_number_unsigned()); } + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + exception_message(token_type::uninitialized)); + } + default: // the last token was unexpected { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::literal_or_value)); } } } @@ -721,10 +735,9 @@ class parser if (JSON_UNLIKELY(t != last_token)) { errored = true; - expected = t; if (allow_exceptions) { - throw_exception(); + JSON_THROW(parse_error::create(101, m_lexer.get_position(), exception_message(t))); } else { @@ -735,7 +748,7 @@ class parser return true; } - [[noreturn]] void throw_exception() const + std::string exception_message(const token_type expected) { std::string error_msg = "syntax error - "; if (last_token == token_type::parse_error) @@ -753,7 +766,7 @@ class parser error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); } - JSON_THROW(parse_error::create(101, m_lexer.get_position(), error_msg)); + return error_msg; } private: @@ -767,8 +780,6 @@ class parser lexer_t m_lexer; /// whether a syntax error occurred bool errored = false; - /// possible reason for the syntax error - token_type expected = token_type::uninitialized; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; /// associated SAX parse event receiver diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 656afa10..6138d33a 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3247,9 +3247,12 @@ struct json_sax @brief a parse error occurred @param[in] position the position in the input where the error occurs @param[in] last_token the last read token + @param[in] error_msg a detailed error message @return whether parsing should proceed */ - virtual bool parse_error(std::size_t position, const std::string& last_token) = 0; + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const std::string& error_msg) = 0; virtual ~json_sax() = default; }; @@ -3809,7 +3812,8 @@ class parser if (JSON_UNLIKELY(last_token != token_type::value_string)) { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::value_string)); } else { @@ -3824,7 +3828,8 @@ class parser if (JSON_UNLIKELY(last_token != token_type::name_separator)) { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::name_separator)); } // parse value @@ -3850,7 +3855,8 @@ class parser else { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::end_object)); } } } @@ -3896,7 +3902,8 @@ class parser else { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::end_array)); } } } @@ -3908,7 +3915,8 @@ class parser if (JSON_UNLIKELY(not std::isfinite(res))) { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + "number overflow"); } else { @@ -3946,10 +3954,19 @@ class parser return sax->number_unsigned(m_lexer.get_number_unsigned()); } + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + exception_message(token_type::uninitialized)); + } + default: // the last token was unexpected { return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string()); + m_lexer.get_token_string(), + exception_message(token_type::literal_or_value)); } } } @@ -3968,10 +3985,9 @@ class parser if (JSON_UNLIKELY(t != last_token)) { errored = true; - expected = t; if (allow_exceptions) { - throw_exception(); + JSON_THROW(parse_error::create(101, m_lexer.get_position(), exception_message(t))); } else { @@ -3982,7 +3998,7 @@ class parser return true; } - [[noreturn]] void throw_exception() const + std::string exception_message(const token_type expected) { std::string error_msg = "syntax error - "; if (last_token == token_type::parse_error) @@ -4000,7 +4016,7 @@ class parser error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); } - JSON_THROW(parse_error::create(101, m_lexer.get_position(), error_msg)); + return error_msg; } private: @@ -4014,8 +4030,6 @@ class parser lexer_t m_lexer; /// whether a syntax error occurred bool errored = false; - /// possible reason for the syntax error - token_type expected = token_type::uninitialized; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; /// associated SAX parse event receiver diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index bbf10589..9d40bfeb 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -123,7 +123,7 @@ class SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool parse_error(std::size_t position, const std::string&) override + bool parse_error(std::size_t position, const std::string&, const std::string&) override { errored = true; events.push_back("parse_error(" + std::to_string(position) + ")"); @@ -208,7 +208,7 @@ class SaxDomParser : public nlohmann::json::json_sax_t return true; } - bool parse_error(std::size_t position, const std::string&) override + bool parse_error(std::size_t position, const std::string&, const std::string&) override { return false; } diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index d50e6924..cd87dfdb 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -122,7 +122,7 @@ struct SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool parse_error(std::size_t position, const std::string&) override + bool parse_error(std::size_t position, const std::string&, const std::string&) override { events.push_back("parse_error(" + std::to_string(position) + ")"); return false; From 5b9d03cfdbe44e3352c9b293a86ae71e339977de Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 5 Mar 2018 21:06:00 +0100 Subject: [PATCH 009/156] :hammer: added SAX-DOM-Parser --- benchmarks/src/benchmarks.cpp | 56 +++++++++ include/nlohmann/detail/input/json_sax.hpp | 132 ++++++++++++++++++++ include/nlohmann/json.hpp | 2 + single_include/nlohmann/json.hpp | 134 +++++++++++++++++++++ test/src/unit-class_parser.cpp | 125 +------------------ 5 files changed, 325 insertions(+), 124 deletions(-) diff --git a/benchmarks/src/benchmarks.cpp b/benchmarks/src/benchmarks.cpp index bebef603..46135e44 100644 --- a/benchmarks/src/benchmarks.cpp +++ b/benchmarks/src/benchmarks.cpp @@ -37,6 +37,35 @@ BENCHMARK_CAPTURE(ParseFile, signed_ints, "data/numbers/signed_ints.json"); BENCHMARK_CAPTURE(ParseFile, unsigned_ints, "data/numbers/unsigned_ints.json"); +static void ParseFileSax(benchmark::State& state, const char* filename) +{ + while (state.KeepRunning()) + { + state.PauseTiming(); + auto* f = new std::ifstream(filename); + auto* sdp = new nlohmann::json_sax_dom_parser(); + state.ResumeTiming(); + + json::sax_parse(*f, sdp); + + state.PauseTiming(); + delete f; + delete sdp; + state.ResumeTiming(); + } + + std::ifstream file(filename, std::ios::binary | std::ios::ate); + state.SetBytesProcessed(state.iterations() * file.tellg()); +} +BENCHMARK_CAPTURE(ParseFileSax, jeopardy, "data/jeopardy/jeopardy.json"); +BENCHMARK_CAPTURE(ParseFileSax, canada, "data/nativejson-benchmark/canada.json"); +BENCHMARK_CAPTURE(ParseFileSax, citm_catalog, "data/nativejson-benchmark/citm_catalog.json"); +BENCHMARK_CAPTURE(ParseFileSax, twitter, "data/nativejson-benchmark/twitter.json"); +BENCHMARK_CAPTURE(ParseFileSax, floats, "data/numbers/floats.json"); +BENCHMARK_CAPTURE(ParseFileSax, signed_ints, "data/numbers/signed_ints.json"); +BENCHMARK_CAPTURE(ParseFileSax, unsigned_ints, "data/numbers/unsigned_ints.json"); + + ////////////////////////////////////////////////////////////////////////////// // parse JSON from string ////////////////////////////////////////////////////////////////////////////// @@ -69,6 +98,33 @@ BENCHMARK_CAPTURE(ParseString, floats, "data/numbers/floats.json"); BENCHMARK_CAPTURE(ParseString, signed_ints, "data/numbers/signed_ints.json"); BENCHMARK_CAPTURE(ParseString, unsigned_ints, "data/numbers/unsigned_ints.json"); +static void ParseStringSax(benchmark::State& state, const char* filename) +{ + std::ifstream f(filename); + std::string str((std::istreambuf_iterator(f)), std::istreambuf_iterator()); + + while (state.KeepRunning()) + { + state.PauseTiming(); + auto* sdp = new nlohmann::json_sax_dom_parser(); + state.ResumeTiming(); + + json::sax_parse(str, sdp); + + state.PauseTiming(); + delete sdp; + state.ResumeTiming(); + } + + state.SetBytesProcessed(state.iterations() * str.size()); +} +BENCHMARK_CAPTURE(ParseStringSax, jeopardy, "data/jeopardy/jeopardy.json"); +BENCHMARK_CAPTURE(ParseStringSax, canada, "data/nativejson-benchmark/canada.json"); +BENCHMARK_CAPTURE(ParseStringSax, citm_catalog, "data/nativejson-benchmark/citm_catalog.json"); +BENCHMARK_CAPTURE(ParseStringSax, twitter, "data/nativejson-benchmark/twitter.json"); +BENCHMARK_CAPTURE(ParseStringSax, floats, "data/numbers/floats.json"); +BENCHMARK_CAPTURE(ParseStringSax, signed_ints, "data/numbers/signed_ints.json"); +BENCHMARK_CAPTURE(ParseStringSax, unsigned_ints, "data/numbers/unsigned_ints.json"); ////////////////////////////////////////////////////////////////////////////// // serialize JSON diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index af2e7f24..38a0a710 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -122,5 +122,137 @@ struct json_sax virtual ~json_sax() = default; }; + + +template +class json_sax_dom_parser : public json_sax +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + bool null() override + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) override + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) override + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) override + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const std::string&) override + { + handle_value(val); + return true; + } + + bool string(std::string&& val) override + { + handle_value(val); + return true; + } + + bool start_object(std::size_t) override + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + return true; + } + + bool key(std::string&& val) override + { + last_key = val; + return true; + } + + bool end_object() override + { + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t) override + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + return true; + } + + bool end_array() override + { + ref_stack.pop_back(); + return true; + } + + bool binary(const std::vector&) override + { + return true; + } + + bool parse_error(std::size_t position, const std::string&, const std::string& error_msg) override + { + JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + return false; + } + + BasicJsonType& get_value() + { + return root; + } + + private: + /// the parsed JSON value + BasicJsonType root; + /// stack to model hierarchy of values + std::vector ref_stack; + /// helper variable for object keys + std::string last_key; + + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + assert(root.is_null()); + root = BasicJsonType(std::forward(v)); + return &root; + } + else + { + assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); + return &(ref_stack.back()->m_value.array->back()); + } + else + { + BasicJsonType& r = ref_stack.back()->m_value.object->operator[](last_key) = BasicJsonType(std::forward(v)); + return &r; + } + } + } +}; + } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 49cce53d..7eb0a352 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -171,6 +171,8 @@ class basic_json friend class ::nlohmann::detail::binary_writer; template friend class ::nlohmann::detail::binary_reader; + template + friend class ::nlohmann::json_sax_dom_parser; /// workaround type for MSVC using basic_json_t = NLOHMANN_BASIC_JSON_TPL; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 6138d33a..009f1109 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3256,6 +3256,138 @@ struct json_sax virtual ~json_sax() = default; }; + + +template +class json_sax_dom_parser : public json_sax +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + bool null() override + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) override + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) override + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) override + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const std::string&) override + { + handle_value(val); + return true; + } + + bool string(std::string&& val) override + { + handle_value(val); + return true; + } + + bool start_object(std::size_t) override + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + return true; + } + + bool key(std::string&& val) override + { + last_key = val; + return true; + } + + bool end_object() override + { + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t) override + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + return true; + } + + bool end_array() override + { + ref_stack.pop_back(); + return true; + } + + bool binary(const std::vector&) override + { + return true; + } + + bool parse_error(std::size_t position, const std::string&, const std::string& error_msg) override + { + JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + return false; + } + + BasicJsonType& get_value() + { + return root; + } + + private: + /// the parsed JSON value + BasicJsonType root; + /// stack to model hierarchy of values + std::vector ref_stack; + /// helper variable for object keys + std::string last_key; + + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + assert(root.is_null()); + root = BasicJsonType(std::forward(v)); + return &root; + } + else + { + assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); + return &(ref_stack.back()->m_value.array->back()); + } + else + { + BasicJsonType& r = ref_stack.back()->m_value.object->operator[](last_key) = BasicJsonType(std::forward(v)); + return &r; + } + } + } +}; + } @@ -10096,6 +10228,8 @@ class basic_json friend class ::nlohmann::detail::binary_writer; template friend class ::nlohmann::detail::binary_reader; + template + friend class ::nlohmann::json_sax_dom_parser; /// workaround type for MSVC using basic_json_t = NLOHMANN_BASIC_JSON_TPL; diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 9d40bfeb..a15ad167 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -134,129 +134,6 @@ class SaxEventLogger : public nlohmann::json::json_sax_t bool errored = false; }; -class SaxDomParser : public nlohmann::json::json_sax_t -{ - public: - bool null() override - { - handle_value(nullptr); - return true; - } - - bool boolean(bool val) override - { - handle_value(val); - return true; - } - - bool number_integer(json::number_integer_t val) override - { - handle_value(val); - return true; - } - - bool number_unsigned(json::number_unsigned_t val) override - { - handle_value(val); - return true; - } - - bool number_float(json::number_float_t val, const std::string&) override - { - handle_value(val); - return true; - } - - bool string(std::string&& val) override - { - handle_value(val); - return true; - } - - bool start_object(std::size_t) override - { - ref_stack.push_back(handle_value(json::value_t::object)); - return true; - } - - bool key(std::string&& val) override - { - last_key = val; - return true; - } - - bool end_object() override - { - ref_stack.pop_back(); - return true; - } - - bool start_array(std::size_t) override - { - ref_stack.push_back(handle_value(json::value_t::array)); - return true; - } - - bool end_array() override - { - ref_stack.pop_back(); - return true; - } - - bool binary(const std::vector&) override - { - return true; - } - - bool parse_error(std::size_t position, const std::string&, const std::string&) override - { - return false; - } - - json& get_value() - { - return root; - } - - private: - /// the parsed JSON value - json root; - /// stack to model hierarchy of values - std::vector ref_stack; - /// helper variable for object keys - std::string last_key; - - /*! - @invariant If the ref stack is empty, then the passed value will be the new - root. - @invariant If the ref stack contains a value, then it is an array or an - object to which we can add elements - */ - json* handle_value(json&& j) - { - if (ref_stack.empty()) - { - assert(root.is_null()); - root = j; - return &root; - } - else - { - assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); - if (ref_stack.back()->is_array()) - { - ref_stack.back()->push_back(j); - return &(ref_stack.back()->back()); - } - else - { - json& r = ref_stack.back()->operator[](last_key) = j; - return &r; - } - } - } -}; - json parser_helper(const std::string& s); bool accept_helper(const std::string& s); @@ -271,7 +148,7 @@ json parser_helper(const std::string& s) CHECK_NOTHROW(json::parser(nlohmann::detail::input_adapter(s), nullptr, false).parse(true, j_nothrow)); CHECK(j_nothrow == j); - SaxDomParser sdp; + nlohmann::json_sax_dom_parser sdp; json::sax_parse(s, &sdp); CHECK(sdp.get_value() == j); From faf2546a152ca5848eae309d5d713392a58caf70 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 6 Mar 2018 07:19:05 +0100 Subject: [PATCH 010/156] :hammer: simplified SAX-DOM parser --- include/nlohmann/detail/input/json_sax.hpp | 12 +++++++----- single_include/nlohmann/json.hpp | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 38a0a710..d0161cd4 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -176,7 +176,8 @@ class json_sax_dom_parser : public json_sax bool key(std::string&& val) override { - last_key = val; + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); return true; } @@ -219,8 +220,8 @@ class json_sax_dom_parser : public json_sax BasicJsonType root; /// stack to model hierarchy of values std::vector ref_stack; - /// helper variable for object keys - std::string last_key; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; /*! @invariant If the ref stack is empty, then the passed value will be the new @@ -247,8 +248,9 @@ class json_sax_dom_parser : public json_sax } else { - BasicJsonType& r = ref_stack.back()->m_value.object->operator[](last_key) = BasicJsonType(std::forward(v)); - return &r; + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; } } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 009f1109..3b1f7e43 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3310,7 +3310,8 @@ class json_sax_dom_parser : public json_sax bool key(std::string&& val) override { - last_key = val; + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); return true; } @@ -3353,8 +3354,8 @@ class json_sax_dom_parser : public json_sax BasicJsonType root; /// stack to model hierarchy of values std::vector ref_stack; - /// helper variable for object keys - std::string last_key; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; /*! @invariant If the ref stack is empty, then the passed value will be the new @@ -3381,8 +3382,9 @@ class json_sax_dom_parser : public json_sax } else { - BasicJsonType& r = ref_stack.back()->m_value.object->operator[](last_key) = BasicJsonType(std::forward(v)); - return &r; + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; } } } From 5beab80553cffd61f546f229de24718f8147d006 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 6 Mar 2018 18:17:07 +0100 Subject: [PATCH 011/156] :hammer: using the SAX-DOM parser --- benchmarks/src/benchmarks.cpp | 56 --------- include/nlohmann/detail/input/json_sax.hpp | 43 +++++-- include/nlohmann/detail/input/parser.hpp | 90 +++++++------ include/nlohmann/json.hpp | 6 +- single_include/nlohmann/json.hpp | 139 +++++++++++++-------- test/src/unit-class_parser.cpp | 5 +- 6 files changed, 173 insertions(+), 166 deletions(-) diff --git a/benchmarks/src/benchmarks.cpp b/benchmarks/src/benchmarks.cpp index 46135e44..bebef603 100644 --- a/benchmarks/src/benchmarks.cpp +++ b/benchmarks/src/benchmarks.cpp @@ -37,35 +37,6 @@ BENCHMARK_CAPTURE(ParseFile, signed_ints, "data/numbers/signed_ints.json"); BENCHMARK_CAPTURE(ParseFile, unsigned_ints, "data/numbers/unsigned_ints.json"); -static void ParseFileSax(benchmark::State& state, const char* filename) -{ - while (state.KeepRunning()) - { - state.PauseTiming(); - auto* f = new std::ifstream(filename); - auto* sdp = new nlohmann::json_sax_dom_parser(); - state.ResumeTiming(); - - json::sax_parse(*f, sdp); - - state.PauseTiming(); - delete f; - delete sdp; - state.ResumeTiming(); - } - - std::ifstream file(filename, std::ios::binary | std::ios::ate); - state.SetBytesProcessed(state.iterations() * file.tellg()); -} -BENCHMARK_CAPTURE(ParseFileSax, jeopardy, "data/jeopardy/jeopardy.json"); -BENCHMARK_CAPTURE(ParseFileSax, canada, "data/nativejson-benchmark/canada.json"); -BENCHMARK_CAPTURE(ParseFileSax, citm_catalog, "data/nativejson-benchmark/citm_catalog.json"); -BENCHMARK_CAPTURE(ParseFileSax, twitter, "data/nativejson-benchmark/twitter.json"); -BENCHMARK_CAPTURE(ParseFileSax, floats, "data/numbers/floats.json"); -BENCHMARK_CAPTURE(ParseFileSax, signed_ints, "data/numbers/signed_ints.json"); -BENCHMARK_CAPTURE(ParseFileSax, unsigned_ints, "data/numbers/unsigned_ints.json"); - - ////////////////////////////////////////////////////////////////////////////// // parse JSON from string ////////////////////////////////////////////////////////////////////////////// @@ -98,33 +69,6 @@ BENCHMARK_CAPTURE(ParseString, floats, "data/numbers/floats.json"); BENCHMARK_CAPTURE(ParseString, signed_ints, "data/numbers/signed_ints.json"); BENCHMARK_CAPTURE(ParseString, unsigned_ints, "data/numbers/unsigned_ints.json"); -static void ParseStringSax(benchmark::State& state, const char* filename) -{ - std::ifstream f(filename); - std::string str((std::istreambuf_iterator(f)), std::istreambuf_iterator()); - - while (state.KeepRunning()) - { - state.PauseTiming(); - auto* sdp = new nlohmann::json_sax_dom_parser(); - state.ResumeTiming(); - - json::sax_parse(str, sdp); - - state.PauseTiming(); - delete sdp; - state.ResumeTiming(); - } - - state.SetBytesProcessed(state.iterations() * str.size()); -} -BENCHMARK_CAPTURE(ParseStringSax, jeopardy, "data/jeopardy/jeopardy.json"); -BENCHMARK_CAPTURE(ParseStringSax, canada, "data/nativejson-benchmark/canada.json"); -BENCHMARK_CAPTURE(ParseStringSax, citm_catalog, "data/nativejson-benchmark/citm_catalog.json"); -BENCHMARK_CAPTURE(ParseStringSax, twitter, "data/nativejson-benchmark/twitter.json"); -BENCHMARK_CAPTURE(ParseStringSax, floats, "data/numbers/floats.json"); -BENCHMARK_CAPTURE(ParseStringSax, signed_ints, "data/numbers/signed_ints.json"); -BENCHMARK_CAPTURE(ParseStringSax, unsigned_ints, "data/numbers/unsigned_ints.json"); ////////////////////////////////////////////////////////////////////////////// // serialize JSON diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index d0161cd4..06227e70 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -132,6 +132,10 @@ class json_sax_dom_parser : public json_sax using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; + json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + bool null() override { handle_value(nullptr); @@ -204,25 +208,30 @@ class json_sax_dom_parser : public json_sax return true; } - bool parse_error(std::size_t position, const std::string&, const std::string& error_msg) override + bool parse_error(std::size_t position, const std::string& token, + const std::string& error_msg) override { - JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + errored = true; + if (allow_exceptions) + { + if (error_msg == "number overflow") + { + JSON_THROW(BasicJsonType::out_of_range::create(406, "number overflow parsing '" + token + "'")); + } + else + { + JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + } + } return false; } - BasicJsonType& get_value() + bool is_errored() const { - return root; + return errored; } private: - /// the parsed JSON value - BasicJsonType root; - /// stack to model hierarchy of values - std::vector ref_stack; - /// helper to hold the reference for the next object element - BasicJsonType* object_element = nullptr; - /*! @invariant If the ref stack is empty, then the passed value will be the new root. @@ -234,7 +243,6 @@ class json_sax_dom_parser : public json_sax { if (ref_stack.empty()) { - assert(root.is_null()); root = BasicJsonType(std::forward(v)); return &root; } @@ -254,6 +262,17 @@ class json_sax_dom_parser : public json_sax } } } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; }; } diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index ece475bb..23fac952 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -63,11 +63,10 @@ class parser const parser_callback_t cb = nullptr, const bool allow_exceptions_ = true) : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) - {} - - parser(detail::input_adapter_t adapter, json_sax_t* s) - : m_lexer(adapter), sax(s) - {} + { + // read first token + get_token(); + } /*! @brief public parser interface @@ -81,31 +80,52 @@ class parser */ void parse(const bool strict, BasicJsonType& result) { - // read first token - get_token(); - - parse_internal(true, result); - result.assert_invariant(); - - // in strict mode, input must be completely read - if (strict) + if (callback) { - get_token(); - expect(token_type::end_of_input); + parse_internal(true, result); + result.assert_invariant(); + + // in strict mode, input must be completely read + if (strict) + { + get_token(); + expect(token_type::end_of_input); + } + + // in case of an error, return discarded value + if (errored) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } } - - // in case of an error, return discarded value - if (errored) + else { - result = value_t::discarded; - return; - } + json_sax_dom_parser sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + result.assert_invariant(); - // set top-level value to null if it was discarded by the callback - // function - if (result.is_discarded()) - { - result = nullptr; + // in strict mode, input must be completely read + if (strict and (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + exception_message(token_type::end_of_input)); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } } } @@ -117,9 +137,6 @@ class parser */ bool accept(const bool strict = true) { - // read first token - get_token(); - if (not accept_internal()) { return false; @@ -129,12 +146,9 @@ class parser return not strict or (get_token() == token_type::end_of_input); } - bool sax_parse() + bool sax_parse(json_sax_t* sax) { - // read first token - get_token(); - - return sax_parse_internal(); + return sax_parse_internal(sax); } private: @@ -535,7 +549,7 @@ class parser } } - bool sax_parse_internal() + bool sax_parse_internal(json_sax_t* sax) { switch (last_token) { @@ -584,7 +598,7 @@ class parser // parse value get_token(); - if (not sax_parse_internal()) + if (not sax_parse_internal(sax)) { return false; } @@ -631,7 +645,7 @@ class parser while (true) { // parse value - if (not sax_parse_internal()) + if (not sax_parse_internal(sax)) { return false; } @@ -782,8 +796,6 @@ class parser bool errored = false; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; - /// associated SAX parse event receiver - json_sax_t* sax = nullptr; }; } } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 7eb0a352..cef504ff 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -5930,12 +5930,12 @@ class basic_json static bool sax_parse(detail::input_adapter i, json_sax_t* sax) { - return parser(i, sax).sax_parse(); + return parser(i).sax_parse(sax); } static bool sax_parse(detail::input_adapter& i, json_sax_t* sax) { - return parser(i, sax).sax_parse(); + return parser(i).sax_parse(sax); } /*! @@ -6013,7 +6013,7 @@ class basic_json typename std::iterator_traits::iterator_category>::value, int>::type = 0> static bool sax_parse(IteratorType first, IteratorType last, json_sax_t* sax) { - return parser(detail::input_adapter(first, last), sax).sax_parse(); + return parser(detail::input_adapter(first, last)).sax_parse(sax); } /*! diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 3b1f7e43..8aaa1f68 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3266,6 +3266,10 @@ class json_sax_dom_parser : public json_sax using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; + json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + bool null() override { handle_value(nullptr); @@ -3338,25 +3342,30 @@ class json_sax_dom_parser : public json_sax return true; } - bool parse_error(std::size_t position, const std::string&, const std::string& error_msg) override + bool parse_error(std::size_t position, const std::string& token, + const std::string& error_msg) override { - JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + errored = true; + if (allow_exceptions) + { + if (error_msg == "number overflow") + { + JSON_THROW(BasicJsonType::out_of_range::create(406, "number overflow parsing '" + token + "'")); + } + else + { + JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + } + } return false; } - BasicJsonType& get_value() + bool is_errored() const { - return root; + return errored; } private: - /// the parsed JSON value - BasicJsonType root; - /// stack to model hierarchy of values - std::vector ref_stack; - /// helper to hold the reference for the next object element - BasicJsonType* object_element = nullptr; - /*! @invariant If the ref stack is empty, then the passed value will be the new root. @@ -3368,7 +3377,6 @@ class json_sax_dom_parser : public json_sax { if (ref_stack.empty()) { - assert(root.is_null()); root = BasicJsonType(std::forward(v)); return &root; } @@ -3388,6 +3396,17 @@ class json_sax_dom_parser : public json_sax } } } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; }; } @@ -3447,11 +3466,10 @@ class parser const parser_callback_t cb = nullptr, const bool allow_exceptions_ = true) : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) - {} - - parser(detail::input_adapter_t adapter, json_sax_t* s) - : m_lexer(adapter), sax(s) - {} + { + // read first token + get_token(); + } /*! @brief public parser interface @@ -3465,31 +3483,52 @@ class parser */ void parse(const bool strict, BasicJsonType& result) { - // read first token - get_token(); - - parse_internal(true, result); - result.assert_invariant(); - - // in strict mode, input must be completely read - if (strict) + if (callback) { - get_token(); - expect(token_type::end_of_input); + parse_internal(true, result); + result.assert_invariant(); + + // in strict mode, input must be completely read + if (strict) + { + get_token(); + expect(token_type::end_of_input); + } + + // in case of an error, return discarded value + if (errored) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } } - - // in case of an error, return discarded value - if (errored) + else { - result = value_t::discarded; - return; - } + json_sax_dom_parser sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + result.assert_invariant(); - // set top-level value to null if it was discarded by the callback - // function - if (result.is_discarded()) - { - result = nullptr; + // in strict mode, input must be completely read + if (strict and (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + exception_message(token_type::end_of_input)); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } } } @@ -3501,9 +3540,6 @@ class parser */ bool accept(const bool strict = true) { - // read first token - get_token(); - if (not accept_internal()) { return false; @@ -3513,12 +3549,9 @@ class parser return not strict or (get_token() == token_type::end_of_input); } - bool sax_parse() + bool sax_parse(json_sax_t* sax) { - // read first token - get_token(); - - return sax_parse_internal(); + return sax_parse_internal(sax); } private: @@ -3919,7 +3952,7 @@ class parser } } - bool sax_parse_internal() + bool sax_parse_internal(json_sax_t* sax) { switch (last_token) { @@ -3968,7 +4001,7 @@ class parser // parse value get_token(); - if (not sax_parse_internal()) + if (not sax_parse_internal(sax)) { return false; } @@ -4015,7 +4048,7 @@ class parser while (true) { // parse value - if (not sax_parse_internal()) + if (not sax_parse_internal(sax)) { return false; } @@ -4166,8 +4199,6 @@ class parser bool errored = false; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; - /// associated SAX parse event receiver - json_sax_t* sax = nullptr; }; } } @@ -15989,12 +16020,12 @@ class basic_json static bool sax_parse(detail::input_adapter i, json_sax_t* sax) { - return parser(i, sax).sax_parse(); + return parser(i).sax_parse(sax); } static bool sax_parse(detail::input_adapter& i, json_sax_t* sax) { - return parser(i, sax).sax_parse(); + return parser(i).sax_parse(sax); } /*! @@ -16072,7 +16103,7 @@ class basic_json typename std::iterator_traits::iterator_category>::value, int>::type = 0> static bool sax_parse(IteratorType first, IteratorType last, json_sax_t* sax) { - return parser(detail::input_adapter(first, last), sax).sax_parse(); + return parser(detail::input_adapter(first, last)).sax_parse(sax); } /*! diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index a15ad167..39753d68 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -148,9 +148,10 @@ json parser_helper(const std::string& s) CHECK_NOTHROW(json::parser(nlohmann::detail::input_adapter(s), nullptr, false).parse(true, j_nothrow)); CHECK(j_nothrow == j); - nlohmann::json_sax_dom_parser sdp; + json j_sax; + nlohmann::json_sax_dom_parser sdp(j_sax); json::sax_parse(s, &sdp); - CHECK(sdp.get_value() == j); + CHECK(j_sax == j); return j; } From 8b379948d0c77c0e2b3563d5aaf1cc6911fffa25 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 7 Mar 2018 22:40:48 +0100 Subject: [PATCH 012/156] :fire: replaced acceptor with SAX parser --- include/nlohmann/detail/input/json_sax.hpp | 74 ++++++++ include/nlohmann/detail/input/parser.hpp | 117 +------------ single_include/nlohmann/json.hpp | 191 +++++++++------------ 3 files changed, 154 insertions(+), 228 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 06227e70..e2b8baad 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -275,5 +275,79 @@ class json_sax_dom_parser : public json_sax const bool allow_exceptions = true; }; +template +class json_sax_acceptor : public json_sax +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + bool null() override + { + return true; + } + + bool boolean(bool) override + { + return true; + } + + bool number_integer(number_integer_t) override + { + return true; + } + + bool number_unsigned(number_unsigned_t) override + { + return true; + } + + bool number_float(number_float_t, const std::string&) override + { + return true; + } + + bool string(std::string&&) override + { + return true; + } + + bool start_object(std::size_t) override + { + return true; + } + + bool key(std::string&&) override + { + return true; + } + + bool end_object() override + { + return true; + } + + bool start_array(std::size_t) override + { + return true; + } + + bool end_array() override + { + return true; + } + + bool binary(const std::vector&) override + { + return true; + } + + bool parse_error(std::size_t, const std::string&, const std::string&) override + { + return false; + } +}; + } diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 23fac952..5c0c2e94 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -137,7 +137,9 @@ class parser */ bool accept(const bool strict = true) { - if (not accept_internal()) + json_sax_acceptor sax_acceptor; + + if (not sax_parse_internal(&sax_acceptor)) { return false; } @@ -436,119 +438,6 @@ class parser } } - /*! - @brief the actual acceptor - - @invariant 1. The last token is not yet processed. Therefore, the caller - of this function must make sure a token has been read. - 2. When this function returns, the last token is processed. - That is, the last read character was already considered. - - This invariant makes sure that no token needs to be "unput". - */ - bool accept_internal() - { - switch (last_token) - { - case token_type::begin_object: - { - // read next token - get_token(); - - // closing } -> we are done - if (last_token == token_type::end_object) - { - return true; - } - - // parse values - while (true) - { - // parse key - if (last_token != token_type::value_string) - { - return false; - } - - // parse separator (:) - get_token(); - if (last_token != token_type::name_separator) - { - return false; - } - - // parse value - get_token(); - if (not accept_internal()) - { - return false; - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing } - return (last_token == token_type::end_object); - } - } - - case token_type::begin_array: - { - // read next token - get_token(); - - // closing ] -> we are done - if (last_token == token_type::end_array) - { - return true; - } - - // parse values - while (true) - { - // parse value - if (not accept_internal()) - { - return false; - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing ] - return (last_token == token_type::end_array); - } - } - - case token_type::value_float: - { - // reject infinity or NAN - return std::isfinite(m_lexer.get_number_float()); - } - - case token_type::literal_false: - case token_type::literal_null: - case token_type::literal_true: - case token_type::value_integer: - case token_type::value_string: - case token_type::value_unsigned: - return true; - - default: // the last token was unexpected - return false; - } - } - bool sax_parse_internal(json_sax_t* sax) { switch (last_token) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 9fc301e2..ff992269 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3409,6 +3409,80 @@ class json_sax_dom_parser : public json_sax const bool allow_exceptions = true; }; +template +class json_sax_acceptor : public json_sax +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + bool null() override + { + return true; + } + + bool boolean(bool) override + { + return true; + } + + bool number_integer(number_integer_t) override + { + return true; + } + + bool number_unsigned(number_unsigned_t) override + { + return true; + } + + bool number_float(number_float_t, const std::string&) override + { + return true; + } + + bool string(std::string&&) override + { + return true; + } + + bool start_object(std::size_t) override + { + return true; + } + + bool key(std::string&&) override + { + return true; + } + + bool end_object() override + { + return true; + } + + bool start_array(std::size_t) override + { + return true; + } + + bool end_array() override + { + return true; + } + + bool binary(const std::vector&) override + { + return true; + } + + bool parse_error(std::size_t, const std::string&, const std::string&) override + { + return false; + } +}; + } @@ -3540,7 +3614,9 @@ class parser */ bool accept(const bool strict = true) { - if (not accept_internal()) + json_sax_acceptor sax_acceptor; + + if (not sax_parse_internal(&sax_acceptor)) { return false; } @@ -3839,119 +3915,6 @@ class parser } } - /*! - @brief the actual acceptor - - @invariant 1. The last token is not yet processed. Therefore, the caller - of this function must make sure a token has been read. - 2. When this function returns, the last token is processed. - That is, the last read character was already considered. - - This invariant makes sure that no token needs to be "unput". - */ - bool accept_internal() - { - switch (last_token) - { - case token_type::begin_object: - { - // read next token - get_token(); - - // closing } -> we are done - if (last_token == token_type::end_object) - { - return true; - } - - // parse values - while (true) - { - // parse key - if (last_token != token_type::value_string) - { - return false; - } - - // parse separator (:) - get_token(); - if (last_token != token_type::name_separator) - { - return false; - } - - // parse value - get_token(); - if (not accept_internal()) - { - return false; - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing } - return (last_token == token_type::end_object); - } - } - - case token_type::begin_array: - { - // read next token - get_token(); - - // closing ] -> we are done - if (last_token == token_type::end_array) - { - return true; - } - - // parse values - while (true) - { - // parse value - if (not accept_internal()) - { - return false; - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing ] - return (last_token == token_type::end_array); - } - } - - case token_type::value_float: - { - // reject infinity or NAN - return std::isfinite(m_lexer.get_number_float()); - } - - case token_type::literal_false: - case token_type::literal_null: - case token_type::literal_true: - case token_type::value_integer: - case token_type::value_string: - case token_type::value_unsigned: - return true; - - default: // the last token was unexpected - return false; - } - } - bool sax_parse_internal(json_sax_t* sax) { switch (last_token) From 149d2fd09c050fe614703baa38a83fb624b490bc Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 10 Mar 2018 11:24:00 +0100 Subject: [PATCH 013/156] :green_heart: improved test coverage --- include/nlohmann/detail/input/parser.hpp | 37 +++++++++--------------- single_include/nlohmann/json.hpp | 37 +++++++++--------------- test/src/unit-class_parser.cpp | 13 ++++++++- 3 files changed, 38 insertions(+), 49 deletions(-) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 8346cd4b..32f2be88 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -164,6 +164,8 @@ class parser { // never parse after a parse error was detected assert(not errored); + // this function is only called when a callback is given + assert(callback); // start with a discarded value if (not result.is_discarded()) @@ -178,12 +180,9 @@ class parser { if (keep) { - if (callback) - { - keep = callback(depth++, parse_event_t::object_start, result); - } + keep = callback(depth++, parse_event_t::object_start, result); - if (not callback or keep) + if (keep) { // explicitly set result to object to cope with {} result.m_type = value_t::object; @@ -197,7 +196,7 @@ class parser // closing } -> we are done if (last_token == token_type::end_object) { - if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) + if (keep and not callback(--depth, parse_event_t::object_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -220,15 +219,8 @@ class parser bool keep_tag = false; if (keep) { - if (callback) - { - BasicJsonType k(key); - keep_tag = callback(depth, parse_event_t::key, k); - } - else - { - keep_tag = true; - } + BasicJsonType k(key); + keep_tag = callback(depth, parse_event_t::key, k); } // parse separator (:) @@ -270,7 +262,7 @@ class parser break; } - if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) + if (keep and not callback(--depth, parse_event_t::object_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -282,12 +274,9 @@ class parser { if (keep) { - if (callback) - { - keep = callback(depth++, parse_event_t::array_start, result); - } + keep = callback(depth++, parse_event_t::array_start, result); - if (not callback or keep) + if (keep) { // explicitly set result to array to cope with [] result.m_type = value_t::array; @@ -301,7 +290,7 @@ class parser // closing ] -> we are done if (last_token == token_type::end_array) { - if (callback and not callback(--depth, parse_event_t::array_end, result)) + if (not callback(--depth, parse_event_t::array_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -344,7 +333,7 @@ class parser break; } - if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) + if (keep and not callback(--depth, parse_event_t::array_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -432,7 +421,7 @@ class parser } } - if (keep and callback and not callback(depth, parse_event_t::value, result)) + if (keep and not callback(depth, parse_event_t::value, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index cdd55475..666150d9 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3641,6 +3641,8 @@ class parser { // never parse after a parse error was detected assert(not errored); + // this function is only called when a callback is given + assert(callback); // start with a discarded value if (not result.is_discarded()) @@ -3655,12 +3657,9 @@ class parser { if (keep) { - if (callback) - { - keep = callback(depth++, parse_event_t::object_start, result); - } + keep = callback(depth++, parse_event_t::object_start, result); - if (not callback or keep) + if (keep) { // explicitly set result to object to cope with {} result.m_type = value_t::object; @@ -3674,7 +3673,7 @@ class parser // closing } -> we are done if (last_token == token_type::end_object) { - if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) + if (keep and not callback(--depth, parse_event_t::object_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -3697,15 +3696,8 @@ class parser bool keep_tag = false; if (keep) { - if (callback) - { - BasicJsonType k(key); - keep_tag = callback(depth, parse_event_t::key, k); - } - else - { - keep_tag = true; - } + BasicJsonType k(key); + keep_tag = callback(depth, parse_event_t::key, k); } // parse separator (:) @@ -3747,7 +3739,7 @@ class parser break; } - if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) + if (keep and not callback(--depth, parse_event_t::object_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -3759,12 +3751,9 @@ class parser { if (keep) { - if (callback) - { - keep = callback(depth++, parse_event_t::array_start, result); - } + keep = callback(depth++, parse_event_t::array_start, result); - if (not callback or keep) + if (keep) { // explicitly set result to array to cope with [] result.m_type = value_t::array; @@ -3778,7 +3767,7 @@ class parser // closing ] -> we are done if (last_token == token_type::end_array) { - if (callback and not callback(--depth, parse_event_t::array_end, result)) + if (not callback(--depth, parse_event_t::array_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -3821,7 +3810,7 @@ class parser break; } - if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) + if (keep and not callback(--depth, parse_event_t::array_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; @@ -3909,7 +3898,7 @@ class parser } } - if (keep and callback and not callback(depth, parse_event_t::value, result)) + if (keep and not callback(depth, parse_event_t::value, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 39753d68..d84148eb 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -176,7 +176,18 @@ bool accept_helper(const std::string& s) CHECK_NOTHROW(json::sax_parse(s, &el)); CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == not el.errored); - // 5. return result + // 5. parse with simple callback + json::parser_callback_t cb = [](int, json::parse_event_t, json&) + { + return true; + }; + json j_cb = json::parse(s, cb, false); + const bool ok_noexcept_cb = not j_cb.is_discarded(); + + // 6. check if this approach came to the same result + CHECK(ok_noexcept == ok_noexcept_cb); + + // 7. return result return ok_accept; } From ad47b0fbde0425838991da876adf40417110489d Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 11 Mar 2018 18:47:38 +0100 Subject: [PATCH 014/156] :recycle: refactored binary readers to use a SAX parser --- .../nlohmann/detail/input/binary_reader.hpp | 518 +++++++++-------- include/nlohmann/detail/input/json_sax.hpp | 21 +- include/nlohmann/json.hpp | 2 +- single_include/nlohmann/json.hpp | 542 ++++++++++-------- test/src/unit-class_parser.cpp | 2 +- 5 files changed, 592 insertions(+), 493 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index d4ca38f5..e7341352 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -16,6 +16,7 @@ #include // make_pair, move #include +#include #include #include #include @@ -37,6 +38,7 @@ class binary_reader using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using string_t = typename BasicJsonType::string_t; + using json_sax_t = json_sax; public: /*! @@ -61,13 +63,16 @@ class binary_reader */ BasicJsonType parse_cbor(const bool strict) { - const auto res = parse_cbor_internal(); + BasicJsonType result; + json_sax_dom_parser sdp(result); + parse_cbor_sax_internal(&sdp); + result.assert_invariant(); if (strict) { get(); expect_eof(); } - return res; + return result; } /*! @@ -82,13 +87,16 @@ class binary_reader */ BasicJsonType parse_msgpack(const bool strict) { - const auto res = parse_msgpack_internal(); + BasicJsonType result; + json_sax_dom_parser sdp(result); + parse_msgpack_sax_internal(&sdp); + result.assert_invariant(); if (strict) { get(); expect_eof(); } - return res; + return result; } /*! @@ -103,13 +111,16 @@ class binary_reader */ BasicJsonType parse_ubjson(const bool strict) { - const auto res = parse_ubjson_internal(); + BasicJsonType result; + json_sax_dom_parser sdp(result); + parse_ubjson_sax_internal(&sdp); + result.assert_invariant(); if (strict) { get_ignore_noop(); expect_eof(); } - return res; + return result; } /*! @@ -130,13 +141,14 @@ class binary_reader input (true, default) or whether the last read character should be considered instead */ - BasicJsonType parse_cbor_internal(const bool get_char = true) + bool parse_cbor_sax_internal(json_sax_t* sax, const bool get_char = true) { switch (get_char ? get() : current) { // EOF case std::char_traits::eof(): - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + unexpect_eof(); + return sax->parse_error(chars_read, "", "unexpected end of input"); // Integer 0x00..0x17 (0..23) case 0x00: @@ -163,19 +175,19 @@ class binary_reader case 0x15: case 0x16: case 0x17: - return static_cast(current); + return sax->number_unsigned(static_cast(current)); case 0x18: // Unsigned integer (one-byte uint8_t follows) - return get_number(); + return sax->number_unsigned(get_number()); case 0x19: // Unsigned integer (two-byte uint16_t follows) - return get_number(); + return sax->number_unsigned(get_number()); case 0x1A: // Unsigned integer (four-byte uint32_t follows) - return get_number(); + return sax->number_unsigned(get_number()); case 0x1B: // Unsigned integer (eight-byte uint64_t follows) - return get_number(); + return sax->number_unsigned(get_number()); // Negative integer -1-0x00..-1-0x17 (-1..-24) case 0x20: @@ -202,28 +214,20 @@ class binary_reader case 0x35: case 0x36: case 0x37: - return static_cast(0x20 - 1 - current); + return sax->number_integer(static_cast(0x20 - 1 - current)); case 0x38: // Negative integer (one-byte uint8_t follows) - { - return static_cast(-1) - get_number(); - } + return sax->number_integer(static_cast(-1) - get_number()); case 0x39: // Negative integer -1-n (two-byte uint16_t follows) - { - return static_cast(-1) - get_number(); - } + return sax->number_integer(static_cast(-1) - get_number()); case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) - { - return static_cast(-1) - get_number(); - } + return sax->number_integer(static_cast(-1) - get_number()); case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) - { - return static_cast(-1) - - static_cast(get_number()); - } + return sax->number_integer(static_cast(-1) - + static_cast(get_number())); // UTF-8 string (0x00..0x17 bytes follow) case 0x60: @@ -255,9 +259,7 @@ class binary_reader case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) case 0x7F: // UTF-8 string (indefinite length) - { - return get_cbor_string(); - } + return sax->string(get_cbor_string()); // array (0x00..0x17 data items follow) case 0x80: @@ -284,39 +286,22 @@ class binary_reader case 0x95: case 0x96: case 0x97: - { - return get_cbor_array(current & 0x1F); - } + return get_cbor_array_sax(sax, static_cast(current & 0x1F)); case 0x98: // array (one-byte uint8_t for n follows) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x99: // array (two-byte uint16_t for n follow) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x9A: // array (four-byte uint32_t for n follow) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x9B: // array (eight-byte uint64_t for n follow) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x9F: // array (indefinite length) - { - BasicJsonType result = value_t::array; - while (get() != 0xFF) - { - result.push_back(parse_cbor_internal(false)); - } - return result; - } + return get_cbor_array_sax(sax, json_sax_t::no_limit); // map (0x00..0x17 pairs of data items follow) case 0xA0: @@ -343,55 +328,31 @@ class binary_reader case 0xB5: case 0xB6: case 0xB7: - { - return get_cbor_object(current & 0x1F); - } + return get_cbor_object_sax(sax, static_cast(current & 0x1F)); case 0xB8: // map (one-byte uint8_t for n follows) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xB9: // map (two-byte uint16_t for n follow) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xBA: // map (four-byte uint32_t for n follow) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xBB: // map (eight-byte uint64_t for n follow) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xBF: // map (indefinite length) - { - BasicJsonType result = value_t::object; - while (get() != 0xFF) - { - auto key = get_cbor_string(); - result[key] = parse_cbor_internal(); - } - return result; - } + return get_cbor_object_sax(sax, json_sax_t::no_limit); case 0xF4: // false - { - return false; - } + return sax->boolean(false); case 0xF5: // true - { - return true; - } + return sax->boolean(true); case 0xF6: // null - { - return value_t::null; - } + return sax->null(); case 0xF9: // Half-Precision Float (two-byte IEEE 754) { @@ -425,18 +386,14 @@ class binary_reader val = (mant == 0) ? std::numeric_limits::infinity() : std::numeric_limits::quiet_NaN(); } - return (half & 0x8000) != 0 ? -val : val; + return sax->number_float((half & 0x8000) != 0 ? -val : val, ""); } case 0xFA: // Single-Precision Float (four-byte IEEE 754) - { - return get_number(); - } + return sax->number_float(static_cast(get_number()), ""); case 0xFB: // Double-Precision Float (eight-byte IEEE 754) - { - return get_number(); - } + return sax->number_float(get_number(), ""); default: // anything else (0xFF is handled inside the other types) { @@ -447,13 +404,14 @@ class binary_reader } } - BasicJsonType parse_msgpack_internal() + bool parse_msgpack_sax_internal(json_sax_t* sax) { switch (get()) { // EOF case std::char_traits::eof(): - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + unexpect_eof(); + return sax->parse_error(chars_read, "", "unexpected end of input"); // positive fixint case 0x00: @@ -584,7 +542,7 @@ class binary_reader case 0x7D: case 0x7E: case 0x7F: - return static_cast(current); + return sax->number_unsigned(static_cast(current)); // fixmap case 0x80: @@ -603,9 +561,7 @@ class binary_reader case 0x8D: case 0x8E: case 0x8F: - { - return get_msgpack_object(current & 0x0F); - } + return get_msgpack_object_sax(sax, static_cast(current & 0x0F)); // fixarray case 0x90: @@ -624,9 +580,7 @@ class binary_reader case 0x9D: case 0x9E: case 0x9F: - { - return get_msgpack_array(current & 0x0F); - } + return get_msgpack_array_sax(sax, static_cast(current & 0x0F)); // fixstr case 0xA0: @@ -661,73 +615,65 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - return get_msgpack_string(); + return sax->string(get_msgpack_string()); case 0xC0: // nil - return value_t::null; + return sax->null(); case 0xC2: // false - return false; + return sax->boolean(false); case 0xC3: // true - return true; + return sax->boolean(true); case 0xCA: // float 32 - return get_number(); + return sax->number_float(static_cast(get_number()), ""); case 0xCB: // float 64 - return get_number(); + return sax->number_float(get_number(), ""); case 0xCC: // uint 8 - return get_number(); + return sax->number_unsigned(get_number()); case 0xCD: // uint 16 - return get_number(); + return sax->number_unsigned(get_number()); case 0xCE: // uint 32 - return get_number(); + return sax->number_unsigned(get_number()); case 0xCF: // uint 64 - return get_number(); + return sax->number_unsigned(get_number()); case 0xD0: // int 8 - return get_number(); + return sax->number_integer(get_number()); case 0xD1: // int 16 - return get_number(); + return sax->number_integer(get_number()); case 0xD2: // int 32 - return get_number(); + return sax->number_integer(get_number()); case 0xD3: // int 64 - return get_number(); + return sax->number_integer(get_number()); case 0xD9: // str 8 case 0xDA: // str 16 case 0xDB: // str 32 - return get_msgpack_string(); + return sax->string(get_msgpack_string()); case 0xDC: // array 16 - { - return get_msgpack_array(get_number()); - } + return get_msgpack_array_sax(sax, static_cast(get_number())); case 0xDD: // array 32 - { - return get_msgpack_array(get_number()); - } + return get_msgpack_array_sax(sax, static_cast(get_number())); case 0xDE: // map 16 - { - return get_msgpack_object(get_number()); - } + return get_msgpack_object_sax(sax, static_cast(get_number())); case 0xDF: // map 32 - { - return get_msgpack_object(get_number()); - } + return get_msgpack_object_sax(sax, static_cast(get_number())); - // positive fixint + // negative fixint case 0xE0: case 0xE1: case 0xE2: @@ -760,7 +706,7 @@ class binary_reader case 0xFD: case 0xFE: case 0xFF: - return static_cast(current); + return sax->number_integer(static_cast(current)); default: // anything else { @@ -777,9 +723,9 @@ class binary_reader input (true, default) or whether the last read character should be considered instead */ - BasicJsonType parse_ubjson_internal(const bool get_char = true) + bool parse_ubjson_sax_internal(json_sax_t* sax, const bool get_char = true) { - return get_ubjson_value(get_char ? get_ignore_noop() : current); + return get_ubjson_sax_value(sax, get_char ? get_ignore_noop() : current); } /*! @@ -919,29 +865,19 @@ class binary_reader case 0x75: case 0x76: case 0x77: - { return get_string(current & 0x1F); - } case 0x78: // UTF-8 string (one-byte uint8_t for n follows) - { return get_string(get_number()); - } case 0x79: // UTF-8 string (two-byte uint16_t for n follow) - { return get_string(get_number()); - } case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) - { return get_string(get_number()); - } case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) - { return get_string(get_number()); - } case 0x7F: // UTF-8 string (indefinite length) { @@ -962,31 +898,75 @@ class binary_reader } } - template - BasicJsonType get_cbor_array(const NumberType len) + bool get_cbor_array_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::array; - std::generate_n(std::back_inserter(*result.m_value.array), len, [this]() + if (not sax->start_array(len)) { - return parse_cbor_internal(); - }); - return result; + return false; + } + + if (len != json_sax_t::no_limit) + for (std::size_t i = 0; i < len; ++i) + { + if (not parse_cbor_sax_internal(sax)) + { + return false; + } + } + else + { + while (get() != 0xFF) + { + if (not parse_cbor_sax_internal(sax, false)) + { + return false; + } + } + } + + return sax->end_array(); } - template - BasicJsonType get_cbor_object(const NumberType len) + bool get_cbor_object_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::object; - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - len, [this]() + if (not sax->start_object(len)) { - get(); - auto key = get_cbor_string(); - auto val = parse_cbor_internal(); - return std::make_pair(std::move(key), std::move(val)); - }); - return result; + return false; + } + + if (len != json_sax_t::no_limit) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (not sax->key(get_cbor_string())) + { + return false; + } + + if (not parse_cbor_sax_internal(sax)) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (not sax->key(get_cbor_string())) + { + return false; + } + + if (not parse_cbor_sax_internal(sax)) + { + return false; + } + } + } + + return sax->end_object(); } /*! @@ -1039,24 +1019,16 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - { return get_string(current & 0x1F); - } case 0xD9: // str 8 - { return get_string(get_number()); - } case 0xDA: // str 16 - { return get_string(get_number()); - } case 0xDB: // str 32 - { return get_string(get_number()); - } default: { @@ -1068,31 +1040,46 @@ class binary_reader } } - template - BasicJsonType get_msgpack_array(const NumberType len) + bool get_msgpack_array_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::array; - std::generate_n(std::back_inserter(*result.m_value.array), len, [this]() + if (not sax->start_array(len)) { - return parse_msgpack_internal(); - }); - return result; + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (not parse_msgpack_sax_internal(sax)) + { + return false; + } + } + + return sax->end_array(); } - template - BasicJsonType get_msgpack_object(const NumberType len) + bool get_msgpack_object_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::object; - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - len, [this]() + if (not sax->start_object(len)) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) { get(); - auto key = get_msgpack_string(); - auto val = parse_msgpack_internal(); - return std::make_pair(std::move(key), std::move(val)); - }); - return result; + if (not sax->key(get_msgpack_string())) + { + return false; + } + + if (not parse_msgpack_sax_internal(sax)) + { + return false; + } + } + + return sax->end_object(); } /*! @@ -1140,6 +1127,25 @@ class binary_reader } } + std::size_t get_ubjson_size_value() + { + switch (get_ignore_noop()) + { + case 'U': + return static_cast(get_number()); + case 'i': + return static_cast(get_number()); + case 'I': + return static_cast(get_number()); + case 'l': + return static_cast(get_number()); + case 'L': + return static_cast(get_number()); + default: + return std::size_t(-1); + } + } + /*! @brief determine the type and size for a container @@ -1168,45 +1174,46 @@ class binary_reader JSON_THROW(parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + ss.str())); } - sz = parse_ubjson_internal(); + sz = get_ubjson_size_value(); } else if (current == '#') { - sz = parse_ubjson_internal(); + sz = get_ubjson_size_value(); } return std::make_pair(sz, tc); } - BasicJsonType get_ubjson_value(const int prefix) + bool get_ubjson_sax_value(json_sax_t* sax, const int prefix) { switch (prefix) { case std::char_traits::eof(): // EOF - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + unexpect_eof(); + return sax->parse_error(chars_read, "", "unexpected end of input"); case 'T': // true - return true; + return sax->boolean(true); case 'F': // false - return false; + return sax->boolean(false); case 'Z': // null - return nullptr; + return sax->null(); case 'U': - return get_number(); + return sax->number_unsigned(get_number()); case 'i': - return get_number(); + return sax->number_integer(get_number()); case 'I': - return get_number(); + return sax->number_integer(get_number()); case 'l': - return get_number(); + return sax->number_integer(get_number()); case 'L': - return get_number(); + return sax->number_integer(get_number()); case 'd': - return get_number(); + return sax->number_float(static_cast(get_number()), ""); case 'D': - return get_number(); + return sax->number_float(get_number(), ""); case 'C': // char { @@ -1219,17 +1226,17 @@ class binary_reader JSON_THROW(parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); } - return string_t(1, static_cast(current)); + return sax->string(string_t(1, static_cast(current))); } case 'S': // string - return get_ubjson_string(); + return sax->string(get_ubjson_string()); case '[': // array - return get_ubjson_array(); + return get_ubjson_sax_array(sax); case '{': // object - return get_ubjson_object(); + return get_ubjson_sax_object(sax); default: // anything else std::stringstream ss; @@ -1239,98 +1246,123 @@ class binary_reader } } - BasicJsonType get_ubjson_array() + bool get_ubjson_sax_array(json_sax_t* sax) { - BasicJsonType result = value_t::array; const auto size_and_type = get_ubjson_size_type(); if (size_and_type.first != string_t::npos) { - if (JSON_UNLIKELY(size_and_type.first > result.max_size())) + if (not sax->start_array(size_and_type.first)) { - JSON_THROW(out_of_range::create(408, - "excessive array size: " + std::to_string(size_and_type.first))); + return false; } if (size_and_type.second != 0) { if (size_and_type.second != 'N') { - std::generate_n(std::back_inserter(*result.m_value.array), - size_and_type.first, [this, size_and_type]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - return get_ubjson_value(size_and_type.second); - }); + if (not get_ubjson_sax_value(sax, size_and_type.second)) + { + return false; + } + } } } else { - std::generate_n(std::back_inserter(*result.m_value.array), - size_and_type.first, [this]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - return parse_ubjson_internal(); - }); + if (not parse_ubjson_sax_internal(sax)) + { + return false; + } + } } } else { + if (not sax->start_array()) + { + return false; + } + while (current != ']') { - result.push_back(parse_ubjson_internal(false)); + if (not parse_ubjson_sax_internal(sax, false)) + { + return false; + } get_ignore_noop(); } } - return result; + return sax->end_array(); } - BasicJsonType get_ubjson_object() + bool get_ubjson_sax_object(json_sax_t* sax) { - BasicJsonType result = value_t::object; const auto size_and_type = get_ubjson_size_type(); if (size_and_type.first != string_t::npos) { - if (JSON_UNLIKELY(size_and_type.first > result.max_size())) + if (not sax->start_object(size_and_type.first)) { - JSON_THROW(out_of_range::create(408, - "excessive object size: " + std::to_string(size_and_type.first))); + return false; } if (size_and_type.second != 0) { - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - size_and_type.first, [this, size_and_type]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - auto key = get_ubjson_string(); - auto val = get_ubjson_value(size_and_type.second); - return std::make_pair(std::move(key), std::move(val)); - }); + if (not sax->key(get_ubjson_string())) + { + return false; + } + if (not get_ubjson_sax_value(sax, size_and_type.second)) + { + return false; + } + } } else { - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - size_and_type.first, [this]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - auto key = get_ubjson_string(); - auto val = parse_ubjson_internal(); - return std::make_pair(std::move(key), std::move(val)); - }); + if (not sax->key(get_ubjson_string())) + { + return false; + } + if (not parse_ubjson_sax_internal(sax)) + { + return false; + } + } } } else { + if (not sax->start_object()) + { + return false; + } + while (current != '}') { - auto key = get_ubjson_string(false); - result[std::move(key)] = parse_ubjson_internal(); + if (not sax->key(get_ubjson_string(false))) + { + return false; + } + if (not parse_ubjson_sax_internal(sax)) + { + return false; + } get_ignore_noop(); } } - return result; + return sax->end_object(); } /*! diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index e2b8baad..bb98e785 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -124,6 +124,8 @@ struct json_sax }; +namespace detail +{ template class json_sax_dom_parser : public json_sax { @@ -172,9 +174,16 @@ class json_sax_dom_parser : public json_sax return true; } - bool start_object(std::size_t) override + bool start_object(std::size_t len) override { ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive object size: " + std::to_string(len))); + } + return true; } @@ -191,9 +200,16 @@ class json_sax_dom_parser : public json_sax return true; } - bool start_array(std::size_t) override + bool start_array(std::size_t len) override { ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive array size: " + std::to_string(len))); + } + return true; } @@ -348,6 +364,7 @@ class json_sax_acceptor : public json_sax return false; } }; +} } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 3a52ec8c..5a5f1cfe 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -172,7 +172,7 @@ class basic_json template friend class ::nlohmann::detail::binary_reader; template - friend class ::nlohmann::json_sax_dom_parser; + friend class ::nlohmann::detail::json_sax_dom_parser; /// workaround type for MSVC using basic_json_t = NLOHMANN_BASIC_JSON_TPL; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 666150d9..bda79b26 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3258,6 +3258,8 @@ struct json_sax }; +namespace detail +{ template class json_sax_dom_parser : public json_sax { @@ -3306,9 +3308,16 @@ class json_sax_dom_parser : public json_sax return true; } - bool start_object(std::size_t) override + bool start_object(std::size_t len) override { ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive object size: " + std::to_string(len))); + } + return true; } @@ -3325,9 +3334,16 @@ class json_sax_dom_parser : public json_sax return true; } - bool start_array(std::size_t) override + bool start_array(std::size_t len) override { ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive array size: " + std::to_string(len))); + } + return true; } @@ -3482,6 +3498,7 @@ class json_sax_acceptor : public json_sax return false; } }; +} } @@ -5285,6 +5302,8 @@ class output_adapter // #include +// #include + // #include // #include @@ -5309,6 +5328,7 @@ class binary_reader using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using string_t = typename BasicJsonType::string_t; + using json_sax_t = json_sax; public: /*! @@ -5333,13 +5353,16 @@ class binary_reader */ BasicJsonType parse_cbor(const bool strict) { - const auto res = parse_cbor_internal(); + BasicJsonType result; + json_sax_dom_parser sdp(result); + parse_cbor_sax_internal(&sdp); + result.assert_invariant(); if (strict) { get(); expect_eof(); } - return res; + return result; } /*! @@ -5354,13 +5377,16 @@ class binary_reader */ BasicJsonType parse_msgpack(const bool strict) { - const auto res = parse_msgpack_internal(); + BasicJsonType result; + json_sax_dom_parser sdp(result); + parse_msgpack_sax_internal(&sdp); + result.assert_invariant(); if (strict) { get(); expect_eof(); } - return res; + return result; } /*! @@ -5375,13 +5401,16 @@ class binary_reader */ BasicJsonType parse_ubjson(const bool strict) { - const auto res = parse_ubjson_internal(); + BasicJsonType result; + json_sax_dom_parser sdp(result); + parse_ubjson_sax_internal(&sdp); + result.assert_invariant(); if (strict) { get_ignore_noop(); expect_eof(); } - return res; + return result; } /*! @@ -5402,13 +5431,14 @@ class binary_reader input (true, default) or whether the last read character should be considered instead */ - BasicJsonType parse_cbor_internal(const bool get_char = true) + bool parse_cbor_sax_internal(json_sax_t* sax, const bool get_char = true) { switch (get_char ? get() : current) { // EOF case std::char_traits::eof(): - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + unexpect_eof(); + return sax->parse_error(chars_read, "", "unexpected end of input"); // Integer 0x00..0x17 (0..23) case 0x00: @@ -5435,19 +5465,19 @@ class binary_reader case 0x15: case 0x16: case 0x17: - return static_cast(current); + return sax->number_unsigned(static_cast(current)); case 0x18: // Unsigned integer (one-byte uint8_t follows) - return get_number(); + return sax->number_unsigned(get_number()); case 0x19: // Unsigned integer (two-byte uint16_t follows) - return get_number(); + return sax->number_unsigned(get_number()); case 0x1A: // Unsigned integer (four-byte uint32_t follows) - return get_number(); + return sax->number_unsigned(get_number()); case 0x1B: // Unsigned integer (eight-byte uint64_t follows) - return get_number(); + return sax->number_unsigned(get_number()); // Negative integer -1-0x00..-1-0x17 (-1..-24) case 0x20: @@ -5474,28 +5504,20 @@ class binary_reader case 0x35: case 0x36: case 0x37: - return static_cast(0x20 - 1 - current); + return sax->number_integer(static_cast(0x20 - 1 - current)); case 0x38: // Negative integer (one-byte uint8_t follows) - { - return static_cast(-1) - get_number(); - } + return sax->number_integer(static_cast(-1) - get_number()); case 0x39: // Negative integer -1-n (two-byte uint16_t follows) - { - return static_cast(-1) - get_number(); - } + return sax->number_integer(static_cast(-1) - get_number()); case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) - { - return static_cast(-1) - get_number(); - } + return sax->number_integer(static_cast(-1) - get_number()); case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) - { - return static_cast(-1) - - static_cast(get_number()); - } + return sax->number_integer(static_cast(-1) - + static_cast(get_number())); // UTF-8 string (0x00..0x17 bytes follow) case 0x60: @@ -5527,9 +5549,7 @@ class binary_reader case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) case 0x7F: // UTF-8 string (indefinite length) - { - return get_cbor_string(); - } + return sax->string(get_cbor_string()); // array (0x00..0x17 data items follow) case 0x80: @@ -5556,39 +5576,22 @@ class binary_reader case 0x95: case 0x96: case 0x97: - { - return get_cbor_array(current & 0x1F); - } + return get_cbor_array_sax(sax, static_cast(current & 0x1F)); case 0x98: // array (one-byte uint8_t for n follows) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x99: // array (two-byte uint16_t for n follow) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x9A: // array (four-byte uint32_t for n follow) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x9B: // array (eight-byte uint64_t for n follow) - { - return get_cbor_array(get_number()); - } + return get_cbor_array_sax(sax, static_cast(get_number())); case 0x9F: // array (indefinite length) - { - BasicJsonType result = value_t::array; - while (get() != 0xFF) - { - result.push_back(parse_cbor_internal(false)); - } - return result; - } + return get_cbor_array_sax(sax, json_sax_t::no_limit); // map (0x00..0x17 pairs of data items follow) case 0xA0: @@ -5615,55 +5618,31 @@ class binary_reader case 0xB5: case 0xB6: case 0xB7: - { - return get_cbor_object(current & 0x1F); - } + return get_cbor_object_sax(sax, static_cast(current & 0x1F)); case 0xB8: // map (one-byte uint8_t for n follows) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xB9: // map (two-byte uint16_t for n follow) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xBA: // map (four-byte uint32_t for n follow) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xBB: // map (eight-byte uint64_t for n follow) - { - return get_cbor_object(get_number()); - } + return get_cbor_object_sax(sax, static_cast(get_number())); case 0xBF: // map (indefinite length) - { - BasicJsonType result = value_t::object; - while (get() != 0xFF) - { - auto key = get_cbor_string(); - result[key] = parse_cbor_internal(); - } - return result; - } + return get_cbor_object_sax(sax, json_sax_t::no_limit); case 0xF4: // false - { - return false; - } + return sax->boolean(false); case 0xF5: // true - { - return true; - } + return sax->boolean(true); case 0xF6: // null - { - return value_t::null; - } + return sax->null(); case 0xF9: // Half-Precision Float (two-byte IEEE 754) { @@ -5697,18 +5676,14 @@ class binary_reader val = (mant == 0) ? std::numeric_limits::infinity() : std::numeric_limits::quiet_NaN(); } - return (half & 0x8000) != 0 ? -val : val; + return sax->number_float((half & 0x8000) != 0 ? -val : val, ""); } case 0xFA: // Single-Precision Float (four-byte IEEE 754) - { - return get_number(); - } + return sax->number_float(static_cast(get_number()), ""); case 0xFB: // Double-Precision Float (eight-byte IEEE 754) - { - return get_number(); - } + return sax->number_float(get_number(), ""); default: // anything else (0xFF is handled inside the other types) { @@ -5719,13 +5694,14 @@ class binary_reader } } - BasicJsonType parse_msgpack_internal() + bool parse_msgpack_sax_internal(json_sax_t* sax) { switch (get()) { // EOF case std::char_traits::eof(): - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + unexpect_eof(); + return sax->parse_error(chars_read, "", "unexpected end of input"); // positive fixint case 0x00: @@ -5856,7 +5832,7 @@ class binary_reader case 0x7D: case 0x7E: case 0x7F: - return static_cast(current); + return sax->number_unsigned(static_cast(current)); // fixmap case 0x80: @@ -5875,9 +5851,7 @@ class binary_reader case 0x8D: case 0x8E: case 0x8F: - { - return get_msgpack_object(current & 0x0F); - } + return get_msgpack_object_sax(sax, static_cast(current & 0x0F)); // fixarray case 0x90: @@ -5896,9 +5870,7 @@ class binary_reader case 0x9D: case 0x9E: case 0x9F: - { - return get_msgpack_array(current & 0x0F); - } + return get_msgpack_array_sax(sax, static_cast(current & 0x0F)); // fixstr case 0xA0: @@ -5933,73 +5905,65 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - return get_msgpack_string(); + return sax->string(get_msgpack_string()); case 0xC0: // nil - return value_t::null; + return sax->null(); case 0xC2: // false - return false; + return sax->boolean(false); case 0xC3: // true - return true; + return sax->boolean(true); case 0xCA: // float 32 - return get_number(); + return sax->number_float(static_cast(get_number()), ""); case 0xCB: // float 64 - return get_number(); + return sax->number_float(get_number(), ""); case 0xCC: // uint 8 - return get_number(); + return sax->number_unsigned(get_number()); case 0xCD: // uint 16 - return get_number(); + return sax->number_unsigned(get_number()); case 0xCE: // uint 32 - return get_number(); + return sax->number_unsigned(get_number()); case 0xCF: // uint 64 - return get_number(); + return sax->number_unsigned(get_number()); case 0xD0: // int 8 - return get_number(); + return sax->number_integer(get_number()); case 0xD1: // int 16 - return get_number(); + return sax->number_integer(get_number()); case 0xD2: // int 32 - return get_number(); + return sax->number_integer(get_number()); case 0xD3: // int 64 - return get_number(); + return sax->number_integer(get_number()); case 0xD9: // str 8 case 0xDA: // str 16 case 0xDB: // str 32 - return get_msgpack_string(); + return sax->string(get_msgpack_string()); case 0xDC: // array 16 - { - return get_msgpack_array(get_number()); - } + return get_msgpack_array_sax(sax, static_cast(get_number())); case 0xDD: // array 32 - { - return get_msgpack_array(get_number()); - } + return get_msgpack_array_sax(sax, static_cast(get_number())); case 0xDE: // map 16 - { - return get_msgpack_object(get_number()); - } + return get_msgpack_object_sax(sax, static_cast(get_number())); case 0xDF: // map 32 - { - return get_msgpack_object(get_number()); - } + return get_msgpack_object_sax(sax, static_cast(get_number())); - // positive fixint + // negative fixint case 0xE0: case 0xE1: case 0xE2: @@ -6032,7 +5996,7 @@ class binary_reader case 0xFD: case 0xFE: case 0xFF: - return static_cast(current); + return sax->number_integer(static_cast(current)); default: // anything else { @@ -6049,9 +6013,9 @@ class binary_reader input (true, default) or whether the last read character should be considered instead */ - BasicJsonType parse_ubjson_internal(const bool get_char = true) + bool parse_ubjson_sax_internal(json_sax_t* sax, const bool get_char = true) { - return get_ubjson_value(get_char ? get_ignore_noop() : current); + return get_ubjson_sax_value(sax, get_char ? get_ignore_noop() : current); } /*! @@ -6191,29 +6155,19 @@ class binary_reader case 0x75: case 0x76: case 0x77: - { return get_string(current & 0x1F); - } case 0x78: // UTF-8 string (one-byte uint8_t for n follows) - { return get_string(get_number()); - } case 0x79: // UTF-8 string (two-byte uint16_t for n follow) - { return get_string(get_number()); - } case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) - { return get_string(get_number()); - } case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) - { return get_string(get_number()); - } case 0x7F: // UTF-8 string (indefinite length) { @@ -6234,31 +6188,75 @@ class binary_reader } } - template - BasicJsonType get_cbor_array(const NumberType len) + bool get_cbor_array_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::array; - std::generate_n(std::back_inserter(*result.m_value.array), len, [this]() + if (not sax->start_array(len)) { - return parse_cbor_internal(); - }); - return result; + return false; + } + + if (len != json_sax_t::no_limit) + for (std::size_t i = 0; i < len; ++i) + { + if (not parse_cbor_sax_internal(sax)) + { + return false; + } + } + else + { + while (get() != 0xFF) + { + if (not parse_cbor_sax_internal(sax, false)) + { + return false; + } + } + } + + return sax->end_array(); } - template - BasicJsonType get_cbor_object(const NumberType len) + bool get_cbor_object_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::object; - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - len, [this]() + if (not sax->start_object(len)) { - get(); - auto key = get_cbor_string(); - auto val = parse_cbor_internal(); - return std::make_pair(std::move(key), std::move(val)); - }); - return result; + return false; + } + + if (len != json_sax_t::no_limit) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (not sax->key(get_cbor_string())) + { + return false; + } + + if (not parse_cbor_sax_internal(sax)) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (not sax->key(get_cbor_string())) + { + return false; + } + + if (not parse_cbor_sax_internal(sax)) + { + return false; + } + } + } + + return sax->end_object(); } /*! @@ -6311,24 +6309,16 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - { return get_string(current & 0x1F); - } case 0xD9: // str 8 - { return get_string(get_number()); - } case 0xDA: // str 16 - { return get_string(get_number()); - } case 0xDB: // str 32 - { return get_string(get_number()); - } default: { @@ -6340,31 +6330,46 @@ class binary_reader } } - template - BasicJsonType get_msgpack_array(const NumberType len) + bool get_msgpack_array_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::array; - std::generate_n(std::back_inserter(*result.m_value.array), len, [this]() + if (not sax->start_array(len)) { - return parse_msgpack_internal(); - }); - return result; + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (not parse_msgpack_sax_internal(sax)) + { + return false; + } + } + + return sax->end_array(); } - template - BasicJsonType get_msgpack_object(const NumberType len) + bool get_msgpack_object_sax(json_sax_t* sax, const std::size_t len) { - BasicJsonType result = value_t::object; - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - len, [this]() + if (not sax->start_object(len)) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) { get(); - auto key = get_msgpack_string(); - auto val = parse_msgpack_internal(); - return std::make_pair(std::move(key), std::move(val)); - }); - return result; + if (not sax->key(get_msgpack_string())) + { + return false; + } + + if (not parse_msgpack_sax_internal(sax)) + { + return false; + } + } + + return sax->end_object(); } /*! @@ -6412,6 +6417,25 @@ class binary_reader } } + std::size_t get_ubjson_size_value() + { + switch (get_ignore_noop()) + { + case 'U': + return static_cast(get_number()); + case 'i': + return static_cast(get_number()); + case 'I': + return static_cast(get_number()); + case 'l': + return static_cast(get_number()); + case 'L': + return static_cast(get_number()); + default: + return std::size_t(-1); + } + } + /*! @brief determine the type and size for a container @@ -6440,45 +6464,46 @@ class binary_reader JSON_THROW(parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + ss.str())); } - sz = parse_ubjson_internal(); + sz = get_ubjson_size_value(); } else if (current == '#') { - sz = parse_ubjson_internal(); + sz = get_ubjson_size_value(); } return std::make_pair(sz, tc); } - BasicJsonType get_ubjson_value(const int prefix) + bool get_ubjson_sax_value(json_sax_t* sax, const int prefix) { switch (prefix) { case std::char_traits::eof(): // EOF - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + unexpect_eof(); + return sax->parse_error(chars_read, "", "unexpected end of input"); case 'T': // true - return true; + return sax->boolean(true); case 'F': // false - return false; + return sax->boolean(false); case 'Z': // null - return nullptr; + return sax->null(); case 'U': - return get_number(); + return sax->number_unsigned(get_number()); case 'i': - return get_number(); + return sax->number_integer(get_number()); case 'I': - return get_number(); + return sax->number_integer(get_number()); case 'l': - return get_number(); + return sax->number_integer(get_number()); case 'L': - return get_number(); + return sax->number_integer(get_number()); case 'd': - return get_number(); + return sax->number_float(static_cast(get_number()), ""); case 'D': - return get_number(); + return sax->number_float(get_number(), ""); case 'C': // char { @@ -6491,17 +6516,17 @@ class binary_reader JSON_THROW(parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); } - return string_t(1, static_cast(current)); + return sax->string(string_t(1, static_cast(current))); } case 'S': // string - return get_ubjson_string(); + return sax->string(get_ubjson_string()); case '[': // array - return get_ubjson_array(); + return get_ubjson_sax_array(sax); case '{': // object - return get_ubjson_object(); + return get_ubjson_sax_object(sax); default: // anything else std::stringstream ss; @@ -6511,98 +6536,123 @@ class binary_reader } } - BasicJsonType get_ubjson_array() + bool get_ubjson_sax_array(json_sax_t* sax) { - BasicJsonType result = value_t::array; const auto size_and_type = get_ubjson_size_type(); if (size_and_type.first != string_t::npos) { - if (JSON_UNLIKELY(size_and_type.first > result.max_size())) + if (not sax->start_array(size_and_type.first)) { - JSON_THROW(out_of_range::create(408, - "excessive array size: " + std::to_string(size_and_type.first))); + return false; } if (size_and_type.second != 0) { if (size_and_type.second != 'N') { - std::generate_n(std::back_inserter(*result.m_value.array), - size_and_type.first, [this, size_and_type]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - return get_ubjson_value(size_and_type.second); - }); + if (not get_ubjson_sax_value(sax, size_and_type.second)) + { + return false; + } + } } } else { - std::generate_n(std::back_inserter(*result.m_value.array), - size_and_type.first, [this]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - return parse_ubjson_internal(); - }); + if (not parse_ubjson_sax_internal(sax)) + { + return false; + } + } } } else { + if (not sax->start_array()) + { + return false; + } + while (current != ']') { - result.push_back(parse_ubjson_internal(false)); + if (not parse_ubjson_sax_internal(sax, false)) + { + return false; + } get_ignore_noop(); } } - return result; + return sax->end_array(); } - BasicJsonType get_ubjson_object() + bool get_ubjson_sax_object(json_sax_t* sax) { - BasicJsonType result = value_t::object; const auto size_and_type = get_ubjson_size_type(); if (size_and_type.first != string_t::npos) { - if (JSON_UNLIKELY(size_and_type.first > result.max_size())) + if (not sax->start_object(size_and_type.first)) { - JSON_THROW(out_of_range::create(408, - "excessive object size: " + std::to_string(size_and_type.first))); + return false; } if (size_and_type.second != 0) { - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - size_and_type.first, [this, size_and_type]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - auto key = get_ubjson_string(); - auto val = get_ubjson_value(size_and_type.second); - return std::make_pair(std::move(key), std::move(val)); - }); + if (not sax->key(get_ubjson_string())) + { + return false; + } + if (not get_ubjson_sax_value(sax, size_and_type.second)) + { + return false; + } + } } else { - std::generate_n(std::inserter(*result.m_value.object, - result.m_value.object->end()), - size_and_type.first, [this]() + for (std::size_t i = 0; i < size_and_type.first; ++i) { - auto key = get_ubjson_string(); - auto val = parse_ubjson_internal(); - return std::make_pair(std::move(key), std::move(val)); - }); + if (not sax->key(get_ubjson_string())) + { + return false; + } + if (not parse_ubjson_sax_internal(sax)) + { + return false; + } + } } } else { + if (not sax->start_object()) + { + return false; + } + while (current != '}') { - auto key = get_ubjson_string(false); - result[std::move(key)] = parse_ubjson_internal(); + if (not sax->key(get_ubjson_string(false))) + { + return false; + } + if (not parse_ubjson_sax_internal(sax)) + { + return false; + } get_ignore_noop(); } } - return result; + return sax->end_object(); } /*! @@ -10225,7 +10275,7 @@ class basic_json template friend class ::nlohmann::detail::binary_reader; template - friend class ::nlohmann::json_sax_dom_parser; + friend class ::nlohmann::detail::json_sax_dom_parser; /// workaround type for MSVC using basic_json_t = NLOHMANN_BASIC_JSON_TPL; diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index d84148eb..1f6c2271 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -149,7 +149,7 @@ json parser_helper(const std::string& s) CHECK(j_nothrow == j); json j_sax; - nlohmann::json_sax_dom_parser sdp(j_sax); + nlohmann::detail::json_sax_dom_parser sdp(j_sax); json::sax_parse(s, &sdp); CHECK(j_sax == j); From 3d4f6a2940e04bbdba06bc7521b554709a570369 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 11 Mar 2018 22:47:25 +0100 Subject: [PATCH 015/156] :hammer: cleaner exception interface --- .../nlohmann/detail/input/binary_reader.hpp | 17 ++--- include/nlohmann/detail/input/json_sax.hpp | 30 ++++++--- include/nlohmann/detail/input/parser.hpp | 17 ++--- single_include/nlohmann/json.hpp | 65 ++++++++++--------- test/src/unit-class_parser.cpp | 2 +- test/src/unit-deserialization.cpp | 2 +- 6 files changed, 73 insertions(+), 60 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index e7341352..eef3ad7c 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -147,8 +147,7 @@ class binary_reader { // EOF case std::char_traits::eof(): - unexpect_eof(); - return sax->parse_error(chars_read, "", "unexpected end of input"); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); // Integer 0x00..0x17 (0..23) case 0x00: @@ -399,7 +398,7 @@ class binary_reader { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str())); + return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str())); } } } @@ -410,8 +409,7 @@ class binary_reader { // EOF case std::char_traits::eof(): - unexpect_eof(); - return sax->parse_error(chars_read, "", "unexpected end of input"); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); // positive fixint case 0x00: @@ -712,8 +710,7 @@ class binary_reader { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, - "error reading MessagePack; last byte: 0x" + ss.str())); + return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + ss.str())); } } } @@ -1189,8 +1186,7 @@ class binary_reader switch (prefix) { case std::char_traits::eof(): // EOF - unexpect_eof(); - return sax->parse_error(chars_read, "", "unexpected end of input"); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); case 'T': // true return sax->boolean(true); @@ -1223,8 +1219,7 @@ class binary_reader { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, - "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); + return sax->parse_error(chars_read, ss.str(), parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); } return sax->string(string_t(1, static_cast(current))); } diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index bb98e785..b354a842 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -4,6 +4,8 @@ #include #include +#include + namespace nlohmann { @@ -118,7 +120,7 @@ struct json_sax */ virtual bool parse_error(std::size_t position, const std::string& last_token, - const std::string& error_msg) = 0; + const detail::exception& ex) = 0; virtual ~json_sax() = default; }; @@ -224,19 +226,27 @@ class json_sax_dom_parser : public json_sax return true; } - bool parse_error(std::size_t position, const std::string& token, - const std::string& error_msg) override + bool parse_error(std::size_t, const std::string&, + const detail::exception& ex) override { errored = true; if (allow_exceptions) { - if (error_msg == "number overflow") + // determine the proper exception type from the id + switch ((ex.id / 100) % 100) { - JSON_THROW(BasicJsonType::out_of_range::create(406, "number overflow parsing '" + token + "'")); - } - else - { - JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + case 1: + JSON_THROW(*reinterpret_cast(&ex)); + case 2: + JSON_THROW(*reinterpret_cast(&ex)); + case 3: + JSON_THROW(*reinterpret_cast(&ex)); + case 4: + JSON_THROW(*reinterpret_cast(&ex)); + case 5: + JSON_THROW(*reinterpret_cast(&ex)); + default: + assert(false); // LCOV_EXCL_LINE } } return false; @@ -359,7 +369,7 @@ class json_sax_acceptor : public json_sax return true; } - bool parse_error(std::size_t, const std::string&, const std::string&) override + bool parse_error(std::size_t, const std::string&, const detail::exception&) override { return false; } diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 32f2be88..847538d6 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -117,7 +117,7 @@ class parser { sdp.parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::end_of_input)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input))); } // in case of an error, return discarded value @@ -456,7 +456,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::value_string)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); } else { @@ -472,7 +472,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::name_separator)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); } // parse value @@ -499,7 +499,8 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::end_object)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); + } } } @@ -546,7 +547,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::end_array)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); } } } @@ -559,7 +560,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - "number overflow"); + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); } else { @@ -602,14 +603,14 @@ class parser // using "uninitialized" to avoid "expected" message return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::uninitialized)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized))); } default: // the last token was unexpected { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::literal_or_value)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value))); } } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index bda79b26..73f9ee6c 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3138,6 +3138,9 @@ scan_number_done: #include #include +// #include + + namespace nlohmann { @@ -3252,7 +3255,7 @@ struct json_sax */ virtual bool parse_error(std::size_t position, const std::string& last_token, - const std::string& error_msg) = 0; + const detail::exception& ex) = 0; virtual ~json_sax() = default; }; @@ -3358,19 +3361,27 @@ class json_sax_dom_parser : public json_sax return true; } - bool parse_error(std::size_t position, const std::string& token, - const std::string& error_msg) override + bool parse_error(std::size_t, const std::string&, + const detail::exception& ex) override { errored = true; if (allow_exceptions) { - if (error_msg == "number overflow") + // determine the proper exception type from the id + switch ((ex.id / 100) % 100) { - JSON_THROW(BasicJsonType::out_of_range::create(406, "number overflow parsing '" + token + "'")); - } - else - { - JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg)); + case 1: + JSON_THROW(*reinterpret_cast(&ex)); + case 2: + JSON_THROW(*reinterpret_cast(&ex)); + case 3: + JSON_THROW(*reinterpret_cast(&ex)); + case 4: + JSON_THROW(*reinterpret_cast(&ex)); + case 5: + JSON_THROW(*reinterpret_cast(&ex)); + default: + assert(false); // LCOV_EXCL_LINE } } return false; @@ -3493,7 +3504,7 @@ class json_sax_acceptor : public json_sax return true; } - bool parse_error(std::size_t, const std::string&, const std::string&) override + bool parse_error(std::size_t, const std::string&, const detail::exception&) override { return false; } @@ -3611,7 +3622,7 @@ class parser { sdp.parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::end_of_input)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input))); } // in case of an error, return discarded value @@ -3950,7 +3961,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::value_string)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); } else { @@ -3966,7 +3977,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::name_separator)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); } // parse value @@ -3993,7 +4004,8 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::end_object)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); + } } } @@ -4040,7 +4052,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::end_array)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); } } } @@ -4053,7 +4065,7 @@ class parser { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - "number overflow"); + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); } else { @@ -4096,14 +4108,14 @@ class parser // using "uninitialized" to avoid "expected" message return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::uninitialized)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized))); } default: // the last token was unexpected { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - exception_message(token_type::literal_or_value)); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value))); } } } @@ -5437,8 +5449,7 @@ class binary_reader { // EOF case std::char_traits::eof(): - unexpect_eof(); - return sax->parse_error(chars_read, "", "unexpected end of input"); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); // Integer 0x00..0x17 (0..23) case 0x00: @@ -5689,7 +5700,7 @@ class binary_reader { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str())); + return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str())); } } } @@ -5700,8 +5711,7 @@ class binary_reader { // EOF case std::char_traits::eof(): - unexpect_eof(); - return sax->parse_error(chars_read, "", "unexpected end of input"); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); // positive fixint case 0x00: @@ -6002,8 +6012,7 @@ class binary_reader { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, - "error reading MessagePack; last byte: 0x" + ss.str())); + return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + ss.str())); } } } @@ -6479,8 +6488,7 @@ class binary_reader switch (prefix) { case std::char_traits::eof(): // EOF - unexpect_eof(); - return sax->parse_error(chars_read, "", "unexpected end of input"); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); case 'T': // true return sax->boolean(true); @@ -6513,8 +6521,7 @@ class binary_reader { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, - "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); + return sax->parse_error(chars_read, ss.str(), parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); } return sax->string(string_t(1, static_cast(current))); } diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 1f6c2271..fec21001 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -123,7 +123,7 @@ class SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool parse_error(std::size_t position, const std::string&, const std::string&) override + bool parse_error(std::size_t position, const std::string&, const json::exception&) override { errored = true; events.push_back("parse_error(" + std::to_string(position) + ")"); diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index cd87dfdb..371df88c 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -122,7 +122,7 @@ struct SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool parse_error(std::size_t position, const std::string&, const std::string&) override + bool parse_error(std::size_t position, const std::string&, const json::exception&) override { events.push_back("parse_error(" + std::to_string(position) + ")"); return false; From 282bafae4f2dd8a3399897e5657984121fedc7f5 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 14 Mar 2018 07:18:42 +0100 Subject: [PATCH 016/156] :hammer: fixed compilation error --- include/nlohmann/detail/input/json_sax.hpp | 22 +++++++++++++--------- single_include/nlohmann/json.hpp | 22 +++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index b354a842..28dfe6a4 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -21,6 +21,8 @@ struct json_sax using number_unsigned_t = typename BasicJsonType::number_unsigned_t; /// type for floating-point numbers using number_float_t = typename BasicJsonType::number_float_t; + /// type for strings + using string_t = typename BasicJsonType::string_t; /// constant to indicate that no size limit is given for array or object static constexpr auto no_limit = std::size_t(-1); @@ -58,14 +60,14 @@ struct json_sax @param[in] s raw token value @return whether parsing should proceed */ - virtual bool number_float(number_float_t val, const std::string& s) = 0; + virtual bool number_float(number_float_t val, const string_t& s) = 0; /*! @brief a string was read @param[in] val string value @return whether parsing should proceed */ - virtual bool string(std::string&& val) = 0; + virtual bool string(string_t&& val) = 0; /*! @brief the beginning of an object was read @@ -80,7 +82,7 @@ struct json_sax @param[in] val object key @return whether parsing should proceed */ - virtual bool key(std::string&& val) = 0; + virtual bool key(string_t&& val) = 0; /*! @brief the end of an object was read @@ -135,6 +137,7 @@ class json_sax_dom_parser : public json_sax using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) : root(r), allow_exceptions(allow_exceptions_) @@ -164,13 +167,13 @@ class json_sax_dom_parser : public json_sax return true; } - bool number_float(number_float_t val, const std::string&) override + bool number_float(number_float_t val, const string_t&) override { handle_value(val); return true; } - bool string(std::string&& val) override + bool string(string_t&& val) override { handle_value(val); return true; @@ -189,7 +192,7 @@ class json_sax_dom_parser : public json_sax return true; } - bool key(std::string&& val) override + bool key(string_t&& val) override { // add null at given key and store the reference for later object_element = &(ref_stack.back()->m_value.object->operator[](val)); @@ -308,6 +311,7 @@ class json_sax_acceptor : public json_sax using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; bool null() override { @@ -329,12 +333,12 @@ class json_sax_acceptor : public json_sax return true; } - bool number_float(number_float_t, const std::string&) override + bool number_float(number_float_t, const string_t&) override { return true; } - bool string(std::string&&) override + bool string(string_t&&) override { return true; } @@ -344,7 +348,7 @@ class json_sax_acceptor : public json_sax return true; } - bool key(std::string&&) override + bool key(string_t&&) override { return true; } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 7a35db73..bb25aa87 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3157,6 +3157,8 @@ struct json_sax using number_unsigned_t = typename BasicJsonType::number_unsigned_t; /// type for floating-point numbers using number_float_t = typename BasicJsonType::number_float_t; + /// type for strings + using string_t = typename BasicJsonType::string_t; /// constant to indicate that no size limit is given for array or object static constexpr auto no_limit = std::size_t(-1); @@ -3194,14 +3196,14 @@ struct json_sax @param[in] s raw token value @return whether parsing should proceed */ - virtual bool number_float(number_float_t val, const std::string& s) = 0; + virtual bool number_float(number_float_t val, const string_t& s) = 0; /*! @brief a string was read @param[in] val string value @return whether parsing should proceed */ - virtual bool string(std::string&& val) = 0; + virtual bool string(string_t&& val) = 0; /*! @brief the beginning of an object was read @@ -3216,7 +3218,7 @@ struct json_sax @param[in] val object key @return whether parsing should proceed */ - virtual bool key(std::string&& val) = 0; + virtual bool key(string_t&& val) = 0; /*! @brief the end of an object was read @@ -3271,6 +3273,7 @@ class json_sax_dom_parser : public json_sax using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) : root(r), allow_exceptions(allow_exceptions_) @@ -3300,13 +3303,13 @@ class json_sax_dom_parser : public json_sax return true; } - bool number_float(number_float_t val, const std::string&) override + bool number_float(number_float_t val, const string_t&) override { handle_value(val); return true; } - bool string(std::string&& val) override + bool string(string_t&& val) override { handle_value(val); return true; @@ -3325,7 +3328,7 @@ class json_sax_dom_parser : public json_sax return true; } - bool key(std::string&& val) override + bool key(string_t&& val) override { // add null at given key and store the reference for later object_element = &(ref_stack.back()->m_value.object->operator[](val)); @@ -3444,6 +3447,7 @@ class json_sax_acceptor : public json_sax using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; bool null() override { @@ -3465,12 +3469,12 @@ class json_sax_acceptor : public json_sax return true; } - bool number_float(number_float_t, const std::string&) override + bool number_float(number_float_t, const string_t&) override { return true; } - bool string(std::string&&) override + bool string(string_t&&) override { return true; } @@ -3480,7 +3484,7 @@ class json_sax_acceptor : public json_sax return true; } - bool key(std::string&&) override + bool key(string_t&&) override { return true; } From 1262d474ebbd3ce8d2581d16da392a4896dc58d2 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 14 Mar 2018 07:32:28 +0100 Subject: [PATCH 017/156] :checkered_flag: fixed an MSVC warning --- test/src/unit-ubjson.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 88b72fc8..db0a8520 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -152,7 +152,7 @@ TEST_CASE("UBJSON") numbers.push_back(-10000000); numbers.push_back(-100000000); numbers.push_back(-1000000000); - numbers.push_back(-2147483648L); + numbers.push_back(-2147483647 - 1); // https://stackoverflow.com/a/29356002/266378 for (auto i : numbers) { CAPTURE(i); From 829ed74d66ae58fc203c3c7cb5d3348705c18c75 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 14 Mar 2018 07:38:22 +0100 Subject: [PATCH 018/156] :checkered_flag: experimenting with /Wall --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index da703786..828c3223 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,8 +6,8 @@ os: environment: matrix: - - additional_flags: "" - - additional_flags: "/permissive- /std:c++latest /utf-8" + - additional_flags: "/Wall" + - additional_flags: "/permissive- /std:c++latest /utf-8 /Wall" matrix: exclude: From 21410d50afc5d801bd149fa995a32d68cce50767 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 14 Mar 2018 17:21:31 +0100 Subject: [PATCH 019/156] :checkered_flag: moved /Wall to CMake --- appveyor.yml | 4 ++-- test/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 828c3223..da703786 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,8 +6,8 @@ os: environment: matrix: - - additional_flags: "/Wall" - - additional_flags: "/permissive- /std:c++latest /utf-8 /Wall" + - additional_flags: "" + - additional_flags: "/permissive- /std:c++latest /utf-8" matrix: exclude: diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e5f6dc55..6d921e99 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -82,7 +82,7 @@ if(MSVC) # Disable warning C4309: 'static_cast': truncation of constant value # Disable warning C4566: character represented by universal-character-name '\uFF01' cannot be represented in the current code page (1252) # Disable warning C4996: 'nlohmann::basic_json::operator <<': was declared deprecated - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4389 /wd4309 /wd4566 /wd4996") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4389 /wd4309 /wd4566 /wd4996 /Wall") endif() ############################################################################# From a52e8355b8c47c8b6c57c59b3afe9ab44b279093 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 14 Mar 2018 17:32:48 +0100 Subject: [PATCH 020/156] :rewind: oops --- test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6d921e99..e5f6dc55 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -82,7 +82,7 @@ if(MSVC) # Disable warning C4309: 'static_cast': truncation of constant value # Disable warning C4566: character represented by universal-character-name '\uFF01' cannot be represented in the current code page (1252) # Disable warning C4996: 'nlohmann::basic_json::operator <<': was declared deprecated - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4389 /wd4309 /wd4566 /wd4996 /Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4389 /wd4309 /wd4566 /wd4996") endif() ############################################################################# From 8165707990e4895aa85b3c508d45eb1883411869 Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Thu, 15 Mar 2018 15:35:00 -0400 Subject: [PATCH 021/156] basic_json now supports getting many type of strings --- .../nlohmann/detail/conversions/from_json.hpp | 19 +++++++++++++++++++ include/nlohmann/detail/meta.hpp | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index eccc04f1..b066b2b4 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -70,6 +70,25 @@ void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) s = *j.template get_ptr(); } +template < + typename BasicJsonType, typename CompatibleStringType, + enable_if_t < + is_compatible_string_type::value and + not std::is_same::value and + std::is_constructible < + BasicJsonType, typename CompatibleStringType::value_type >::value, + int > = 0 > +void from_json(const BasicJsonType& j, CompatibleStringType& s) +{ + if (JSON_UNLIKELY(not j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()))); + } + + s = *j.template get_ptr(); +} + template void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) { diff --git a/include/nlohmann/detail/meta.hpp b/include/nlohmann/detail/meta.hpp index b251afb6..780efba8 100644 --- a/include/nlohmann/detail/meta.hpp +++ b/include/nlohmann/detail/meta.hpp @@ -120,6 +120,16 @@ struct is_compatible_object_type_impl std::is_constructible::value; }; +template +struct is_compatible_string_type_impl : std::false_type {}; + +template +struct is_compatible_string_type_impl +{ + static constexpr auto value = + std::is_same::value; +}; + template struct is_compatible_object_type { @@ -130,6 +140,15 @@ struct is_compatible_object_type typename BasicJsonType::object_t, CompatibleObjectType >::value; }; +template +struct is_compatible_string_type +{ + static auto constexpr value = is_compatible_string_type_impl < + conjunction>, + has_value_type>::value, + typename BasicJsonType::string_t, CompatibleStringType >::value; +}; + template struct is_basic_json_nested_type { From 2a5506ed98a195257fa16c0cf1cc632dfff368ce Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Fri, 16 Mar 2018 13:16:10 -0400 Subject: [PATCH 022/156] Amalgamated headers --- single_include/nlohmann/json.hpp | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 6b6655af..10a50a58 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -353,6 +353,16 @@ struct is_compatible_object_type_impl std::is_constructible::value; }; +template +struct is_compatible_string_type_impl : std::false_type {}; + +template +struct is_compatible_string_type_impl +{ + static constexpr auto value = + std::is_same::value; +}; + template struct is_compatible_object_type { @@ -363,6 +373,15 @@ struct is_compatible_object_type typename BasicJsonType::object_t, CompatibleObjectType >::value; }; +template +struct is_compatible_string_type +{ + static auto constexpr value = is_compatible_string_type_impl < + conjunction>, + has_value_type>::value, + typename BasicJsonType::string_t, CompatibleStringType >::value; +}; + template struct is_basic_json_nested_type { @@ -977,6 +996,25 @@ void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) s = *j.template get_ptr(); } +template < + typename BasicJsonType, typename CompatibleStringType, + enable_if_t < + is_compatible_string_type::value and + not std::is_same::value and + std::is_constructible < + BasicJsonType, typename CompatibleStringType::value_type >::value, + int > = 0 > +void from_json(const BasicJsonType& j, CompatibleStringType& s) +{ + if (JSON_UNLIKELY(not j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()))); + } + + s = *j.template get_ptr(); +} + template void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) { From c87ffad45c75a2c74fe1a9a64f965d8e40c4c6d9 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 17 Mar 2018 14:46:50 +0100 Subject: [PATCH 023/156] :recycle: implemented a non-recursive parser --- include/nlohmann/detail/input/parser.hpp | 412 +++++++++++++++-------- single_include/nlohmann/json.hpp | 412 ++++++++++++++--------- 2 files changed, 526 insertions(+), 298 deletions(-) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 5559692d..83bd75f1 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -431,188 +431,304 @@ class parser bool sax_parse_internal(json_sax_t* sax) { - switch (last_token) + // two values for the structured values + enum class parse_state_t { array_value, object_value }; + // stack to remember the hieararchy of structured values we are parsing + std::vector states; + // value to avoid a goto (see comment where set to true) + bool skip_to_state_evaluation = false; + + while (true) { - case token_type::begin_object: + if (not skip_to_state_evaluation) { - if (not sax->start_object()) + // invariant: get_token() was called before each iteration + switch (last_token) { - return false; - } - - // read next token - get_token(); - - // closing } -> we are done - if (JSON_UNLIKELY(last_token == token_type::end_object)) - { - return sax->end_object(); - } - - // parse values - while (true) - { - // parse key - if (JSON_UNLIKELY(last_token != token_type::value_string)) + case token_type::begin_object: { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); - } - else - { - if (not sax->key(m_lexer.move_string())) + if (not sax->start_object()) { return false; } - } - // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); - } + // read next token + get_token(); - // parse value - get_token(); - if (not sax_parse_internal(sax)) - { - return false; - } + // closing } -> we are done + if (last_token == token_type::end_object) + { + if (not sax->end_object()) + { + return false; + } + break; + } - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { + // parse key + if (JSON_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); + } + else + { + if (not sax->key(m_lexer.move_string())) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (JSON_UNLIKELY(last_token != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); + } + + // remember we are now inside an object + states.push_back(parse_state_t::object_value); + + // parse values get_token(); continue; } - // closing } - if (JSON_LIKELY(last_token == token_type::end_object)) + case token_type::begin_array: { - return sax->end_object(); + if (not sax->start_array()) + { + return false; + } + + // read next token + get_token(); + + // closing ] -> we are done + if (last_token == token_type::end_array) + { + if (not sax->end_array()) + { + return false; + } + break; + } + + // remember we are now inside an array + states.push_back(parse_state_t::array_value); + + // parse values (no need to call get_token) + continue; } - else + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_UNLIKELY(not std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); + } + else + { + if (not sax->number_float(res, m_lexer.move_string())) + { + return false; + } + break; + } + } + + case token_type::literal_false: + { + if (not sax->boolean(false)) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (not sax->null()) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (not sax->boolean(true)) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (not sax->number_integer(m_lexer.get_number_integer())) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (not sax->string(m_lexer.move_string())) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (not sax->number_unsigned(m_lexer.get_number_unsigned())) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized))); + } + + default: // the last token was unexpected { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); - + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value))); } } } - - case token_type::begin_array: + else { - if (not sax->start_array()) - { - return false; - } + skip_to_state_evaluation = false; + } - // read next token + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hieararchy: done + return true; + } + else + { get_token(); - - // closing ] -> we are done - if (last_token == token_type::end_array) + switch (states.back()) { - return sax->end_array(); - } - - // parse values - while (true) - { - // parse value - if (not sax_parse_internal(sax)) + case parse_state_t::array_value: { - return false; + // comma -> next value + if (last_token == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_LIKELY(last_token == token_type::end_array)) + { + if (not sax->end_array()) + { + return false; + } + + // We are done with this array. Before we can parse + // a new value, we need to evaluate the new state + // first. By setting skip_to_state_evaluation to + // false, we are effectively jumping to the + // beginning of this switch. + assert(not states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); + } } - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) + case parse_state_t::object_value: { - get_token(); - continue; - } + // comma -> next value + if (last_token == token_type::value_separator) + { + get_token(); - // closing ] - if (JSON_LIKELY(last_token == token_type::end_array)) - { - return sax->end_array(); - } - else - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); + // parse key + if (JSON_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); + } + else + { + if (not sax->key(m_lexer.move_string())) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (JSON_UNLIKELY(last_token != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_LIKELY(last_token == token_type::end_object)) + { + if (not sax->end_object()) + { + return false; + } + + // We are done with this object. Before we can + // parse a new value, we need to evaluate the new + // state first. By setting skip_to_state_evaluation + // to false, we are effectively jumping to the + // beginning of this switch. + assert(not states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); + } } } } - - case token_type::value_float: - { - const auto res = m_lexer.get_number_float(); - - if (JSON_UNLIKELY(not std::isfinite(res))) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); - } - else - { - return sax->number_float(res, m_lexer.move_string()); - } - } - - case token_type::literal_false: - { - return sax->boolean(false); - } - - case token_type::literal_null: - { - return sax->null(); - } - - case token_type::literal_true: - { - return sax->boolean(true); - } - - case token_type::value_integer: - { - return sax->number_integer(m_lexer.get_number_integer()); - } - - case token_type::value_string: - { - return sax->string(m_lexer.move_string()); - } - - case token_type::value_unsigned: - { - return sax->number_unsigned(m_lexer.get_number_unsigned()); - } - - case token_type::parse_error: - { - // using "uninitialized" to avoid "expected" message - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized))); - } - - default: // the last token was unexpected - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value))); - } } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index cdc9d01f..a588e4f0 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3941,188 +3941,300 @@ class parser bool sax_parse_internal(json_sax_t* sax) { - switch (last_token) + // two values for the structured values + enum class parse_state_t { array_value, object_value }; + // stack to remember the hieararchy of structured values we are parsing + std::vector states; + // value to avoid a goto (see comment where set to true) + bool skip_to_tail = false; + + while (true) { - case token_type::begin_object: + if (not skip_to_tail) { - if (not sax->start_object()) + // invariant: get_token() was called before each iteration + switch (last_token) { - return false; - } - - // read next token - get_token(); - - // closing } -> we are done - if (JSON_UNLIKELY(last_token == token_type::end_object)) - { - return sax->end_object(); - } - - // parse values - while (true) - { - // parse key - if (JSON_UNLIKELY(last_token != token_type::value_string)) + case token_type::begin_object: { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); - } - else - { - if (not sax->key(m_lexer.move_string())) + if (not sax->start_object()) { return false; } - } - // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); - } - - // parse value - get_token(); - if (not sax_parse_internal(sax)) - { - return false; - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { + // read next token get_token(); + + // closing } -> we are done + if (last_token == token_type::end_object) + { + if (not sax->end_object()) + { + return false; + } + break; + } + + // parse key + if (JSON_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); + } + else + { + if (not sax->key(m_lexer.move_string())) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (JSON_UNLIKELY(last_token != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); + } + + // parse values + get_token(); + states.push_back(parse_state_t::object_value); continue; } - // closing } - if (JSON_LIKELY(last_token == token_type::end_object)) + case token_type::begin_array: { - return sax->end_object(); + if (not sax->start_array()) + { + return false; + } + + // read next token + get_token(); + + // closing ] -> we are done + if (last_token == token_type::end_array) + { + if (not sax->end_array()) + { + return false; + } + break; + } + + // parse values (no need to call get_token) + states.push_back(parse_state_t::array_value); + continue; } - else + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_UNLIKELY(not std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); + } + else + { + if (not sax->number_float(res, m_lexer.move_string())) + { + return false; + } + break; + } + } + + case token_type::literal_false: + { + if (not sax->boolean(false)) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (not sax->null()) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (not sax->boolean(true)) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (not sax->number_integer(m_lexer.get_number_integer())) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (not sax->string(m_lexer.move_string())) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (not sax->number_unsigned(m_lexer.get_number_unsigned())) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized))); + } + + default: // the last token was unexpected { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); - + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value))); } } } - - case token_type::begin_array: + else { - if (not sax->start_array()) - { - return false; - } + skip_to_tail = false; + } - // read next token + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hieararchy: done + return true; + } + else + { get_token(); - - // closing ] -> we are done - if (last_token == token_type::end_array) + switch (states.back()) { - return sax->end_array(); - } - - // parse values - while (true) - { - // parse value - if (not sax_parse_internal(sax)) + case parse_state_t::array_value: { - return false; + // comma -> next value + if (last_token == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_LIKELY(last_token == token_type::end_array)) + { + if (not sax->end_array()) + { + return false; + } + + // We are done with this array. Before we can parse + // a new value, we need to evaluate the new state + // first. By setting skip_to_tail to false, we are + // effectively jumping to the beginning of this + // switch. + assert(not states.empty()); + states.pop_back(); + skip_to_tail = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); + } } - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) + case parse_state_t::object_value: { - get_token(); - continue; - } + // comma -> next value + if (last_token == token_type::value_separator) + { + get_token(); - // closing ] - if (JSON_LIKELY(last_token == token_type::end_array)) - { - return sax->end_array(); - } - else - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); + // parse key + if (JSON_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); + } + else + { + if (not sax->key(m_lexer.move_string())) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (JSON_UNLIKELY(last_token != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_LIKELY(last_token == token_type::end_object)) + { + if (not sax->end_object()) + { + return false; + } + + // We are done with this object. Before we can + // parse a new value, we need to evaluate the new + // state first. By setting skip_to_tail to false, + // we are effectively jumping to the beginning of + // this switch. + assert(not states.empty()); + states.pop_back(); + skip_to_tail = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); + } } } } - - case token_type::value_float: - { - const auto res = m_lexer.get_number_float(); - - if (JSON_UNLIKELY(not std::isfinite(res))) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); - } - else - { - return sax->number_float(res, m_lexer.move_string()); - } - } - - case token_type::literal_false: - { - return sax->boolean(false); - } - - case token_type::literal_null: - { - return sax->null(); - } - - case token_type::literal_true: - { - return sax->boolean(true); - } - - case token_type::value_integer: - { - return sax->number_integer(m_lexer.get_number_integer()); - } - - case token_type::value_string: - { - return sax->string(m_lexer.move_string()); - } - - case token_type::value_unsigned: - { - return sax->number_unsigned(m_lexer.get_number_unsigned()); - } - - case token_type::parse_error: - { - // using "uninitialized" to avoid "expected" message - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized))); - } - - default: // the last token was unexpected - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value))); - } } } From 606a25195fcb863a7fae057dd2262bdc9f8ac877 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 17 Mar 2018 19:15:59 +0100 Subject: [PATCH 024/156] :white_check_mark: improved test coverage --- include/nlohmann/detail/input/json_sax.hpp | 6 +- single_include/nlohmann/json.hpp | 36 +++-- test/src/unit-class_parser.cpp | 171 +++++++++++++++++++++ 3 files changed, 194 insertions(+), 19 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 28dfe6a4..a0ffdc66 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -241,13 +241,13 @@ class json_sax_dom_parser : public json_sax case 1: JSON_THROW(*reinterpret_cast(&ex)); case 2: - JSON_THROW(*reinterpret_cast(&ex)); + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE case 3: - JSON_THROW(*reinterpret_cast(&ex)); + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE case 4: JSON_THROW(*reinterpret_cast(&ex)); case 5: - JSON_THROW(*reinterpret_cast(&ex)); + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE default: assert(false); // LCOV_EXCL_LINE } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index a588e4f0..639d6400 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3377,13 +3377,13 @@ class json_sax_dom_parser : public json_sax case 1: JSON_THROW(*reinterpret_cast(&ex)); case 2: - JSON_THROW(*reinterpret_cast(&ex)); + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE case 3: - JSON_THROW(*reinterpret_cast(&ex)); + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE case 4: JSON_THROW(*reinterpret_cast(&ex)); case 5: - JSON_THROW(*reinterpret_cast(&ex)); + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE default: assert(false); // LCOV_EXCL_LINE } @@ -3946,11 +3946,11 @@ class parser // stack to remember the hieararchy of structured values we are parsing std::vector states; // value to avoid a goto (see comment where set to true) - bool skip_to_tail = false; + bool skip_to_state_evaluation = false; while (true) { - if (not skip_to_tail) + if (not skip_to_state_evaluation) { // invariant: get_token() was called before each iteration switch (last_token) @@ -3999,9 +3999,11 @@ class parser parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); } + // remember we are now inside an object + states.push_back(parse_state_t::object_value); + // parse values get_token(); - states.push_back(parse_state_t::object_value); continue; } @@ -4025,8 +4027,10 @@ class parser break; } - // parse values (no need to call get_token) + // remember we are now inside an array states.push_back(parse_state_t::array_value); + + // parse values (no need to call get_token) continue; } @@ -4122,7 +4126,7 @@ class parser } else { - skip_to_tail = false; + skip_to_state_evaluation = false; } // we reached this line after we successfully parsed a value @@ -4156,12 +4160,12 @@ class parser // We are done with this array. Before we can parse // a new value, we need to evaluate the new state - // first. By setting skip_to_tail to false, we are - // effectively jumping to the beginning of this - // switch. + // first. By setting skip_to_state_evaluation to + // false, we are effectively jumping to the + // beginning of this switch. assert(not states.empty()); states.pop_back(); - skip_to_tail = true; + skip_to_state_evaluation = true; continue; } else @@ -4218,12 +4222,12 @@ class parser // We are done with this object. Before we can // parse a new value, we need to evaluate the new - // state first. By setting skip_to_tail to false, - // we are effectively jumping to the beginning of - // this switch. + // state first. By setting skip_to_state_evaluation + // to false, we are effectively jumping to the + // beginning of this switch. assert(not states.empty()); states.pop_back(); - skip_to_tail = true; + skip_to_state_evaluation = true; continue; } else diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index e37f398a..c425207a 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -134,6 +134,81 @@ class SaxEventLogger : public nlohmann::json::json_sax_t bool errored = false; }; +class SaxCountdown : public nlohmann::json::json_sax_t +{ + public: + explicit SaxCountdown(const int count) : events_left(count) + {} + + bool null() override + { + return events_left-- > 0; + } + + bool boolean(bool) override + { + return events_left-- > 0; + } + + bool number_integer(json::number_integer_t) override + { + return events_left-- > 0; + } + + bool number_unsigned(json::number_unsigned_t) override + { + return events_left-- > 0; + } + + bool number_float(json::number_float_t, const std::string&) override + { + return events_left-- > 0; + } + + bool string(std::string&&) override + { + return events_left-- > 0; + } + + bool start_object(std::size_t) override + { + return events_left-- > 0; + } + + bool key(std::string&&) override + { + return events_left-- > 0; + } + + bool end_object() override + { + return events_left-- > 0; + } + + bool start_array(std::size_t) override + { + return events_left-- > 0; + } + + bool end_array() override + { + return events_left-- > 0; + } + + bool binary(const std::vector&) override + { + return events_left-- > 0; + } + + bool parse_error(std::size_t, const std::string&, const json::exception&) override + { + return false; + } + + private: + int events_left = 0; +}; + json parser_helper(const std::string& s); bool accept_helper(const std::string& s); @@ -1595,4 +1670,100 @@ TEST_CASE("parser class") CHECK(j == json(true)); } } + + SECTION("improve test coverage") + { + SECTION("parser with callback") + { + json::parser_callback_t cb = [](int, json::parse_event_t, json&) + { + return true; + }; + + CHECK(json::parse("{\"foo\": true:", cb, false).is_discarded()); + + CHECK_THROWS_AS(json::parse("{\"foo\": true:", cb), json::parse_error&); + CHECK_THROWS_WITH(json::parse("{\"foo\": true:", cb), + "[json.exception.parse_error.101] parse error at 13: syntax error - unexpected ':'; expected '}'"); + + CHECK_THROWS_AS(json::parse("1.18973e+4932", cb), json::out_of_range&); + CHECK_THROWS_WITH(json::parse("1.18973e+4932", cb), + "[json.exception.out_of_range.406] number overflow parsing '1.18973e+4932'"); + } + + SECTION("SAX parser") + { + SECTION("} without value") + { + SaxCountdown s(1); + CHECK(json::sax_parse("{}", &s) == false); + } + + SECTION("} with value") + { + SaxCountdown s(3); + CHECK(json::sax_parse("{\"k1\": true}", &s) == false); + } + + SECTION("second key") + { + SaxCountdown s(3); + CHECK(json::sax_parse("{\"k1\": true, \"k2\": false}", &s) == false); + } + + SECTION("] without value") + { + SaxCountdown s(1); + CHECK(json::sax_parse("[]", &s) == false); + } + + SECTION("] with value") + { + SaxCountdown s(2); + CHECK(json::sax_parse("[1]", &s) == false); + } + + SECTION("float") + { + SaxCountdown s(0); + CHECK(json::sax_parse("3.14", &s) == false); + } + + SECTION("false") + { + SaxCountdown s(0); + CHECK(json::sax_parse("false", &s) == false); + } + + SECTION("null") + { + SaxCountdown s(0); + CHECK(json::sax_parse("null", &s) == false); + } + + SECTION("true") + { + SaxCountdown s(0); + CHECK(json::sax_parse("true", &s) == false); + } + + SECTION("unsigned") + { + SaxCountdown s(0); + CHECK(json::sax_parse("12", &s) == false); + } + + SECTION("integer") + { + SaxCountdown s(0); + CHECK(json::sax_parse("-12", &s) == false); + } + + SECTION("string") + { + SaxCountdown s(0); + CHECK(json::sax_parse("\"foo\"", &s) == false); + } + } + } } From 375b05a17d3bc7c93eee9933748e85fc5420923b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 17 Mar 2018 23:31:18 +0100 Subject: [PATCH 025/156] :hammer: cleanup --- include/nlohmann/detail/input/json_sax.hpp | 26 +++++++++++++--------- single_include/nlohmann/json.hpp | 26 +++++++++++++--------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index a0ffdc66..8bbaa9c9 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -277,17 +277,23 @@ class json_sax_dom_parser : public json_sax } else { - assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); - if (ref_stack.back()->is_array()) + switch (ref_stack.back()->m_type) { - ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); - return &(ref_stack.back()->m_value.array->back()); - } - else - { - assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; + case value_t::array: + { + ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); + return &(ref_stack.back()->m_value.array->back()); + } + + case value_t::object: + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + default: + assert(false); // LCOV_EXCL_LINE } } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 639d6400..50302903 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3413,17 +3413,23 @@ class json_sax_dom_parser : public json_sax } else { - assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); - if (ref_stack.back()->is_array()) + switch (ref_stack.back()->m_type) { - ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); - return &(ref_stack.back()->m_value.array->back()); - } - else - { - assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; + case value_t::array: + { + ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); + return &(ref_stack.back()->m_value.array->back()); + } + + case value_t::object: + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + default: + assert(false); // LCOV_EXCL_LINE } } } From 22929fe18960c1a6d9c6fa18b666a1961cb38e36 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 18 Mar 2018 15:13:53 +0100 Subject: [PATCH 026/156] :construction: started a SAX/DOM/callback parser --- include/nlohmann/detail/input/json_sax.hpp | 216 +++++++++++++++++++ include/nlohmann/detail/input/parser.hpp | 21 ++ include/nlohmann/json.hpp | 2 + single_include/nlohmann/json.hpp | 240 +++++++++++++++++++++ 4 files changed, 479 insertions(+) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 8bbaa9c9..e19088a9 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -4,6 +4,7 @@ #include #include +#include #include namespace nlohmann @@ -310,6 +311,221 @@ class json_sax_dom_parser : public json_sax const bool allow_exceptions = true; }; +template +class json_sax_dom_callback_parser : public json_sax +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb = nullptr, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + bool null() override + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) override + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) override + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) override + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t&) override + { + handle_value(val); + return true; + } + + bool string(string_t&& val) override + { + handle_value(val); + return true; + } + + bool start_object(std::size_t len) override + { + const bool keep = callback(ref_stack.size() + 1, parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive object size: " + std::to_string(len))); + } + + return true; + } + + bool key(string_t&& val) override + { + BasicJsonType k = BasicJsonType(std::forward < string_t&& > (val)); + const bool keep = callback(ref_stack.size(), parse_event_t::key, k); + + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); + return true; + } + + bool end_object() override + { + const bool keep = callback(ref_stack.size() - 1, parse_event_t::object_end, *ref_stack.back()); + if (not keep) + { + *ref_stack.back() = discarded; + } + + ref_stack.pop_back(); + keep_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) override + { + const bool keep = callback(ref_stack.size() + 1, parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive array size: " + std::to_string(len))); + } + + return true; + } + + bool end_array() override + { + const bool keep = callback(ref_stack.size() - 1, parse_event_t::array_end, *ref_stack.back()); + if (not keep) + { + *ref_stack.back() = discarded; + } + + ref_stack.pop_back(); + keep_stack.pop_back(); + return true; + } + + bool binary(const std::vector&) override + { + return true; + } + + bool parse_error(std::size_t, const std::string&, + const detail::exception& ex) override + { + errored = true; + if (allow_exceptions) + { + // determine the proper exception type from the id + switch ((ex.id / 100) % 100) + { + case 1: + JSON_THROW(*reinterpret_cast(&ex)); + case 2: + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE + case 3: + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE + case 4: + JSON_THROW(*reinterpret_cast(&ex)); + case 5: + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE + default: + assert(false); // LCOV_EXCL_LINE + } + } + return false; + } + + bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward(v)); + return &root; + } + else + { + switch (ref_stack.back()->m_type) + { + case value_t::array: + { + ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); + return &(ref_stack.back()->m_value.array->back()); + } + + case value_t::object: + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + default: + assert(false); // LCOV_EXCL_LINE + } + } + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack; + /// stack to manage which values to keep + std::vector keep_stack; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + template class json_sax_acceptor : public json_sax { diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 83bd75f1..c0710cf8 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -83,6 +83,27 @@ class parser { if (callback) { + /* + json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + result.assert_invariant(); + + // in strict mode, input must be completely read + if (strict and (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input))); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + */ + parse_internal(true, result); result.assert_invariant(); diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 02284597..bdc905f1 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -173,6 +173,8 @@ class basic_json friend class ::nlohmann::detail::binary_reader; template friend class ::nlohmann::detail::json_sax_dom_parser; + template + friend class ::nlohmann::detail::json_sax_dom_callback_parser; /// workaround type for MSVC using basic_json_t = NLOHMANN_BASIC_JSON_TPL; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 50302903..f9d997b9 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3139,6 +3139,8 @@ scan_number_done: #include #include +// #include + // #include @@ -3446,6 +3448,221 @@ class json_sax_dom_parser : public json_sax const bool allow_exceptions = true; }; +template +class json_sax_dom_callback_parser : public json_sax +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb = nullptr, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + bool null() override + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) override + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) override + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) override + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t&) override + { + handle_value(val); + return true; + } + + bool string(string_t&& val) override + { + handle_value(val); + return true; + } + + bool start_object(std::size_t len) override + { + const bool keep = callback(ref_stack.size() + 1, parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive object size: " + std::to_string(len))); + } + + return true; + } + + bool key(string_t&& val) override + { + BasicJsonType k = BasicJsonType(std::forward < string_t&& > (val)); + const bool keep = callback(ref_stack.size(), parse_event_t::key, k); + + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); + return true; + } + + bool end_object() override + { + const bool keep = callback(ref_stack.size() - 1, parse_event_t::object_end, *ref_stack.back()); + if (not keep) + { + *ref_stack.back() = discarded; + } + + ref_stack.pop_back(); + keep_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) override + { + const bool keep = callback(ref_stack.size() + 1, parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive array size: " + std::to_string(len))); + } + + return true; + } + + bool end_array() override + { + const bool keep = callback(ref_stack.size() - 1, parse_event_t::array_end, *ref_stack.back()); + if (not keep) + { + *ref_stack.back() = discarded; + } + + ref_stack.pop_back(); + keep_stack.pop_back(); + return true; + } + + bool binary(const std::vector&) override + { + return true; + } + + bool parse_error(std::size_t, const std::string&, + const detail::exception& ex) override + { + errored = true; + if (allow_exceptions) + { + // determine the proper exception type from the id + switch ((ex.id / 100) % 100) + { + case 1: + JSON_THROW(*reinterpret_cast(&ex)); + case 2: + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE + case 3: + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE + case 4: + JSON_THROW(*reinterpret_cast(&ex)); + case 5: + JSON_THROW(*reinterpret_cast(&ex)); // LCOV_EXCL_LINE + default: + assert(false); // LCOV_EXCL_LINE + } + } + return false; + } + + bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward(v)); + return &root; + } + else + { + switch (ref_stack.back()->m_type) + { + case value_t::array: + { + ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); + return &(ref_stack.back()->m_value.array->back()); + } + + case value_t::object: + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + default: + assert(false); // LCOV_EXCL_LINE + } + } + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack; + /// stack to manage which values to keep + std::vector keep_stack; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + template class json_sax_acceptor : public json_sax { @@ -3599,6 +3816,27 @@ class parser { if (callback) { + /* + json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + result.assert_invariant(); + + // in strict mode, input must be completely read + if (strict and (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input))); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + */ + parse_internal(true, result); result.assert_invariant(); @@ -10411,6 +10649,8 @@ class basic_json friend class ::nlohmann::detail::binary_reader; template friend class ::nlohmann::detail::json_sax_dom_parser; + template + friend class ::nlohmann::detail::json_sax_dom_callback_parser; /// workaround type for MSVC using basic_json_t = NLOHMANN_BASIC_JSON_TPL; From 943d641054c36ff68b7eb057d5c0e1b8e7409ad7 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 18 Mar 2018 16:07:21 +0100 Subject: [PATCH 027/156] :hammer: some refactoring --- include/nlohmann/detail/input/json_sax.hpp | 54 ++++++-------- include/nlohmann/detail/input/parser.hpp | 30 ++++---- single_include/nlohmann/json.hpp | 84 ++++++++++------------ 3 files changed, 74 insertions(+), 94 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index e19088a9..5763e652 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -278,23 +278,17 @@ class json_sax_dom_parser : public json_sax } else { - switch (ref_stack.back()->m_type) + assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); + if (ref_stack.back()->is_array()) { - case value_t::array: - { - ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); - return &(ref_stack.back()->m_value.array->back()); - } - - case value_t::object: - { - assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; - } - - default: - assert(false); // LCOV_EXCL_LINE + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + else + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; } } } @@ -397,6 +391,7 @@ class json_sax_dom_callback_parser : public json_sax const bool keep = callback(ref_stack.size() - 1, parse_event_t::object_end, *ref_stack.back()); if (not keep) { + // discard object *ref_stack.back() = discarded; } @@ -426,6 +421,7 @@ class json_sax_dom_callback_parser : public json_sax const bool keep = callback(ref_stack.size() - 1, parse_event_t::array_end, *ref_stack.back()); if (not keep) { + // discard array *ref_stack.back() = discarded; } @@ -487,23 +483,17 @@ class json_sax_dom_callback_parser : public json_sax } else { - switch (ref_stack.back()->m_type) + assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); + if (ref_stack.back()->is_array()) { - case value_t::array: - { - ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); - return &(ref_stack.back()->m_value.array->back()); - } - - case value_t::object: - { - assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; - } - - default: - assert(false); // LCOV_EXCL_LINE + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + else + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; } } } diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index c0710cf8..5d389dc6 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -468,7 +468,7 @@ class parser { case token_type::begin_object: { - if (not sax->start_object()) + if (JSON_UNLIKELY(not sax->start_object())) { return false; } @@ -479,7 +479,7 @@ class parser // closing } -> we are done if (last_token == token_type::end_object) { - if (not sax->end_object()) + if (JSON_UNLIKELY(not sax->end_object())) { return false; } @@ -495,7 +495,7 @@ class parser } else { - if (not sax->key(m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) { return false; } @@ -520,7 +520,7 @@ class parser case token_type::begin_array: { - if (not sax->start_array()) + if (JSON_UNLIKELY(not sax->start_array())) { return false; } @@ -531,7 +531,7 @@ class parser // closing ] -> we are done if (last_token == token_type::end_array) { - if (not sax->end_array()) + if (JSON_UNLIKELY(not sax->end_array())) { return false; } @@ -557,7 +557,7 @@ class parser } else { - if (not sax->number_float(res, m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->number_float(res, m_lexer.move_string()))) { return false; } @@ -567,7 +567,7 @@ class parser case token_type::literal_false: { - if (not sax->boolean(false)) + if (JSON_UNLIKELY(not sax->boolean(false))) { return false; } @@ -576,7 +576,7 @@ class parser case token_type::literal_null: { - if (not sax->null()) + if (JSON_UNLIKELY(not sax->null())) { return false; } @@ -585,7 +585,7 @@ class parser case token_type::literal_true: { - if (not sax->boolean(true)) + if (JSON_UNLIKELY(not sax->boolean(true))) { return false; } @@ -594,7 +594,7 @@ class parser case token_type::value_integer: { - if (not sax->number_integer(m_lexer.get_number_integer())) + if (JSON_UNLIKELY(not sax->number_integer(m_lexer.get_number_integer()))) { return false; } @@ -603,7 +603,7 @@ class parser case token_type::value_string: { - if (not sax->string(m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->string(m_lexer.move_string()))) { return false; } @@ -612,7 +612,7 @@ class parser case token_type::value_unsigned: { - if (not sax->number_unsigned(m_lexer.get_number_unsigned())) + if (JSON_UNLIKELY(not sax->number_unsigned(m_lexer.get_number_unsigned()))) { return false; } @@ -664,7 +664,7 @@ class parser // closing ] if (JSON_LIKELY(last_token == token_type::end_array)) { - if (not sax->end_array()) + if (JSON_UNLIKELY(not sax->end_array())) { return false; } @@ -703,7 +703,7 @@ class parser } else { - if (not sax->key(m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) { return false; } @@ -726,7 +726,7 @@ class parser // closing } if (JSON_LIKELY(last_token == token_type::end_object)) { - if (not sax->end_object()) + if (JSON_UNLIKELY(not sax->end_object())) { return false; } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index f9d997b9..a060c7fb 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3415,23 +3415,17 @@ class json_sax_dom_parser : public json_sax } else { - switch (ref_stack.back()->m_type) + assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); + if (ref_stack.back()->is_array()) { - case value_t::array: - { - ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); - return &(ref_stack.back()->m_value.array->back()); - } - - case value_t::object: - { - assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; - } - - default: - assert(false); // LCOV_EXCL_LINE + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + else + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; } } } @@ -3534,6 +3528,7 @@ class json_sax_dom_callback_parser : public json_sax const bool keep = callback(ref_stack.size() - 1, parse_event_t::object_end, *ref_stack.back()); if (not keep) { + // discard object *ref_stack.back() = discarded; } @@ -3563,6 +3558,7 @@ class json_sax_dom_callback_parser : public json_sax const bool keep = callback(ref_stack.size() - 1, parse_event_t::array_end, *ref_stack.back()); if (not keep) { + // discard array *ref_stack.back() = discarded; } @@ -3624,23 +3620,17 @@ class json_sax_dom_callback_parser : public json_sax } else { - switch (ref_stack.back()->m_type) + assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); + if (ref_stack.back()->is_array()) { - case value_t::array: - { - ref_stack.back()->m_value.array->push_back(BasicJsonType(std::forward(v))); - return &(ref_stack.back()->m_value.array->back()); - } - - case value_t::object: - { - assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; - } - - default: - assert(false); // LCOV_EXCL_LINE + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + else + { + assert(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; } } } @@ -4201,7 +4191,7 @@ class parser { case token_type::begin_object: { - if (not sax->start_object()) + if (JSON_UNLIKELY(not sax->start_object())) { return false; } @@ -4212,7 +4202,7 @@ class parser // closing } -> we are done if (last_token == token_type::end_object) { - if (not sax->end_object()) + if (JSON_UNLIKELY(not sax->end_object())) { return false; } @@ -4228,7 +4218,7 @@ class parser } else { - if (not sax->key(m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) { return false; } @@ -4253,7 +4243,7 @@ class parser case token_type::begin_array: { - if (not sax->start_array()) + if (JSON_UNLIKELY(not sax->start_array())) { return false; } @@ -4264,7 +4254,7 @@ class parser // closing ] -> we are done if (last_token == token_type::end_array) { - if (not sax->end_array()) + if (JSON_UNLIKELY(not sax->end_array())) { return false; } @@ -4290,7 +4280,7 @@ class parser } else { - if (not sax->number_float(res, m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->number_float(res, m_lexer.move_string()))) { return false; } @@ -4300,7 +4290,7 @@ class parser case token_type::literal_false: { - if (not sax->boolean(false)) + if (JSON_UNLIKELY(not sax->boolean(false))) { return false; } @@ -4309,7 +4299,7 @@ class parser case token_type::literal_null: { - if (not sax->null()) + if (JSON_UNLIKELY(not sax->null())) { return false; } @@ -4318,7 +4308,7 @@ class parser case token_type::literal_true: { - if (not sax->boolean(true)) + if (JSON_UNLIKELY(not sax->boolean(true))) { return false; } @@ -4327,7 +4317,7 @@ class parser case token_type::value_integer: { - if (not sax->number_integer(m_lexer.get_number_integer())) + if (JSON_UNLIKELY(not sax->number_integer(m_lexer.get_number_integer()))) { return false; } @@ -4336,7 +4326,7 @@ class parser case token_type::value_string: { - if (not sax->string(m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->string(m_lexer.move_string()))) { return false; } @@ -4345,7 +4335,7 @@ class parser case token_type::value_unsigned: { - if (not sax->number_unsigned(m_lexer.get_number_unsigned())) + if (JSON_UNLIKELY(not sax->number_unsigned(m_lexer.get_number_unsigned()))) { return false; } @@ -4397,7 +4387,7 @@ class parser // closing ] if (JSON_LIKELY(last_token == token_type::end_array)) { - if (not sax->end_array()) + if (JSON_UNLIKELY(not sax->end_array())) { return false; } @@ -4436,7 +4426,7 @@ class parser } else { - if (not sax->key(m_lexer.move_string())) + if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) { return false; } @@ -4459,7 +4449,7 @@ class parser // closing } if (JSON_LIKELY(last_token == token_type::end_object)) { - if (not sax->end_object()) + if (JSON_UNLIKELY(not sax->end_object())) { return false; } From a271ee5f1664f9c398c4d2700f7cb0a8186ceb9a Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 18 Mar 2018 23:00:45 +0100 Subject: [PATCH 028/156] :recycle: proper use of SAX parser for binary formats --- .../nlohmann/detail/input/binary_reader.hpp | 729 +++++++++++++----- single_include/nlohmann/json.hpp | 729 +++++++++++++----- 2 files changed, 1044 insertions(+), 414 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index eef3ad7c..f5e1cc34 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -30,7 +30,7 @@ namespace detail /////////////////// /*! -@brief deserialization of CBOR and MessagePack values +@brief deserialization of CBOR, MessagePack, and UBJSON values */ template class binary_reader @@ -65,7 +65,8 @@ class binary_reader { BasicJsonType result; json_sax_dom_parser sdp(result); - parse_cbor_sax_internal(&sdp); + sax = &sdp; + parse_cbor_internal(); result.assert_invariant(); if (strict) { @@ -89,7 +90,8 @@ class binary_reader { BasicJsonType result; json_sax_dom_parser sdp(result); - parse_msgpack_sax_internal(&sdp); + sax = &sdp; + parse_msgpack_internal(); result.assert_invariant(); if (strict) { @@ -113,7 +115,8 @@ class binary_reader { BasicJsonType result; json_sax_dom_parser sdp(result); - parse_ubjson_sax_internal(&sdp); + sax = &sdp; + parse_ubjson_internal(); result.assert_invariant(); if (strict) { @@ -140,14 +143,16 @@ class binary_reader @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead + + @return whether a valid CBOR value was passed to the SAX parser */ - bool parse_cbor_sax_internal(json_sax_t* sax, const bool get_char = true) + bool parse_cbor_internal(const bool get_char = true) { switch (get_char ? get() : current) { // EOF case std::char_traits::eof(): - return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); + return unexpect_eof(); // Integer 0x00..0x17 (0..23) case 0x00: @@ -177,16 +182,28 @@ class binary_reader return sax->number_unsigned(static_cast(current)); case 0x18: // Unsigned integer (one-byte uint8_t follows) - return sax->number_unsigned(get_number()); + { + uint8_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0x19: // Unsigned integer (two-byte uint16_t follows) - return sax->number_unsigned(get_number()); + { + uint16_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0x1A: // Unsigned integer (four-byte uint32_t follows) - return sax->number_unsigned(get_number()); + { + uint32_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0x1B: // Unsigned integer (eight-byte uint64_t follows) - return sax->number_unsigned(get_number()); + { + uint64_t number; + return get_number(number) and sax->number_unsigned(number); + } // Negative integer -1-0x00..-1-0x17 (-1..-24) case 0x20: @@ -216,17 +233,29 @@ class binary_reader return sax->number_integer(static_cast(0x20 - 1 - current)); case 0x38: // Negative integer (one-byte uint8_t follows) - return sax->number_integer(static_cast(-1) - get_number()); + { + uint8_t number; + return get_number(number) and sax->number_integer(static_cast(-1) - number); + } case 0x39: // Negative integer -1-n (two-byte uint16_t follows) - return sax->number_integer(static_cast(-1) - get_number()); + { + uint16_t number; + return get_number(number) and sax->number_integer(static_cast(-1) - number); + } case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) - return sax->number_integer(static_cast(-1) - get_number()); + { + uint32_t number; + return get_number(number) and sax->number_integer(static_cast(-1) - number); + } case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) - return sax->number_integer(static_cast(-1) - - static_cast(get_number())); + { + uint64_t number; + return get_number(number) and sax->number_integer(static_cast(-1) + - static_cast(number)); + } // UTF-8 string (0x00..0x17 bytes follow) case 0x60: @@ -258,7 +287,10 @@ class binary_reader case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) case 0x7F: // UTF-8 string (indefinite length) - return sax->string(get_cbor_string()); + { + string_t s; + return get_cbor_string(s) and sax->string(std::move(s)); + } // array (0x00..0x17 data items follow) case 0x80: @@ -285,22 +317,34 @@ class binary_reader case 0x95: case 0x96: case 0x97: - return get_cbor_array_sax(sax, static_cast(current & 0x1F)); + return get_cbor_array(static_cast(current & 0x1F)); case 0x98: // array (one-byte uint8_t for n follows) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint8_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x99: // array (two-byte uint16_t for n follow) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x9A: // array (four-byte uint32_t for n follow) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x9B: // array (eight-byte uint64_t for n follow) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint64_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x9F: // array (indefinite length) - return get_cbor_array_sax(sax, json_sax_t::no_limit); + return get_cbor_array(json_sax_t::no_limit); // map (0x00..0x17 pairs of data items follow) case 0xA0: @@ -327,22 +371,34 @@ class binary_reader case 0xB5: case 0xB6: case 0xB7: - return get_cbor_object_sax(sax, static_cast(current & 0x1F)); + return get_cbor_object(static_cast(current & 0x1F)); case 0xB8: // map (one-byte uint8_t for n follows) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint8_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xB9: // map (two-byte uint16_t for n follow) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xBA: // map (four-byte uint32_t for n follow) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xBB: // map (eight-byte uint64_t for n follow) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint64_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xBF: // map (indefinite length) - return get_cbor_object_sax(sax, json_sax_t::no_limit); + return get_cbor_object(json_sax_t::no_limit); case 0xF4: // false return sax->boolean(false); @@ -356,9 +412,15 @@ class binary_reader case 0xF9: // Half-Precision Float (two-byte IEEE 754) { const int byte1 = get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } const int byte2 = get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } // code from RFC 7049, Appendix D, Figure 3: // As half-precision floating-point numbers were only added @@ -389,27 +451,35 @@ class binary_reader } case 0xFA: // Single-Precision Float (four-byte IEEE 754) - return sax->number_float(static_cast(get_number()), ""); + { + float number; + return get_number(number) and sax->number_float(static_cast(number), ""); + } case 0xFB: // Double-Precision Float (eight-byte IEEE 754) - return sax->number_float(get_number(), ""); + { + double number; + return get_number(number) and sax->number_float(number, ""); + } default: // anything else (0xFF is handled inside the other types) { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + last_token)); } } } - bool parse_msgpack_sax_internal(json_sax_t* sax) + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() { switch (get()) { // EOF case std::char_traits::eof(): - return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); + return unexpect_eof(); // positive fixint case 0x00: @@ -559,7 +629,7 @@ class binary_reader case 0x8D: case 0x8E: case 0x8F: - return get_msgpack_object_sax(sax, static_cast(current & 0x0F)); + return get_msgpack_object(static_cast(current & 0x0F)); // fixarray case 0x90: @@ -578,7 +648,7 @@ class binary_reader case 0x9D: case 0x9E: case 0x9F: - return get_msgpack_array_sax(sax, static_cast(current & 0x0F)); + return get_msgpack_array(static_cast(current & 0x0F)); // fixstr case 0xA0: @@ -613,7 +683,10 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - return sax->string(get_msgpack_string()); + { + string_t s; + return get_msgpack_string(s) and sax->string(std::move(s)); + } case 0xC0: // nil return sax->null(); @@ -625,51 +698,96 @@ class binary_reader return sax->boolean(true); case 0xCA: // float 32 - return sax->number_float(static_cast(get_number()), ""); + { + float number; + return get_number(number) and sax->number_float(static_cast(number), ""); + } case 0xCB: // float 64 - return sax->number_float(get_number(), ""); + { + double number; + return get_number(number) and sax->number_float(number, ""); + } case 0xCC: // uint 8 - return sax->number_unsigned(get_number()); + { + uint8_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xCD: // uint 16 - return sax->number_unsigned(get_number()); + { + uint16_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xCE: // uint 32 - return sax->number_unsigned(get_number()); + { + uint32_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xCF: // uint 64 - return sax->number_unsigned(get_number()); + { + uint64_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xD0: // int 8 - return sax->number_integer(get_number()); + { + int8_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD1: // int 16 - return sax->number_integer(get_number()); + { + int16_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD2: // int 32 - return sax->number_integer(get_number()); + { + int32_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD3: // int 64 - return sax->number_integer(get_number()); + { + int64_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD9: // str 8 case 0xDA: // str 16 case 0xDB: // str 32 - return sax->string(get_msgpack_string()); + { + string_t s; + return get_msgpack_string(s) and sax->string(std::move(s)); + } case 0xDC: // array 16 - return get_msgpack_array_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_msgpack_array(static_cast(len)); + } case 0xDD: // array 32 - return get_msgpack_array_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_msgpack_array(static_cast(len)); + } case 0xDE: // map 16 - return get_msgpack_object_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_msgpack_object(static_cast(len)); + } case 0xDF: // map 32 - return get_msgpack_object_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_msgpack_object(static_cast(len)); + } // negative fixint case 0xE0: @@ -708,9 +826,8 @@ class binary_reader default: // anything else { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + last_token)); } } } @@ -719,10 +836,12 @@ class binary_reader @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser */ - bool parse_ubjson_sax_internal(json_sax_t* sax, const bool get_char = true) + bool parse_ubjson_internal(const bool get_char = true) { - return get_ubjson_sax_value(sax, get_char ? get_ignore_noop() : current); + return get_ubjson_value(get_char ? get_ignore_noop() : current); } /*! @@ -758,23 +877,26 @@ class binary_reader @brief read a number from the input @tparam NumberType the type of the number + @param[out] result number of type @a NumberType - @return number of type @a NumberType + @return whether conversion completed @note This function needs to respect the system's endianess, because - bytes in CBOR and MessagePack are stored in network order (big - endian) and therefore need reordering on little endian systems. - - @throw parse_error.110 if input has less than `sizeof(NumberType)` bytes + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. */ - template NumberType get_number() + template + bool get_number(NumberType& result) { // step 1: read input into array with system's byte order std::array vec; for (std::size_t i = 0; i < sizeof(NumberType); ++i) { get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } // reverse byte order prior to conversion if necessary if (is_little_endian) @@ -788,35 +910,37 @@ class binary_reader } // step 2: convert array into number of type T and return - NumberType result; std::memcpy(&result, vec.data(), sizeof(NumberType)); - return result; + return true; } /*! @brief create a string by reading characters from the input - @param[in] len number of bytes to read + @tparam NumberType the type of the number + @param[in] len number of characters to read + @param[out] string created by reading @a len bytes + + @return whether string creation completed @note We can not reserve @a len bytes for the result, because @a len may be too large. Usually, @ref unexpect_eof() detects the end of the input before we run out of string memory. - - @return string created by reading @a len bytes - - @throw parse_error.110 if input has less than @a len bytes */ template - string_t get_string(const NumberType len) + bool get_string(const NumberType len, string_t& result) { - string_t result; - std::generate_n(std::back_inserter(result), len, [this]() + bool success = true; + std::generate_n(std::back_inserter(result), len, [this, &success]() { get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + success = false; + } return static_cast(current); }); - return result; + return success; } /*! @@ -826,14 +950,16 @@ class binary_reader string length and then copies this number of bytes into a string. Additionally, CBOR's strings with indefinite lengths are supported. - @return string + @param[out] result created string - @throw parse_error.110 if input ended - @throw parse_error.113 if an unexpected byte is read + @return whether string creation completed */ - string_t get_cbor_string() + bool get_cbor_string(string_t& result) { - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } switch (current) { @@ -862,42 +988,64 @@ class binary_reader case 0x75: case 0x76: case 0x77: - return get_string(current & 0x1F); + { + return get_string(current & 0x1F, result); + } case 0x78: // UTF-8 string (one-byte uint8_t for n follows) - return get_string(get_number()); + { + uint8_t len; + return get_number(len) and get_string(len, result); + } case 0x79: // UTF-8 string (two-byte uint16_t for n follow) - return get_string(get_number()); + { + uint16_t len; + return get_number(len) and get_string(len, result); + } case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) - return get_string(get_number()); + { + uint32_t len; + return get_number(len) and get_string(len, result); + } case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) - return get_string(get_number()); + { + uint64_t len; + return get_number(len) and get_string(len, result); + } case 0x7F: // UTF-8 string (indefinite length) { - string_t result; while (get() != 0xFF) { - result.append(get_cbor_string()); + string_t chunk; + if (not get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); } - return result; + return true; } default: { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, "expected a CBOR string; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "expected a CBOR string; last byte: 0x" + last_token)); } } } - bool get_cbor_array_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the array or json_sax_t::no_limit for an + array of indefinite size + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len) { - if (not sax->start_array(len)) + if (JSON_UNLIKELY(not sax->start_array(len))) { return false; } @@ -905,7 +1053,7 @@ class binary_reader if (len != json_sax_t::no_limit) for (std::size_t i = 0; i < len; ++i) { - if (not parse_cbor_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_cbor_internal())) { return false; } @@ -914,7 +1062,7 @@ class binary_reader { while (get() != 0xFF) { - if (not parse_cbor_sax_internal(sax, false)) + if (JSON_UNLIKELY(not parse_cbor_internal(false))) { return false; } @@ -924,9 +1072,14 @@ class binary_reader return sax->end_array(); } - bool get_cbor_object_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the object or json_sax_t::no_limit for an + object of indefinite size + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len) { - if (not sax->start_object(len)) + if (not JSON_UNLIKELY(sax->start_object(len))) { return false; } @@ -936,12 +1089,13 @@ class binary_reader for (std::size_t i = 0; i < len; ++i) { get(); - if (not sax->key(get_cbor_string())) + string_t key; + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_cbor_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_cbor_internal())) { return false; } @@ -951,12 +1105,13 @@ class binary_reader { while (get() != 0xFF) { - if (not sax->key(get_cbor_string())) + string_t key; + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_cbor_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_cbor_internal())) { return false; } @@ -972,14 +1127,16 @@ class binary_reader This function first reads starting bytes to determine the expected string length and then copies this number of bytes into a string. - @return string + @param[out] result created string - @throw parse_error.110 if input ended - @throw parse_error.113 if an unexpected byte is read + @return whether string creation completed */ - string_t get_msgpack_string() + bool get_msgpack_string(string_t& result) { - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } switch (current) { @@ -1016,37 +1173,50 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - return get_string(current & 0x1F); + { + return get_string(current & 0x1F, result); + } case 0xD9: // str 8 - return get_string(get_number()); + { + uint8_t len; + return get_number(len) and get_string(len, result); + } case 0xDA: // str 16 - return get_string(get_number()); + { + uint16_t len; + return get_number(len) and get_string(len, result); + } case 0xDB: // str 32 - return get_string(get_number()); + { + uint32_t len; + return get_number(len) and get_string(len, result); + } default: { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, - "expected a MessagePack string; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "expected a MessagePack string; last byte: 0x" + last_token)); } } } - bool get_msgpack_array_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) { - if (not sax->start_array(len)) + if (JSON_UNLIKELY(not sax->start_array(len))) { return false; } for (std::size_t i = 0; i < len; ++i) { - if (not parse_msgpack_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_msgpack_internal())) { return false; } @@ -1055,9 +1225,13 @@ class binary_reader return sax->end_array(); } - bool get_msgpack_object_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) { - if (not sax->start_object(len)) + if (JSON_UNLIKELY(not sax->start_object(len))) { return false; } @@ -1065,12 +1239,13 @@ class binary_reader for (std::size_t i = 0; i < len; ++i) { get(); - if (not sax->key(get_msgpack_string())) + string_t key; + if (JSON_UNLIKELY(not get_msgpack_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_msgpack_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_msgpack_internal())) { return false; } @@ -1086,60 +1261,131 @@ class binary_reader indicating a string, or in case of an object key where the 'S' byte can be left out. + @param[out] result created string @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead - @return string - - @throw parse_error.110 if input ended - @throw parse_error.113 if an unexpected byte is read + @return whether string creation completed */ - string_t get_ubjson_string(const bool get_char = true) + bool get_ubjson_string(string_t& result, const bool get_char = true) { if (get_char) { get(); // TODO: may we ignore N here? } - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } switch (current) { case 'U': - return get_string(get_number()); + { + uint8_t len; + return get_number(len) and get_string(len, result); + } + case 'i': - return get_string(get_number()); + { + int8_t len; + return get_number(len) and get_string(len, result); + } + case 'I': - return get_string(get_number()); + { + int16_t len; + return get_number(len) and get_string(len, result); + } + case 'l': - return get_string(get_number()); + { + int32_t len; + return get_number(len) and get_string(len, result); + } + case 'L': - return get_string(get_number()); + { + int64_t len; + return get_number(len) and get_string(len, result); + } + default: - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, - "expected a UBJSON string; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "expected a UBJSON string; last byte: 0x" + last_token)); } } - std::size_t get_ubjson_size_value() + /*! + @param[out] result determined size + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result) { switch (get_ignore_noop()) { case 'U': - return static_cast(get_number()); + { + uint8_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'i': - return static_cast(get_number()); + { + int8_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'I': - return static_cast(get_number()); + { + int16_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'l': - return static_cast(get_number()); + { + int32_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'L': - return static_cast(get_number()); + { + int64_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + default: - return std::size_t(-1); + { + result = std::size_t(-1); + return true; + } } } @@ -1149,44 +1395,51 @@ class binary_reader In the optimized UBJSON format, a type and a size can be provided to allow for a more compact representation. - @return pair of the size and the type + @param[out] result pair of the size and the type + + @return whether pair creation completed */ - std::pair get_ubjson_size_type() + bool get_ubjson_size_type(std::pair& result) { - std::size_t sz = string_t::npos; - int tc = 0; + result.first = string_t::npos; // size + result.second = 0; // type get_ignore_noop(); if (current == '$') { - tc = get(); // must not ignore 'N', because 'N' maybe the type - unexpect_eof(); + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } get_ignore_noop(); - if (current != '#') + if (JSON_UNLIKELY(current != '#')) { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, - "expected '#' after UBJSON type information; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + last_token)); } - sz = get_ubjson_size_value(); + + return get_ubjson_size_value(result.first); } else if (current == '#') { - sz = get_ubjson_size_value(); + return get_ubjson_size_value(result.first); } - - return std::make_pair(sz, tc); + return true; } - bool get_ubjson_sax_value(json_sax_t* sax, const int prefix) + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const int prefix) { switch (prefix) { case std::char_traits::eof(): // EOF - return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); + return unexpect_eof(); case 'T': // true return sax->boolean(true); @@ -1197,57 +1450,96 @@ class binary_reader return sax->null(); case 'U': - return sax->number_unsigned(get_number()); + { + uint8_t number; + return get_number(number) and sax->number_unsigned(number); + } + case 'i': - return sax->number_integer(get_number()); + { + int8_t number; + return get_number(number) and sax->number_integer(number); + } + case 'I': - return sax->number_integer(get_number()); + { + int16_t number; + return get_number(number) and sax->number_integer(number); + } + case 'l': - return sax->number_integer(get_number()); + { + int32_t number; + return get_number(number) and sax->number_integer(number); + } + case 'L': - return sax->number_integer(get_number()); + { + int64_t number; + return get_number(number) and sax->number_integer(number); + } + case 'd': - return sax->number_float(static_cast(get_number()), ""); + { + float number; + return get_number(number) and sax->number_float(static_cast(number), ""); + } + case 'D': - return sax->number_float(get_number(), ""); + { + double number; + return get_number(number) and sax->number_float(number, ""); + } case 'C': // char { get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } if (JSON_UNLIKELY(current > 127)) { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return sax->parse_error(chars_read, ss.str(), parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token)); } return sax->string(string_t(1, static_cast(current))); } case 'S': // string - return sax->string(get_ubjson_string()); + { + string_t s; + return get_ubjson_string(s) and sax->string(std::move(s)); + } case '[': // array - return get_ubjson_sax_array(sax); + return get_ubjson_array(); case '{': // object - return get_ubjson_sax_object(sax); + return get_ubjson_object(); default: // anything else - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, - "error reading UBJSON; last byte: 0x" + ss.str())); + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "error reading UBJSON; last byte: 0x" + last_token)); + } } } - bool get_ubjson_sax_array(json_sax_t* sax) + /*! + @return whether array creation completed + */ + bool get_ubjson_array() { - const auto size_and_type = get_ubjson_size_type(); + std::pair size_and_type; + if (JSON_UNLIKELY(not get_ubjson_size_type(size_and_type))) + { + return false; + } if (size_and_type.first != string_t::npos) { - if (not sax->start_array(size_and_type.first)) + if (JSON_UNLIKELY(not sax->start_array(size_and_type.first))) { return false; } @@ -1258,7 +1550,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not get_ubjson_sax_value(sax, size_and_type.second)) + if (JSON_UNLIKELY(not get_ubjson_value(size_and_type.second))) { return false; } @@ -1269,7 +1561,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not parse_ubjson_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_ubjson_internal())) { return false; } @@ -1278,14 +1570,14 @@ class binary_reader } else { - if (not sax->start_array()) + if (JSON_UNLIKELY(not sax->start_array())) { return false; } while (current != ']') { - if (not parse_ubjson_sax_internal(sax, false)) + if (JSON_UNLIKELY(not parse_ubjson_internal(false))) { return false; } @@ -1296,13 +1588,20 @@ class binary_reader return sax->end_array(); } - bool get_ubjson_sax_object(json_sax_t* sax) + /*! + @return whether object creation completed + */ + bool get_ubjson_object() { - const auto size_and_type = get_ubjson_size_type(); + std::pair size_and_type; + if (JSON_UNLIKELY(not get_ubjson_size_type(size_and_type))) + { + return false; + } if (size_and_type.first != string_t::npos) { - if (not sax->start_object(size_and_type.first)) + if (JSON_UNLIKELY(not sax->start_object(size_and_type.first))) { return false; } @@ -1311,11 +1610,12 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not sax->key(get_ubjson_string())) + string_t key; + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) { return false; } - if (not get_ubjson_sax_value(sax, size_and_type.second)) + if (JSON_UNLIKELY(not get_ubjson_value(size_and_type.second))) { return false; } @@ -1325,11 +1625,12 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not sax->key(get_ubjson_string())) + string_t key; + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_ubjson_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_ubjson_internal())) { return false; } @@ -1338,18 +1639,19 @@ class binary_reader } else { - if (not sax->start_object()) + if (JSON_UNLIKELY(not sax->start_object())) { return false; } while (current != '}') { - if (not sax->key(get_ubjson_string(false))) + string_t key; + if (JSON_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(std::move(key)))) { return false; } - if (not parse_ubjson_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_ubjson_internal())) { return false; } @@ -1361,27 +1663,37 @@ class binary_reader } /*! - @brief throw if end of input is not reached - @throw parse_error.110 if input not ended + @return whether input was completely read */ - void expect_eof() const + bool expect_eof() const { if (JSON_UNLIKELY(current != std::char_traits::eof())) { - JSON_THROW(parse_error::create(110, chars_read, "expected end of input")); + return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, "expected end of input")); } + return true; } /*! - @briefthrow if end of input is reached - @throw parse_error.110 if input ended + @return whether the last read character is not EOF */ - void unexpect_eof() const + bool unexpect_eof() const { if (JSON_UNLIKELY(current == std::char_traits::eof())) { - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::stringstream ss; + ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; + return ss.str(); } private: @@ -1396,6 +1708,9 @@ class binary_reader /// whether we can assume little endianess const bool is_little_endian = little_endianess(); + + /// the SAX parser + json_sax_t* sax = nullptr; }; } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index a060c7fb..4d8ec2bc 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -5688,7 +5688,7 @@ namespace detail /////////////////// /*! -@brief deserialization of CBOR and MessagePack values +@brief deserialization of CBOR, MessagePack, and UBJSON values */ template class binary_reader @@ -5723,7 +5723,8 @@ class binary_reader { BasicJsonType result; json_sax_dom_parser sdp(result); - parse_cbor_sax_internal(&sdp); + sax = &sdp; + parse_cbor_internal(); result.assert_invariant(); if (strict) { @@ -5747,7 +5748,8 @@ class binary_reader { BasicJsonType result; json_sax_dom_parser sdp(result); - parse_msgpack_sax_internal(&sdp); + sax = &sdp; + parse_msgpack_internal(); result.assert_invariant(); if (strict) { @@ -5771,7 +5773,8 @@ class binary_reader { BasicJsonType result; json_sax_dom_parser sdp(result); - parse_ubjson_sax_internal(&sdp); + sax = &sdp; + parse_ubjson_internal(); result.assert_invariant(); if (strict) { @@ -5798,14 +5801,16 @@ class binary_reader @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead + + @return whether a valid CBOR value was passed to the SAX parser */ - bool parse_cbor_sax_internal(json_sax_t* sax, const bool get_char = true) + bool parse_cbor_internal(const bool get_char = true) { switch (get_char ? get() : current) { // EOF case std::char_traits::eof(): - return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); + return unexpect_eof(); // Integer 0x00..0x17 (0..23) case 0x00: @@ -5835,16 +5840,28 @@ class binary_reader return sax->number_unsigned(static_cast(current)); case 0x18: // Unsigned integer (one-byte uint8_t follows) - return sax->number_unsigned(get_number()); + { + uint8_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0x19: // Unsigned integer (two-byte uint16_t follows) - return sax->number_unsigned(get_number()); + { + uint16_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0x1A: // Unsigned integer (four-byte uint32_t follows) - return sax->number_unsigned(get_number()); + { + uint32_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0x1B: // Unsigned integer (eight-byte uint64_t follows) - return sax->number_unsigned(get_number()); + { + uint64_t number; + return get_number(number) and sax->number_unsigned(number); + } // Negative integer -1-0x00..-1-0x17 (-1..-24) case 0x20: @@ -5874,17 +5891,29 @@ class binary_reader return sax->number_integer(static_cast(0x20 - 1 - current)); case 0x38: // Negative integer (one-byte uint8_t follows) - return sax->number_integer(static_cast(-1) - get_number()); + { + uint8_t number; + return get_number(number) and sax->number_integer(static_cast(-1) - number); + } case 0x39: // Negative integer -1-n (two-byte uint16_t follows) - return sax->number_integer(static_cast(-1) - get_number()); + { + uint16_t number; + return get_number(number) and sax->number_integer(static_cast(-1) - number); + } case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) - return sax->number_integer(static_cast(-1) - get_number()); + { + uint32_t number; + return get_number(number) and sax->number_integer(static_cast(-1) - number); + } case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) - return sax->number_integer(static_cast(-1) - - static_cast(get_number())); + { + uint64_t number; + return get_number(number) and sax->number_integer(static_cast(-1) + - static_cast(number)); + } // UTF-8 string (0x00..0x17 bytes follow) case 0x60: @@ -5916,7 +5945,10 @@ class binary_reader case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) case 0x7F: // UTF-8 string (indefinite length) - return sax->string(get_cbor_string()); + { + string_t s; + return get_cbor_string(s) and sax->string(std::move(s)); + } // array (0x00..0x17 data items follow) case 0x80: @@ -5943,22 +5975,34 @@ class binary_reader case 0x95: case 0x96: case 0x97: - return get_cbor_array_sax(sax, static_cast(current & 0x1F)); + return get_cbor_array(static_cast(current & 0x1F)); case 0x98: // array (one-byte uint8_t for n follows) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint8_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x99: // array (two-byte uint16_t for n follow) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x9A: // array (four-byte uint32_t for n follow) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x9B: // array (eight-byte uint64_t for n follow) - return get_cbor_array_sax(sax, static_cast(get_number())); + { + uint64_t len; + return get_number(len) and get_cbor_array(static_cast(len)); + } case 0x9F: // array (indefinite length) - return get_cbor_array_sax(sax, json_sax_t::no_limit); + return get_cbor_array(json_sax_t::no_limit); // map (0x00..0x17 pairs of data items follow) case 0xA0: @@ -5985,22 +6029,34 @@ class binary_reader case 0xB5: case 0xB6: case 0xB7: - return get_cbor_object_sax(sax, static_cast(current & 0x1F)); + return get_cbor_object(static_cast(current & 0x1F)); case 0xB8: // map (one-byte uint8_t for n follows) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint8_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xB9: // map (two-byte uint16_t for n follow) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xBA: // map (four-byte uint32_t for n follow) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xBB: // map (eight-byte uint64_t for n follow) - return get_cbor_object_sax(sax, static_cast(get_number())); + { + uint64_t len; + return get_number(len) and get_cbor_object(static_cast(len)); + } case 0xBF: // map (indefinite length) - return get_cbor_object_sax(sax, json_sax_t::no_limit); + return get_cbor_object(json_sax_t::no_limit); case 0xF4: // false return sax->boolean(false); @@ -6014,9 +6070,15 @@ class binary_reader case 0xF9: // Half-Precision Float (two-byte IEEE 754) { const int byte1 = get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } const int byte2 = get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } // code from RFC 7049, Appendix D, Figure 3: // As half-precision floating-point numbers were only added @@ -6047,27 +6109,35 @@ class binary_reader } case 0xFA: // Single-Precision Float (four-byte IEEE 754) - return sax->number_float(static_cast(get_number()), ""); + { + float number; + return get_number(number) and sax->number_float(static_cast(number), ""); + } case 0xFB: // Double-Precision Float (eight-byte IEEE 754) - return sax->number_float(get_number(), ""); + { + double number; + return get_number(number) and sax->number_float(number, ""); + } default: // anything else (0xFF is handled inside the other types) { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + last_token)); } } } - bool parse_msgpack_sax_internal(json_sax_t* sax) + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() { switch (get()) { // EOF case std::char_traits::eof(): - return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); + return unexpect_eof(); // positive fixint case 0x00: @@ -6217,7 +6287,7 @@ class binary_reader case 0x8D: case 0x8E: case 0x8F: - return get_msgpack_object_sax(sax, static_cast(current & 0x0F)); + return get_msgpack_object(static_cast(current & 0x0F)); // fixarray case 0x90: @@ -6236,7 +6306,7 @@ class binary_reader case 0x9D: case 0x9E: case 0x9F: - return get_msgpack_array_sax(sax, static_cast(current & 0x0F)); + return get_msgpack_array(static_cast(current & 0x0F)); // fixstr case 0xA0: @@ -6271,7 +6341,10 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - return sax->string(get_msgpack_string()); + { + string_t s; + return get_msgpack_string(s) and sax->string(std::move(s)); + } case 0xC0: // nil return sax->null(); @@ -6283,51 +6356,96 @@ class binary_reader return sax->boolean(true); case 0xCA: // float 32 - return sax->number_float(static_cast(get_number()), ""); + { + float number; + return get_number(number) and sax->number_float(static_cast(number), ""); + } case 0xCB: // float 64 - return sax->number_float(get_number(), ""); + { + double number; + return get_number(number) and sax->number_float(number, ""); + } case 0xCC: // uint 8 - return sax->number_unsigned(get_number()); + { + uint8_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xCD: // uint 16 - return sax->number_unsigned(get_number()); + { + uint16_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xCE: // uint 32 - return sax->number_unsigned(get_number()); + { + uint32_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xCF: // uint 64 - return sax->number_unsigned(get_number()); + { + uint64_t number; + return get_number(number) and sax->number_unsigned(number); + } case 0xD0: // int 8 - return sax->number_integer(get_number()); + { + int8_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD1: // int 16 - return sax->number_integer(get_number()); + { + int16_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD2: // int 32 - return sax->number_integer(get_number()); + { + int32_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD3: // int 64 - return sax->number_integer(get_number()); + { + int64_t number; + return get_number(number) and sax->number_integer(number); + } case 0xD9: // str 8 case 0xDA: // str 16 case 0xDB: // str 32 - return sax->string(get_msgpack_string()); + { + string_t s; + return get_msgpack_string(s) and sax->string(std::move(s)); + } case 0xDC: // array 16 - return get_msgpack_array_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_msgpack_array(static_cast(len)); + } case 0xDD: // array 32 - return get_msgpack_array_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_msgpack_array(static_cast(len)); + } case 0xDE: // map 16 - return get_msgpack_object_sax(sax, static_cast(get_number())); + { + uint16_t len; + return get_number(len) and get_msgpack_object(static_cast(len)); + } case 0xDF: // map 32 - return get_msgpack_object_sax(sax, static_cast(get_number())); + { + uint32_t len; + return get_number(len) and get_msgpack_object(static_cast(len)); + } // negative fixint case 0xE0: @@ -6366,9 +6484,8 @@ class binary_reader default: // anything else { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + last_token)); } } } @@ -6377,10 +6494,12 @@ class binary_reader @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser */ - bool parse_ubjson_sax_internal(json_sax_t* sax, const bool get_char = true) + bool parse_ubjson_internal(const bool get_char = true) { - return get_ubjson_sax_value(sax, get_char ? get_ignore_noop() : current); + return get_ubjson_value(get_char ? get_ignore_noop() : current); } /*! @@ -6416,23 +6535,26 @@ class binary_reader @brief read a number from the input @tparam NumberType the type of the number + @param[out] result number of type @a NumberType - @return number of type @a NumberType + @return whether conversion completed @note This function needs to respect the system's endianess, because - bytes in CBOR and MessagePack are stored in network order (big - endian) and therefore need reordering on little endian systems. - - @throw parse_error.110 if input has less than `sizeof(NumberType)` bytes + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. */ - template NumberType get_number() + template + bool get_number(NumberType& result) { // step 1: read input into array with system's byte order std::array vec; for (std::size_t i = 0; i < sizeof(NumberType); ++i) { get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } // reverse byte order prior to conversion if necessary if (is_little_endian) @@ -6446,35 +6568,37 @@ class binary_reader } // step 2: convert array into number of type T and return - NumberType result; std::memcpy(&result, vec.data(), sizeof(NumberType)); - return result; + return true; } /*! @brief create a string by reading characters from the input - @param[in] len number of bytes to read + @tparam NumberType the type of the number + @param[in] len number of characters to read + @param[out] string created by reading @a len bytes + + @return whether string creation completed @note We can not reserve @a len bytes for the result, because @a len may be too large. Usually, @ref unexpect_eof() detects the end of the input before we run out of string memory. - - @return string created by reading @a len bytes - - @throw parse_error.110 if input has less than @a len bytes */ template - string_t get_string(const NumberType len) + bool get_string(const NumberType len, string_t& result) { - string_t result; - std::generate_n(std::back_inserter(result), len, [this]() + bool success = true; + std::generate_n(std::back_inserter(result), len, [this, &success]() { get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + success = false; + } return static_cast(current); }); - return result; + return success; } /*! @@ -6484,14 +6608,16 @@ class binary_reader string length and then copies this number of bytes into a string. Additionally, CBOR's strings with indefinite lengths are supported. - @return string + @param[out] result created string - @throw parse_error.110 if input ended - @throw parse_error.113 if an unexpected byte is read + @return whether string creation completed */ - string_t get_cbor_string() + bool get_cbor_string(string_t& result) { - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } switch (current) { @@ -6520,42 +6646,64 @@ class binary_reader case 0x75: case 0x76: case 0x77: - return get_string(current & 0x1F); + { + return get_string(current & 0x1F, result); + } case 0x78: // UTF-8 string (one-byte uint8_t for n follows) - return get_string(get_number()); + { + uint8_t len; + return get_number(len) and get_string(len, result); + } case 0x79: // UTF-8 string (two-byte uint16_t for n follow) - return get_string(get_number()); + { + uint16_t len; + return get_number(len) and get_string(len, result); + } case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) - return get_string(get_number()); + { + uint32_t len; + return get_number(len) and get_string(len, result); + } case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) - return get_string(get_number()); + { + uint64_t len; + return get_number(len) and get_string(len, result); + } case 0x7F: // UTF-8 string (indefinite length) { - string_t result; while (get() != 0xFF) { - result.append(get_cbor_string()); + string_t chunk; + if (not get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); } - return result; + return true; } default: { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, "expected a CBOR string; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "expected a CBOR string; last byte: 0x" + last_token)); } } } - bool get_cbor_array_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the array or json_sax_t::no_limit for an + array of indefinite size + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len) { - if (not sax->start_array(len)) + if (JSON_UNLIKELY(not sax->start_array(len))) { return false; } @@ -6563,7 +6711,7 @@ class binary_reader if (len != json_sax_t::no_limit) for (std::size_t i = 0; i < len; ++i) { - if (not parse_cbor_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_cbor_internal())) { return false; } @@ -6572,7 +6720,7 @@ class binary_reader { while (get() != 0xFF) { - if (not parse_cbor_sax_internal(sax, false)) + if (JSON_UNLIKELY(not parse_cbor_internal(false))) { return false; } @@ -6582,9 +6730,14 @@ class binary_reader return sax->end_array(); } - bool get_cbor_object_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the object or json_sax_t::no_limit for an + object of indefinite size + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len) { - if (not sax->start_object(len)) + if (not JSON_UNLIKELY(sax->start_object(len))) { return false; } @@ -6594,12 +6747,13 @@ class binary_reader for (std::size_t i = 0; i < len; ++i) { get(); - if (not sax->key(get_cbor_string())) + string_t key; + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_cbor_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_cbor_internal())) { return false; } @@ -6609,12 +6763,13 @@ class binary_reader { while (get() != 0xFF) { - if (not sax->key(get_cbor_string())) + string_t key; + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_cbor_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_cbor_internal())) { return false; } @@ -6630,14 +6785,16 @@ class binary_reader This function first reads starting bytes to determine the expected string length and then copies this number of bytes into a string. - @return string + @param[out] result created string - @throw parse_error.110 if input ended - @throw parse_error.113 if an unexpected byte is read + @return whether string creation completed */ - string_t get_msgpack_string() + bool get_msgpack_string(string_t& result) { - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } switch (current) { @@ -6674,37 +6831,50 @@ class binary_reader case 0xBD: case 0xBE: case 0xBF: - return get_string(current & 0x1F); + { + return get_string(current & 0x1F, result); + } case 0xD9: // str 8 - return get_string(get_number()); + { + uint8_t len; + return get_number(len) and get_string(len, result); + } case 0xDA: // str 16 - return get_string(get_number()); + { + uint16_t len; + return get_number(len) and get_string(len, result); + } case 0xDB: // str 32 - return get_string(get_number()); + { + uint32_t len; + return get_number(len) and get_string(len, result); + } default: { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, - "expected a MessagePack string; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "expected a MessagePack string; last byte: 0x" + last_token)); } } } - bool get_msgpack_array_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) { - if (not sax->start_array(len)) + if (JSON_UNLIKELY(not sax->start_array(len))) { return false; } for (std::size_t i = 0; i < len; ++i) { - if (not parse_msgpack_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_msgpack_internal())) { return false; } @@ -6713,9 +6883,13 @@ class binary_reader return sax->end_array(); } - bool get_msgpack_object_sax(json_sax_t* sax, const std::size_t len) + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) { - if (not sax->start_object(len)) + if (JSON_UNLIKELY(not sax->start_object(len))) { return false; } @@ -6723,12 +6897,13 @@ class binary_reader for (std::size_t i = 0; i < len; ++i) { get(); - if (not sax->key(get_msgpack_string())) + string_t key; + if (JSON_UNLIKELY(not get_msgpack_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_msgpack_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_msgpack_internal())) { return false; } @@ -6744,60 +6919,131 @@ class binary_reader indicating a string, or in case of an object key where the 'S' byte can be left out. + @param[out] result created string @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead - @return string - - @throw parse_error.110 if input ended - @throw parse_error.113 if an unexpected byte is read + @return whether string creation completed */ - string_t get_ubjson_string(const bool get_char = true) + bool get_ubjson_string(string_t& result, const bool get_char = true) { if (get_char) { get(); // TODO: may we ignore N here? } - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } switch (current) { case 'U': - return get_string(get_number()); + { + uint8_t len; + return get_number(len) and get_string(len, result); + } + case 'i': - return get_string(get_number()); + { + int8_t len; + return get_number(len) and get_string(len, result); + } + case 'I': - return get_string(get_number()); + { + int16_t len; + return get_number(len) and get_string(len, result); + } + case 'l': - return get_string(get_number()); + { + int32_t len; + return get_number(len) and get_string(len, result); + } + case 'L': - return get_string(get_number()); + { + int64_t len; + return get_number(len) and get_string(len, result); + } + default: - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(113, chars_read, - "expected a UBJSON string; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "expected a UBJSON string; last byte: 0x" + last_token)); } } - std::size_t get_ubjson_size_value() + /*! + @param[out] result determined size + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result) { switch (get_ignore_noop()) { case 'U': - return static_cast(get_number()); + { + uint8_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'i': - return static_cast(get_number()); + { + int8_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'I': - return static_cast(get_number()); + { + int16_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'l': - return static_cast(get_number()); + { + int32_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + case 'L': - return static_cast(get_number()); + { + int64_t number; + if (JSON_UNLIKELY(not get_number(number))) + { + return false; + } + result = static_cast(number); + return true; + } + default: - return std::size_t(-1); + { + result = std::size_t(-1); + return true; + } } } @@ -6807,44 +7053,51 @@ class binary_reader In the optimized UBJSON format, a type and a size can be provided to allow for a more compact representation. - @return pair of the size and the type + @param[out] result pair of the size and the type + + @return whether pair creation completed */ - std::pair get_ubjson_size_type() + bool get_ubjson_size_type(std::pair& result) { - std::size_t sz = string_t::npos; - int tc = 0; + result.first = string_t::npos; // size + result.second = 0; // type get_ignore_noop(); if (current == '$') { - tc = get(); // must not ignore 'N', because 'N' maybe the type - unexpect_eof(); + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } get_ignore_noop(); - if (current != '#') + if (JSON_UNLIKELY(current != '#')) { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, - "expected '#' after UBJSON type information; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + last_token)); } - sz = get_ubjson_size_value(); + + return get_ubjson_size_value(result.first); } else if (current == '#') { - sz = get_ubjson_size_value(); + return get_ubjson_size_value(result.first); } - - return std::make_pair(sz, tc); + return true; } - bool get_ubjson_sax_value(json_sax_t* sax, const int prefix) + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const int prefix) { switch (prefix) { case std::char_traits::eof(): // EOF - return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); + return unexpect_eof(); case 'T': // true return sax->boolean(true); @@ -6855,57 +7108,96 @@ class binary_reader return sax->null(); case 'U': - return sax->number_unsigned(get_number()); + { + uint8_t number; + return get_number(number) and sax->number_unsigned(number); + } + case 'i': - return sax->number_integer(get_number()); + { + int8_t number; + return get_number(number) and sax->number_integer(number); + } + case 'I': - return sax->number_integer(get_number()); + { + int16_t number; + return get_number(number) and sax->number_integer(number); + } + case 'l': - return sax->number_integer(get_number()); + { + int32_t number; + return get_number(number) and sax->number_integer(number); + } + case 'L': - return sax->number_integer(get_number()); + { + int64_t number; + return get_number(number) and sax->number_integer(number); + } + case 'd': - return sax->number_float(static_cast(get_number()), ""); + { + float number; + return get_number(number) and sax->number_float(static_cast(number), ""); + } + case 'D': - return sax->number_float(get_number(), ""); + { + double number; + return get_number(number) and sax->number_float(number, ""); + } case 'C': // char { get(); - unexpect_eof(); + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } if (JSON_UNLIKELY(current > 127)) { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return sax->parse_error(chars_read, ss.str(), parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token)); } return sax->string(string_t(1, static_cast(current))); } case 'S': // string - return sax->string(get_ubjson_string()); + { + string_t s; + return get_ubjson_string(s) and sax->string(std::move(s)); + } case '[': // array - return get_ubjson_sax_array(sax); + return get_ubjson_array(); case '{': // object - return get_ubjson_sax_object(sax); + return get_ubjson_object(); default: // anything else - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - JSON_THROW(parse_error::create(112, chars_read, - "error reading UBJSON; last byte: 0x" + ss.str())); + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "error reading UBJSON; last byte: 0x" + last_token)); + } } } - bool get_ubjson_sax_array(json_sax_t* sax) + /*! + @return whether array creation completed + */ + bool get_ubjson_array() { - const auto size_and_type = get_ubjson_size_type(); + std::pair size_and_type; + if (JSON_UNLIKELY(not get_ubjson_size_type(size_and_type))) + { + return false; + } if (size_and_type.first != string_t::npos) { - if (not sax->start_array(size_and_type.first)) + if (JSON_UNLIKELY(not sax->start_array(size_and_type.first))) { return false; } @@ -6916,7 +7208,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not get_ubjson_sax_value(sax, size_and_type.second)) + if (JSON_UNLIKELY(not get_ubjson_value(size_and_type.second))) { return false; } @@ -6927,7 +7219,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not parse_ubjson_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_ubjson_internal())) { return false; } @@ -6936,14 +7228,14 @@ class binary_reader } else { - if (not sax->start_array()) + if (JSON_UNLIKELY(not sax->start_array())) { return false; } while (current != ']') { - if (not parse_ubjson_sax_internal(sax, false)) + if (JSON_UNLIKELY(not parse_ubjson_internal(false))) { return false; } @@ -6954,13 +7246,20 @@ class binary_reader return sax->end_array(); } - bool get_ubjson_sax_object(json_sax_t* sax) + /*! + @return whether object creation completed + */ + bool get_ubjson_object() { - const auto size_and_type = get_ubjson_size_type(); + std::pair size_and_type; + if (JSON_UNLIKELY(not get_ubjson_size_type(size_and_type))) + { + return false; + } if (size_and_type.first != string_t::npos) { - if (not sax->start_object(size_and_type.first)) + if (JSON_UNLIKELY(not sax->start_object(size_and_type.first))) { return false; } @@ -6969,11 +7268,12 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not sax->key(get_ubjson_string())) + string_t key; + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) { return false; } - if (not get_ubjson_sax_value(sax, size_and_type.second)) + if (JSON_UNLIKELY(not get_ubjson_value(size_and_type.second))) { return false; } @@ -6983,11 +7283,12 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (not sax->key(get_ubjson_string())) + string_t key; + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) { return false; } - if (not parse_ubjson_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_ubjson_internal())) { return false; } @@ -6996,18 +7297,19 @@ class binary_reader } else { - if (not sax->start_object()) + if (JSON_UNLIKELY(not sax->start_object())) { return false; } while (current != '}') { - if (not sax->key(get_ubjson_string(false))) + string_t key; + if (JSON_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(std::move(key)))) { return false; } - if (not parse_ubjson_sax_internal(sax)) + if (JSON_UNLIKELY(not parse_ubjson_internal())) { return false; } @@ -7019,27 +7321,37 @@ class binary_reader } /*! - @brief throw if end of input is not reached - @throw parse_error.110 if input not ended + @return whether input was completely read */ - void expect_eof() const + bool expect_eof() const { if (JSON_UNLIKELY(current != std::char_traits::eof())) { - JSON_THROW(parse_error::create(110, chars_read, "expected end of input")); + return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, "expected end of input")); } + return true; } /*! - @briefthrow if end of input is reached - @throw parse_error.110 if input ended + @return whether the last read character is not EOF */ - void unexpect_eof() const + bool unexpect_eof() const { if (JSON_UNLIKELY(current == std::char_traits::eof())) { - JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); + return sax->parse_error(chars_read, "", parse_error::create(110, chars_read, "unexpected end of input")); } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::stringstream ss; + ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; + return ss.str(); } private: @@ -7054,6 +7366,9 @@ class binary_reader /// whether we can assume little endianess const bool is_little_endian = little_endianess(); + + /// the SAX parser + json_sax_t* sax = nullptr; }; } } From 9e07e9b4ecc05a51cc559e3b871d633336f2c896 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 19 Mar 2018 22:48:13 +0100 Subject: [PATCH 029/156] :sparkles: implemented non-throwing binary reader --- .../nlohmann/detail/input/binary_reader.hpp | 110 ++++------- include/nlohmann/json.hpp | 62 +++++-- single_include/nlohmann/json.hpp | 171 +++++++++--------- test/src/unit-cbor.cpp | 79 ++++++++ 4 files changed, 252 insertions(+), 170 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index f5e1cc34..429502ea 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -41,6 +41,9 @@ class binary_reader using json_sax_t = json_sax; public: + /// the supported binary input formats + enum class binary_format_t { cbor, msgpack, ubjson }; + /*! @brief create a binary reader @@ -52,77 +55,50 @@ class binary_reader } /*! - @brief create a JSON value from CBOR input - + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor @param[in] strict whether to expect the input to be consumed completed - @return JSON value created from CBOR input - @throw parse_error.110 if input ended unexpectedly or the end of file was - not reached when @a strict was set to true - @throw parse_error.112 if unsupported byte was read + @return */ - BasicJsonType parse_cbor(const bool strict) + bool sax_parse(const binary_format_t format, json_sax_t* sax_, const bool strict) { - BasicJsonType result; - json_sax_dom_parser sdp(result); - sax = &sdp; - parse_cbor_internal(); - result.assert_invariant(); - if (strict) + sax = sax_; + bool result; + + switch (format) { - get(); - expect_eof(); + case binary_format_t::cbor: + result = parse_cbor_internal(); + break; + + case binary_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case binary_format_t::ubjson: + result = parse_ubjson_internal(); + break; } - return result; - } - /*! - @brief create a JSON value from MessagePack input - - @param[in] strict whether to expect the input to be consumed completed - @return JSON value created from MessagePack input - - @throw parse_error.110 if input ended unexpectedly or the end of file was - not reached when @a strict was set to true - @throw parse_error.112 if unsupported byte was read - */ - BasicJsonType parse_msgpack(const bool strict) - { - BasicJsonType result; - json_sax_dom_parser sdp(result); - sax = &sdp; - parse_msgpack_internal(); - result.assert_invariant(); - if (strict) + // strict mode: next byte must be EOF + if (result and strict) { - get(); - expect_eof(); + if (format == binary_format_t::ubjson) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_UNLIKELY(current != std::char_traits::eof())) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, "expected end of input")); + } } - return result; - } - /*! - @brief create a JSON value from UBJSON input - - @param[in] strict whether to expect the input to be consumed completed - @return JSON value created from UBJSON input - - @throw parse_error.110 if input ended unexpectedly or the end of file was - not reached when @a strict was set to true - @throw parse_error.112 if unsupported byte was read - */ - BasicJsonType parse_ubjson(const bool strict) - { - BasicJsonType result; - json_sax_dom_parser sdp(result); - sax = &sdp; - parse_ubjson_internal(); - result.assert_invariant(); - if (strict) - { - get_ignore_noop(); - expect_eof(); - } return result; } @@ -1662,18 +1638,6 @@ class binary_reader return sax->end_object(); } - /*! - @return whether input was completely read - */ - bool expect_eof() const - { - if (JSON_UNLIKELY(current != std::char_traits::eof())) - { - return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, "expected end of input")); - } - return true; - } - /*! @return whether the last read character is not EOF */ diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index bdc905f1..393fa2ea 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -6611,6 +6611,9 @@ class basic_json @param[in] i an input in CBOR format convertible to an input adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) + @param[in] allow_exceptions whether to throw exceptions in case of a + parse error (optional, true by default) + @return deserialized JSON value @throw parse_error.110 if the given input ends prematurely or the end of @@ -6636,9 +6639,13 @@ class basic_json @a strict parameter since 3.0.0 */ static basic_json from_cbor(detail::input_adapter i, - const bool strict = true) + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(i).parse_cbor(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -6646,9 +6653,14 @@ class basic_json */ template::value, int> = 0> - static basic_json from_cbor(A1 && a1, A2 && a2, const bool strict = true) + static basic_json from_cbor(A1 && a1, A2 && a2, + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_cbor(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -6701,6 +6713,10 @@ class basic_json adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) + @param[in] allow_exceptions whether to throw exceptions in case of a + parse error (optional, true by default) + + @return deserialized JSON value @throw parse_error.110 if the given input ends prematurely or the end of file was not reached when @a strict was set to true @@ -6725,9 +6741,13 @@ class basic_json @a strict parameter since 3.0.0 */ static basic_json from_msgpack(detail::input_adapter i, - const bool strict = true) + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(i).parse_msgpack(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -6735,9 +6755,14 @@ class basic_json */ template::value, int> = 0> - static basic_json from_msgpack(A1 && a1, A2 && a2, const bool strict = true) + static basic_json from_msgpack(A1 && a1, A2 && a2, + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_msgpack(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -6772,6 +6797,10 @@ class basic_json @param[in] i an input in UBJSON format convertible to an input adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) + @param[in] allow_exceptions whether to throw exceptions in case of a + parse error (optional, true by default) + + @return deserialized JSON value @throw parse_error.110 if the given input ends prematurely or the end of file was not reached when @a strict was set to true @@ -6794,16 +6823,25 @@ class basic_json @since version 3.1.0 */ static basic_json from_ubjson(detail::input_adapter i, - const bool strict = true) + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(i).parse_ubjson(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } template::value, int> = 0> - static basic_json from_ubjson(A1 && a1, A2 && a2, const bool strict = true) + static basic_json from_ubjson(A1 && a1, A2 && a2, + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_ubjson(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /// @} diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 4d8ec2bc..ea4f1995 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -5699,6 +5699,8 @@ class binary_reader using json_sax_t = json_sax; public: + enum class binary_format_t { cbor, msgpack, ubjson }; + /*! @brief create a binary reader @@ -5710,77 +5712,50 @@ class binary_reader } /*! - @brief create a JSON value from CBOR input - + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor @param[in] strict whether to expect the input to be consumed completed - @return JSON value created from CBOR input - @throw parse_error.110 if input ended unexpectedly or the end of file was - not reached when @a strict was set to true - @throw parse_error.112 if unsupported byte was read + @return */ - BasicJsonType parse_cbor(const bool strict) + bool sax_parse(const binary_format_t format, json_sax_t* sax_, const bool strict) { - BasicJsonType result; - json_sax_dom_parser sdp(result); - sax = &sdp; - parse_cbor_internal(); - result.assert_invariant(); - if (strict) + sax = sax_; + bool result; + + switch (format) { - get(); - expect_eof(); + case binary_format_t::cbor: + result = parse_cbor_internal(); + break; + + case binary_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case binary_format_t::ubjson: + result = parse_ubjson_internal(); + break; } - return result; - } - /*! - @brief create a JSON value from MessagePack input - - @param[in] strict whether to expect the input to be consumed completed - @return JSON value created from MessagePack input - - @throw parse_error.110 if input ended unexpectedly or the end of file was - not reached when @a strict was set to true - @throw parse_error.112 if unsupported byte was read - */ - BasicJsonType parse_msgpack(const bool strict) - { - BasicJsonType result; - json_sax_dom_parser sdp(result); - sax = &sdp; - parse_msgpack_internal(); - result.assert_invariant(); - if (strict) + // strict mode: next byte must be EOF + if (result and strict) { - get(); - expect_eof(); + if (format == binary_format_t::ubjson) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_UNLIKELY(current != std::char_traits::eof())) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, "expected end of input")); + } } - return result; - } - /*! - @brief create a JSON value from UBJSON input - - @param[in] strict whether to expect the input to be consumed completed - @return JSON value created from UBJSON input - - @throw parse_error.110 if input ended unexpectedly or the end of file was - not reached when @a strict was set to true - @throw parse_error.112 if unsupported byte was read - */ - BasicJsonType parse_ubjson(const bool strict) - { - BasicJsonType result; - json_sax_dom_parser sdp(result); - sax = &sdp; - parse_ubjson_internal(); - result.assert_invariant(); - if (strict) - { - get_ignore_noop(); - expect_eof(); - } return result; } @@ -7320,18 +7295,6 @@ class binary_reader return sax->end_object(); } - /*! - @return whether input was completely read - */ - bool expect_eof() const - { - if (JSON_UNLIKELY(current != std::char_traits::eof())) - { - return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, "expected end of input")); - } - return true; - } - /*! @return whether the last read character is not EOF */ @@ -17392,6 +17355,9 @@ class basic_json @param[in] i an input in CBOR format convertible to an input adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) + @param[in] allow_exceptions whether to throw exceptions in case of a + parse error (optional, true by default) + @return deserialized JSON value @throw parse_error.110 if the given input ends prematurely or the end of @@ -17417,9 +17383,13 @@ class basic_json @a strict parameter since 3.0.0 */ static basic_json from_cbor(detail::input_adapter i, - const bool strict = true) + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(i).parse_cbor(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -17427,9 +17397,14 @@ class basic_json */ template::value, int> = 0> - static basic_json from_cbor(A1 && a1, A2 && a2, const bool strict = true) + static basic_json from_cbor(A1 && a1, A2 && a2, + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_cbor(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -17482,6 +17457,10 @@ class basic_json adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) + @param[in] allow_exceptions whether to throw exceptions in case of a + parse error (optional, true by default) + + @return deserialized JSON value @throw parse_error.110 if the given input ends prematurely or the end of file was not reached when @a strict was set to true @@ -17506,9 +17485,13 @@ class basic_json @a strict parameter since 3.0.0 */ static basic_json from_msgpack(detail::input_adapter i, - const bool strict = true) + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(i).parse_msgpack(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -17516,9 +17499,14 @@ class basic_json */ template::value, int> = 0> - static basic_json from_msgpack(A1 && a1, A2 && a2, const bool strict = true) + static basic_json from_msgpack(A1 && a1, A2 && a2, + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_msgpack(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /*! @@ -17553,6 +17541,10 @@ class basic_json @param[in] i an input in UBJSON format convertible to an input adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) + @param[in] allow_exceptions whether to throw exceptions in case of a + parse error (optional, true by default) + + @return deserialized JSON value @throw parse_error.110 if the given input ends prematurely or the end of file was not reached when @a strict was set to true @@ -17575,16 +17567,25 @@ class basic_json @since version 3.1.0 */ static basic_json from_ubjson(detail::input_adapter i, - const bool strict = true) + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(i).parse_ubjson(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } template::value, int> = 0> - static basic_json from_ubjson(A1 && a1, A2 && a2, const bool strict = true) + static basic_json from_ubjson(A1 && a1, A2 && a2, + const bool strict = true, + const bool allow_exceptions = true) { - return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_ubjson(strict); + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); } /// @} diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index 6b9eac52..e8b8c6f4 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -54,6 +54,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("boolean") @@ -67,6 +68,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("false") @@ -78,6 +80,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -142,6 +145,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -190,6 +194,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -225,6 +230,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -241,6 +247,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("-256..-24") @@ -271,6 +278,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -300,6 +308,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -330,6 +339,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -362,6 +372,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -396,6 +407,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -438,6 +450,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -488,6 +501,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -555,6 +569,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -587,6 +602,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -620,6 +636,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -661,6 +678,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -710,6 +728,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } } @@ -730,6 +749,8 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); CHECK(json::from_cbor(result) == v); + + CHECK(json::from_cbor(result, true, false) == j); } } @@ -742,12 +763,14 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector({0xf9})), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector({0xf9})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); + CHECK(json::from_cbor(std::vector({0xf9}), true, false).is_discarded()); } SECTION("only one byte follows") { CHECK_THROWS_AS(json::from_cbor(std::vector({0xf9, 0x7c})), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector({0xf9, 0x7c})), "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK(json::from_cbor(std::vector({0xf9, 0x7c}), true, false).is_discarded()); } } @@ -868,6 +891,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -899,6 +923,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -931,6 +956,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } @@ -965,6 +991,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } } @@ -980,6 +1007,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("[null]") @@ -991,6 +1019,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("[1,2,3,4,5]") @@ -1002,6 +1031,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("[[[[]]]]") @@ -1013,6 +1043,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("array with uint16_t elements") @@ -1027,6 +1058,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("array with uint32_t elements") @@ -1043,6 +1075,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } /* @@ -1079,6 +1112,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("{\"\":null}") @@ -1090,6 +1124,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("{\"a\": {\"b\": {\"c\": {}}}}") @@ -1104,6 +1139,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("object with uint8_t elements") @@ -1130,6 +1166,7 @@ TEST_CASE("CBOR") CHECK(result[1] == 0xff); // size byte (0xff) // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("object with uint16_t elements") @@ -1158,6 +1195,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } SECTION("object with uint32_t elements") @@ -1188,6 +1226,7 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); + CHECK(json::from_cbor(result, true, false) == j); } } } @@ -1229,6 +1268,7 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector()), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector()), "[json.exception.parse_error.110] parse error at 1: unexpected end of input"); + CHECK(json::from_cbor(std::vector(), true, false).is_discarded()); } SECTION("too short byte vector") @@ -1248,6 +1288,10 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x62})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x62, 0x60})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x7F})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x7F, 0x60})), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector({0x18})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); @@ -1279,6 +1323,34 @@ TEST_CASE("CBOR") "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); CHECK_THROWS_WITH(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), "[json.exception.parse_error.110] parse error at 9: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x62})), + "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x62, 0x60})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x7F})), + "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x7F, 0x60})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + + CHECK(json::from_cbor(std::vector({0x18}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x19}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x19, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1a}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1a, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1a, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1a, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x62}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x62, 0x60}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x7F}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x7F, 0x60}), true, false).is_discarded()); } SECTION("unsupported bytes") @@ -1288,9 +1360,12 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector({0x1c})), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector({0x1c})), "[json.exception.parse_error.112] parse error at 1: error reading CBOR; last byte: 0x1C"); + CHECK(json::from_cbor(std::vector({0x1c}), true, false).is_discarded()); + CHECK_THROWS_AS(json::from_cbor(std::vector({0xf8})), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector({0xf8})), "[json.exception.parse_error.112] parse error at 1: error reading CBOR; last byte: 0xF8"); + CHECK(json::from_cbor(std::vector({0xf8}), true, false).is_discarded()); } SECTION("all unsupported bytes") @@ -1340,6 +1415,7 @@ TEST_CASE("CBOR") }) { CHECK_THROWS_AS(json::from_cbor(std::vector({static_cast(byte)})), json::parse_error&); + CHECK(json::from_cbor(std::vector({static_cast(byte)}), true, false).is_discarded()); } } } @@ -1349,6 +1425,7 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector({0xa1, 0xff, 0x01})), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector({0xa1, 0xff, 0x01})), "[json.exception.parse_error.113] parse error at 2: expected a CBOR string; last byte: 0xFF"); + CHECK(json::from_cbor(std::vector({0xa1, 0xff, 0x01}), true, false).is_discarded()); } SECTION("strict mode") @@ -1358,6 +1435,7 @@ TEST_CASE("CBOR") { const auto result = json::from_cbor(vec, false); CHECK(result == json()); + CHECK(not json::from_cbor(vec, false, false).is_discarded()); } SECTION("strict mode") @@ -1365,6 +1443,7 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(vec), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(vec), "[json.exception.parse_error.110] parse error at 2: expected end of input"); + CHECK(json::from_cbor(vec, true, false).is_discarded()); } } } From 99ecca55c459973432e560159260d51f9f6eb950 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 20 Mar 2018 18:49:10 +0100 Subject: [PATCH 030/156] :white_check_mark: improved test coverage --- Makefile | 2 +- .../nlohmann/detail/input/binary_reader.hpp | 8 +- single_include/nlohmann/json.hpp | 9 +- test/src/unit-cbor.cpp | 13 ++ test/src/unit-msgpack.cpp | 70 +++++++ test/src/unit-ubjson.cpp | 172 ++++++++++++++++++ 6 files changed, 269 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index ed0a7a5c..1e121788 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ coverage: mkdir build_coverage cd build_coverage ; CXX=g++-5 cmake .. -GNinja -DJSON_Coverage=ON -DJSON_MultipleHeaders=ON cd build_coverage ; ninja - cd build_coverage ; ctest -j10 + cd build_coverage ; ctest -E '.*_default' -j10 cd build_coverage ; ninja lcov_html open build_coverage/test/html/index.html diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index 429502ea..d3c09bc9 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -1359,8 +1359,8 @@ class binary_reader default: { - result = std::size_t(-1); - return true; + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after '#' must denote a number type; last byte: 0x" + last_token)); } } } @@ -1393,6 +1393,10 @@ class binary_reader get_ignore_noop(); if (JSON_UNLIKELY(current != '#')) { + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + last_token)); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index ea4f1995..57eba455 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -5699,6 +5699,7 @@ class binary_reader using json_sax_t = json_sax; public: + /// the supported binary input formats enum class binary_format_t { cbor, msgpack, ubjson }; /*! @@ -7016,8 +7017,8 @@ class binary_reader default: { - result = std::size_t(-1); - return true; + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after '#' must denote a number type; last byte: 0x" + last_token)); } } } @@ -7050,6 +7051,10 @@ class binary_reader get_ignore_noop(); if (JSON_UNLIKELY(current != '#')) { + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + last_token)); } diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index e8b8c6f4..b0efe6bc 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -1292,6 +1292,10 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector({0x62, 0x60})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0x7F})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0x7F, 0x60})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x82, 0x01})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x9F, 0x01})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5})), json::parse_error&); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x18})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); @@ -1331,6 +1335,12 @@ TEST_CASE("CBOR") "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); CHECK_THROWS_WITH(json::from_cbor(std::vector({0x7F, 0x60})), "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x82, 0x01})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x9F, 0x01})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5})), + "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); CHECK(json::from_cbor(std::vector({0x18}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x19}), true, false).is_discarded()); @@ -1351,6 +1361,9 @@ TEST_CASE("CBOR") CHECK(json::from_cbor(std::vector({0x62, 0x60}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x7F}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x7F, 0x60}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x82, 0x01}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x9F, 0x01}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5}), true, false).is_discarded()); } SECTION("unsupported bytes") diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index d8bdb08b..9cb3d18b 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -54,6 +54,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("boolean") @@ -67,6 +68,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("false") @@ -78,6 +80,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -111,6 +114,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -141,6 +145,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -174,6 +179,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -208,6 +214,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -250,6 +257,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -300,6 +308,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -331,6 +340,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -347,6 +357,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("-32768..-129 (int 16)") @@ -379,6 +390,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -423,6 +435,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -472,6 +485,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -504,6 +518,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -536,6 +551,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -569,6 +585,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -610,6 +627,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -659,6 +677,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -679,6 +698,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); CHECK(json::from_msgpack(result) == v); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -727,6 +747,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -758,6 +779,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -790,6 +812,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -824,6 +847,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -839,6 +863,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("[null]") @@ -850,6 +875,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("[1,2,3,4,5]") @@ -861,6 +887,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("[[[[]]]]") @@ -872,6 +899,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("array 16") @@ -886,6 +914,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("array 32") @@ -909,6 +938,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -923,6 +953,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("{\"\":null}") @@ -934,6 +965,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("{\"a\": {\"b\": {\"c\": {}}}}") @@ -948,6 +980,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("map 16") @@ -971,6 +1004,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("map 32") @@ -1001,6 +1035,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -1019,10 +1054,12 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector()), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector()), "[json.exception.parse_error.110] parse error at 1: unexpected end of input"); + CHECK(json::from_msgpack(std::vector(), true, false).is_discarded()); } SECTION("too short byte vector") { + CHECK_THROWS_AS(json::from_msgpack(std::vector({0x87})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcc})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcd})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcd, 0x00})), json::parse_error&); @@ -1038,7 +1075,11 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); + CHECK_THROWS_AS(json::from_msgpack(std::vector({0xa5, 0x68, 0x65})), json::parse_error&); + CHECK_THROWS_AS(json::from_msgpack(std::vector({0x92, 0x01})), json::parse_error&); + CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x87})), + "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xcc})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xcd})), @@ -1069,6 +1110,29 @@ TEST_CASE("MessagePack") "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), "[json.exception.parse_error.110] parse error at 9: unexpected end of input"); + CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xa5, 0x68, 0x65})), + "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x92, 0x01})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + + CHECK(json::from_msgpack(std::vector({0x87}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcc}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcd}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcd, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xa5, 0x68, 0x65}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0x92, 0x01}), true, false).is_discarded()); } SECTION("unsupported bytes") @@ -1078,9 +1142,12 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector({0xc1})), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xc1})), "[json.exception.parse_error.112] parse error at 1: error reading MessagePack; last byte: 0xC1"); + CHECK(json::from_msgpack(std::vector({0xc6}), true, false).is_discarded()); + CHECK_THROWS_AS(json::from_msgpack(std::vector({0xc6})), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xc6})), "[json.exception.parse_error.112] parse error at 1: error reading MessagePack; last byte: 0xC6"); + CHECK(json::from_msgpack(std::vector({0xc6}), true, false).is_discarded()); } SECTION("all unsupported bytes") @@ -1098,6 +1165,7 @@ TEST_CASE("MessagePack") }) { CHECK_THROWS_AS(json::from_msgpack(std::vector({static_cast(byte)})), json::parse_error&); + CHECK(json::from_msgpack(std::vector({static_cast(byte)}), true, false).is_discarded()); } } } @@ -1107,6 +1175,7 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector({0x81, 0xff, 0x01})), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x81, 0xff, 0x01})), "[json.exception.parse_error.113] parse error at 2: expected a MessagePack string; last byte: 0xFF"); + CHECK(json::from_msgpack(std::vector({0x81, 0xff, 0x01}), true, false).is_discarded()); } SECTION("strict mode") @@ -1123,6 +1192,7 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(vec), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(vec), "[json.exception.parse_error.110] parse error at 2: expected end of input"); + CHECK(json::from_msgpack(vec, true, false).is_discarded()); } } } diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 1d7c1046..11774268 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -54,6 +54,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("boolean") @@ -67,6 +68,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("false") @@ -78,6 +80,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -140,6 +143,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -186,6 +190,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -219,6 +224,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -239,6 +245,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("-128..-1 (int8)") @@ -269,6 +276,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -301,6 +309,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -333,6 +342,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -367,6 +377,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -409,6 +420,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -457,6 +469,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -492,6 +505,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -524,6 +538,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -557,6 +572,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -598,6 +614,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -645,6 +662,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -665,6 +683,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); CHECK(json::from_ubjson(result) == v); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -703,6 +722,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -735,6 +755,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -768,6 +789,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -803,6 +825,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -820,6 +843,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -831,6 +855,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -842,6 +867,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -856,6 +882,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -867,6 +894,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -878,6 +906,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -892,6 +921,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -903,6 +933,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -914,6 +945,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -928,6 +960,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -939,6 +972,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -950,6 +984,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -966,6 +1001,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -982,6 +1018,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -993,6 +1030,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -1009,6 +1047,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1027,6 +1066,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1038,6 +1078,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -1055,6 +1096,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1066,6 +1108,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1077,6 +1120,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -1091,6 +1135,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1102,6 +1147,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1113,6 +1159,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -1130,6 +1177,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1144,6 +1192,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1158,6 +1207,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -1239,6 +1289,7 @@ TEST_CASE("UBJSON") SECTION("optimized version (length only)") { // create vector with two elements of the same type + std::vector v_TU = {'[', '#', 'U', 2, 'T', 'T'}; std::vector v_T = {'[', '#', 'i', 2, 'T', 'T'}; std::vector v_F = {'[', '#', 'i', 2, 'F', 'F'}; std::vector v_Z = {'[', '#', 'i', 2, 'Z', 'Z'}; @@ -1252,6 +1303,7 @@ TEST_CASE("UBJSON") std::vector v_C = {'[', '#', 'i', 2, 'C', 'a', 'C', 'a'}; // check if vector is parsed correctly + CHECK(json::from_ubjson(v_TU) == json({true, true})); CHECK(json::from_ubjson(v_T) == json({true, true})); CHECK(json::from_ubjson(v_F) == json({false, false})); CHECK(json::from_ubjson(v_Z) == json({nullptr, nullptr})); @@ -1378,6 +1430,126 @@ TEST_CASE("UBJSON") CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.112] parse error at 4: expected '#' after UBJSON type information; last byte: 0x02"); } } + + SECTION("strings") + { + std::vector vS = {'S'}; + CHECK_THROWS_AS(json::from_ubjson(vS), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vS), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); + CHECK(json::from_ubjson(vS, true, false).is_discarded()); + + std::vector v = {'S', 'i', '2', 'a'}; + CHECK_THROWS_AS(json::from_ubjson(v), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); + CHECK(json::from_ubjson(v, true, false).is_discarded()); + + std::vector vC = {'C'}; + CHECK_THROWS_AS(json::from_ubjson(vC), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vC), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); + CHECK(json::from_ubjson(vC, true, false).is_discarded()); + } + + SECTION("sizes") + { + std::vector vU = {'[', '#', 'U'}; + CHECK_THROWS_AS(json::from_ubjson(vU), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vU), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vU, true, false).is_discarded()); + + std::vector vi = {'[', '#', 'i'}; + CHECK_THROWS_AS(json::from_ubjson(vi), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vi), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vi, true, false).is_discarded()); + + std::vector vI = {'[', '#', 'I'}; + CHECK_THROWS_AS(json::from_ubjson(vI), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vI), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vI, true, false).is_discarded()); + + std::vector vl = {'[', '#', 'l'}; + CHECK_THROWS_AS(json::from_ubjson(vl), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vl), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vl, true, false).is_discarded()); + + std::vector vL = {'[', '#', 'L'}; + CHECK_THROWS_AS(json::from_ubjson(vL), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vL), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vL, true, false).is_discarded()); + + std::vector v0 = {'[', '#', 'T', ']'}; + CHECK_THROWS_AS(json::from_ubjson(v0), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v0), "[json.exception.parse_error.113] parse error at 3: byte after '#' must denote a number type; last byte: 0x54"); + CHECK(json::from_ubjson(v0, true, false).is_discarded()); + } + + SECTION("types") + { + std::vector v0 = {'[', '$'}; + CHECK_THROWS_AS(json::from_ubjson(v0), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v0), "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK(json::from_ubjson(v0, true, false).is_discarded()); + + std::vector vi = {'[', '$', '#'}; + CHECK_THROWS_AS(json::from_ubjson(vi), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vi), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vi, true, false).is_discarded()); + + std::vector vT = {'[', '$', 'T'}; + CHECK_THROWS_AS(json::from_ubjson(vT), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vT), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vT, true, false).is_discarded()); + } + + SECTION("arrays") + { + std::vector vST = {'[', '$', 'i', '#', 'i', 2, 1}; + CHECK_THROWS_AS(json::from_ubjson(vST), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vST), "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); + CHECK(json::from_ubjson(vST, true, false).is_discarded()); + + std::vector vS = {'[', '#', 'i', 2, 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(vS), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vS), "[json.exception.parse_error.110] parse error at 7: unexpected end of input"); + CHECK(json::from_ubjson(vS, true, false).is_discarded()); + + std::vector v = {'[', 'i', 2, 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(v), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.110] parse error at 6: unexpected end of input"); + CHECK(json::from_ubjson(v, true, false).is_discarded()); + } + + SECTION("objects") + { + std::vector vST = {'{', '$', 'i', '#', 'i', 2, 'i', 1, 'a', 1}; + CHECK_THROWS_AS(json::from_ubjson(vST), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vST), "[json.exception.parse_error.110] parse error at 11: unexpected end of input"); + CHECK(json::from_ubjson(vST, true, false).is_discarded()); + + std::vector vT = {'{', '$', 'i', 'i', 1, 'a', 1}; + CHECK_THROWS_AS(json::from_ubjson(vT), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vT), "[json.exception.parse_error.112] parse error at 4: expected '#' after UBJSON type information; last byte: 0x69"); + CHECK(json::from_ubjson(vT, true, false).is_discarded()); + + std::vector vS = {'{', '#', 'i', 2, 'i', 1, 'a', 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(vS), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vS), "[json.exception.parse_error.110] parse error at 10: unexpected end of input"); + CHECK(json::from_ubjson(vS, true, false).is_discarded()); + + std::vector v = {'{', 'i', 1, 'a', 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(v), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.110] parse error at 7: unexpected end of input"); + CHECK(json::from_ubjson(v, true, false).is_discarded()); + + std::vector v2 = {'{', 'i', 1, 'a', 'i', 1, 'i'}; + CHECK_THROWS_AS(json::from_ubjson(v2), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v2), "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); + CHECK(json::from_ubjson(v2, true, false).is_discarded()); + + std::vector v3 = {'{', 'i', 1, 'a'}; + CHECK_THROWS_AS(json::from_ubjson(v3), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v3), "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); + CHECK(json::from_ubjson(v3, true, false).is_discarded()); + } } SECTION("writing optimized values") From 25f56ff2076aa7fd3e275e92db4eb15a5f111894 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 20 Mar 2018 19:22:18 +0100 Subject: [PATCH 031/156] :memo: updated documentation --- include/nlohmann/json.hpp | 37 ++++++++++++++++++-------------- single_include/nlohmann/json.hpp | 37 ++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 393fa2ea..ff2f7f34 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -6629,14 +6629,15 @@ class basic_json @sa http://cbor.io @sa @ref to_cbor(const basic_json&) for the analogous serialization - @sa @ref from_msgpack(detail::input_adapter, const bool) for the + @sa @ref from_msgpack(detail::input_adapter, const bool, const bool) for the related MessagePack format - @sa @ref from_ubjson(detail::input_adapter, const bool) for the related - UBJSON format + @sa @ref from_ubjson(detail::input_adapter, const bool, const bool) for the + related UBJSON format @since version 2.0.9; parameter @a start_index since 2.1.1; changed to consume input adapters, removed start_index parameter, and added - @a strict parameter since 3.0.0 + @a strict parameter since 3.0.0; added @allow_exceptions parameter + since 3.2.0 */ static basic_json from_cbor(detail::input_adapter i, const bool strict = true, @@ -6649,7 +6650,7 @@ class basic_json } /*! - @copydoc from_cbor(detail::input_adapter, const bool) + @copydoc from_cbor(detail::input_adapter, const bool, const bool) */ template::value, int> = 0> @@ -6731,14 +6732,15 @@ class basic_json @sa http://msgpack.org @sa @ref to_msgpack(const basic_json&) for the analogous serialization - @sa @ref from_cbor(detail::input_adapter, const bool) for the related CBOR - format - @sa @ref from_ubjson(detail::input_adapter, const bool) for the related - UBJSON format + @sa @ref from_cbor(detail::input_adapter, const bool, const bool) for the + related CBOR format + @sa @ref from_ubjson(detail::input_adapter, const bool, const bool) for + the related UBJSON format @since version 2.0.9; parameter @a start_index since 2.1.1; changed to consume input adapters, removed start_index parameter, and added - @a strict parameter since 3.0.0 + @a strict parameter since 3.0.0; added @allow_exceptions parameter + since 3.2.0 */ static basic_json from_msgpack(detail::input_adapter i, const bool strict = true, @@ -6751,7 +6753,7 @@ class basic_json } /*! - @copydoc from_msgpack(detail::input_adapter, const bool) + @copydoc from_msgpack(detail::input_adapter, const bool, const bool) */ template::value, int> = 0> @@ -6815,12 +6817,12 @@ class basic_json @sa http://ubjson.org @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the analogous serialization - @sa @ref from_cbor(detail::input_adapter, const bool) for the related CBOR - format - @sa @ref from_msgpack(detail::input_adapter, const bool) for the related - MessagePack format + @sa @ref from_cbor(detail::input_adapter, const bool, const bool) for the + related CBOR format + @sa @ref from_msgpack(detail::input_adapter, const bool, const bool) for + the related MessagePack format - @since version 3.1.0 + @since version 3.1.0; added @allow_exceptions parameter since 3.2.0 */ static basic_json from_ubjson(detail::input_adapter i, const bool strict = true, @@ -6832,6 +6834,9 @@ class basic_json return res ? result : basic_json(value_t::discarded); } + /*! + @copydoc from_ubjson(detail::input_adapter, const bool, const bool) + */ template::value, int> = 0> static basic_json from_ubjson(A1 && a1, A2 && a2, diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 57eba455..67af8de1 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -17378,14 +17378,15 @@ class basic_json @sa http://cbor.io @sa @ref to_cbor(const basic_json&) for the analogous serialization - @sa @ref from_msgpack(detail::input_adapter, const bool) for the + @sa @ref from_msgpack(detail::input_adapter, const bool, const bool) for the related MessagePack format - @sa @ref from_ubjson(detail::input_adapter, const bool) for the related - UBJSON format + @sa @ref from_ubjson(detail::input_adapter, const bool, const bool) for the + related UBJSON format @since version 2.0.9; parameter @a start_index since 2.1.1; changed to consume input adapters, removed start_index parameter, and added - @a strict parameter since 3.0.0 + @a strict parameter since 3.0.0; added @allow_exceptions parameter + since 3.2.0 */ static basic_json from_cbor(detail::input_adapter i, const bool strict = true, @@ -17398,7 +17399,7 @@ class basic_json } /*! - @copydoc from_cbor(detail::input_adapter, const bool) + @copydoc from_cbor(detail::input_adapter, const bool, const bool) */ template::value, int> = 0> @@ -17480,14 +17481,15 @@ class basic_json @sa http://msgpack.org @sa @ref to_msgpack(const basic_json&) for the analogous serialization - @sa @ref from_cbor(detail::input_adapter, const bool) for the related CBOR - format - @sa @ref from_ubjson(detail::input_adapter, const bool) for the related - UBJSON format + @sa @ref from_cbor(detail::input_adapter, const bool, const bool) for the + related CBOR format + @sa @ref from_ubjson(detail::input_adapter, const bool, const bool) for + the related UBJSON format @since version 2.0.9; parameter @a start_index since 2.1.1; changed to consume input adapters, removed start_index parameter, and added - @a strict parameter since 3.0.0 + @a strict parameter since 3.0.0; added @allow_exceptions parameter + since 3.2.0 */ static basic_json from_msgpack(detail::input_adapter i, const bool strict = true, @@ -17500,7 +17502,7 @@ class basic_json } /*! - @copydoc from_msgpack(detail::input_adapter, const bool) + @copydoc from_msgpack(detail::input_adapter, const bool, const bool) */ template::value, int> = 0> @@ -17564,12 +17566,12 @@ class basic_json @sa http://ubjson.org @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the analogous serialization - @sa @ref from_cbor(detail::input_adapter, const bool) for the related CBOR - format - @sa @ref from_msgpack(detail::input_adapter, const bool) for the related - MessagePack format + @sa @ref from_cbor(detail::input_adapter, const bool, const bool) for the + related CBOR format + @sa @ref from_msgpack(detail::input_adapter, const bool, const bool) for + the related MessagePack format - @since version 3.1.0 + @since version 3.1.0; added @allow_exceptions parameter since 3.2.0 */ static basic_json from_ubjson(detail::input_adapter i, const bool strict = true, @@ -17581,6 +17583,9 @@ class basic_json return res ? result : basic_json(value_t::discarded); } + /*! + @copydoc from_ubjson(detail::input_adapter, const bool, const bool) + */ template::value, int> = 0> static basic_json from_ubjson(A1 && a1, A2 && a2, From 1e38ffc01413f7ac46e1362c6fb55e0de5ab5049 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 20 Mar 2018 20:04:11 +0100 Subject: [PATCH 032/156] :white_check_mark: more tests --- test/src/unit-cbor.cpp | 9 ++++++++- test/src/unit-msgpack.cpp | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index b0efe6bc..ba07026a 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -1295,7 +1295,8 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector({0x82, 0x01})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0x9F, 0x01})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5})), json::parse_error&); - + CHECK_THROWS_AS(json::from_cbor(std::vector({0xA1, 0x61, 0X61})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0xBF, 0x61, 0X61})), json::parse_error&); CHECK_THROWS_WITH(json::from_cbor(std::vector({0x18})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); @@ -1341,6 +1342,10 @@ TEST_CASE("CBOR") "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); CHECK_THROWS_WITH(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5})), "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0xA1, 0x61, 0x61})), + "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0xBF, 0x61, 0x61})), + "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); CHECK(json::from_cbor(std::vector({0x18}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x19}), true, false).is_discarded()); @@ -1364,6 +1369,8 @@ TEST_CASE("CBOR") CHECK(json::from_cbor(std::vector({0x82, 0x01}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x9F, 0x01}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0xA1, 0x61, 0x61}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0xBF, 0x61, 0x61}), true, false).is_discarded()); } SECTION("unsupported bytes") diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index 9cb3d18b..e1c209d9 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -1077,6 +1077,7 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xa5, 0x68, 0x65})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0x92, 0x01})), json::parse_error&); + CHECK_THROWS_AS(json::from_msgpack(std::vector({0x81, 0xa1, 0x61})), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x87})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); @@ -1114,6 +1115,8 @@ TEST_CASE("MessagePack") "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x92, 0x01})), "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x81, 0xa1, 0x61})), + "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); CHECK(json::from_msgpack(std::vector({0x87}), true, false).is_discarded()); CHECK(json::from_msgpack(std::vector({0xcc}), true, false).is_discarded()); @@ -1133,6 +1136,7 @@ TEST_CASE("MessagePack") CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); CHECK(json::from_msgpack(std::vector({0xa5, 0x68, 0x65}), true, false).is_discarded()); CHECK(json::from_msgpack(std::vector({0x92, 0x01}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0x81, 0xA1, 0x61}), true, false).is_discarded()); } SECTION("unsupported bytes") From 9e1abb48423c87ada6eb39d4cf9451388a31d55d Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 20 Mar 2018 22:39:08 +0100 Subject: [PATCH 033/156] :white_check_mark: improved coverage --- .../nlohmann/detail/input/binary_reader.hpp | 18 +-- .../nlohmann/detail/input/input_adapters.hpp | 3 + include/nlohmann/detail/input/json_sax.hpp | 26 +--- include/nlohmann/detail/input/lexer.hpp | 2 +- include/nlohmann/detail/input/parser.hpp | 27 ++-- include/nlohmann/json.hpp | 59 ++++---- single_include/nlohmann/json.hpp | 135 +++++++----------- test/src/unit-cbor.cpp | 94 ++++++++++++ test/src/unit-class_parser.cpp | 13 +- test/src/unit-deserialization.cpp | 6 - test/src/unit-msgpack.cpp | 94 ++++++++++++ test/src/unit-ubjson.cpp | 115 +++++++++++++++ 12 files changed, 412 insertions(+), 180 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index d3c09bc9..0feb6dd4 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -41,9 +41,6 @@ class binary_reader using json_sax_t = json_sax; public: - /// the supported binary input formats - enum class binary_format_t { cbor, msgpack, ubjson }; - /*! @brief create a binary reader @@ -61,30 +58,35 @@ class binary_reader @return */ - bool sax_parse(const binary_format_t format, json_sax_t* sax_, const bool strict) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true) { sax = sax_; bool result; switch (format) { - case binary_format_t::cbor: + case input_format_t::cbor: result = parse_cbor_internal(); break; - case binary_format_t::msgpack: + case input_format_t::msgpack: result = parse_msgpack_internal(); break; - case binary_format_t::ubjson: + case input_format_t::ubjson: result = parse_ubjson_internal(); break; + + default: + assert(false); // LCOV_EXCL_LINE } // strict mode: next byte must be EOF if (result and strict) { - if (format == binary_format_t::ubjson) + if (format == input_format_t::ubjson) { get_ignore_noop(); } diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index ef66948d..92987e97 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -20,6 +20,9 @@ namespace nlohmann { namespace detail { +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson }; + //////////////////// // input adapters // //////////////////// diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 5763e652..98479eb9 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -105,21 +105,12 @@ struct json_sax */ virtual bool end_array() = 0; - /*! - @brief a binary value was read - @param[in] val byte vector - @return whether parsing should proceed - @note examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON - array - */ - virtual bool binary(const std::vector& val) = 0; - /*! @brief a parse error occurred @param[in] position the position in the input where the error occurs @param[in] last_token the last read token @param[in] error_msg a detailed error message - @return whether parsing should proceed + @return whether parsing should proceed (must return false) */ virtual bool parse_error(std::size_t position, const std::string& last_token, @@ -225,11 +216,6 @@ class json_sax_dom_parser : public json_sax return true; } - bool binary(const std::vector&) override - { - return true; - } - bool parse_error(std::size_t, const std::string&, const detail::exception& ex) override { @@ -430,11 +416,6 @@ class json_sax_dom_callback_parser : public json_sax return true; } - bool binary(const std::vector&) override - { - return true; - } - bool parse_error(std::size_t, const std::string&, const detail::exception& ex) override { @@ -580,11 +561,6 @@ class json_sax_acceptor : public json_sax return true; } - bool binary(const std::vector&) override - { - return true; - } - bool parse_error(std::size_t, const std::string&, const detail::exception&) override { return false; diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 98cc1b69..20c1b3fe 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -99,7 +99,7 @@ class lexer } } - explicit lexer(detail::input_adapter_t adapter) + explicit lexer(detail::input_adapter_t&& adapter) : ia(std::move(adapter)), decimal_point_char(get_decimal_point()) {} // delete because of pointer members diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 5d389dc6..a38101c9 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -60,10 +60,10 @@ class parser std::function; /// a parser reading from an input adapter - explicit parser(detail::input_adapter_t adapter, + explicit parser(detail::input_adapter_t&& adapter, const parser_callback_t cb = nullptr, const bool allow_exceptions_ = true) - : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) + : callback(cb), m_lexer(std::move(adapter)), allow_exceptions(allow_exceptions_) { // read first token get_token(); @@ -160,19 +160,22 @@ class parser bool accept(const bool strict = true) { json_sax_acceptor sax_acceptor; - - if (not sax_parse_internal(&sax_acceptor)) - { - return false; - } - - // strict => last token must be EOF - return not strict or (get_token() == token_type::end_of_input); + return sax_parse(&sax_acceptor, strict); } - bool sax_parse(json_sax_t* sax) + bool sax_parse(json_sax_t* sax, const bool strict = true) { - return sax_parse_internal(sax); + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result and strict and (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input))); + } + + return result; } private: diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index ff2f7f34..66d0fb37 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -209,6 +209,8 @@ class basic_json /// helper type for initializer lists of basic_json values using initializer_list_t = std::initializer_list>; + using input_format_t = detail::input_format_t; + //////////////// // exceptions // //////////////// @@ -5996,7 +5998,7 @@ class basic_json @since version 2.0.3 (contiguous containers) */ - static basic_json parse(detail::input_adapter i, + static basic_json parse(detail::input_adapter&& i, const parser_callback_t cb = nullptr, const bool allow_exceptions = true) { @@ -6005,36 +6007,23 @@ class basic_json return result; } - /*! - @copydoc basic_json parse(detail::input_adapter, const parser_callback_t) - */ - static basic_json parse(detail::input_adapter& i, - const parser_callback_t cb = nullptr, - const bool allow_exceptions = true) - { - basic_json result; - parser(i, cb, allow_exceptions).parse(true, result); - return result; - } - - static bool accept(detail::input_adapter i) + static bool accept(detail::input_adapter&& i) { return parser(i).accept(true); } - static bool accept(detail::input_adapter& i) + static bool sax_parse(detail::input_adapter&& i, json_sax_t* sax, + input_format_t format = input_format_t::json, + const bool strict = true) { - return parser(i).accept(true); - } - - static bool sax_parse(detail::input_adapter i, json_sax_t* sax) - { - return parser(i).sax_parse(sax); - } - - static bool sax_parse(detail::input_adapter& i, json_sax_t* sax) - { - return parser(i).sax_parse(sax); + assert(sax); + switch (format) + { + case input_format_t::json: + return parser(std::move(i)).sax_parse(sax, strict); + default: + return binary_reader(std::move(i)).sax_parse(format, sax, strict); + } } /*! @@ -6639,13 +6628,13 @@ class basic_json @a strict parameter since 3.0.0; added @allow_exceptions parameter since 3.2.0 */ - static basic_json from_cbor(detail::input_adapter i, + static basic_json from_cbor(detail::input_adapter&& i, const bool strict = true, const bool allow_exceptions = true) { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::cbor, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -6660,7 +6649,7 @@ class basic_json { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(input_format_t::cbor, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -6742,13 +6731,13 @@ class basic_json @a strict parameter since 3.0.0; added @allow_exceptions parameter since 3.2.0 */ - static basic_json from_msgpack(detail::input_adapter i, + static basic_json from_msgpack(detail::input_adapter&& i, const bool strict = true, const bool allow_exceptions = true) { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::msgpack, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -6763,7 +6752,7 @@ class basic_json { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(input_format_t::msgpack, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -6824,13 +6813,13 @@ class basic_json @since version 3.1.0; added @allow_exceptions parameter since 3.2.0 */ - static basic_json from_ubjson(detail::input_adapter i, + static basic_json from_ubjson(detail::input_adapter&& i, const bool strict = true, const bool allow_exceptions = true) { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::ubjson, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -6845,7 +6834,7 @@ class basic_json { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(input_format_t::ubjson, &sdp, strict); return res ? result : basic_json(value_t::discarded); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 67af8de1..55e1e01b 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1593,6 +1593,9 @@ namespace nlohmann { namespace detail { +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson }; + //////////////////// // input adapters // //////////////////// @@ -1938,7 +1941,7 @@ class lexer } } - explicit lexer(detail::input_adapter_t adapter) + explicit lexer(detail::input_adapter_t&& adapter) : ia(std::move(adapter)), decimal_point_char(get_decimal_point()) {} // delete because of pointer members @@ -3242,21 +3245,12 @@ struct json_sax */ virtual bool end_array() = 0; - /*! - @brief a binary value was read - @param[in] val byte vector - @return whether parsing should proceed - @note examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON - array - */ - virtual bool binary(const std::vector& val) = 0; - /*! @brief a parse error occurred @param[in] position the position in the input where the error occurs @param[in] last_token the last read token @param[in] error_msg a detailed error message - @return whether parsing should proceed + @return whether parsing should proceed (must return false) */ virtual bool parse_error(std::size_t position, const std::string& last_token, @@ -3362,11 +3356,6 @@ class json_sax_dom_parser : public json_sax return true; } - bool binary(const std::vector&) override - { - return true; - } - bool parse_error(std::size_t, const std::string&, const detail::exception& ex) override { @@ -3567,11 +3556,6 @@ class json_sax_dom_callback_parser : public json_sax return true; } - bool binary(const std::vector&) override - { - return true; - } - bool parse_error(std::size_t, const std::string&, const detail::exception& ex) override { @@ -3717,11 +3701,6 @@ class json_sax_acceptor : public json_sax return true; } - bool binary(const std::vector&) override - { - return true; - } - bool parse_error(std::size_t, const std::string&, const detail::exception&) override { return false; @@ -3783,10 +3762,10 @@ class parser std::function; /// a parser reading from an input adapter - explicit parser(detail::input_adapter_t adapter, + explicit parser(detail::input_adapter_t&& adapter, const parser_callback_t cb = nullptr, const bool allow_exceptions_ = true) - : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) + : callback(cb), m_lexer(std::move(adapter)), allow_exceptions(allow_exceptions_) { // read first token get_token(); @@ -3883,19 +3862,22 @@ class parser bool accept(const bool strict = true) { json_sax_acceptor sax_acceptor; - - if (not sax_parse_internal(&sax_acceptor)) - { - return false; - } - - // strict => last token must be EOF - return not strict or (get_token() == token_type::end_of_input); + return sax_parse(&sax_acceptor, strict); } - bool sax_parse(json_sax_t* sax) + bool sax_parse(json_sax_t* sax, const bool strict = true) { - return sax_parse_internal(sax); + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result and strict and (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input))); + } + + return result; } private: @@ -5699,9 +5681,6 @@ class binary_reader using json_sax_t = json_sax; public: - /// the supported binary input formats - enum class binary_format_t { cbor, msgpack, ubjson }; - /*! @brief create a binary reader @@ -5719,30 +5698,35 @@ class binary_reader @return */ - bool sax_parse(const binary_format_t format, json_sax_t* sax_, const bool strict) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true) { sax = sax_; bool result; switch (format) { - case binary_format_t::cbor: + case input_format_t::cbor: result = parse_cbor_internal(); break; - case binary_format_t::msgpack: + case input_format_t::msgpack: result = parse_msgpack_internal(); break; - case binary_format_t::ubjson: + case input_format_t::ubjson: result = parse_ubjson_internal(); break; + + default: + assert(false); // LCOV_EXCL_LINE } // strict mode: next byte must be EOF if (result and strict) { - if (format == binary_format_t::ubjson) + if (format == input_format_t::ubjson) { get_ignore_noop(); } @@ -10958,6 +10942,8 @@ class basic_json /// helper type for initializer lists of basic_json values using initializer_list_t = std::initializer_list>; + using input_format_t = detail::input_format_t; + //////////////// // exceptions // //////////////// @@ -16745,7 +16731,7 @@ class basic_json @since version 2.0.3 (contiguous containers) */ - static basic_json parse(detail::input_adapter i, + static basic_json parse(detail::input_adapter&& i, const parser_callback_t cb = nullptr, const bool allow_exceptions = true) { @@ -16754,36 +16740,23 @@ class basic_json return result; } - /*! - @copydoc basic_json parse(detail::input_adapter, const parser_callback_t) - */ - static basic_json parse(detail::input_adapter& i, - const parser_callback_t cb = nullptr, - const bool allow_exceptions = true) - { - basic_json result; - parser(i, cb, allow_exceptions).parse(true, result); - return result; - } - - static bool accept(detail::input_adapter i) + static bool accept(detail::input_adapter&& i) { return parser(i).accept(true); } - static bool accept(detail::input_adapter& i) + static bool sax_parse(detail::input_adapter&& i, json_sax_t* sax, + input_format_t format = input_format_t::json, + const bool strict = true) { - return parser(i).accept(true); - } - - static bool sax_parse(detail::input_adapter i, json_sax_t* sax) - { - return parser(i).sax_parse(sax); - } - - static bool sax_parse(detail::input_adapter& i, json_sax_t* sax) - { - return parser(i).sax_parse(sax); + assert(sax); + switch (format) + { + case input_format_t::json: + return parser(std::move(i)).sax_parse(sax, strict); + default: + return binary_reader(std::move(i)).sax_parse(format, sax, strict); + } } /*! @@ -17388,13 +17361,13 @@ class basic_json @a strict parameter since 3.0.0; added @allow_exceptions parameter since 3.2.0 */ - static basic_json from_cbor(detail::input_adapter i, + static basic_json from_cbor(detail::input_adapter&& i, const bool strict = true, const bool allow_exceptions = true) { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::cbor, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -17409,7 +17382,7 @@ class basic_json { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::cbor, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(input_format_t::cbor, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -17491,13 +17464,13 @@ class basic_json @a strict parameter since 3.0.0; added @allow_exceptions parameter since 3.2.0 */ - static basic_json from_msgpack(detail::input_adapter i, + static basic_json from_msgpack(detail::input_adapter&& i, const bool strict = true, const bool allow_exceptions = true) { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::msgpack, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -17512,7 +17485,7 @@ class basic_json { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::msgpack, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(input_format_t::msgpack, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -17573,13 +17546,13 @@ class basic_json @since version 3.1.0; added @allow_exceptions parameter since 3.2.0 */ - static basic_json from_ubjson(detail::input_adapter i, + static basic_json from_ubjson(detail::input_adapter&& i, const bool strict = true, const bool allow_exceptions = true) { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(i)).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::ubjson, &sdp, strict); return res ? result : basic_json(value_t::discarded); } @@ -17594,7 +17567,7 @@ class basic_json { basic_json result; detail::json_sax_dom_parser sdp(result, allow_exceptions); - const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(binary_reader::binary_format_t::ubjson, &sdp, strict); + const bool res = binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).sax_parse(input_format_t::ubjson, &sdp, strict); return res ? result : basic_json(value_t::discarded); } diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index ba07026a..cd8fb0db 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -33,6 +33,76 @@ using nlohmann::json; #include +class SaxCountdown : public nlohmann::json::json_sax_t +{ + public: + explicit SaxCountdown(const int count) : events_left(count) + {} + + bool null() override + { + return events_left-- > 0; + } + + bool boolean(bool) override + { + return events_left-- > 0; + } + + bool number_integer(json::number_integer_t) override + { + return events_left-- > 0; + } + + bool number_unsigned(json::number_unsigned_t) override + { + return events_left-- > 0; + } + + bool number_float(json::number_float_t, const std::string&) override + { + return events_left-- > 0; + } + + bool string(std::string&&) override + { + return events_left-- > 0; + } + + bool start_object(std::size_t) override + { + return events_left-- > 0; + } + + bool key(std::string&&) override + { + return events_left-- > 0; + } + + bool end_object() override + { + return events_left-- > 0; + } + + bool start_array(std::size_t) override + { + return events_left-- > 0; + } + + bool end_array() override + { + return events_left-- > 0; + } + + bool parse_error(std::size_t, const std::string&, const json::exception&) override + { + return false; + } + + private: + int events_left = 0; +}; + TEST_CASE("CBOR") { SECTION("individual values") @@ -1467,6 +1537,30 @@ TEST_CASE("CBOR") } } } + + SECTION("SAX aborts") + { + SECTION("start_array(len)") + { + std::vector v = {0x83, 0x01, 0x02, 0x03}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::cbor)); + } + + SECTION("start_object(len)") + { + std::vector v = {0xA1, 0x63, 0x66, 0x6F, 0x6F, 0xF4}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::cbor)); + } + + SECTION("key()") + { + std::vector v = {0xA1, 0x63, 0x66, 0x6F, 0x6F, 0xF4}; + SaxCountdown scp(1); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::cbor)); + } + } } // use this testcase outside [hide] to run it with Valgrind diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index c425207a..1e100568 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -117,12 +117,6 @@ class SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool binary(const std::vector&) override - { - events.push_back("binary()"); - return true; - } - bool parse_error(std::size_t position, const std::string&, const json::exception&) override { errored = true; @@ -195,11 +189,6 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool binary(const std::vector&) override - { - return events_left-- > 0; - } - bool parse_error(std::size_t, const std::string&, const json::exception&) override { return false; @@ -248,7 +237,7 @@ bool accept_helper(const std::string& s) // 4. parse with SAX (compare with relaxed accept result) SaxEventLogger el; - CHECK_NOTHROW(json::sax_parse(s, &el)); + CHECK_NOTHROW(json::sax_parse(s, &el, json::input_format_t::json, false)); CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == not el.errored); // 5. parse with simple callback diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 4243e839..5aa3a8b6 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -116,12 +116,6 @@ struct SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool binary(const std::vector&) override - { - events.push_back("binary()"); - return true; - } - bool parse_error(std::size_t position, const std::string&, const json::exception&) override { events.push_back("parse_error(" + std::to_string(position) + ")"); diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index e1c209d9..6974c530 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -33,6 +33,76 @@ using nlohmann::json; #include +class SaxCountdown : public nlohmann::json::json_sax_t +{ + public: + explicit SaxCountdown(const int count) : events_left(count) + {} + + bool null() override + { + return events_left-- > 0; + } + + bool boolean(bool) override + { + return events_left-- > 0; + } + + bool number_integer(json::number_integer_t) override + { + return events_left-- > 0; + } + + bool number_unsigned(json::number_unsigned_t) override + { + return events_left-- > 0; + } + + bool number_float(json::number_float_t, const std::string&) override + { + return events_left-- > 0; + } + + bool string(std::string&&) override + { + return events_left-- > 0; + } + + bool start_object(std::size_t) override + { + return events_left-- > 0; + } + + bool key(std::string&&) override + { + return events_left-- > 0; + } + + bool end_object() override + { + return events_left-- > 0; + } + + bool start_array(std::size_t) override + { + return events_left-- > 0; + } + + bool end_array() override + { + return events_left-- > 0; + } + + bool parse_error(std::size_t, const std::string&, const json::exception&) override + { + return false; + } + + private: + int events_left = 0; +}; + TEST_CASE("MessagePack") { SECTION("individual values") @@ -1200,6 +1270,30 @@ TEST_CASE("MessagePack") } } } + + SECTION("SAX aborts") + { + SECTION("start_array(len)") + { + std::vector v = {0x93, 0x01, 0x02, 0x03}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::msgpack)); + } + + SECTION("start_object(len)") + { + std::vector v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::msgpack)); + } + + SECTION("key()") + { + std::vector v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2}; + SaxCountdown scp(1); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::msgpack)); + } + } } diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 11774268..7f92d969 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -33,6 +33,76 @@ using nlohmann::json; #include +class SaxCountdown : public nlohmann::json::json_sax_t +{ + public: + explicit SaxCountdown(const int count) : events_left(count) + {} + + bool null() override + { + return events_left-- > 0; + } + + bool boolean(bool) override + { + return events_left-- > 0; + } + + bool number_integer(json::number_integer_t) override + { + return events_left-- > 0; + } + + bool number_unsigned(json::number_unsigned_t) override + { + return events_left-- > 0; + } + + bool number_float(json::number_float_t, const std::string&) override + { + return events_left-- > 0; + } + + bool string(std::string&&) override + { + return events_left-- > 0; + } + + bool start_object(std::size_t) override + { + return events_left-- > 0; + } + + bool key(std::string&&) override + { + return events_left-- > 0; + } + + bool end_object() override + { + return events_left-- > 0; + } + + bool start_array(std::size_t) override + { + return events_left-- > 0; + } + + bool end_array() override + { + return events_left-- > 0; + } + + bool parse_error(std::size_t, const std::string&, const json::exception&) override + { + return false; + } + + private: + int events_left = 0; +}; + TEST_CASE("UBJSON") { SECTION("individual values") @@ -1241,6 +1311,51 @@ TEST_CASE("UBJSON") } } + SECTION("SAX aborts") + { + SECTION("start_array()") + { + std::vector v = {'[', 'T', 'F', ']'}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::ubjson)); + } + + SECTION("start_object()") + { + std::vector v = {'{', 'i', 3, 'f', 'o', 'o', 'F', '}'}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::ubjson)); + } + + SECTION("key() in object") + { + std::vector v = {'{', 'i', 3, 'f', 'o', 'o', 'F', '}'}; + SaxCountdown scp(1); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::ubjson)); + } + + SECTION("start_array(len)") + { + std::vector v = {'[', '#', 'i', '2', 'T', 'F'}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::ubjson)); + } + + SECTION("start_object(len)") + { + std::vector v = {'{', '#', 'i', '1', 3, 'f', 'o', 'o', 'F'}; + SaxCountdown scp(0); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::ubjson)); + } + + SECTION("key() in object with length") + { + std::vector v = {'{', 'i', 3, 'f', 'o', 'o', 'F', '}'}; + SaxCountdown scp(1); + CHECK(not json::sax_parse(v, &scp, json::input_format_t::ubjson)); + } + } + SECTION("parsing values") { SECTION("strings") From 2537677e4ca608b667d120f2f136b0f301081a93 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 20 Mar 2018 23:40:01 +0100 Subject: [PATCH 034/156] :white_check_mark: improved test coverage --- test/src/unit-ubjson.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 7f92d969..1ccb9e22 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -1664,6 +1664,16 @@ TEST_CASE("UBJSON") CHECK_THROWS_AS(json::from_ubjson(v3), json::parse_error&); CHECK_THROWS_WITH(json::from_ubjson(v3), "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); CHECK(json::from_ubjson(v3, true, false).is_discarded()); + + std::vector vST1 = {'{', '$', 'd', '#', 'i', 2, 'i', 1, 'a'}; + CHECK_THROWS_AS(json::from_ubjson(vST1), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vST1), "[json.exception.parse_error.110] parse error at 10: unexpected end of input"); + CHECK(json::from_ubjson(vST1, true, false).is_discarded()); + + std::vector vST2 = {'{', '#', 'i', 2, 'i', 1, 'a'}; + CHECK_THROWS_AS(json::from_ubjson(vST2), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vST2), "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); + CHECK(json::from_ubjson(vST2, true, false).is_discarded()); } } From 4f6b2b6429c71ffab9cbd2ce8ac16a734a1a562b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 21 Mar 2018 20:12:06 +0100 Subject: [PATCH 035/156] :hammer: changed SAX interface --- .../nlohmann/detail/input/binary_reader.hpp | 38 +++++----- include/nlohmann/detail/input/json_sax.hpp | 18 ++--- include/nlohmann/detail/input/lexer.hpp | 4 +- include/nlohmann/detail/input/parser.hpp | 12 ++-- single_include/nlohmann/json.hpp | 72 ++++++++++--------- test/src/unit-cbor.cpp | 4 +- test/src/unit-class_parser.cpp | 8 +-- test/src/unit-deserialization.cpp | 6 +- test/src/unit-msgpack.cpp | 4 +- test/src/unit-ubjson.cpp | 8 +-- 10 files changed, 91 insertions(+), 83 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index 0feb6dd4..e4e1f176 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -267,7 +267,7 @@ class binary_reader case 0x7F: // UTF-8 string (indefinite length) { string_t s; - return get_cbor_string(s) and sax->string(std::move(s)); + return get_cbor_string(s) and sax->string(s); } // array (0x00..0x17 data items follow) @@ -663,7 +663,7 @@ class binary_reader case 0xBF: { string_t s; - return get_msgpack_string(s) and sax->string(std::move(s)); + return get_msgpack_string(s) and sax->string(s); } case 0xC0: // nil @@ -740,7 +740,7 @@ class binary_reader case 0xDB: // str 32 { string_t s; - return get_msgpack_string(s) and sax->string(std::move(s)); + return get_msgpack_string(s) and sax->string(s); } case 0xDC: // array 16 @@ -1062,13 +1062,13 @@ class binary_reader return false; } + string_t key; if (len != json_sax_t::no_limit) { for (std::size_t i = 0; i < len; ++i) { get(); - string_t key; - if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(key))) { return false; } @@ -1077,14 +1077,14 @@ class binary_reader { return false; } + key.clear(); } } else { while (get() != 0xFF) { - string_t key; - if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(key))) { return false; } @@ -1093,6 +1093,7 @@ class binary_reader { return false; } + key.clear(); } } @@ -1214,11 +1215,11 @@ class binary_reader return false; } + string_t key; for (std::size_t i = 0; i < len; ++i) { get(); - string_t key; - if (JSON_UNLIKELY(not get_msgpack_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_msgpack_string(key) or not sax->key(key))) { return false; } @@ -1227,6 +1228,7 @@ class binary_reader { return false; } + key.clear(); } return sax->end_object(); @@ -1485,13 +1487,14 @@ class binary_reader auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token)); } - return sax->string(string_t(1, static_cast(current))); + string_t s(1, static_cast(current)); + return sax->string(s); } case 'S': // string { string_t s; - return get_ubjson_string(s) and sax->string(std::move(s)); + return get_ubjson_string(s) and sax->string(s); } case '[': // array @@ -1581,6 +1584,7 @@ class binary_reader return false; } + string_t key; if (size_and_type.first != string_t::npos) { if (JSON_UNLIKELY(not sax->start_object(size_and_type.first))) @@ -1592,8 +1596,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - string_t key; - if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(key))) { return false; } @@ -1601,14 +1604,14 @@ class binary_reader { return false; } + key.clear(); } } else { for (std::size_t i = 0; i < size_and_type.first; ++i) { - string_t key; - if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(key))) { return false; } @@ -1616,6 +1619,7 @@ class binary_reader { return false; } + key.clear(); } } } @@ -1628,8 +1632,7 @@ class binary_reader while (current != '}') { - string_t key; - if (JSON_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(key))) { return false; } @@ -1638,6 +1641,7 @@ class binary_reader return false; } get_ignore_noop(); + key.clear(); } } diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 98479eb9..eb92731f 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -68,7 +68,7 @@ struct json_sax @param[in] val string value @return whether parsing should proceed */ - virtual bool string(string_t&& val) = 0; + virtual bool string(string_t& val) = 0; /*! @brief the beginning of an object was read @@ -83,7 +83,7 @@ struct json_sax @param[in] val object key @return whether parsing should proceed */ - virtual bool key(string_t&& val) = 0; + virtual bool key(string_t& val) = 0; /*! @brief the end of an object was read @@ -165,7 +165,7 @@ class json_sax_dom_parser : public json_sax return true; } - bool string(string_t&& val) override + bool string(string_t& val) override { handle_value(val); return true; @@ -184,7 +184,7 @@ class json_sax_dom_parser : public json_sax return true; } - bool key(string_t&& val) override + bool key(string_t& val) override { // add null at given key and store the reference for later object_element = &(ref_stack.back()->m_value.object->operator[](val)); @@ -340,7 +340,7 @@ class json_sax_dom_callback_parser : public json_sax return true; } - bool string(string_t&& val) override + bool string(string_t& val) override { handle_value(val); return true; @@ -362,9 +362,9 @@ class json_sax_dom_callback_parser : public json_sax return true; } - bool key(string_t&& val) override + bool key(string_t& val) override { - BasicJsonType k = BasicJsonType(std::forward < string_t&& > (val)); + BasicJsonType k = BasicJsonType(val); const bool keep = callback(ref_stack.size(), parse_event_t::key, k); // add null at given key and store the reference for later @@ -531,7 +531,7 @@ class json_sax_acceptor : public json_sax return true; } - bool string(string_t&&) override + bool string(string_t&) override { return true; } @@ -541,7 +541,7 @@ class json_sax_acceptor : public json_sax return true; } - bool key(string_t&&) override + bool key(string_t&) override { return true; } diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 20c1b3fe..1ed35617 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1131,9 +1131,9 @@ scan_number_done: } /// return current string value (implicitly resets the token; useful only once) - string_t&& move_string() + string_t& get_string() { - return std::move(token_buffer); + return token_buffer; } ///////////////////// diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index a38101c9..d8f1ff34 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -239,7 +239,7 @@ class parser { return; } - key = m_lexer.move_string(); + key = m_lexer.get_string(); bool keep_tag = false; if (keep) @@ -375,7 +375,7 @@ class parser case token_type::value_string: { result.m_type = value_t::string; - result.m_value = m_lexer.move_string(); + result.m_value = m_lexer.get_string(); break; } @@ -498,7 +498,7 @@ class parser } else { - if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) { return false; } @@ -560,7 +560,7 @@ class parser } else { - if (JSON_UNLIKELY(not sax->number_float(res, m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->number_float(res, m_lexer.get_string()))) { return false; } @@ -606,7 +606,7 @@ class parser case token_type::value_string: { - if (JSON_UNLIKELY(not sax->string(m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->string(m_lexer.get_string()))) { return false; } @@ -706,7 +706,7 @@ class parser } else { - if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) { return false; } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 55e1e01b..de1f6bfe 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -2973,9 +2973,9 @@ scan_number_done: } /// return current string value (implicitly resets the token; useful only once) - string_t&& move_string() + string_t& get_string() { - return std::move(token_buffer); + return token_buffer; } ///////////////////// @@ -3208,7 +3208,7 @@ struct json_sax @param[in] val string value @return whether parsing should proceed */ - virtual bool string(string_t&& val) = 0; + virtual bool string(string_t& val) = 0; /*! @brief the beginning of an object was read @@ -3223,7 +3223,7 @@ struct json_sax @param[in] val object key @return whether parsing should proceed */ - virtual bool key(string_t&& val) = 0; + virtual bool key(string_t& val) = 0; /*! @brief the end of an object was read @@ -3305,7 +3305,7 @@ class json_sax_dom_parser : public json_sax return true; } - bool string(string_t&& val) override + bool string(string_t& val) override { handle_value(val); return true; @@ -3324,7 +3324,7 @@ class json_sax_dom_parser : public json_sax return true; } - bool key(string_t&& val) override + bool key(string_t& val) override { // add null at given key and store the reference for later object_element = &(ref_stack.back()->m_value.object->operator[](val)); @@ -3480,7 +3480,7 @@ class json_sax_dom_callback_parser : public json_sax return true; } - bool string(string_t&& val) override + bool string(string_t& val) override { handle_value(val); return true; @@ -3502,9 +3502,9 @@ class json_sax_dom_callback_parser : public json_sax return true; } - bool key(string_t&& val) override + bool key(string_t& val) override { - BasicJsonType k = BasicJsonType(std::forward < string_t&& > (val)); + BasicJsonType k = BasicJsonType(val); const bool keep = callback(ref_stack.size(), parse_event_t::key, k); // add null at given key and store the reference for later @@ -3671,7 +3671,7 @@ class json_sax_acceptor : public json_sax return true; } - bool string(string_t&&) override + bool string(string_t&) override { return true; } @@ -3681,7 +3681,7 @@ class json_sax_acceptor : public json_sax return true; } - bool key(string_t&&) override + bool key(string_t&) override { return true; } @@ -3941,7 +3941,7 @@ class parser { return; } - key = m_lexer.move_string(); + key = m_lexer.get_string(); bool keep_tag = false; if (keep) @@ -4077,7 +4077,7 @@ class parser case token_type::value_string: { result.m_type = value_t::string; - result.m_value = m_lexer.move_string(); + result.m_value = m_lexer.get_string(); break; } @@ -4200,7 +4200,7 @@ class parser } else { - if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) { return false; } @@ -4262,7 +4262,7 @@ class parser } else { - if (JSON_UNLIKELY(not sax->number_float(res, m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->number_float(res, m_lexer.get_string()))) { return false; } @@ -4308,7 +4308,7 @@ class parser case token_type::value_string: { - if (JSON_UNLIKELY(not sax->string(m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->string(m_lexer.get_string()))) { return false; } @@ -4408,7 +4408,7 @@ class parser } else { - if (JSON_UNLIKELY(not sax->key(m_lexer.move_string()))) + if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) { return false; } @@ -5907,7 +5907,7 @@ class binary_reader case 0x7F: // UTF-8 string (indefinite length) { string_t s; - return get_cbor_string(s) and sax->string(std::move(s)); + return get_cbor_string(s) and sax->string(s); } // array (0x00..0x17 data items follow) @@ -6303,7 +6303,7 @@ class binary_reader case 0xBF: { string_t s; - return get_msgpack_string(s) and sax->string(std::move(s)); + return get_msgpack_string(s) and sax->string(s); } case 0xC0: // nil @@ -6380,7 +6380,7 @@ class binary_reader case 0xDB: // str 32 { string_t s; - return get_msgpack_string(s) and sax->string(std::move(s)); + return get_msgpack_string(s) and sax->string(s); } case 0xDC: // array 16 @@ -6702,13 +6702,13 @@ class binary_reader return false; } + string_t key; if (len != json_sax_t::no_limit) { for (std::size_t i = 0; i < len; ++i) { get(); - string_t key; - if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(key))) { return false; } @@ -6717,14 +6717,14 @@ class binary_reader { return false; } + key.clear(); } } else { while (get() != 0xFF) { - string_t key; - if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(key))) { return false; } @@ -6733,6 +6733,7 @@ class binary_reader { return false; } + key.clear(); } } @@ -6854,11 +6855,11 @@ class binary_reader return false; } + string_t key; for (std::size_t i = 0; i < len; ++i) { get(); - string_t key; - if (JSON_UNLIKELY(not get_msgpack_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_msgpack_string(key) or not sax->key(key))) { return false; } @@ -6867,6 +6868,7 @@ class binary_reader { return false; } + key.clear(); } return sax->end_object(); @@ -7125,13 +7127,14 @@ class binary_reader auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token)); } - return sax->string(string_t(1, static_cast(current))); + string_t s(1, static_cast(current)); + return sax->string(s); } case 'S': // string { string_t s; - return get_ubjson_string(s) and sax->string(std::move(s)); + return get_ubjson_string(s) and sax->string(s); } case '[': // array @@ -7221,6 +7224,7 @@ class binary_reader return false; } + string_t key; if (size_and_type.first != string_t::npos) { if (JSON_UNLIKELY(not sax->start_object(size_and_type.first))) @@ -7232,8 +7236,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - string_t key; - if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(key))) { return false; } @@ -7241,14 +7244,14 @@ class binary_reader { return false; } + key.clear(); } } else { for (std::size_t i = 0; i < size_and_type.first; ++i) { - string_t key; - if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(key))) { return false; } @@ -7256,6 +7259,7 @@ class binary_reader { return false; } + key.clear(); } } } @@ -7268,8 +7272,7 @@ class binary_reader while (current != '}') { - string_t key; - if (JSON_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(std::move(key)))) + if (JSON_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(key))) { return false; } @@ -7278,6 +7281,7 @@ class binary_reader return false; } get_ignore_noop(); + key.clear(); } } diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index cd8fb0db..29879508 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -64,7 +64,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool string(std::string&&) override + bool string(std::string&) override { return events_left-- > 0; } @@ -74,7 +74,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool key(std::string&&) override + bool key(std::string&) override { return events_left-- > 0; } diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 1e100568..e4cfb536 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -67,7 +67,7 @@ class SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool string(std::string&& val) override + bool string(std::string& val) override { events.push_back("string(" + val + ")"); return true; @@ -86,7 +86,7 @@ class SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool key(std::string&& val) override + bool key(std::string& val) override { events.push_back("key(" + val + ")"); return true; @@ -159,7 +159,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool string(std::string&&) override + bool string(std::string&) override { return events_left-- > 0; } @@ -169,7 +169,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool key(std::string&&) override + bool key(std::string&) override { return events_left-- > 0; } diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 5aa3a8b6..5c9fde5a 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -66,7 +66,7 @@ struct SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool string(std::string&& val) override + bool string(std::string& val) override { events.push_back("string(" + val + ")"); return true; @@ -85,7 +85,7 @@ struct SaxEventLogger : public nlohmann::json::json_sax_t return true; } - bool key(std::string&& val) override + bool key(std::string& val) override { events.push_back("key(" + val + ")"); return true; @@ -143,7 +143,7 @@ struct SaxEventLoggerExitAfterStartObject : public SaxEventLogger struct SaxEventLoggerExitAfterKey : public SaxEventLogger { - bool key(std::string&& val) override + bool key(std::string& val) override { events.push_back("key(" + val + ")"); return false; diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index 6974c530..7789ccb7 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -64,7 +64,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool string(std::string&&) override + bool string(std::string&) override { return events_left-- > 0; } @@ -74,7 +74,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool key(std::string&&) override + bool key(std::string&) override { return events_left-- > 0; } diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 1ccb9e22..380e0f3f 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -64,7 +64,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool string(std::string&&) override + bool string(std::string&) override { return events_left-- > 0; } @@ -74,7 +74,7 @@ class SaxCountdown : public nlohmann::json::json_sax_t return events_left-- > 0; } - bool key(std::string&&) override + bool key(std::string&) override { return events_left-- > 0; } @@ -1668,12 +1668,12 @@ TEST_CASE("UBJSON") std::vector vST1 = {'{', '$', 'd', '#', 'i', 2, 'i', 1, 'a'}; CHECK_THROWS_AS(json::from_ubjson(vST1), json::parse_error&); CHECK_THROWS_WITH(json::from_ubjson(vST1), "[json.exception.parse_error.110] parse error at 10: unexpected end of input"); - CHECK(json::from_ubjson(vST1, true, false).is_discarded()); + CHECK(json::from_ubjson(vST1, true, false).is_discarded()); std::vector vST2 = {'{', '#', 'i', 2, 'i', 1, 'a'}; CHECK_THROWS_AS(json::from_ubjson(vST2), json::parse_error&); CHECK_THROWS_WITH(json::from_ubjson(vST2), "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); - CHECK(json::from_ubjson(vST2, true, false).is_discarded()); + CHECK(json::from_ubjson(vST2, true, false).is_discarded()); } } From a9baab76c27704467df03bcf2a30ec463207b4b4 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 28 Mar 2018 18:20:55 +0200 Subject: [PATCH 036/156] :ambulance: fix for #1021 --- include/nlohmann/detail/exceptions.hpp | 1 + .../nlohmann/detail/output/binary_writer.hpp | 50 +++++++++++++++--- single_include/nlohmann/json.hpp | 51 ++++++++++++++++--- test/src/unit-regression.cpp | 18 +++++++ 4 files changed, 108 insertions(+), 12 deletions(-) diff --git a/include/nlohmann/detail/exceptions.hpp b/include/nlohmann/detail/exceptions.hpp index b73d7b1f..53b38ec8 100644 --- a/include/nlohmann/detail/exceptions.hpp +++ b/include/nlohmann/detail/exceptions.hpp @@ -301,6 +301,7 @@ Exceptions have ids 5xx. name / id | example message | description ------------------------------ | --------------- | ------------------------- json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed. +json.exception.other_error.502 | type for number_float_t is not supported | The template type for a number is not supported for the binary serialization in CBOR, MessagePack or UBJSON. @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error diff --git a/include/nlohmann/detail/output/binary_writer.hpp b/include/nlohmann/detail/output/binary_writer.hpp index 1b15bdaf..13968fed 100644 --- a/include/nlohmann/detail/output/binary_writer.hpp +++ b/include/nlohmann/detail/output/binary_writer.hpp @@ -149,9 +149,19 @@ class binary_writer break; } - case value_t::number_float: // Double-Precision Float + case value_t::number_float: { - oa->write_character(static_cast(0xFB)); + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // Single-Precision Float + oa->write_character(static_cast(0xFA)); + break; + case 8: // Double-Precision Float + oa->write_character(static_cast(0xFB)); + break; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } write_number(j.m_value.number_float); break; } @@ -409,9 +419,19 @@ class binary_writer break; } - case value_t::number_float: // float 64 + case value_t::number_float: { - oa->write_character(static_cast(0xCB)); + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // float 32 + oa->write_character(static_cast(0xCA)); + break; + case 8: // float 64 + oa->write_character(static_cast(0xCB)); + break; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } write_number(j.m_value.number_float); break; } @@ -712,7 +732,17 @@ class binary_writer { if (add_prefix) { - oa->write_character(static_cast('D')); // float64 + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // float 32 + oa->write_character(static_cast('d')); + break; + case 8: // float 64 + oa->write_character(static_cast('D')); + break; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } } write_number(n); } @@ -892,7 +922,15 @@ class binary_writer } case value_t::number_float: - return 'D'; + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // float 32 + return 'd'; + case 8: // float 64 + return 'D'; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } case value_t::string: return 'S'; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 6b6655af..deeb9d5d 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -794,6 +794,7 @@ Exceptions have ids 5xx. name / id | example message | description ------------------------------ | --------------- | ------------------------- json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed. +json.exception.other_error.502 | type for number_float_t is not supported | The template type for a number is not supported for the binary serialization in CBOR, MessagePack or UBJSON. @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error @@ -6357,9 +6358,19 @@ class binary_writer break; } - case value_t::number_float: // Double-Precision Float + case value_t::number_float: { - oa->write_character(static_cast(0xFB)); + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // Single-Precision Float + oa->write_character(static_cast(0xFA)); + break; + case 8: // Double-Precision Float + oa->write_character(static_cast(0xFB)); + break; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } write_number(j.m_value.number_float); break; } @@ -6617,9 +6628,19 @@ class binary_writer break; } - case value_t::number_float: // float 64 + case value_t::number_float: { - oa->write_character(static_cast(0xCB)); + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // float 32 + oa->write_character(static_cast(0xCA)); + break; + case 8: // float 64 + oa->write_character(static_cast(0xCB)); + break; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } write_number(j.m_value.number_float); break; } @@ -6920,7 +6941,17 @@ class binary_writer { if (add_prefix) { - oa->write_character(static_cast('D')); // float64 + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // float 32 + oa->write_character(static_cast('d')); + break; + case 8: // float 64 + oa->write_character(static_cast('D')); + break; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } } write_number(n); } @@ -7100,7 +7131,15 @@ class binary_writer } case value_t::number_float: - return 'D'; + switch (sizeof(typename BasicJsonType::number_float_t)) + { + case 4: // float 32 + return 'd'; + case 8: // float 64 + return 'D'; + default: + JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); + } case value_t::string: return 'S'; diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index c4ca93d9..faa38a14 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -114,6 +114,13 @@ struct nocopy }; } +///////////////////////////////////////////////////////////////////// +// for #1021 +///////////////////////////////////////////////////////////////////// + +using float_json = nlohmann::basic_json; + + TEST_CASE("regression tests") { SECTION("issue #60 - Double quotation mark is not parsed correctly") @@ -1597,4 +1604,15 @@ TEST_CASE("regression tests") auto j = json::parse(geojsonExample, cb, true); CHECK(j == json()); } + + SECTION("issue #1021 - to/from_msgpack only works with standard typization") + { + float_json j = 1000.0; + CHECK(float_json::from_cbor(float_json::to_cbor(j)) == j); + CHECK(float_json::from_msgpack(float_json::to_msgpack(j)) == j); + CHECK(float_json::from_ubjson(float_json::to_ubjson(j)) == j); + + float_json j2 = {1000.0, 2000.0, 3000.0}; + CHECK(float_json::from_ubjson(float_json::to_ubjson(j2, true, true)) == j2); + } } From 73cc5089e33ea950b6677e19ee7ec656c9bcf985 Mon Sep 17 00:00:00 2001 From: Kevin Tonon Date: Tue, 27 Mar 2018 12:51:30 -0400 Subject: [PATCH 037/156] Using target_compile_features to specify C++ 11 standard --- CMakeLists.txt | 4 +++- benchmarks/CMakeLists.txt | 5 +++-- test/CMakeLists.txt | 8 +++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c0acc750..958a129f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0.0) +cmake_minimum_required(VERSION 3.8) ## ## PROJECT @@ -44,6 +44,8 @@ endif() ## add_library(${NLOHMANN_JSON_TARGET_NAME} INTERFACE) +target_compile_features(${NLOHMANN_JSON_TARGET_NAME} INTERFACE cxx_std_11) + target_include_directories( ${NLOHMANN_JSON_TARGET_NAME} INTERFACE diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index c10d44e9..a53812c1 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -1,9 +1,9 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.8) project(JSON_Benchmarks LANGUAGES CXX) # set compiler flags if((CMAKE_CXX_COMPILER_ID MATCHES GNU) OR (CMAKE_CXX_COMPILER_ID MATCHES Clang)) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -flto -DNDEBUG -O3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto -DNDEBUG -O3") endif() # configure Google Benchmarks @@ -23,4 +23,5 @@ file(COPY ${CMAKE_SOURCE_DIR}/../test/data/regression/floats.json # benchmark binary add_executable(json_benchmarks src/benchmarks.cpp) +target_compile_features(json_benchmarks PRIVATE cxx_std_11) target_link_libraries(json_benchmarks benchmark ${CMAKE_THREAD_LIBS_INIT}) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e5f6dc55..c49150ad 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -6,7 +6,7 @@ option(JSON_Coverage "Build test suite with coverage information" OFF) if(JSON_Sanitizer) message(STATUS "Building test suite with Clang sanitizer") if(NOT MSVC) - set(CMAKE_CXX_FLAGS "-std=c++11 -g -O2 -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer") + set(CMAKE_CXX_FLAGS "-g -O2 -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer") endif() endif() @@ -62,11 +62,10 @@ add_library(catch_main OBJECT "src/unit.cpp" ) set_target_properties(catch_main PROPERTIES - CXX_STANDARD 11 - CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" ) +target_compile_features(catch_main PUBLIC cxx_std_11) target_include_directories(catch_main PRIVATE "thirdparty/catch") # https://stackoverflow.com/questions/2368811/how-to-set-warning-level-in-cmake @@ -96,13 +95,12 @@ foreach(file ${files}) add_executable(${testcase} $ ${file}) set_target_properties(${testcase} PROPERTIES - CXX_STANDARD 11 - CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" ) target_compile_definitions(${testcase} PRIVATE CATCH_CONFIG_FAST_COMPILE) + target_compile_features(${testcase} PRIVATE cxx_std_11) target_include_directories(${testcase} PRIVATE "thirdparty/catch") target_include_directories(${testcase} PRIVATE "thirdparty/fifo_map") target_include_directories(${testcase} PRIVATE ${NLOHMANN_JSON_INCLUDE_BUILD_DIR}) From 896a9db461adbad68d025ef07396905ad6e90fb5 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 28 Mar 2018 19:37:21 +0200 Subject: [PATCH 038/156] :hammer: improved code #1021 --- include/nlohmann/detail/exceptions.hpp | 1 - .../nlohmann/detail/output/binary_writer.hpp | 86 +++++++++--------- single_include/nlohmann/json.hpp | 87 +++++++++---------- test/src/unit-regression.cpp | 2 +- 4 files changed, 79 insertions(+), 97 deletions(-) diff --git a/include/nlohmann/detail/exceptions.hpp b/include/nlohmann/detail/exceptions.hpp index 53b38ec8..b73d7b1f 100644 --- a/include/nlohmann/detail/exceptions.hpp +++ b/include/nlohmann/detail/exceptions.hpp @@ -301,7 +301,6 @@ Exceptions have ids 5xx. name / id | example message | description ------------------------------ | --------------- | ------------------------- json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed. -json.exception.other_error.502 | type for number_float_t is not supported | The template type for a number is not supported for the binary serialization in CBOR, MessagePack or UBJSON. @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error diff --git a/include/nlohmann/detail/output/binary_writer.hpp b/include/nlohmann/detail/output/binary_writer.hpp index 13968fed..71e5ec81 100644 --- a/include/nlohmann/detail/output/binary_writer.hpp +++ b/include/nlohmann/detail/output/binary_writer.hpp @@ -151,17 +151,7 @@ class binary_writer case value_t::number_float: { - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // Single-Precision Float - oa->write_character(static_cast(0xFA)); - break; - case 8: // Double-Precision Float - oa->write_character(static_cast(0xFB)); - break; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + oa->write_character(get_cbor_float_prefix(j.m_value.number_float)); write_number(j.m_value.number_float); break; } @@ -421,17 +411,7 @@ class binary_writer case value_t::number_float: { - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // float 32 - oa->write_character(static_cast(0xCA)); - break; - case 8: // float 64 - oa->write_character(static_cast(0xCB)); - break; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + oa->write_character(get_msgpack_float_prefix(j.m_value.number_float)); write_number(j.m_value.number_float); break; } @@ -608,7 +588,7 @@ class binary_writer if (use_type and not j.m_value.array->empty()) { assert(use_count); - const char first_prefix = ubjson_prefix(j.front()); + const CharType first_prefix = ubjson_prefix(j.front()); const bool same_prefix = std::all_of(j.begin() + 1, j.end(), [this, first_prefix](const BasicJsonType & v) { @@ -619,7 +599,7 @@ class binary_writer { prefix_required = false; oa->write_character(static_cast('$')); - oa->write_character(static_cast(first_prefix)); + oa->write_character(first_prefix); } } @@ -653,7 +633,7 @@ class binary_writer if (use_type and not j.m_value.object->empty()) { assert(use_count); - const char first_prefix = ubjson_prefix(j.front()); + const CharType first_prefix = ubjson_prefix(j.front()); const bool same_prefix = std::all_of(j.begin(), j.end(), [this, first_prefix](const BasicJsonType & v) { @@ -664,7 +644,7 @@ class binary_writer { prefix_required = false; oa->write_character(static_cast('$')); - oa->write_character(static_cast(first_prefix)); + oa->write_character(first_prefix); } } @@ -732,17 +712,7 @@ class binary_writer { if (add_prefix) { - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // float 32 - oa->write_character(static_cast('d')); - break; - case 8: // float 64 - oa->write_character(static_cast('D')); - break; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + oa->write_character(get_ubjson_float_prefix(n)); } write_number(n); } @@ -863,7 +833,7 @@ class binary_writer write_number_with_ubjson_prefix. Therefore, we return 'L' for any value that does not fit the previous limits. */ - char ubjson_prefix(const BasicJsonType& j) const noexcept + CharType ubjson_prefix(const BasicJsonType& j) const noexcept { switch (j.type()) { @@ -922,15 +892,7 @@ class binary_writer } case value_t::number_float: - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // float 32 - return 'd'; - case 8: // float 64 - return 'D'; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + return get_ubjson_float_prefix(j.m_value.number_float); case value_t::string: return 'S'; @@ -946,6 +908,36 @@ class binary_writer } } + static constexpr CharType get_cbor_float_prefix(float) + { + return static_cast(0xFA); // Single-Precision Float + } + + static constexpr CharType get_cbor_float_prefix(double) + { + return static_cast(0xFB); // Double-Precision Float + } + + static constexpr CharType get_msgpack_float_prefix(float) + { + return static_cast(0xCA); // float 32 + } + + static constexpr CharType get_msgpack_float_prefix(double) + { + return static_cast(0xCB); // float 64 + } + + static constexpr CharType get_ubjson_float_prefix(float) + { + return 'd'; // float 32 + } + + static constexpr CharType get_ubjson_float_prefix(double) + { + return 'D'; // float 64 + } + private: /// whether we can assume little endianess const bool is_little_endian = binary_reader::little_endianess(); diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index deeb9d5d..b7558aa5 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -794,7 +794,6 @@ Exceptions have ids 5xx. name / id | example message | description ------------------------------ | --------------- | ------------------------- json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed. -json.exception.other_error.502 | type for number_float_t is not supported | The template type for a number is not supported for the binary serialization in CBOR, MessagePack or UBJSON. @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error @@ -6360,17 +6359,7 @@ class binary_writer case value_t::number_float: { - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // Single-Precision Float - oa->write_character(static_cast(0xFA)); - break; - case 8: // Double-Precision Float - oa->write_character(static_cast(0xFB)); - break; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + oa->write_character(get_cbor_float_prefix(j.m_value.number_float)); write_number(j.m_value.number_float); break; } @@ -6630,17 +6619,7 @@ class binary_writer case value_t::number_float: { - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // float 32 - oa->write_character(static_cast(0xCA)); - break; - case 8: // float 64 - oa->write_character(static_cast(0xCB)); - break; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + oa->write_character(get_msgpack_float_prefix(j.m_value.number_float)); write_number(j.m_value.number_float); break; } @@ -6817,7 +6796,7 @@ class binary_writer if (use_type and not j.m_value.array->empty()) { assert(use_count); - const char first_prefix = ubjson_prefix(j.front()); + const CharType first_prefix = ubjson_prefix(j.front()); const bool same_prefix = std::all_of(j.begin() + 1, j.end(), [this, first_prefix](const BasicJsonType & v) { @@ -6828,7 +6807,7 @@ class binary_writer { prefix_required = false; oa->write_character(static_cast('$')); - oa->write_character(static_cast(first_prefix)); + oa->write_character(first_prefix); } } @@ -6862,7 +6841,7 @@ class binary_writer if (use_type and not j.m_value.object->empty()) { assert(use_count); - const char first_prefix = ubjson_prefix(j.front()); + const CharType first_prefix = ubjson_prefix(j.front()); const bool same_prefix = std::all_of(j.begin(), j.end(), [this, first_prefix](const BasicJsonType & v) { @@ -6873,7 +6852,7 @@ class binary_writer { prefix_required = false; oa->write_character(static_cast('$')); - oa->write_character(static_cast(first_prefix)); + oa->write_character(first_prefix); } } @@ -6941,17 +6920,7 @@ class binary_writer { if (add_prefix) { - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // float 32 - oa->write_character(static_cast('d')); - break; - case 8: // float 64 - oa->write_character(static_cast('D')); - break; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + oa->write_character(get_ubjson_float_prefix(n)); } write_number(n); } @@ -7072,7 +7041,7 @@ class binary_writer write_number_with_ubjson_prefix. Therefore, we return 'L' for any value that does not fit the previous limits. */ - char ubjson_prefix(const BasicJsonType& j) const noexcept + CharType ubjson_prefix(const BasicJsonType& j) const noexcept { switch (j.type()) { @@ -7131,15 +7100,7 @@ class binary_writer } case value_t::number_float: - switch (sizeof(typename BasicJsonType::number_float_t)) - { - case 4: // float 32 - return 'd'; - case 8: // float 64 - return 'D'; - default: - JSON_THROW(other_error::create(502, "type for number_float_t is not supported")); - } + return get_ubjson_float_prefix(j.m_value.number_float); case value_t::string: return 'S'; @@ -7155,6 +7116,36 @@ class binary_writer } } + static constexpr CharType get_cbor_float_prefix(float) + { + return static_cast(0xFA); // Single-Precision Float + } + + static constexpr CharType get_cbor_float_prefix(double) + { + return static_cast(0xFB); // Double-Precision Float + } + + static constexpr CharType get_msgpack_float_prefix(float) + { + return static_cast(0xCA); // float 32 + } + + static constexpr CharType get_msgpack_float_prefix(double) + { + return static_cast(0xCB); // float 64 + } + + static constexpr CharType get_ubjson_float_prefix(float) + { + return 'd'; // float 32 + } + + static constexpr CharType get_ubjson_float_prefix(double) + { + return 'D'; // float 64 + } + private: /// whether we can assume little endianess const bool is_little_endian = binary_reader::little_endianess(); diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index faa38a14..01e68957 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -118,7 +118,7 @@ struct nocopy // for #1021 ///////////////////////////////////////////////////////////////////// -using float_json = nlohmann::basic_json; +using float_json = nlohmann::basic_json; TEST_CASE("regression tests") From 5f723bbec65b37b604a7860227e753a58cd97255 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 28 Mar 2018 23:39:39 +0200 Subject: [PATCH 039/156] :hammer: realized callback parser wirh SAX interface #971 --- include/nlohmann/detail/input/json_sax.hpp | 153 +++++-- include/nlohmann/detail/input/parser.hpp | 318 -------------- single_include/nlohmann/json.hpp | 471 ++++++--------------- test/src/unit-ubjson.cpp | 29 ++ 4 files changed, 273 insertions(+), 698 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index eb92731f..0bc628cc 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -242,7 +242,7 @@ class json_sax_dom_parser : public json_sax return false; } - bool is_errored() const + constexpr bool is_errored() const { return errored; } @@ -303,7 +303,7 @@ class json_sax_dom_callback_parser : public json_sax using parse_event_t = typename BasicJsonType::parse_event_t; json_sax_dom_callback_parser(BasicJsonType& r, - const parser_callback_t cb = nullptr, + const parser_callback_t cb, const bool allow_exceptions_ = true) : root(r), callback(cb), allow_exceptions(allow_exceptions_) { @@ -348,15 +348,21 @@ class json_sax_dom_callback_parser : public json_sax bool start_object(std::size_t len) override { - const bool keep = callback(ref_stack.size() + 1, parse_event_t::object_start, discarded); + // check callback for object start + const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::object_start, discarded); keep_stack.push_back(keep); - ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + auto val = handle_value(BasicJsonType::value_t::object); + ref_stack.push_back(val.second); - if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + // check object limit + if (ref_stack.back()) { - JSON_THROW(out_of_range::create(408, - "excessive object size: " + std::to_string(len))); + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive object size: " + std::to_string(len))); + } } return true; @@ -365,38 +371,73 @@ class json_sax_dom_callback_parser : public json_sax bool key(string_t& val) override { BasicJsonType k = BasicJsonType(val); - const bool keep = callback(ref_stack.size(), parse_event_t::key, k); - // add null at given key and store the reference for later - object_element = &(ref_stack.back()->m_value.object->operator[](val)); + // check callback for key + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep and ref_stack.back()) + { + object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); + } + return true; } bool end_object() override { - const bool keep = callback(ref_stack.size() - 1, parse_event_t::object_end, *ref_stack.back()); - if (not keep) + bool keep = true; + if (ref_stack.back()) { - // discard object - *ref_stack.back() = discarded; + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()); + if (not keep) + { + // discard object + *ref_stack.back() = discarded; + } } + assert(not ref_stack.empty()); + assert(not keep_stack.empty()); ref_stack.pop_back(); keep_stack.pop_back(); + + if (not ref_stack.empty() and ref_stack.back()) + { + // remove discarded value + if (ref_stack.back()->is_object()) + { + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + } + return true; } bool start_array(std::size_t len) override { - const bool keep = callback(ref_stack.size() + 1, parse_event_t::array_start, discarded); + const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::array_start, discarded); keep_stack.push_back(keep); - ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + auto val = handle_value(BasicJsonType::value_t::array); + ref_stack.push_back(val.second); - if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + // check array limit + if (ref_stack.back()) { - JSON_THROW(out_of_range::create(408, - "excessive array size: " + std::to_string(len))); + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive array size: " + std::to_string(len))); + } } return true; @@ -404,15 +445,32 @@ class json_sax_dom_callback_parser : public json_sax bool end_array() override { - const bool keep = callback(ref_stack.size() - 1, parse_event_t::array_end, *ref_stack.back()); - if (not keep) + bool keep = true; + + if (ref_stack.back()) { - // discard array - *ref_stack.back() = discarded; + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (not keep) + { + // discard array + *ref_stack.back() = discarded; + } } + assert(not ref_stack.empty()); + assert(not keep_stack.empty()); ref_stack.pop_back(); keep_stack.pop_back(); + + // remove discarded value + if (not keep and not ref_stack.empty()) + { + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->pop_back(); + } + } + return true; } @@ -442,7 +500,7 @@ class json_sax_dom_callback_parser : public json_sax return false; } - bool is_errored() const + constexpr bool is_errored() const { return errored; } @@ -453,28 +511,59 @@ class json_sax_dom_callback_parser : public json_sax root. @invariant If the ref stack contains a value, then it is an array or an object to which we can add elements + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) */ template - BasicJsonType* handle_value(Value&& v) + std::pair handle_value(Value&& v) { + assert(not keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (not keep_stack.back()) + { + return {false, nullptr}; + } + + // create value and check callback + auto value = BasicJsonType(std::forward(v)); + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (not keep) + { + return {false, nullptr}; + } + if (ref_stack.empty()) { - root = BasicJsonType(std::forward(v)); - return &root; + root = std::move(value); + return {true, &root}; } else { assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); if (ref_stack.back()->is_array()) { - ref_stack.back()->m_value.array->emplace_back(std::forward(v)); - return &(ref_stack.back()->m_value.array->back()); + ref_stack.back()->m_value.array->push_back(std::move(value)); + return {true, &(ref_stack.back()->m_value.array->back())}; } else { + // check if we should store an element for the current key + assert(not key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (not store_element) + { + return {false, nullptr}; + } + assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; + *object_element = std::move(value); + return {true, object_element}; } } } @@ -485,6 +574,8 @@ class json_sax_dom_callback_parser : public json_sax std::vector ref_stack; /// stack to manage which values to keep std::vector keep_stack; + /// stack to manage which object keys to keep + std::vector key_keep_stack; /// helper to hold the reference for the next object element BasicJsonType* object_element = nullptr; /// whether a syntax error occurred diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index d8f1ff34..de16ef05 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -83,7 +83,6 @@ class parser { if (callback) { - /* json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); sax_parse_internal(&sdp); result.assert_invariant(); @@ -102,24 +101,6 @@ class parser result = value_t::discarded; return; } - */ - - parse_internal(true, result); - result.assert_invariant(); - - // in strict mode, input must be completely read - if (strict) - { - get_token(); - expect(token_type::end_of_input); - } - - // in case of an error, return discarded value - if (errored) - { - result = value_t::discarded; - return; - } // set top-level value to null if it was discarded by the callback // function @@ -179,280 +160,6 @@ class parser } private: - /*! - @brief the actual parser - @throw parse_error.101 in case of an unexpected token - @throw parse_error.102 if to_unicode fails or surrogate error - @throw parse_error.103 if to_unicode fails - */ - void parse_internal(bool keep, BasicJsonType& result) - { - // never parse after a parse error was detected - assert(not errored); - // this function is only called when a callback is given - assert(callback); - - // start with a discarded value - if (not result.is_discarded()) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - - switch (last_token) - { - case token_type::begin_object: - { - if (keep) - { - keep = callback(depth++, parse_event_t::object_start, result); - - if (keep) - { - // explicitly set result to object to cope with {} - result.m_type = value_t::object; - result.m_value = value_t::object; - } - } - - // read next token - get_token(); - - // closing } -> we are done - if (last_token == token_type::end_object) - { - if (keep and not callback(--depth, parse_event_t::object_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - // parse values - string_t key; - BasicJsonType value; - while (true) - { - // store key - if (not expect(token_type::value_string)) - { - return; - } - key = m_lexer.get_string(); - - bool keep_tag = false; - if (keep) - { - BasicJsonType k(key); - keep_tag = callback(depth, parse_event_t::key, k); - } - - // parse separator (:) - get_token(); - if (not expect(token_type::name_separator)) - { - return; - } - - // parse and add value - get_token(); - value.m_value.destroy(value.m_type); - value.m_type = value_t::discarded; - parse_internal(keep, value); - - if (JSON_UNLIKELY(errored)) - { - return; - } - - if (keep and keep_tag and not value.is_discarded()) - { - result.m_value.object->emplace(std::move(key), std::move(value)); - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing } - if (not expect(token_type::end_object)) - { - return; - } - break; - } - - if (keep and not callback(--depth, parse_event_t::object_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - case token_type::begin_array: - { - if (keep) - { - keep = callback(depth++, parse_event_t::array_start, result); - - if (keep) - { - // explicitly set result to array to cope with [] - result.m_type = value_t::array; - result.m_value = value_t::array; - } - } - - // read next token - get_token(); - - // closing ] -> we are done - if (last_token == token_type::end_array) - { - if (not callback(--depth, parse_event_t::array_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - // parse values - BasicJsonType value; - while (true) - { - // parse value - value.m_value.destroy(value.m_type); - value.m_type = value_t::discarded; - parse_internal(keep, value); - - if (JSON_UNLIKELY(errored)) - { - return; - } - - if (keep and not value.is_discarded()) - { - result.m_value.array->push_back(std::move(value)); - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing ] - if (not expect(token_type::end_array)) - { - return; - } - break; - } - - if (keep and not callback(--depth, parse_event_t::array_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - case token_type::literal_null: - { - result.m_type = value_t::null; - break; - } - - case token_type::value_string: - { - result.m_type = value_t::string; - result.m_value = m_lexer.get_string(); - break; - } - - case token_type::literal_true: - { - result.m_type = value_t::boolean; - result.m_value = true; - break; - } - - case token_type::literal_false: - { - result.m_type = value_t::boolean; - result.m_value = false; - break; - } - - case token_type::value_unsigned: - { - result.m_type = value_t::number_unsigned; - result.m_value = m_lexer.get_number_unsigned(); - break; - } - - case token_type::value_integer: - { - result.m_type = value_t::number_integer; - result.m_value = m_lexer.get_number_integer(); - break; - } - - case token_type::value_float: - { - result.m_type = value_t::number_float; - result.m_value = m_lexer.get_number_float(); - - // throw in case of infinity or NAN - if (JSON_UNLIKELY(not std::isfinite(result.m_value.number_float))) - { - if (allow_exceptions) - { - JSON_THROW(out_of_range::create(406, "number overflow parsing '" + - m_lexer.get_token_string() + "'")); - } - expect(token_type::uninitialized); - } - break; - } - - case token_type::parse_error: - { - // using "uninitialized" to avoid "expected" message - if (not expect(token_type::uninitialized)) - { - return; - } - break; // LCOV_EXCL_LINE - } - - default: - { - // the last token was unexpected; we expected a value - if (not expect(token_type::literal_or_value)) - { - return; - } - break; // LCOV_EXCL_LINE - } - } - - if (keep and not callback(depth, parse_event_t::value, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - } - bool sax_parse_internal(json_sax_t* sax) { // two values for the structured values @@ -762,27 +469,6 @@ class parser return (last_token = m_lexer.scan()); } - /*! - @throw parse_error.101 if expected token did not occur - */ - bool expect(token_type t) - { - if (JSON_UNLIKELY(t != last_token)) - { - errored = true; - if (allow_exceptions) - { - JSON_THROW(parse_error::create(101, m_lexer.get_position(), exception_message(t))); - } - else - { - return false; - } - } - - return true; - } - std::string exception_message(const token_type expected) { std::string error_msg = "syntax error - "; @@ -805,16 +491,12 @@ class parser } private: - /// current level of recursion - int depth = 0; /// callback function const parser_callback_t callback = nullptr; /// the type of the last read token token_type last_token = token_type::uninitialized; /// the lexer lexer_t m_lexer; - /// whether a syntax error occurred - bool errored = false; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; }; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index de1f6bfe..6fb619d6 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3382,7 +3382,7 @@ class json_sax_dom_parser : public json_sax return false; } - bool is_errored() const + constexpr bool is_errored() const { return errored; } @@ -3443,7 +3443,7 @@ class json_sax_dom_callback_parser : public json_sax using parse_event_t = typename BasicJsonType::parse_event_t; json_sax_dom_callback_parser(BasicJsonType& r, - const parser_callback_t cb = nullptr, + const parser_callback_t cb, const bool allow_exceptions_ = true) : root(r), callback(cb), allow_exceptions(allow_exceptions_) { @@ -3488,15 +3488,21 @@ class json_sax_dom_callback_parser : public json_sax bool start_object(std::size_t len) override { - const bool keep = callback(ref_stack.size() + 1, parse_event_t::object_start, discarded); + // check callback for object start + const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::object_start, discarded); keep_stack.push_back(keep); - ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + auto val = handle_value(BasicJsonType::value_t::object); + ref_stack.push_back(val.second); - if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + // check object limit + if (ref_stack.back()) { - JSON_THROW(out_of_range::create(408, - "excessive object size: " + std::to_string(len))); + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive object size: " + std::to_string(len))); + } } return true; @@ -3505,38 +3511,73 @@ class json_sax_dom_callback_parser : public json_sax bool key(string_t& val) override { BasicJsonType k = BasicJsonType(val); - const bool keep = callback(ref_stack.size(), parse_event_t::key, k); - // add null at given key and store the reference for later - object_element = &(ref_stack.back()->m_value.object->operator[](val)); + // check callback for key + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep and ref_stack.back()) + { + object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); + } + return true; } bool end_object() override { - const bool keep = callback(ref_stack.size() - 1, parse_event_t::object_end, *ref_stack.back()); - if (not keep) + bool keep = true; + if (ref_stack.back()) { - // discard object - *ref_stack.back() = discarded; + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()); + if (not keep) + { + // discard object + *ref_stack.back() = discarded; + } } + assert(not ref_stack.empty()); + assert(not keep_stack.empty()); ref_stack.pop_back(); keep_stack.pop_back(); + + if (not ref_stack.empty() and ref_stack.back()) + { + // remove discarded value + if (ref_stack.back()->is_object()) + { + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + } + return true; } bool start_array(std::size_t len) override { - const bool keep = callback(ref_stack.size() + 1, parse_event_t::array_start, discarded); + const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::array_start, discarded); keep_stack.push_back(keep); - ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + auto val = handle_value(BasicJsonType::value_t::array); + ref_stack.push_back(val.second); - if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + // check array limit + if (ref_stack.back()) { - JSON_THROW(out_of_range::create(408, - "excessive array size: " + std::to_string(len))); + if (JSON_UNLIKELY(len != json_sax::no_limit and len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, + "excessive array size: " + std::to_string(len))); + } } return true; @@ -3544,15 +3585,32 @@ class json_sax_dom_callback_parser : public json_sax bool end_array() override { - const bool keep = callback(ref_stack.size() - 1, parse_event_t::array_end, *ref_stack.back()); - if (not keep) + bool keep = true; + + if (ref_stack.back()) { - // discard array - *ref_stack.back() = discarded; + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (not keep) + { + // discard array + *ref_stack.back() = discarded; + } } + assert(not ref_stack.empty()); + assert(not keep_stack.empty()); ref_stack.pop_back(); keep_stack.pop_back(); + + // remove discarded value + if (not keep and not ref_stack.empty()) + { + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->pop_back(); + } + } + return true; } @@ -3582,7 +3640,7 @@ class json_sax_dom_callback_parser : public json_sax return false; } - bool is_errored() const + constexpr bool is_errored() const { return errored; } @@ -3593,28 +3651,59 @@ class json_sax_dom_callback_parser : public json_sax root. @invariant If the ref stack contains a value, then it is an array or an object to which we can add elements + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) */ template - BasicJsonType* handle_value(Value&& v) + std::pair handle_value(Value&& v) { + assert(not keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (not keep_stack.back()) + { + return {false, nullptr}; + } + + // create value and check callback + auto value = BasicJsonType(std::forward(v)); + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (not keep) + { + return {false, nullptr}; + } + if (ref_stack.empty()) { - root = BasicJsonType(std::forward(v)); - return &root; + root = std::move(value); + return {true, &root}; } else { assert(ref_stack.back()->is_array() or ref_stack.back()->is_object()); if (ref_stack.back()->is_array()) { - ref_stack.back()->m_value.array->emplace_back(std::forward(v)); - return &(ref_stack.back()->m_value.array->back()); + ref_stack.back()->m_value.array->push_back(std::move(value)); + return {true, &(ref_stack.back()->m_value.array->back())}; } else { + // check if we should store an element for the current key + assert(not key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (not store_element) + { + return {false, nullptr}; + } + assert(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; + *object_element = std::move(value); + return {true, object_element}; } } } @@ -3625,6 +3714,8 @@ class json_sax_dom_callback_parser : public json_sax std::vector ref_stack; /// stack to manage which values to keep std::vector keep_stack; + /// stack to manage which object keys to keep + std::vector key_keep_stack; /// helper to hold the reference for the next object element BasicJsonType* object_element = nullptr; /// whether a syntax error occurred @@ -3785,7 +3876,6 @@ class parser { if (callback) { - /* json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); sax_parse_internal(&sdp); result.assert_invariant(); @@ -3804,24 +3894,6 @@ class parser result = value_t::discarded; return; } - */ - - parse_internal(true, result); - result.assert_invariant(); - - // in strict mode, input must be completely read - if (strict) - { - get_token(); - expect(token_type::end_of_input); - } - - // in case of an error, return discarded value - if (errored) - { - result = value_t::discarded; - return; - } // set top-level value to null if it was discarded by the callback // function @@ -3881,280 +3953,6 @@ class parser } private: - /*! - @brief the actual parser - @throw parse_error.101 in case of an unexpected token - @throw parse_error.102 if to_unicode fails or surrogate error - @throw parse_error.103 if to_unicode fails - */ - void parse_internal(bool keep, BasicJsonType& result) - { - // never parse after a parse error was detected - assert(not errored); - // this function is only called when a callback is given - assert(callback); - - // start with a discarded value - if (not result.is_discarded()) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - - switch (last_token) - { - case token_type::begin_object: - { - if (keep) - { - keep = callback(depth++, parse_event_t::object_start, result); - - if (keep) - { - // explicitly set result to object to cope with {} - result.m_type = value_t::object; - result.m_value = value_t::object; - } - } - - // read next token - get_token(); - - // closing } -> we are done - if (last_token == token_type::end_object) - { - if (keep and not callback(--depth, parse_event_t::object_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - // parse values - string_t key; - BasicJsonType value; - while (true) - { - // store key - if (not expect(token_type::value_string)) - { - return; - } - key = m_lexer.get_string(); - - bool keep_tag = false; - if (keep) - { - BasicJsonType k(key); - keep_tag = callback(depth, parse_event_t::key, k); - } - - // parse separator (:) - get_token(); - if (not expect(token_type::name_separator)) - { - return; - } - - // parse and add value - get_token(); - value.m_value.destroy(value.m_type); - value.m_type = value_t::discarded; - parse_internal(keep, value); - - if (JSON_UNLIKELY(errored)) - { - return; - } - - if (keep and keep_tag and not value.is_discarded()) - { - result.m_value.object->emplace(std::move(key), std::move(value)); - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing } - if (not expect(token_type::end_object)) - { - return; - } - break; - } - - if (keep and not callback(--depth, parse_event_t::object_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - case token_type::begin_array: - { - if (keep) - { - keep = callback(depth++, parse_event_t::array_start, result); - - if (keep) - { - // explicitly set result to array to cope with [] - result.m_type = value_t::array; - result.m_value = value_t::array; - } - } - - // read next token - get_token(); - - // closing ] -> we are done - if (last_token == token_type::end_array) - { - if (not callback(--depth, parse_event_t::array_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - // parse values - BasicJsonType value; - while (true) - { - // parse value - value.m_value.destroy(value.m_type); - value.m_type = value_t::discarded; - parse_internal(keep, value); - - if (JSON_UNLIKELY(errored)) - { - return; - } - - if (keep and not value.is_discarded()) - { - result.m_value.array->push_back(std::move(value)); - } - - // comma -> next value - get_token(); - if (last_token == token_type::value_separator) - { - get_token(); - continue; - } - - // closing ] - if (not expect(token_type::end_array)) - { - return; - } - break; - } - - if (keep and not callback(--depth, parse_event_t::array_end, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - break; - } - - case token_type::literal_null: - { - result.m_type = value_t::null; - break; - } - - case token_type::value_string: - { - result.m_type = value_t::string; - result.m_value = m_lexer.get_string(); - break; - } - - case token_type::literal_true: - { - result.m_type = value_t::boolean; - result.m_value = true; - break; - } - - case token_type::literal_false: - { - result.m_type = value_t::boolean; - result.m_value = false; - break; - } - - case token_type::value_unsigned: - { - result.m_type = value_t::number_unsigned; - result.m_value = m_lexer.get_number_unsigned(); - break; - } - - case token_type::value_integer: - { - result.m_type = value_t::number_integer; - result.m_value = m_lexer.get_number_integer(); - break; - } - - case token_type::value_float: - { - result.m_type = value_t::number_float; - result.m_value = m_lexer.get_number_float(); - - // throw in case of infinity or NAN - if (JSON_UNLIKELY(not std::isfinite(result.m_value.number_float))) - { - if (allow_exceptions) - { - JSON_THROW(out_of_range::create(406, "number overflow parsing '" + - m_lexer.get_token_string() + "'")); - } - expect(token_type::uninitialized); - } - break; - } - - case token_type::parse_error: - { - // using "uninitialized" to avoid "expected" message - if (not expect(token_type::uninitialized)) - { - return; - } - break; // LCOV_EXCL_LINE - } - - default: - { - // the last token was unexpected; we expected a value - if (not expect(token_type::literal_or_value)) - { - return; - } - break; // LCOV_EXCL_LINE - } - } - - if (keep and not callback(depth, parse_event_t::value, result)) - { - result.m_value.destroy(result.m_type); - result.m_type = value_t::discarded; - } - } - bool sax_parse_internal(json_sax_t* sax) { // two values for the structured values @@ -4464,27 +4262,6 @@ class parser return (last_token = m_lexer.scan()); } - /*! - @throw parse_error.101 if expected token did not occur - */ - bool expect(token_type t) - { - if (JSON_UNLIKELY(t != last_token)) - { - errored = true; - if (allow_exceptions) - { - JSON_THROW(parse_error::create(101, m_lexer.get_position(), exception_message(t))); - } - else - { - return false; - } - } - - return true; - } - std::string exception_message(const token_type expected) { std::string error_msg = "syntax error - "; @@ -4507,16 +4284,12 @@ class parser } private: - /// current level of recursion - int depth = 0; /// callback function const parser_callback_t callback = nullptr; /// the type of the last read token token_type last_token = token_type::uninitialized; /// the lexer lexer_t m_lexer; - /// whether a syntax error occurred - bool errored = false; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; }; diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 380e0f3f..791668ff 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -1309,6 +1309,35 @@ TEST_CASE("UBJSON") CHECK_THROWS_AS(json::to_ubjson(j), json::out_of_range&); CHECK_THROWS_WITH(json::to_ubjson(j), "[json.exception.out_of_range.407] number overflow serializing 9223372036854775808"); } + + SECTION("excessive size") + { + SECTION("array") + { + std::vector v_ubjson = {'[', '$', 'Z', '#', 'L', 0x78, 0x28, 0x00, 0x68, 0x28, 0x69, 0x69, 0x17}; + CHECK_THROWS_AS(json::from_ubjson(v_ubjson), json::out_of_range&); + + json j; + nlohmann::detail::json_sax_dom_callback_parser scp(j, [](int, json::parse_event_t, const json&) + { + return true; + }); + CHECK_THROWS_AS(json::sax_parse(v_ubjson, &scp, json::input_format_t::ubjson), json::out_of_range&); + } + + SECTION("object") + { + std::vector v_ubjson = {'{', '$', 'Z', '#', 'L', 0x78, 0x28, 0x00, 0x68, 0x28, 0x69, 0x69, 0x17}; + CHECK_THROWS_AS(json::from_ubjson(v_ubjson), json::out_of_range&); + + json j; + nlohmann::detail::json_sax_dom_callback_parser scp(j, [](int, json::parse_event_t, const json&) + { + return true; + }); + CHECK_THROWS_AS(json::sax_parse(v_ubjson, &scp, json::input_format_t::ubjson), json::out_of_range&); + } + } } SECTION("SAX aborts") From 53d8d57921630d9dbb7b8701cbeda724bfbc4850 Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Thu, 29 Mar 2018 01:03:36 -0400 Subject: [PATCH 040/156] Amalgamate single include --- single_include/nlohmann/json.hpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 10a50a58..498ba880 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1321,6 +1321,16 @@ struct external_constructor j.m_value = std::move(s); j.assert_invariant(); } + + template::value, + int> = 0> + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } }; template<> @@ -12470,9 +12480,6 @@ class basic_json not detail::is_basic_json::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value -#endif -#if defined(JSON_HAS_CPP_17) - and not std::is_same::value #endif , int >::type = 0 > operator ValueType() const From c78dbc366c818a9ae7358e13a52c2abe82bf98eb Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Thu, 29 Mar 2018 01:03:57 -0400 Subject: [PATCH 041/156] Added test for conversion to string_view --- test/src/unit-conversions.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index d67f5acb..0b4bd912 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -39,6 +39,10 @@ using nlohmann::json; #include #include +#if defined(JSON_HAS_CPP_17) +#include +#endif + TEST_CASE("value conversion") { SECTION("get an object (explicit)") @@ -292,6 +296,13 @@ TEST_CASE("value conversion") std::string s = j.get(); CHECK(json(s) == j); } +#if defined(JSON_HAS_CPP_17) + SECTION("std::string_view") + { + std::string_view s = j.get(); + CHECK(json(s) == j); + } +#endif SECTION("exception in case of a non-string type") { @@ -331,6 +342,14 @@ TEST_CASE("value conversion") CHECK(json(s) == j); } +#if defined(JSON_HAS_CPP_17) + SECTION("std::string_view") + { + std::string_view s = j; + CHECK(json(s) == j); + } +#endif + SECTION("std::string") { std::string s = j; From 830c93fd09aa5c30e42bc6918ecc37d947fa9a24 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 29 Mar 2018 17:07:55 +0200 Subject: [PATCH 042/156] :memo: fixed example for operator> #1029 --- doc/examples/operator__greater.cpp | 8 ++++---- doc/examples/operator__greater.link | 2 +- doc/examples/operator__greater.output | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/examples/operator__greater.cpp b/doc/examples/operator__greater.cpp index c632387c..65bb9c04 100644 --- a/doc/examples/operator__greater.cpp +++ b/doc/examples/operator__greater.cpp @@ -17,8 +17,8 @@ int main() // output values and comparisons std::cout << std::boolalpha; - std::cout << array_1 << " == " << array_2 << " " << (array_1 > array_2) << '\n'; - std::cout << object_1 << " == " << object_2 << " " << (object_1 > object_2) << '\n'; - std::cout << number_1 << " == " << number_2 << " " << (number_1 > number_2) << '\n'; - std::cout << string_1 << " == " << string_2 << " " << (string_1 > string_2) << '\n'; + std::cout << array_1 << " > " << array_2 << " " << (array_1 > array_2) << '\n'; + std::cout << object_1 << " > " << object_2 << " " << (object_1 > object_2) << '\n'; + std::cout << number_1 << " > " << number_2 << " " << (number_1 > number_2) << '\n'; + std::cout << string_1 << " > " << string_2 << " " << (string_1 > string_2) << '\n'; } diff --git a/doc/examples/operator__greater.link b/doc/examples/operator__greater.link index 3fc848ea..c59a48a1 100644 --- a/doc/examples/operator__greater.link +++ b/doc/examples/operator__greater.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__greater.output b/doc/examples/operator__greater.output index 045847c3..910c48e3 100644 --- a/doc/examples/operator__greater.output +++ b/doc/examples/operator__greater.output @@ -1,4 +1,4 @@ -[1,2,3] == [1,2,4] false -{"A":"a","B":"b"} == {"A":"a","B":"b"} false -17 == 17.0000000000001 false -"foo" == "bar" true +[1,2,3] > [1,2,4] false +{"A":"a","B":"b"} > {"A":"a","B":"b"} false +17 > 17.0000000000001 false +"foo" > "bar" true From 4efa8cdb4c7ae03674da7a29e1d70ae067836643 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 29 Mar 2018 17:19:21 +0200 Subject: [PATCH 043/156] :green_heart: fixed Valgrind options #1030 --- test/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e5f6dc55..9da2c80d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -13,8 +13,7 @@ endif() if(JSON_Valgrind) find_program(CMAKE_MEMORYCHECK_COMMAND valgrind) message(STATUS "Executing test suite with Valgrind (${CMAKE_MEMORYCHECK_COMMAND})") - set(MEMORYCHECK_COMMAND_OPTIONS "--error-exitcode=1 --leak-check=full") - set(memcheck_command "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}") + set(memcheck_command "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS} --error-exitcode=1 --leak-check=full") separate_arguments(memcheck_command) endif() From 850671b9f1adab7bd1ec1779ce9ca29bd66b904d Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 29 Mar 2018 18:45:43 +0200 Subject: [PATCH 044/156] :hammer: using a vector for the parser hierarchy --- include/nlohmann/detail/input/parser.hpp | 173 +++++++++++------------ single_include/nlohmann/json.hpp | 173 +++++++++++------------ 2 files changed, 166 insertions(+), 180 deletions(-) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index de16ef05..67c94464 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -162,10 +162,9 @@ class parser private: bool sax_parse_internal(json_sax_t* sax) { - // two values for the structured values - enum class parse_state_t { array_value, object_value }; // stack to remember the hieararchy of structured values we are parsing - std::vector states; + // true = array; false = object + std::vector states; // value to avoid a goto (see comment where set to true) bool skip_to_state_evaluation = false; @@ -221,7 +220,7 @@ class parser } // remember we are now inside an object - states.push_back(parse_state_t::object_value); + states.push_back(false); // parse values get_token(); @@ -249,7 +248,7 @@ class parser } // remember we are now inside an array - states.push_back(parse_state_t::array_value); + states.push_back(true); // parse values (no need to call get_token) continue; @@ -359,104 +358,98 @@ class parser else { get_token(); - switch (states.back()) + if (states.back()) // array { - case parse_state_t::array_value: + // comma -> next value + if (last_token == token_type::value_separator) { - // comma -> next value - if (last_token == token_type::value_separator) - { - // parse a new value - get_token(); - continue; - } - - // closing ] - if (JSON_LIKELY(last_token == token_type::end_array)) - { - if (JSON_UNLIKELY(not sax->end_array())) - { - return false; - } - - // We are done with this array. Before we can parse - // a new value, we need to evaluate the new state - // first. By setting skip_to_state_evaluation to - // false, we are effectively jumping to the - // beginning of this switch. - assert(not states.empty()); - states.pop_back(); - skip_to_state_evaluation = true; - continue; - } - else - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); - } + // parse a new value + get_token(); + continue; } - case parse_state_t::object_value: + // closing ] + if (JSON_LIKELY(last_token == token_type::end_array)) { - // comma -> next value - if (last_token == token_type::value_separator) + if (JSON_UNLIKELY(not sax->end_array())) { - get_token(); - - // parse key - if (JSON_UNLIKELY(last_token != token_type::value_string)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); - } - else - { - if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) - { - return false; - } - } - - // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); - } - - // parse values - get_token(); - continue; + return false; } - // closing } - if (JSON_LIKELY(last_token == token_type::end_object)) - { - if (JSON_UNLIKELY(not sax->end_object())) - { - return false; - } + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + assert(not states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); + } + } + else // object + { + // comma -> next value + if (last_token == token_type::value_separator) + { + get_token(); - // We are done with this object. Before we can - // parse a new value, we need to evaluate the new - // state first. By setting skip_to_state_evaluation - // to false, we are effectively jumping to the - // beginning of this switch. - assert(not states.empty()); - states.pop_back(); - skip_to_state_evaluation = true; - continue; - } - else + // parse key + if (JSON_UNLIKELY(last_token != token_type::value_string)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); } + else + { + if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (JSON_UNLIKELY(last_token != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_LIKELY(last_token == token_type::end_object)) + { + if (JSON_UNLIKELY(not sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + assert(not states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); } } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 6fb619d6..9df10e1a 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3955,10 +3955,9 @@ class parser private: bool sax_parse_internal(json_sax_t* sax) { - // two values for the structured values - enum class parse_state_t { array_value, object_value }; // stack to remember the hieararchy of structured values we are parsing - std::vector states; + // true = array; false = object + std::vector states; // value to avoid a goto (see comment where set to true) bool skip_to_state_evaluation = false; @@ -4014,7 +4013,7 @@ class parser } // remember we are now inside an object - states.push_back(parse_state_t::object_value); + states.push_back(false); // parse values get_token(); @@ -4042,7 +4041,7 @@ class parser } // remember we are now inside an array - states.push_back(parse_state_t::array_value); + states.push_back(true); // parse values (no need to call get_token) continue; @@ -4152,104 +4151,98 @@ class parser else { get_token(); - switch (states.back()) + if (states.back()) // array { - case parse_state_t::array_value: + // comma -> next value + if (last_token == token_type::value_separator) { - // comma -> next value - if (last_token == token_type::value_separator) - { - // parse a new value - get_token(); - continue; - } - - // closing ] - if (JSON_LIKELY(last_token == token_type::end_array)) - { - if (JSON_UNLIKELY(not sax->end_array())) - { - return false; - } - - // We are done with this array. Before we can parse - // a new value, we need to evaluate the new state - // first. By setting skip_to_state_evaluation to - // false, we are effectively jumping to the - // beginning of this switch. - assert(not states.empty()); - states.pop_back(); - skip_to_state_evaluation = true; - continue; - } - else - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); - } + // parse a new value + get_token(); + continue; } - case parse_state_t::object_value: + // closing ] + if (JSON_LIKELY(last_token == token_type::end_array)) { - // comma -> next value - if (last_token == token_type::value_separator) + if (JSON_UNLIKELY(not sax->end_array())) { - get_token(); - - // parse key - if (JSON_UNLIKELY(last_token != token_type::value_string)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); - } - else - { - if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) - { - return false; - } - } - - // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); - } - - // parse values - get_token(); - continue; + return false; } - // closing } - if (JSON_LIKELY(last_token == token_type::end_object)) - { - if (JSON_UNLIKELY(not sax->end_object())) - { - return false; - } + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + assert(not states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array))); + } + } + else // object + { + // comma -> next value + if (last_token == token_type::value_separator) + { + get_token(); - // We are done with this object. Before we can - // parse a new value, we need to evaluate the new - // state first. By setting skip_to_state_evaluation - // to false, we are effectively jumping to the - // beginning of this switch. - assert(not states.empty()); - states.pop_back(); - skip_to_state_evaluation = true; - continue; - } - else + // parse key + if (JSON_UNLIKELY(last_token != token_type::value_string)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string))); } + else + { + if (JSON_UNLIKELY(not sax->key(m_lexer.get_string()))) + { + return false; + } + } + + // parse separator (:) + get_token(); + if (JSON_UNLIKELY(last_token != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator))); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_LIKELY(last_token == token_type::end_object)) + { + if (JSON_UNLIKELY(not sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + assert(not states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + else + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object))); } } } From ba6edd5634d0ba360ea79663dab70a6177687a92 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 30 Mar 2018 00:38:18 +0200 Subject: [PATCH 045/156] :hammer: cleanup --- include/nlohmann/detail/input/parser.hpp | 25 +++++++----------------- single_include/nlohmann/json.hpp | 25 +++++++----------------- 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 67c94464..c3cfcd53 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -182,11 +182,8 @@ class parser return false; } - // read next token - get_token(); - // closing } -> we are done - if (last_token == token_type::end_object) + if (get_token() == token_type::end_object) { if (JSON_UNLIKELY(not sax->end_object())) { @@ -211,8 +208,7 @@ class parser } // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) + if (JSON_UNLIKELY(get_token() != token_type::name_separator)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), @@ -234,11 +230,8 @@ class parser return false; } - // read next token - get_token(); - // closing ] -> we are done - if (last_token == token_type::end_array) + if (get_token() == token_type::end_array) { if (JSON_UNLIKELY(not sax->end_array())) { @@ -357,11 +350,10 @@ class parser } else { - get_token(); if (states.back()) // array { // comma -> next value - if (last_token == token_type::value_separator) + if (get_token() == token_type::value_separator) { // parse a new value get_token(); @@ -395,12 +387,10 @@ class parser else // object { // comma -> next value - if (last_token == token_type::value_separator) + if (get_token() == token_type::value_separator) { - get_token(); - // parse key - if (JSON_UNLIKELY(last_token != token_type::value_string)) + if (JSON_UNLIKELY(get_token() != token_type::value_string)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), @@ -415,8 +405,7 @@ class parser } // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) + if (JSON_UNLIKELY(get_token() != token_type::name_separator)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 9df10e1a..415ed114 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3975,11 +3975,8 @@ class parser return false; } - // read next token - get_token(); - // closing } -> we are done - if (last_token == token_type::end_object) + if (get_token() == token_type::end_object) { if (JSON_UNLIKELY(not sax->end_object())) { @@ -4004,8 +4001,7 @@ class parser } // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) + if (JSON_UNLIKELY(get_token() != token_type::name_separator)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), @@ -4027,11 +4023,8 @@ class parser return false; } - // read next token - get_token(); - // closing ] -> we are done - if (last_token == token_type::end_array) + if (get_token() == token_type::end_array) { if (JSON_UNLIKELY(not sax->end_array())) { @@ -4150,11 +4143,10 @@ class parser } else { - get_token(); if (states.back()) // array { // comma -> next value - if (last_token == token_type::value_separator) + if (get_token() == token_type::value_separator) { // parse a new value get_token(); @@ -4188,12 +4180,10 @@ class parser else // object { // comma -> next value - if (last_token == token_type::value_separator) + if (get_token() == token_type::value_separator) { - get_token(); - // parse key - if (JSON_UNLIKELY(last_token != token_type::value_string)) + if (JSON_UNLIKELY(get_token() != token_type::value_string)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), @@ -4208,8 +4198,7 @@ class parser } // parse separator (:) - get_token(); - if (JSON_UNLIKELY(last_token != token_type::name_separator)) + if (JSON_UNLIKELY(get_token() != token_type::name_separator)) { return sax->parse_error(m_lexer.get_position(), m_lexer.get_token_string(), From eb06d0531a7334017e17fbfb5db7e6c31d40cf7c Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 1 Apr 2018 19:12:36 +0200 Subject: [PATCH 046/156] :construction: added input adapter for wide strings #1031 --- .../nlohmann/detail/input/input_adapters.hpp | 182 ++++++++++++++++++ single_include/nlohmann/json.hpp | 182 ++++++++++++++++++ test/Makefile | 3 +- test/src/unit-wstring.cpp | 58 ++++++ 4 files changed, 424 insertions(+), 1 deletion(-) create mode 100644 test/src/unit-wstring.cpp diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index ef66948d..eb358432 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -165,6 +165,179 @@ class input_buffer_adapter : public input_adapter_protocol const char* start; }; +template +class wide_string_input_adapter : public input_adapter_protocol +{ + private: + using char_t = typename WideStringType::value_type; + + public: + wide_string_input_adapter(const WideStringType& w) : str(w) {} + + std::char_traits::int_type get_character() noexcept override + { + // unget_character() was called previously: return the last character + if (next_unget) + { + next_unget = false; + return last_char; + } + + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + if (sizeof(char_t) == 2) + { + fill_buffer_utf16(); + } + else + { + fill_buffer_utf32(); + } + + assert(utf8_bytes_filled > 0); + assert(utf8_bytes_index == 0); + } + + // use buffer + assert(utf8_bytes_filled > 0); + assert(utf8_bytes_index < utf8_bytes_filled); + return (last_char = utf8_bytes[utf8_bytes_index++]); + } + + void unget_character() noexcept override + { + next_unget = true; + } + + private: + void fill_buffer_utf16() + { + utf8_bytes_index = 0; + + if (current_wchar == str.size()) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const char_t wc = str[current_wchar++]; + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = 0xC0 | ((wc >> 6)); + utf8_bytes[1] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc or wc >= 0xE000) + { + utf8_bytes[0] = 0xE0 | ((wc >> 12)); + utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); + utf8_bytes[2] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 3; + } + else + { + if (current_wchar < str.size()) + { + const char_t wc2 = str[current_wchar++]; + const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF)); + utf8_bytes[0] = 0xf0 | (charcode >> 18); + utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F); + utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F); + utf8_bytes[3] = 0x80 | (charcode & 0x3F); + utf8_bytes_filled = 4; + } + else + { + // unknown character + ++current_wchar; + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + } + } + } + + void fill_buffer_utf32() + { + utf8_bytes_index = 0; + + if (current_wchar == str.size()) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const char_t wc = str[current_wchar++]; + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F); + utf8_bytes[1] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F); + utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); + utf8_bytes[2] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = 0xF0 | ((wc >> 18 ) & 0x07); + utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F); + utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F); + utf8_bytes[3] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + } + } + + private: + /// the wstring to process + const WideStringType& str; + + /// index of the current wchar in str + std::size_t current_wchar = 0; + + /// a buffer for UTF-8 bytes + std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; + + /// the last character (returned after unget_character() is called) + std::char_traits::int_type last_char = 0; + /// whether get_character() should return last_char + bool next_unget = false; +}; + class input_adapter { public: @@ -178,6 +351,15 @@ class input_adapter input_adapter(std::istream&& i) : ia(std::make_shared(i)) {} + input_adapter(const std::wstring& ws) + : ia(std::make_shared>(ws)) {} + + input_adapter(const std::u16string& ws) + : ia(std::make_shared>(ws)) {} + + input_adapter(const std::u32string& ws) + : ia(std::make_shared>(ws)) {} + /// input adapter for buffer template +class wide_string_input_adapter : public input_adapter_protocol +{ + private: + using char_t = typename WideStringType::value_type; + + public: + wide_string_input_adapter(const WideStringType& w) : str(w) {} + + std::char_traits::int_type get_character() noexcept override + { + // unget_character() was called previously: return the last character + if (next_unget) + { + next_unget = false; + return last_char; + } + + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + if (sizeof(char_t) == 2) + { + fill_buffer_utf16(); + } + else + { + fill_buffer_utf32(); + } + + assert(utf8_bytes_filled > 0); + assert(utf8_bytes_index == 0); + } + + // use buffer + assert(utf8_bytes_filled > 0); + assert(utf8_bytes_index < utf8_bytes_filled); + return (last_char = utf8_bytes[utf8_bytes_index++]); + } + + void unget_character() noexcept override + { + next_unget = true; + } + + private: + void fill_buffer_utf16() + { + utf8_bytes_index = 0; + + if (current_wchar == str.size()) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const char_t wc = str[current_wchar++]; + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = 0xC0 | ((wc >> 6)); + utf8_bytes[1] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc or wc >= 0xE000) + { + utf8_bytes[0] = 0xE0 | ((wc >> 12)); + utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); + utf8_bytes[2] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 3; + } + else + { + if (current_wchar < str.size()) + { + const char_t wc2 = str[current_wchar++]; + const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF)); + utf8_bytes[0] = 0xf0 | (charcode >> 18); + utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F); + utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F); + utf8_bytes[3] = 0x80 | (charcode & 0x3F); + utf8_bytes_filled = 4; + } + else + { + // unknown character + ++current_wchar; + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + } + } + } + + void fill_buffer_utf32() + { + utf8_bytes_index = 0; + + if (current_wchar == str.size()) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const char_t wc = str[current_wchar++]; + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F); + utf8_bytes[1] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F); + utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); + utf8_bytes[2] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = 0xF0 | ((wc >> 18 ) & 0x07); + utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F); + utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F); + utf8_bytes[3] = 0x80 | (wc & 0x3F); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = wc; + utf8_bytes_filled = 1; + } + } + } + + private: + /// the wstring to process + const WideStringType& str; + + /// index of the current wchar in str + std::size_t current_wchar = 0; + + /// a buffer for UTF-8 bytes + std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; + + /// the last character (returned after unget_character() is called) + std::char_traits::int_type last_char = 0; + /// whether get_character() should return last_char + bool next_unget = false; +}; + class input_adapter { public: @@ -1751,6 +1924,15 @@ class input_adapter input_adapter(std::istream&& i) : ia(std::make_shared(i)) {} + input_adapter(const std::wstring& ws) + : ia(std::make_shared>(ws)) {} + + input_adapter(const std::u16string& ws) + : ia(std::make_shared>(ws)) {} + + input_adapter(const std::u32string& ws) + : ia(std::make_shared>(ws)) {} + /// input adapter for buffer template. +Copyright (c) 2013-2018 Niels Lohmann . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "catch.hpp" + +#include + +using nlohmann::json; + + +TEST_CASE("wide strings") +{ + SECTION("std::wstring") + { + std::wstring w = L"[12.2,\"Ⴥaäö💤🧢\"]"; + json j = json::parse(w); + CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + } + + SECTION("std::u16string") + { + std::u16string w = u"[12.2,\"Ⴥaäö💤🧢\"]"; + json j = json::parse(w); + CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + } + + SECTION("std::u32string") + { + std::u32string w = U"[12.2,\"Ⴥaäö💤🧢\"]"; + json j = json::parse(w); + CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + } +} From ab89ae4e5010f896fc41d749e1ff2e4cec6c7019 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 2 Apr 2018 11:34:36 +0200 Subject: [PATCH 047/156] :hammer: trying to make tests run with MSVC #1031 --- test/src/unit-wstring.cpp | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/test/src/unit-wstring.cpp b/test/src/unit-wstring.cpp index 6b720c99..186ab4c7 100644 --- a/test/src/unit-wstring.cpp +++ b/test/src/unit-wstring.cpp @@ -32,27 +32,45 @@ SOFTWARE. using nlohmann::json; +// from https://www.reddit.com/r/cpp/comments/75gohf/i_just_found_a_use_for_the_poop_emoji_in_c/ +constexpr bool compiler_supports_utf8(); +constexpr bool compiler_supports_utf8() +{ + return (static_cast("💩"[0]) == 0xF0) and + (static_cast("💩"[1]) == 0x9F) and + (static_cast("💩"[2]) == 0x92) and + (static_cast("💩"[3]) == 0xA9); +} TEST_CASE("wide strings") { SECTION("std::wstring") { - std::wstring w = L"[12.2,\"Ⴥaäö💤🧢\"]"; - json j = json::parse(w); - CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + if (compiler_supports_utf8()) + { + std::wstring w = L"[12.2,\"Ⴥaäö💤🧢\"]"; + json j = json::parse(w); + CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + } } SECTION("std::u16string") { - std::u16string w = u"[12.2,\"Ⴥaäö💤🧢\"]"; - json j = json::parse(w); - CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + if (compiler_supports_utf8()) + { + std::u16string w = u"[12.2,\"Ⴥaäö💤🧢\"]"; + json j = json::parse(w); + CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + } } SECTION("std::u32string") { - std::u32string w = U"[12.2,\"Ⴥaäö💤🧢\"]"; - json j = json::parse(w); - CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + if (compiler_supports_utf8()) + { + std::u32string w = U"[12.2,\"Ⴥaäö💤🧢\"]"; + json j = json::parse(w); + CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); + } } } From 727dd4664bf458925b7f76541e7effbd17017391 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 2 Apr 2018 12:27:07 +0200 Subject: [PATCH 048/156] :hammer: trying to make tests run with MSVC #1031 --- test/src/unit-wstring.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/test/src/unit-wstring.cpp b/test/src/unit-wstring.cpp index 186ab4c7..a9f2c194 100644 --- a/test/src/unit-wstring.cpp +++ b/test/src/unit-wstring.cpp @@ -32,21 +32,29 @@ SOFTWARE. using nlohmann::json; -// from https://www.reddit.com/r/cpp/comments/75gohf/i_just_found_a_use_for_the_poop_emoji_in_c/ -constexpr bool compiler_supports_utf8(); -constexpr bool compiler_supports_utf8() +bool wstring_is_utf16(); +bool wstring_is_utf16() { - return (static_cast("💩"[0]) == 0xF0) and - (static_cast("💩"[1]) == 0x9F) and - (static_cast("💩"[2]) == 0x92) and - (static_cast("💩"[3]) == 0xA9); + return (std::wstring(L"💩") == std::wstring(L"\U0001F4A9")); +} + +bool u16string_is_utf16(); +bool u16string_is_utf16() +{ + return (std::u16string(u"💩") == std::u16string(u"\U0001F4A9")); +} + +bool u32string_is_utf32(); +bool u32string_is_utf32() +{ + return (std::u32string(U"💩") == std::u32string(U"\U0001F4A9")); } TEST_CASE("wide strings") { SECTION("std::wstring") { - if (compiler_supports_utf8()) + if (wstring_is_utf16()) { std::wstring w = L"[12.2,\"Ⴥaäö💤🧢\"]"; json j = json::parse(w); @@ -56,7 +64,7 @@ TEST_CASE("wide strings") SECTION("std::u16string") { - if (compiler_supports_utf8()) + if (u16string_is_utf16()) { std::u16string w = u"[12.2,\"Ⴥaäö💤🧢\"]"; json j = json::parse(w); @@ -66,7 +74,7 @@ TEST_CASE("wide strings") SECTION("std::u32string") { - if (compiler_supports_utf8()) + if (u32string_is_utf32()) { std::u32string w = U"[12.2,\"Ⴥaäö💤🧢\"]"; json j = json::parse(w); From 16c5bfeaad759dabac9fd54a34c9077cf9621e7f Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 2 Apr 2018 13:01:56 +0200 Subject: [PATCH 049/156] :ok_hand: fixed compiler warnings #1031 --- include/nlohmann/detail/input/input_adapters.hpp | 11 ++++------- single_include/nlohmann/json.hpp | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index eb358432..5332a63f 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -168,9 +168,6 @@ class input_buffer_adapter : public input_adapter_protocol template class wide_string_input_adapter : public input_adapter_protocol { - private: - using char_t = typename WideStringType::value_type; - public: wide_string_input_adapter(const WideStringType& w) : str(w) {} @@ -186,7 +183,7 @@ class wide_string_input_adapter : public input_adapter_protocol // check if buffer needs to be filled if (utf8_bytes_index == utf8_bytes_filled) { - if (sizeof(char_t) == 2) + if (sizeof(typename WideStringType::value_type) == 2) { fill_buffer_utf16(); } @@ -223,7 +220,7 @@ class wide_string_input_adapter : public input_adapter_protocol else { // get the current character - const char_t wc = str[current_wchar++]; + const int wc = static_cast(str[current_wchar++]); // UTF-16 to UTF-8 encoding if (wc < 0x80) @@ -248,7 +245,7 @@ class wide_string_input_adapter : public input_adapter_protocol { if (current_wchar < str.size()) { - const char_t wc2 = str[current_wchar++]; + const int wc2 = static_cast(str[current_wchar++]); const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF)); utf8_bytes[0] = 0xf0 | (charcode >> 18); utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F); @@ -279,7 +276,7 @@ class wide_string_input_adapter : public input_adapter_protocol else { // get the current character - const char_t wc = str[current_wchar++]; + const int wc = static_cast(str[current_wchar++]); // UTF-32 to UTF-8 encoding if (wc < 0x80) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 33a07189..97c83d39 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1741,9 +1741,6 @@ class input_buffer_adapter : public input_adapter_protocol template class wide_string_input_adapter : public input_adapter_protocol { - private: - using char_t = typename WideStringType::value_type; - public: wide_string_input_adapter(const WideStringType& w) : str(w) {} @@ -1759,7 +1756,7 @@ class wide_string_input_adapter : public input_adapter_protocol // check if buffer needs to be filled if (utf8_bytes_index == utf8_bytes_filled) { - if (sizeof(char_t) == 2) + if (sizeof(typename WideStringType::value_type) == 2) { fill_buffer_utf16(); } @@ -1796,7 +1793,7 @@ class wide_string_input_adapter : public input_adapter_protocol else { // get the current character - const char_t wc = str[current_wchar++]; + const int wc = static_cast(str[current_wchar++]); // UTF-16 to UTF-8 encoding if (wc < 0x80) @@ -1821,7 +1818,7 @@ class wide_string_input_adapter : public input_adapter_protocol { if (current_wchar < str.size()) { - const char_t wc2 = str[current_wchar++]; + const int wc2 = static_cast(str[current_wchar++]); const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF)); utf8_bytes[0] = 0xf0 | (charcode >> 18); utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F); @@ -1852,7 +1849,7 @@ class wide_string_input_adapter : public input_adapter_protocol else { // get the current character - const char_t wc = str[current_wchar++]; + const int wc = static_cast(str[current_wchar++]); // UTF-32 to UTF-8 encoding if (wc < 0x80) From 6678eb2b4a1eab6c555c90a4d4a95907df1e909c Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 2 Apr 2018 15:38:49 +0200 Subject: [PATCH 050/156] :white_check_mark: improved test coverage #1031 --- test/src/unit-wstring.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/src/unit-wstring.cpp b/test/src/unit-wstring.cpp index a9f2c194..37cf42db 100644 --- a/test/src/unit-wstring.cpp +++ b/test/src/unit-wstring.cpp @@ -62,6 +62,15 @@ TEST_CASE("wide strings") } } + SECTION("invalid std::wstring") + { + if (wstring_is_utf16()) + { + std::wstring w = L"\"\xDBFF"; + CHECK_THROWS_AS(json::parse(w), json::parse_error&); + } + } + SECTION("std::u16string") { if (u16string_is_utf16()) @@ -72,6 +81,15 @@ TEST_CASE("wide strings") } } + SECTION("invalid std::u16string") + { + if (wstring_is_utf16()) + { + std::u16string w = u"\"\xDBFF"; + CHECK_THROWS_AS(json::parse(w), json::parse_error&); + } + } + SECTION("std::u32string") { if (u32string_is_utf32()) @@ -81,4 +99,13 @@ TEST_CASE("wide strings") CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]"); } } + + SECTION("invalid std::u32string") + { + if (u32string_is_utf32()) + { + std::u32string w = U"\"\x110000"; + CHECK_THROWS_AS(json::parse(w), json::parse_error&); + } + } } From aa89c5e048bc31c2b2c60ce50f498e0651c7f604 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 2 Apr 2018 21:10:48 +0200 Subject: [PATCH 051/156] :hammer: removing unget_character() function from input adapters #834 --- .../nlohmann/detail/input/input_adapters.hpp | 68 ++-------- include/nlohmann/detail/input/lexer.hpp | 60 +++++++- single_include/nlohmann/json.hpp | 128 +++++++++--------- test/src/unit-deserialization.cpp | 54 +++++--- 4 files changed, 168 insertions(+), 142 deletions(-) diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index 92987e97..82a59136 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -31,19 +31,17 @@ enum class input_format_t { json, cbor, msgpack, ubjson }; @brief abstract input adapter interface Produces a stream of std::char_traits::int_type characters from a -std::istream, a buffer, or some other input type. Accepts the return of exactly -one non-EOF character for future input. The int_type characters returned -consist of all valid char values as positive values (typically unsigned char), -plus an EOF value outside that range, specified by the value of the function -std::char_traits::eof(). This value is typically -1, but could be any -arbitrary value which is not a valid char value. +std::istream, a buffer, or some other input type. Accepts the return of +exactly one non-EOF character for future input. The int_type characters +returned consist of all valid char values as positive values (typically +unsigned char), plus an EOF value outside that range, specified by the value +of the function std::char_traits::eof(). This value is typically -1, but +could be any arbitrary value which is not a valid char value. */ struct input_adapter_protocol { /// get a character [0,255] or std::char_traits::eof(). virtual std::char_traits::int_type get_character() = 0; - /// restore the last non-eof() character to input - virtual void unget_character() = 0; virtual ~input_adapter_protocol() = default; }; @@ -71,34 +69,7 @@ class input_stream_adapter : public input_adapter_protocol explicit input_stream_adapter(std::istream& i) : is(i), sb(*i.rdbuf()) - { - // skip byte order mark - std::char_traits::int_type c; - if ((c = get_character()) == 0xEF) - { - if ((c = get_character()) == 0xBB) - { - if ((c = get_character()) == 0xBF) - { - return; // Ignore BOM - } - else if (c != std::char_traits::eof()) - { - is.unget(); - } - is.putback('\xBB'); - } - else if (c != std::char_traits::eof()) - { - is.unget(); - } - is.putback('\xEF'); - } - else if (c != std::char_traits::eof()) - { - is.unget(); // no byte order mark; process as usual - } - } + {} // delete because of pointer members input_stream_adapter(const input_stream_adapter&) = delete; @@ -112,11 +83,6 @@ class input_stream_adapter : public input_adapter_protocol return sb.sbumpc(); } - void unget_character() override - { - sb.sungetc(); // is.unget() avoided for performance - } - private: /// the associated input stream std::istream& is; @@ -128,14 +94,8 @@ class input_buffer_adapter : public input_adapter_protocol { public: input_buffer_adapter(const char* b, const std::size_t l) - : cursor(b), limit(b + l), start(b) - { - // skip byte order mark - if (l >= 3 and b[0] == '\xEF' and b[1] == '\xBB' and b[2] == '\xBF') - { - cursor += 3; - } - } + : cursor(b), limit(b + l) + {} // delete because of pointer members input_buffer_adapter(const input_buffer_adapter&) = delete; @@ -151,21 +111,11 @@ class input_buffer_adapter : public input_adapter_protocol return std::char_traits::eof(); } - void unget_character() noexcept override - { - if (JSON_LIKELY(cursor > start)) - { - --cursor; - } - } - private: /// pointer to the current character const char* cursor; /// pointer past the last character const char* limit; - /// pointer to the first character - const char* start; }; class input_adapter diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 1ed35617..7b31068f 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1081,7 +1081,16 @@ scan_number_done: std::char_traits::int_type get() { ++chars_read; - current = ia->get_character(); + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia->get_character(); + } + if (JSON_LIKELY(current != std::char_traits::eof())) { token_string.push_back(std::char_traits::to_char_type(current)); @@ -1089,13 +1098,20 @@ scan_number_done: return current; } - /// unget current character (return it again on next get) + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read and + token_string. The next call to get() will behave as if the unget character + is read again. + */ void unget() { + next_unget = true; --chars_read; if (JSON_LIKELY(current != std::char_traits::eof())) { - ia->unget_character(); assert(token_string.size() != 0); token_string.pop_back(); } @@ -1183,8 +1199,43 @@ scan_number_done: // actual scanner ///////////////////// + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + if (get() == 0xBB and get() == 0xBF) + { + // we completely parsed the BOM + return true; + } + else + { + // after reading 0xEF, an unexpected character followed + return false; + } + } + else + { + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + } + token_type scan() { + // initially, skip the BOM + if (chars_read == 0 and not skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + // read next character and ignore whitespace do { @@ -1254,6 +1305,9 @@ scan_number_done: /// the current character std::char_traits::int_type current = std::char_traits::eof(); + /// whether the next get() call should just return current + bool next_unget = false; + /// the number of characters read std::size_t chars_read = 0; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 415ed114..30085744 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1604,19 +1604,17 @@ enum class input_format_t { json, cbor, msgpack, ubjson }; @brief abstract input adapter interface Produces a stream of std::char_traits::int_type characters from a -std::istream, a buffer, or some other input type. Accepts the return of exactly -one non-EOF character for future input. The int_type characters returned -consist of all valid char values as positive values (typically unsigned char), -plus an EOF value outside that range, specified by the value of the function -std::char_traits::eof(). This value is typically -1, but could be any -arbitrary value which is not a valid char value. +std::istream, a buffer, or some other input type. Accepts the return of +exactly one non-EOF character for future input. The int_type characters +returned consist of all valid char values as positive values (typically +unsigned char), plus an EOF value outside that range, specified by the value +of the function std::char_traits::eof(). This value is typically -1, but +could be any arbitrary value which is not a valid char value. */ struct input_adapter_protocol { /// get a character [0,255] or std::char_traits::eof(). virtual std::char_traits::int_type get_character() = 0; - /// restore the last non-eof() character to input - virtual void unget_character() = 0; virtual ~input_adapter_protocol() = default; }; @@ -1644,34 +1642,7 @@ class input_stream_adapter : public input_adapter_protocol explicit input_stream_adapter(std::istream& i) : is(i), sb(*i.rdbuf()) - { - // skip byte order mark - std::char_traits::int_type c; - if ((c = get_character()) == 0xEF) - { - if ((c = get_character()) == 0xBB) - { - if ((c = get_character()) == 0xBF) - { - return; // Ignore BOM - } - else if (c != std::char_traits::eof()) - { - is.unget(); - } - is.putback('\xBB'); - } - else if (c != std::char_traits::eof()) - { - is.unget(); - } - is.putback('\xEF'); - } - else if (c != std::char_traits::eof()) - { - is.unget(); // no byte order mark; process as usual - } - } + {} // delete because of pointer members input_stream_adapter(const input_stream_adapter&) = delete; @@ -1685,11 +1656,6 @@ class input_stream_adapter : public input_adapter_protocol return sb.sbumpc(); } - void unget_character() override - { - sb.sungetc(); // is.unget() avoided for performance - } - private: /// the associated input stream std::istream& is; @@ -1701,14 +1667,8 @@ class input_buffer_adapter : public input_adapter_protocol { public: input_buffer_adapter(const char* b, const std::size_t l) - : cursor(b), limit(b + l), start(b) - { - // skip byte order mark - if (l >= 3 and b[0] == '\xEF' and b[1] == '\xBB' and b[2] == '\xBF') - { - cursor += 3; - } - } + : cursor(b), limit(b + l) + {} // delete because of pointer members input_buffer_adapter(const input_buffer_adapter&) = delete; @@ -1724,21 +1684,11 @@ class input_buffer_adapter : public input_adapter_protocol return std::char_traits::eof(); } - void unget_character() noexcept override - { - if (JSON_LIKELY(cursor > start)) - { - --cursor; - } - } - private: /// pointer to the current character const char* cursor; /// pointer past the last character const char* limit; - /// pointer to the first character - const char* start; }; class input_adapter @@ -2923,7 +2873,16 @@ scan_number_done: std::char_traits::int_type get() { ++chars_read; - current = ia->get_character(); + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia->get_character(); + } + if (JSON_LIKELY(current != std::char_traits::eof())) { token_string.push_back(std::char_traits::to_char_type(current)); @@ -2931,13 +2890,20 @@ scan_number_done: return current; } - /// unget current character (return it again on next get) + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read and + token_string. The next call to get() will behave as if the unget character + is read again. + */ void unget() { + next_unget = true; --chars_read; if (JSON_LIKELY(current != std::char_traits::eof())) { - ia->unget_character(); assert(token_string.size() != 0); token_string.pop_back(); } @@ -3025,8 +2991,43 @@ scan_number_done: // actual scanner ///////////////////// + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + if (get() == 0xBB and get() == 0xBF) + { + // we completely parsed the BOM + return true; + } + else + { + // after reading 0xEF, an unexpected character followed + return false; + } + } + else + { + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + } + token_type scan() { + // initially, skip the BOM + if (chars_read == 0 and not skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + // read next character and ignore whitespace do { @@ -3096,6 +3097,9 @@ scan_number_done: /// the current character std::char_traits::int_type current = std::char_traits::eof(); + /// whether the next get() call should just return current + bool next_unget = false; + /// the number of characters read std::size_t chars_read = 0; diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 5c9fde5a..d69c5983 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -798,18 +798,18 @@ TEST_CASE("deserialization") { CHECK_THROWS_AS(json::parse(bom), json::parse_error&); CHECK_THROWS_WITH(json::parse(bom), - "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + "[json.exception.parse_error.101] parse error at 4: syntax error - unexpected end of input; expected '[', '{', or a literal"); CHECK_THROWS_AS(json::parse(std::istringstream(bom)), json::parse_error&); CHECK_THROWS_WITH(json::parse(std::istringstream(bom)), - "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + "[json.exception.parse_error.101] parse error at 4: syntax error - unexpected end of input; expected '[', '{', or a literal"); SaxEventLogger l; CHECK(not json::sax_parse(bom, &l)); CHECK(l.events.size() == 1); CHECK(l.events == std::vector( { - "parse_error(1)" + "parse_error(4)" })); } @@ -836,12 +836,12 @@ TEST_CASE("deserialization") SECTION("2 byte of BOM") { CHECK_THROWS_AS(json::parse(bom.substr(0, 2)), json::parse_error&); - CHECK_THROWS_WITH(json::parse(bom), - "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + CHECK_THROWS_WITH(json::parse(bom.substr(0, 2)), + "[json.exception.parse_error.101] parse error at 3: syntax error - invalid BOM; must be 0xEF 0xBB 0xBF if given; last read: '\xEF\xBB'"); CHECK_THROWS_AS(json::parse(std::istringstream(bom.substr(0, 2))), json::parse_error&); - CHECK_THROWS_WITH(json::parse(std::istringstream(bom)), - "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + CHECK_THROWS_WITH(json::parse(std::istringstream(bom.substr(0, 2))), + "[json.exception.parse_error.101] parse error at 3: syntax error - invalid BOM; must be 0xEF 0xBB 0xBF if given; last read: '\xEF\xBB'"); SaxEventLogger l1, l2; CHECK(not json::sax_parse(std::istringstream(bom.substr(0, 2)), &l1)); @@ -849,24 +849,24 @@ TEST_CASE("deserialization") CHECK(l1.events.size() == 1); CHECK(l1.events == std::vector( { - "parse_error(1)" + "parse_error(3)" })); CHECK(l2.events.size() == 1); CHECK(l2.events == std::vector( { - "parse_error(1)" + "parse_error(3)" })); } SECTION("1 byte of BOM") { CHECK_THROWS_AS(json::parse(bom.substr(0, 1)), json::parse_error&); - CHECK_THROWS_WITH(json::parse(bom), - "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + CHECK_THROWS_WITH(json::parse(bom.substr(0, 1)), + "[json.exception.parse_error.101] parse error at 2: syntax error - invalid BOM; must be 0xEF 0xBB 0xBF if given; last read: '\xEF'"); CHECK_THROWS_AS(json::parse(std::istringstream(bom.substr(0, 1))), json::parse_error&); - CHECK_THROWS_WITH(json::parse(std::istringstream(bom)), - "[json.exception.parse_error.101] parse error at 1: syntax error - unexpected end of input; expected '[', '{', or a literal"); + CHECK_THROWS_WITH(json::parse(std::istringstream(bom.substr(0, 1))), + "[json.exception.parse_error.101] parse error at 2: syntax error - invalid BOM; must be 0xEF 0xBB 0xBF if given; last read: '\xEF'"); SaxEventLogger l1, l2; CHECK(not json::sax_parse(std::istringstream(bom.substr(0, 1)), &l1)); @@ -874,12 +874,12 @@ TEST_CASE("deserialization") CHECK(l1.events.size() == 1); CHECK(l1.events == std::vector( { - "parse_error(1)" + "parse_error(2)" })); CHECK(l2.events.size() == 1); CHECK(l2.events == std::vector( { - "parse_error(1)" + "parse_error(2)" })); } @@ -926,10 +926,28 @@ TEST_CASE("deserialization") SaxEventLogger l; CHECK(not json::sax_parse(s + "null", &l)); CHECK(l.events.size() == 1); - CHECK(l.events == std::vector( + + if (i0 != 0) { - "parse_error(1)" - })); + CHECK(l.events == std::vector( + { + "parse_error(1)" + })); + } + else if (i1 != 0) + { + CHECK(l.events == std::vector( + { + "parse_error(2)" + })); + } + else + { + CHECK(l.events == std::vector( + { + "parse_error(3)" + })); + } } } } From 1e08654f995ab9248ea3567dcb3854d2928198a2 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 2 Apr 2018 22:25:17 +0200 Subject: [PATCH 052/156] :hammer: cleanup --- .travis.yml | 1 + include/nlohmann/detail/input/input_adapters.hpp | 7 ++----- include/nlohmann/detail/input/json_sax.hpp | 1 - single_include/nlohmann/json.hpp | 6 ++---- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8ce38cc8..68a16db5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -277,6 +277,7 @@ script: if [[ (-x $(which brew)) ]]; then brew update brew install cmake ninja + brew upgrade cmake cmake --version fi diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index 82a59136..4c942f33 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -1,11 +1,8 @@ #pragma once -#include // min -#include // array #include // assert #include // size_t #include // strlen -#include // streamsize, streamoff, streampos #include // istream #include // begin, end, iterator_traits, random_access_iterator_tag, distance, next #include // shared_ptr, make_shared, addressof @@ -31,7 +28,7 @@ enum class input_format_t { json, cbor, msgpack, ubjson }; @brief abstract input adapter interface Produces a stream of std::char_traits::int_type characters from a -std::istream, a buffer, or some other input type. Accepts the return of +std::istream, a buffer, or some other input type. Accepts the return of exactly one non-EOF character for future input. The int_type characters returned consist of all valid char values as positive values (typically unsigned char), plus an EOF value outside that range, specified by the value @@ -115,7 +112,7 @@ class input_buffer_adapter : public input_adapter_protocol /// pointer to the current character const char* cursor; /// pointer past the last character - const char* limit; + const char* const limit; }; class input_adapter diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 0bc628cc..561bbe1c 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -660,4 +660,3 @@ class json_sax_acceptor : public json_sax } } - diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 30085744..637cb403 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1572,12 +1572,10 @@ constexpr const auto& to_json = detail::static_const::value; // #include -#include // min #include // array #include // assert #include // size_t #include // strlen -#include // streamsize, streamoff, streampos #include // istream #include // begin, end, iterator_traits, random_access_iterator_tag, distance, next #include // shared_ptr, make_shared, addressof @@ -1686,9 +1684,9 @@ class input_buffer_adapter : public input_adapter_protocol private: /// pointer to the current character - const char* cursor; + const char* const cursor; /// pointer past the last character - const char* limit; + const char* const limit; }; class input_adapter From 08a7233d1b58232e34488d2e14168ce913abd577 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 2 Apr 2018 22:38:44 +0200 Subject: [PATCH 053/156] :ambulance: fixed commit 1e08654 --- single_include/nlohmann/json.hpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 637cb403..226ac96b 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1572,7 +1572,6 @@ constexpr const auto& to_json = detail::static_const::value; // #include -#include // array #include // assert #include // size_t #include // strlen @@ -1602,7 +1601,7 @@ enum class input_format_t { json, cbor, msgpack, ubjson }; @brief abstract input adapter interface Produces a stream of std::char_traits::int_type characters from a -std::istream, a buffer, or some other input type. Accepts the return of +std::istream, a buffer, or some other input type. Accepts the return of exactly one non-EOF character for future input. The int_type characters returned consist of all valid char values as positive values (typically unsigned char), plus an EOF value outside that range, specified by the value @@ -1684,7 +1683,7 @@ class input_buffer_adapter : public input_adapter_protocol private: /// pointer to the current character - const char* const cursor; + const char* cursor; /// pointer past the last character const char* const limit; }; @@ -3803,7 +3802,6 @@ class json_sax_acceptor : public json_sax } - // #include // #include From a35d414c390c2671f2f4a9aecbd84010377175de Mon Sep 17 00:00:00 2001 From: Kevin Tonon Date: Tue, 3 Apr 2018 08:28:07 -0400 Subject: [PATCH 054/156] Update CMake to latest on Travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8ce38cc8..68a16db5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -277,6 +277,7 @@ script: if [[ (-x $(which brew)) ]]; then brew update brew install cmake ninja + brew upgrade cmake cmake --version fi From e439a1a9a78e95836a47e6189423400ee8a02cfd Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Sat, 7 Apr 2018 13:15:44 +0200 Subject: [PATCH 055/156] CMake: 3.8+ is Sufficient The current CMake scripts depend on CMake 3.8+. This allows us to remove previous work-arounds. --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 958a129f..a490ab6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,8 +53,8 @@ target_include_directories( $ ) -## add debug view defintion file for msvc (natvis) [cmake <= 3.2.2 does not support export of source files] -if (MSVC AND CMAKE_VERSION VERSION_GREATER "3.2.2") +## add debug view defintion file for msvc (natvis) +if (MSVC) set(NLOHMANN_ADD_NATVIS TRUE) set(NLOHMANN_NATVIS_FILE "nlohmann_json.natvis") target_sources( @@ -64,7 +64,7 @@ if (MSVC AND CMAKE_VERSION VERSION_GREATER "3.2.2") $ ) endif() - + ## ## TESTS ## create and configure the unit test target From 1ae989638739cc3e7277ffa9ae7b287001a177c1 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Sat, 7 Apr 2018 16:43:01 +0200 Subject: [PATCH 056/156] Package Manager: Spack I contributed a package to the Spack package manager. Spack is a flexible package manager that supports multiple versions, configurations, platforms, and compilers. It is popular in high-performance computing. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3ed3c183..e2e180d7 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,8 @@ If you are using the [Meson Build System](http://mesonbuild.com), then you can w If you are using [Conan](https://www.conan.io/) to manage your dependencies, merely add `jsonformoderncpp/x.y.z@vthiery/stable` to your `conanfile.py`'s requires, where `x.y.z` is the release version you want to use. Please file issues [here](https://github.com/vthiery/conan-jsonformoderncpp/issues) if you experience problems with the packages. +If you are using [Spack](https://www.spack.io/) to manage your dependencies, you can use the `nlohmann_json` package. Please see the [spack project](https://github.com/spack/spack) for any issues regarding the packaging. + If you are using [hunter](https://github.com/ruslo/hunter/) on your project for external dependencies, then you can use the [nlohmann_json package](https://docs.hunter.sh/en/latest/packages/pkg/nlohmann_json.html). Please see the hunter project for any issues regarding the packaging. If you are using [Buckaroo](https://buckaroo.pm), you can install this library's module with `buckaroo install nlohmann/json`. Please file issues [here](https://github.com/LoopPerfect/buckaroo-recipes/issues/new?title=nlohmann/nlohmann/json). From 4286b16b7192d4bbc7de253455ea859eac045f2b Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Sun, 8 Apr 2018 15:46:25 -0400 Subject: [PATCH 057/156] Fix trivial typo in comment. Not really important, but since I saw it. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a490ab6b..51d85429 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,7 @@ target_include_directories( $ ) -## add debug view defintion file for msvc (natvis) +## add debug view definition file for msvc (natvis) if (MSVC) set(NLOHMANN_ADD_NATVIS TRUE) set(NLOHMANN_NATVIS_FILE "nlohmann_json.natvis") From aaee18ce906dd92d3d4999312c049d083205034e Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Mon, 9 Apr 2018 11:15:33 -0400 Subject: [PATCH 058/156] Added test for string conversion with string_view --- test/src/unit-conversions.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 0b4bd912..b059087c 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -329,6 +329,34 @@ TEST_CASE("value conversion") CHECK_THROWS_WITH(json(json::value_t::number_float).get(), "[json.exception.type_error.302] type must be string, but is number"); } + +#if defined(JSON_HAS_CPP_17) + SECTION("exception in case of a non-string type using string_view") + { + CHECK_THROWS_AS(json(json::value_t::null).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::object).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::array).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::boolean).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_integer).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_float).get(), json::type_error&); + + CHECK_THROWS_WITH(json(json::value_t::null).get(), + "[json.exception.type_error.302] type must be string, but is null"); + CHECK_THROWS_WITH(json(json::value_t::object).get(), + "[json.exception.type_error.302] type must be string, but is object"); + CHECK_THROWS_WITH(json(json::value_t::array).get(), + "[json.exception.type_error.302] type must be string, but is array"); + CHECK_THROWS_WITH(json(json::value_t::boolean).get(), + "[json.exception.type_error.302] type must be string, but is boolean"); + CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), + "[json.exception.type_error.302] type must be string, but is number"); + CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), + "[json.exception.type_error.302] type must be string, but is number"); + CHECK_THROWS_WITH(json(json::value_t::number_float).get(), + "[json.exception.type_error.302] type must be string, but is number"); + } +#endif } SECTION("get a string (implicit)") From 031b88d3152bd13a4d2960f698f5f4eef49830c4 Mon Sep 17 00:00:00 2001 From: Chuck Atkins Date: Mon, 9 Apr 2018 11:31:25 -0400 Subject: [PATCH 059/156] Make the CMake install dir user-configurable --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 51d85429..9c8afbef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,8 @@ option(JSON_MultipleHeaders "Use non-amalgamated version of the library." OFF) ## CONFIGURATION ## set(NLOHMANN_JSON_TARGET_NAME ${PROJECT_NAME}) -set(NLOHMANN_JSON_CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") +set(NLOHMANN_JSON_CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}" + CACHE INTERNAL "") set(NLOHMANN_JSON_INCLUDE_INSTALL_DIR "include") set(NLOHMANN_JSON_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") set(NLOHMANN_JSON_CMAKE_CONFIG_TEMPLATE "cmake/config.cmake.in") From 7f20e9ddc73356b87c63ce9106128e09e8b35596 Mon Sep 17 00:00:00 2001 From: James Upjohn Date: Tue, 10 Apr 2018 17:16:44 +1200 Subject: [PATCH 060/156] Fixed incorrect version number in README clang-900.0.39.2 is from LLVM 9.0.0, not 8.1.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2e180d7..75f1f95d 100644 --- a/README.md +++ b/README.md @@ -834,7 +834,7 @@ The following compilers are currently used in continuous integration at [Travis] | Clang Xcode 8.3 | Darwin Kernel Version 16.5.0 (macOS 10.12.4) | Apple LLVM version 8.1.0 (clang-802.0.38) | | Clang Xcode 9.0 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.37) | | Clang Xcode 9.1 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.38) | -| Clang Xcode 9.2 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 8.1.0 (clang-900.0.39.2) | +| Clang Xcode 9.2 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.39.2) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25420.1, MSVC 19.0.24215.1 | | Visual Studio 2017 | Windows Server 2016 | Microsoft (R) Build Engine version 15.5.180.51428, MSVC 19.12.25830.2 | From 8d8f8907715798dcca106509e4d9056a2b9f784e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 10 Apr 2018 08:29:07 +0200 Subject: [PATCH 061/156] :hankey: first try on #1045 --- .../detail/iterators/iteration_proxy.hpp | 17 +++++++++++++++ single_include/nlohmann/json.hpp | 17 +++++++++++++++ test/src/unit-regression.cpp | 21 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/include/nlohmann/detail/iterators/iteration_proxy.hpp b/include/nlohmann/detail/iterators/iteration_proxy.hpp index 7547d038..b035a812 100644 --- a/include/nlohmann/detail/iterators/iteration_proxy.hpp +++ b/include/nlohmann/detail/iterators/iteration_proxy.hpp @@ -2,6 +2,7 @@ #include // size_t #include // string, to_string +#include // input_iterator_tag #include @@ -16,6 +17,13 @@ template class iteration_proxy /// helper class for iteration class iteration_proxy_internal { + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_internal; + using pointer = iteration_proxy_internal*; + using reference = iteration_proxy_internal&; + using iterator_category = std::input_iterator_tag; + private: /// the iterator IteratorType anchor; @@ -25,6 +33,9 @@ template class iteration_proxy public: explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} + iteration_proxy_internal(const iteration_proxy_internal&) = default; + iteration_proxy_internal& operator=(const iteration_proxy_internal&) = default; + /// dereference operator (needed for range-based for) iteration_proxy_internal& operator*() { @@ -40,6 +51,12 @@ template class iteration_proxy return *this; } + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_internal& o) const noexcept + { + return anchor == o.anchor; + } + /// inequality operator (needed for range-based for) bool operator!=(const iteration_proxy_internal& o) const noexcept { diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index b7558aa5..ce534f34 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -4491,6 +4491,7 @@ class iter_impl #include // size_t #include // string, to_string +#include // input_iterator_tag // #include @@ -4506,6 +4507,13 @@ template class iteration_proxy /// helper class for iteration class iteration_proxy_internal { + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_internal; + using pointer = iteration_proxy_internal*; + using reference = iteration_proxy_internal&; + using iterator_category = std::input_iterator_tag; + private: /// the iterator IteratorType anchor; @@ -4515,6 +4523,9 @@ template class iteration_proxy public: explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} + iteration_proxy_internal(const iteration_proxy_internal&) = default; + iteration_proxy_internal& operator=(const iteration_proxy_internal&) = default; + /// dereference operator (needed for range-based for) iteration_proxy_internal& operator*() { @@ -4530,6 +4541,12 @@ template class iteration_proxy return *this; } + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_internal& o) const noexcept + { + return anchor == o.anchor; + } + /// inequality operator (needed for range-based for) bool operator!=(const iteration_proxy_internal& o) const noexcept { diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 01e68957..d26e0e57 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -1615,4 +1615,25 @@ TEST_CASE("regression tests") float_json j2 = {1000.0, 2000.0, 3000.0}; CHECK(float_json::from_ubjson(float_json::to_ubjson(j2, true, true)) == j2); } + + SECTION("issue #1045 - Using STL algorithms with JSON containers with expected results?") + { + json diffs = nlohmann::json::array(); + json m1{{"key1", 42}}; + json m2{{"key2", 42}}; + auto p1 = m1.items(); + auto p2 = m2.items(); + + using it_type = decltype(p1.begin()); + + std::set_difference( + p1.begin(), p1.end(), + p2.begin(), p2.end(), + std::inserter(diffs, diffs.end()), [&](const it_type & e1, const it_type & e2) -> bool + { + return (e1.key() < e2.key()) and (e1.value() < e2.value()); + }); + + CHECK(diffs.size() == 2); + } } From c02a3155d4931752c78da589d34c47a9d7d15002 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 10 Apr 2018 08:39:28 +0200 Subject: [PATCH 062/156] :construction_worker: added Xcode 9.3 builder See https://blog.travis-ci.com/2018-04-09-say-bonjour-to-xcode-93-and-macos-high-sierra. --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 68a16db5..ecc8c362 100644 --- a/.travis.yml +++ b/.travis.yml @@ -155,6 +155,9 @@ matrix: - os: osx osx_image: xcode9.2 + - os: osx + osx_image: xcode9.3 + # Linux / GCC - os: linux From 33a2154f8dbff1382d84d6e463e31a5ac9f3da18 Mon Sep 17 00:00:00 2001 From: Chuck Atkins Date: Mon, 9 Apr 2018 11:32:18 -0400 Subject: [PATCH 063/156] Enable target namespaces and build dir project config CMake convention is to use a project namespace, i.e. Foo::, for imported targets. When multiple targets are imported from a project, this looks like Foo::Bar1 Foo::Bar2, etc. This adds the nlohmann_json:: namespace to the exported target names. This also allows the generated project config files to be used from the build directory instead of just the install directory. --- CMakeLists.txt | 11 +++++++++-- cmake/config.cmake.in | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c8afbef..031a66f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,9 +27,10 @@ set(NLOHMANN_JSON_CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}" set(NLOHMANN_JSON_INCLUDE_INSTALL_DIR "include") set(NLOHMANN_JSON_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") set(NLOHMANN_JSON_CMAKE_CONFIG_TEMPLATE "cmake/config.cmake.in") -set(NLOHMANN_JSON_CMAKE_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}/cmake_config") +set(NLOHMANN_JSON_CMAKE_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}") set(NLOHMANN_JSON_CMAKE_VERSION_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}ConfigVersion.cmake") set(NLOHMANN_JSON_CMAKE_PROJECT_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Config.cmake") +set(NLOHMANN_JSON_CMAKE_PROJECT_TARGETS_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Targets.cmake") if (JSON_MultipleHeaders) set(NLOHMANN_JSON_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/include/") @@ -44,7 +45,7 @@ endif() ## create target and add include path ## add_library(${NLOHMANN_JSON_TARGET_NAME} INTERFACE) - +add_library(${PROJECT_NAME}::${NLOHMANN_JSON_TARGET_NAME} ALIAS ${NLOHMANN_JSON_TARGET_NAME}) target_compile_features(${NLOHMANN_JSON_TARGET_NAME} INTERFACE cxx_std_11) target_include_directories( @@ -105,6 +106,11 @@ if (NLOHMANN_ADD_NATVIS) DESTINATION . ) endif() +export( + TARGETS ${NLOHMANN_JSON_TARGET_NAME} + NAMESPACE ${PROJECT_NAME}:: + FILE ${NLOHMANN_JSON_CMAKE_PROJECT_TARGETS_FILE} +) install( TARGETS ${NLOHMANN_JSON_TARGET_NAME} EXPORT ${NLOHMANN_JSON_TARGETS_EXPORT_NAME} @@ -112,5 +118,6 @@ install( ) install( EXPORT ${NLOHMANN_JSON_TARGETS_EXPORT_NAME} + NAMESPACE ${PROJECT_NAME}:: DESTINATION ${NLOHMANN_JSON_CONFIG_INSTALL_DIR} ) diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in index b4fd29d9..8baabf07 100644 --- a/cmake/config.cmake.in +++ b/cmake/config.cmake.in @@ -1,3 +1,5 @@ @PACKAGE_INIT@ -include("${CMAKE_CURRENT_LIST_DIR}/@NLOHMANN_JSON_TARGETS_EXPORT_NAME@.cmake") +if(NOT TARGET @PROJECT_NAME@::@NLOHMANN_JSON_TARGET_NAME@) + include("${CMAKE_CURRENT_LIST_DIR}/@NLOHMANN_JSON_TARGETS_EXPORT_NAME@.cmake") +endif() check_required_components("@PROJECT_NAME@") From 46ec2fddf8774af2f9368bf563dd6e32fa91d77e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 10 Apr 2018 18:13:37 +0200 Subject: [PATCH 064/156] :memo: updated THANKS list --- README.md | 8 +++++++- doc/avatars.png | Bin 581547 -> 650315 bytes 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 75f1f95d..47c3ae21 100644 --- a/README.md +++ b/README.md @@ -835,6 +835,7 @@ The following compilers are currently used in continuous integration at [Travis] | Clang Xcode 9.0 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.37) | | Clang Xcode 9.1 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.38) | | Clang Xcode 9.2 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.39.2) | +| Clang Xcode 9.3 | Darwin Kernel Version 17.4.0 (macOS 10.13.0) | Apple LLVM version 9.1.0 (clang-902.0.39.1) | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25420.1, MSVC 19.0.24215.1 | | Visual Studio 2017 | Windows Server 2016 | Microsoft (R) Build Engine version 15.5.180.51428, MSVC 19.12.25830.2 | @@ -977,7 +978,12 @@ I deeply appreciate the help of the following people. - [Paul Fultz II](https://github.com/pfultz2) added a note on the cget package manager. - [Wilson Lin](https://github.com/wla80) made the integration section of the README more concise. - [RalfBielig](https://github.com/ralfbielig) detected and fixed a memory leak in the parser callback. -- [agrianius](https://github.com/agrianius) allowed to dump JSON to an alternative string type +- [agrianius](https://github.com/agrianius) allowed to dump JSON to an alternative string type. +- [Kevin Tonon](https://github.com/ktonon) overworked the C++11 compiler checks in CMake. +- [Axel Huebl](https://github.com/ax3l) simplified a CMake check and added support for the [Spack package manager](https://spack.io). +- [Carlos O'Ryan](https://github.com/coryan) fixed a typo. +- [James Upjohn](https://github.com/jammehcow) fixed a version number in the compilers section. +- [Chuck Atkins](https://github.com/chuckatkins) adjusted the CMake files to the CMake packaging guidelines Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone. diff --git a/doc/avatars.png b/doc/avatars.png index 0024190864bf104d6625dfdf655bdb920340f007..4d557d28a30301ec49f3972c5e2321d30e96c1f8 100644 GIT binary patch literal 650315 zcmV)LK)Jt(P)C4Pd~qu&@~T!Lr6) z)&ytcoTGBIMrovxCWkjKhnr96?yBD(=e{?inKvWJmTWMpk3OUK-o1T7pFY)9^{x6A z!oPB<)oMTNOZYb}A9?fT-aCbaz;_>Sf9q%(kgAlTf&KxlwafE%t7VMIvV3T0P$`|- zyjHI-HJWj$nmIc-JUlTq)$SyuRGOu!gIAn8@XGBb%Tg8qKm_>4BdsG@IWQ{A-RQ{Z zogkt9iyBqMD)Ns^{nsDq8`*HY@_WOd}_L9V9=EM0<8)1#=@L!)wr{WrZjxcPNj72 ze0_0#VS4hBhacFoZNrZ37qHiHwO_~8j>mRmcH#Je@v+g#iDN+&Z9Hdd+c5wheDL1k z!QuXm=cY+^^Vhz(usDC+Gq1erRquM}#xH7{T=lA7_|B*QJRaJ7<+ZQ9^(%iovf=U# z7r*A_FZ}7>{o~z8NJz#gBxj6a=ANEvC&|Q#i=wUD`d_0SilKA7!?mz{cqy8i%?6_E zymR_0kgtuC^&?T=+UnZPgQDAjy@}1^a__ozqcg{kwwD&DJkYGgdmda^s^>bF93=P2 zKyPWocsx2fG&`5hOt$)mc>RWTJv}>bzVZ4m?K*n>BkfA15(N3WO7;`iZM|)8^2kGT zKYm^GAKtNLVxqb0yRFUJROs=2pQGy+dJf$7nIHBN_`c+ywr$l&-m@kQ12fTX)@*iu z&p?0NR|>;+Yq5W5?UXhq?QFl`d_A_-lzYB?&mHGnapC#bzO1l)90G~p_jdiC{rWw| zpa3#Uo?9X;#YVujGw(7X!YsElwd}}rv)0P1VZbDv)Oi7=5Ipsip*JQ%3In4EnZ||msFbV-6A}K~h zg(M>00}HSS3n>CZ2BdOKYx@HBY(Xla4mAQGbf+2+5mA=fuARERSk1NaW&#LW8|jOv zucU*3oD(84`um-M;>oW3y8FT1QdRc!Hw%T?c8}mW^=9dt+(C!>}Ne| zXmAJsy!XXC5S{T=dOT9E*T3Hz_@T;&KlTNRLn|0WI&HSBby^z}D(92- zQawvr&ZR^Ff_Bakfq;kzk!BA;6b6+NYNG)O(K*X$dv0N#kopD(vMjT$L!cHv{(xIQ_cK3r*;Utl>#JY;=TH6Jxmz|jmpYuL z|LzS}Klf+f^Yt5U+jsx1UiU3Dy@^UG8P}TovFE*5^{uN!lrisHlC4Afo9}<`!}mW_ zZ#S=f<~7@1^Y41l^&_ydAqAiP;_VMSa=54Bu+2J9dHq4#s-ZFA`fJPw*YNefU?z}=O#jy^E88o0$%6re=i=gK$ z%MxuA0D_?RzPL6-3WCU5m*)u*vS+2pdk-u`SSpp3R*l+Rp65$TOZVS@KO!onCMG71 z9zD8!`}VoHIb)30S}En6d*FcwdU|?_1;1m*j=sLWtFF50InQ|xix47s77-yV^oa*x z0Awre#O0}uN?5KSfC2yj=bR$K?@#j-@~>V0Oiz55*#lCm(Yod4Tju8H4<9|!Xf=AO zJv(>q92ptu>FF689gRa1MiC+sQ5?ra=oyL~2LOnuShp*ycjeV6J}RDUVNm6Ho@N<{ zIOmvI0Iap%`ydFiEZetlUzTO{dc9mJZ`rz45$)f*uUT)jTdj*PzWBn6E@5UO(pqb+ z0pKtG>JvYliF=adzx=oV^25G_?@LOhl2VF@oO8}OSY88#$!8rq_JrN_p)?U8vk;Qj zN^9LUCK0{&sdd&f;fc2r3rnW>8N0^h%JGZkwDM&+p*{r>1)wmAq_E$M-vL<|fe;B% zM5Gi4KahEPs^p387yr`a>G<;xS0>uAXJ4x=YE8;$PfC+AKuQ1|=ipndc4Mhg3bk-2 za}bw%oU@fmPfw+n%0`t`NMIBg4S^C3;=IZ&CaGk(2kgGuM6|LIFmu<7WM-0bHM;wz z+y2j={W)}I9Q&!684o-&JDan3@5T92Tq?(KAD5?xi^FuC{^DrD#b?6o z0gw<8L>K{Z`D-g~GBbPcSN_tycko@s<>h&UOV%UkXra;k_rLyYZ}_R#c9I1{)=J{Z zqszf%z&VH)abDPq7$QUlU_fCJ@4+)728sa0E#FyjiN&=GvtQnyab-?K1i%v()>_x^ z1OQ8j0%)e2ANDN^(`kgPYDxAM8*IxfHRs&SiB`ftwRuHF(ZY5MBW2Pj$)J4 zrNFDWw$%?BBKTsd%k^VDhy7{Nc)- zAN{qU6i?1B&Q8y-8R=6>v-lNTrFh=~fIR?U@f)+SSQPk)U;M3udmdOgcxO-rKilE^DIe|tldtt#P{@uvr|*vV-)I5o7R#t%|^SOrj2IWYIN$g zbZkvOqI+cTRA2%^zjn=_D6Z8U5ebW99vT}_fiZzeI@a3!m2Z3}001NKNowOHvkI_K zcU0&;Kmh^ZlfKaXzQ~GV6p5p%);hOoq5Zt~D~4II1>o`#y4INpA{D1)b^suREP^cX zC>!rl=LLZ8JAC!D{M!~3K@jJhCKYIn;;n~vnuMJsG=Wk|YZZl|Fatms2HGeP&hpH2 z&Maw?AOM2&RI9B{dii+#;vHq1w*deF1A|8COV(E=A4%fg;UulK+O2XWM#O=Efh28f zt+4!akPYVEmcOC$&b72@3rfzO+mSrO1JuARSQ5Zy_E|sc%W4heRtkFg|pO}~cw#3lN zpf?V)JT*ELBohXeYNe+-FfqAc?IXZ6I5NI@`*tD>OX2XEwI&RE2Zysf7o|0VcMbuR zA^~yUdG8Ss3BoWC_9igQUf7qzSXfZNC@tQDFd`yg5NH9*>{&Dtbvj8Lm-0MEpG)7s z{mD7KbNfpJeVuwLiR`Pv;P{4mz0_Y;4;-7jAa6aV&ml8$*h<=&Zv!Cvv2r=c6SLUL zj?bvwN16wxlg@l+a8Q-2s@`%-wdS@YtHkB=&mWzcsZCF-G@rF;y_G0%t&7*ISH5t= zmD@LMUekNu`w!b*nr}>s;=b{|+aH*otXE%fRppvZ{+8+d$$Ek(2NZsgPPK@z@QOp^ znaiY&C;_q7W?5#vYujWjG_8e&IEZGNji5IkTYrv^gKVbOKfYE4hKQ8+@leSlgJ=K- zW~GhjP?*z&rKO{X8+-S{Vm)m)AkU3bB3>zlicF=VEvRJS|V66z(~5;gS}vJ$8RyT?Bvu6~ZympHwnU zvf1Md;B25TmiS`f!_fR+qF#%zL$HHfX4oJg00d__>Y1e!p$U*MU@sY=)=Fu~Qi!zn zEY8_DH0uU+sMX%-#ZJrBYnhN5>I?fzU`WM5fyKHYK&_Rx&M^-5Ms3RrsSTA9_DU)7 z;MvQvUg}Q5YRYOQJX%=W0CJMsk4yl7_ygB+Pn{4c=X?+ZNa(B+0d2GwE&{(I;!(O< zN{a7OflMGGD>Og=td&y4iSn7n0^JhHR}K&)3QVM!1cVU) zkh&{Y1lU8xU@44{eI-!kKt%x{+Q$DdntZal+)i>qa37OrV>K3r7weZq(~T!^7KloGZ-2q5`Ez6+Va} zQbdR-EJQRtF)=!ttQn$*Cp%kn$u!l_5>T4=eBc8guYUHB8wkzDwXo1zDIK>|?aW;E%;!n(#!Fob7n;EjVvIQwC`#uXQ@$ITFo5aKYu9er0HW zt|j}w9jlI$Jo6H~`X}E!Iy~|{JThkPu3P~GB85r2cI43BuYdJ(x88Dn)@&rrdKd*^ zpi5EA?3Gf^$=vMx-C5_$pZ)O2nvGXK^SLj3_3O{wc_jek)`KENKq81w7!vLs8~e~d ze(a)4FJh3mQg(SJ5U`gdO#%~$17FYaZ^Y$$pHkT@8Ld??Kc}~*|u+!H&z+$bxb6@A7ha30Yn;kh6 zbQ1ACH9<1m-*?3oeOF&K{K6OakF5a!@g9}>9u~lll(2vx5jETG`Px$MIY~3`IgVpz zZPIS{R?E)js$51?M5GiU5&(gCffJc1#r|HP>`?6S0z~9J1Bg;6f<*|DkTj8XuGpxG z@ywFtwp1$j_Vz6;Eip@)=F^ii)oL}4%X#jA)a=5dAdpr7fJ8vZ%+;+d z08{b&iBLdt%ei9^uM~+05&;MyC{j`2SE8{>sUl?q0atSJqyV)*6g)~To|5pl452|6 zC=-wZ2rCdT>@K`6N(LZ60D{24Kfnq4*CGP&p5>n(0(d>Z>j3~>5Aey8zxJM!{)H2P z`={k!o#c7$eU1PkjKYRVvDbt?%WDgZIp+fC(=4%BDJEz0rP>k#)a&(WH5J8iwYO(@ zWB^M6k!B^i_}qKTR*gPQrc)^Sis@;fcS?X@^~b;a7&QIKst;RAlS3Pdn|mz5Q*keAUZa z&ARs~8lQ8{V8L7T8FCK5BJ2xW$9n()@PfRI=P3YTLP9?60sue&y@&{RQwazO5JUt8 z1dGVS2_KcYa2X19twhi}55hn!;LtOH7B4Km>zHzZ|0`n1#XEu2c}4_}mAqDek`L`@eDJ(L6u*k(B0>NcH zS7!cYdJUFdQ7(@V|6e*<+9XkBbLl14-w0`~i^+xM*rIIF{EK7(~F*A=+ zs@=RL79jxcD%irUJ1Ho73i@9B`ZNIlw0vKp2%RJEb3&{d6(e^*5ou-)!$2W;t2>>x zG0HnTGczS3<#Kgspnqz1UKm=<*2v({EH1=Re9_w8pS-9XO49L;2(`xj^M1onw6V{P zm~C)496xWdU|@xr6@@|{r!Dw$JaI* z&2~GfmdjxjI_E})hJm17tJUjI1Moj&K@=i#>;ZtCW9BH1!!WdI!&+NZM_K2EEih{n z>$oI74|K)Z#?tg83UA)HxmIteQeV<;^$TXXRa%$Im9*K|c+RHTg(Yi&U3SNg$x%ZrT&jN^m-h1bqQWO}Cge)9Jp%aIQVPFsh*b{*!^2{P& zj79-w3Bw==0z@bR(9E_sD%t7wre|!s`jU|kefy49$NlW9uiU2xu&z;TlBum<9qRe1YZ-SlN>sli_x5nkZ`ThG9dQl+(PVYN#_@28)whs3W4CpWl zsxbp4vkSIXPmdk56G!vms>e!0yY)=SsHEsPiEFhHd`|>32XFLN+DvEMb4b zNj>GrCm`)rq_12i0>|uuDIjCC^UefH3wo5ccc>3(QKrx=1~7&rLVW0B#QLN&{!15);R$1ihxBxx&kXGV6bg?}Y0U!b?!YTp)pbZg9B{q>EZ@swO1R98(005}2CkTjO85k%~ zD5QJKO29i7ZyhPEka+o7$!V2jk5dZwQfs}qxcL6}zyGiQ>i_du22Lu~G7$BZt9glr}gOs3F6bT{N`sSo2UTpZ7ggfb&KUZ5g3;l_MWI_>$gI z^^MOCe(bWo&;-r2k{_8=dgiucV`-$Rl^U7z4|pZ)871DvV&&%l|(1`u~Zyyzy`T=zaIzd+*K*FUXQk z0e?kN$$8I$kv5)vVzb^-g@uD42y_TamRgP221c9h=bgXvqD$uIW)2@Yy7$1I-S^!! zI5;*sHo9@+)}BfaaNex9J7F9K#)~$ACT8!MnbR~i#sonK#9lbhEh#W1gD9YN0eLA! zA|3!p={)xcpj3#Ede25Eca}6c=kh$y^L$`nVCT-A_uY4&F=lvpSSi)t-`8rjippAR z?FAQHP%f7njmE&hfYxf=x^)}YulL?5r2(LJV1MH)U#)%o6U}>fVXJKb0)PMj0g7-n z9D@3tcOCiPe`7Xo9Dm1K&wKZ;RELMzJ5v9qV>pOV6t2|k^;WCZPSV_35wOn9&dvo& zWxZ9SR1gG(!Y5M9LL{Wr3c$e3%v=;S7b}*z$SFh-Km=w%?1JUa`QnKez)ZoHppBuUGAC(O)jU9Ls7TWxlZ5L=BV83@7>iDxI?Q9;9{6y!GVv}y~J z7MTu}gZ|-x-ogHjo7Y7p?L<7F6J``F$Y#1~-)XH2TZ_2}{Ne814}R{$|5TefzBoB4 zU^AB|SsF&6_ddxj5dlk{=e1hRu`_|ra}I+zRID*?%pH56K8<~suB@!(;&nNh4TA}g zmw8!=|4!70g9ZQ=rHI8B+Q5s@%4$XGY6)Rk&W!HfLgDomC7U7uLV(N2lmGw&l5}&; zyQe$xbCDnf3}BtLp5OGAx4iQg-&t?hJ*V1mZW9*k!I4<@mc%l9K=1%wgjpAmm;f*5 zWV0}MFUtz8xDWvm?j{|{G8`|D0f4X<&V*CP9s~oW#Ty3n=us4q&2uz}D5!Mc000%7;5ZQ}2viuU zaFH3%3oBHBf~mD0cwlhkqU~2|4d<-e_+!t0&c^i{n$70)-0Va9_s!1C?B4z0!DCa+ zW;2dM1pq7_L<@>Ac|b&`NkjxZpvXyN22ab=^1TU@7x0EaAt3@0^GTUHa1te9k(-Dh zfI?b(n_1`MFl@3#+eYu4&xi!4EC5j+0sI@{AVpocL<8p7LMT{hh*B^!GOKRjQo1QYY@H@z=1!7yonI;t7+h9euu>Ex1r5>iaOlRD z3aU%-%#n$LAe^3_-oO8zX0vhV(BY+}#fSDhI6pVv*WWihJRAh((n~LW-t(TfZr$2; zyKSvQL@ul{qQdbdC~^V{^u6m1BNqSCilZTqo?ArxH|@NwB99^rIQ_#SDEkAvp4G15 z>~i+2`#y)Sc0fb~L;}Q$#$K)JxhU^CNfH3RJ-&MDuxzcs#Lol-P2HEC^LsZ_!+ zMudVKj0iiO_W9?Z_t3+8>&<3=Pj7FvN12WYXl<63mMWE=EYC}&sJFjgD}C_b0i|?L z<&6Bj-p6KvAcj8$a?W{#(w9$k}O6f3EN+n5BiOSYF zad}TAZnawNX3K=-H1X(teQ9ys_-LS^R4MD;fqw5J1+E|)5e}kQ6PBvIKKIQ=ZFYA0 z@S*)X&fga3z&pvZtk$THuUm&o33zsnMTp2d=e?I=vq50*ioA0XX75Ej0)sFi5FvXT z1O@<{btce-Zm_xQv^xM0L?Olz+x(;d@Qu$8gd6(I%dXsT-j;P&U$XU!w>-3aX>r>1 z_l{JzY`pyNk?DWhb?>u|EuOa-pf9R7r93&ge#_dZ(zh_dk*aMUl@~wf!k4`G+TZ?@ z|F?B0+6@!UvDr}_1By?GFDY{N2ho1sr`?SPKV{biDSpN z4vo$%wKn$#FM8IxJ&&|MefLZ=J65R-oc&=v9zjH5ZZsOxwZ+eW;S2xn-S3V_d+(J} zX9~Qo8Ztgh9QiEY7iQ+J3*nXVP zX%Ymw9E9aK3Y1!Z-u9g@dTwvI>>F86rPQ=}ZQ`gN9GRP0oZWZm;DdXo4j<3ixAF{F z1lfw3KRR>DO^G~)j(*}bW=~8W!=(RVZ+}m<$YW_RdJOIN7{ecP{`d(FKRf!O6gq$E zC9e8yfx>!Kf);U(AQSkMgG?|((Ilgu_q*C>HCEA#NZO~MCGru`Kd-XC_J{&k0BAUk z*B!bLX%UB9<-Bne0f6$}kyDBQz@X8f+55yhA_d4EoXwb>t46YIT^Rs1_;RQV>I&_d z3%U|SX4_7r-nN~LLedF)B;|AAqIwCJ0r%yE{%%@A5!65`2>SpLq-(_&21XGEC>ZX# z`L-ve**=+aR{Il{U6dzL?z;QNy$8Nq(q{em1{IYK9+_A_zVYQRel0;65tnJl3S3NB z7)VhUqF^HMAc#aLgd`wZ6_X}J8j7fof)$$xkpLtz=H6ZRx}q4jaI;zBB#N7 zQQgCXB4o$bdH}S}6^YDLoQ$E{gW%CM9A}=iM?EP-EVidTd-i<&>tFx$Xa4!2`yN;` zGKxLO&gag0Ve2d?Tx>N1rOTy?_nt+pbBbteWaQi5_{P`2_OV%X<}se=Y6UVU4*r-9%wzaJr(S>#qmXRctS`>Z zH0yId&pC`NkO_=d)M__c&1M{xjaHz^d#{x)RA^?M(wek#S)Mx|#gPtzcC8kKWkjQu zw%#gIo-Go0I<0oI6$U|6F5Ap^i7+7ywqvl{oOm( zu3H;wqm^Or(=;iWkd!Vq(E@UN#hc!8$5%gl{k=22ap|IUeb-dYr}m^r+xbX8%2Mx; zs+HC3;dcLL?pV0s9H~|kMfl{^jdm-*@Wpa6O1U2_X%cTmYB!pgEY&0oC@1r2{)`Ez%IYlx- zbiqXzUwY}~_1eOrBL^Sav*+&b-Z8dj?S@U;Hf`9P=b11IU@BQD2#Q6hwMGE%9W$Z0 zAW)sumg15^$n(5l#ZXG2h@fbNc@9aE0%``#k`&P}3o|lvp6Bg$JIk_awYq)#_Q}b~ zBuVP^+VJoYQ8mk4mZe#iA>xi5JB%?=6j^I`o_`(^5zzeIcOH5F`_oT+TGeY+fFXcD z8$n=!0HEXSB0#5q5X&W>=HbGe9656IJ?}mGPanPbeec`$idO z^q3pm6SQxo8}5QMO`EM&n%ZvqFEb)!HV=X@ief}up%Ly5IjQzty7e?ggC2%1O9VJ4 z&N(7dN)>-8%Ho3{DA0FANRrfh4@3ZHt&O5+aBwiovibRWB5Ji-m1QCX=iKbf%<#~V zwHCU&qkJDG#LCcV7RH`B7v6iK?o0SD@Zo+hQef>50n7pbzzqPf>KZ^G zfZyK)ivsMxAjA#^HJn?Dw?xlBhmHUo$T>ggaLL&v03nD1*wVLVQ*{b12mIYG9)CJk z|GSSm$@j$b^>{_Pj@T+ESE} zJkN^ES|O*j7H~kq0Io=z_Tsz+c8Y|^dCRSOXMS!*L=HYOJUBWOm&(HPf_Nr-TnxZU1xhKDZmS9JnUpFj z=8ZASTI_@_>!v;u%1SJ?NYZ6l0iT!|Kv1hnsdV)4vG08QJ2%{L!_?Fy5w%-wZFCUC zS_d;zb5qA>Jo{U3x$`Su`T9HF@z%>OyL@nPu+?gNpA*qZ*^$c@*GVpKp+%YblvvOS z!(HTQ0RB-z8jU$)S}7tpE8dw&KnL5fP9kb;i#Tym)`s7)*#~?n#CqBDUM+rz=4bQv>wOfg%vF z)_LzjMTlgKQA!&PUTJaO+vL!`J!>{>$urk#E@o*mKQoE8H8Q@b#hkMP69IsA-enmx z>L4J%g~t5i{QSiiT^yFe>4`~-B5lI?si}2q#@JS5kdz)uTBHji@3p+(%ts|w3G9a!9>Xpk8L*R4YLJW7FGq&v<|AqNx?t;Od=Rf1Z z-Zdje!*v&rU$!*Af1!SOF&ka8>72@7XWh0V58Z7Rf(Q4svP8e_y8e-YW(qxD|LlIu zmww@G>&mKf*FAf_bmzg}`?c4<{KucIBr5mDgo={-KY!-Kvz_MQBTL&ije}Q7%O5+| zo=EinyJ5B?Yu1mNcIM`i@}a40!&(l8bp&?bG6q zX_`h+bpPHx|NV_Wmo3!lx7`2BfA_wTxLTwPpZsMwDJXEt(M}K4p1O9<^!;vI8pfhU zv7iRfK;s>jO7G$N{Mh#G!`pY{8cOTN!r`HyucuX;y!JKEjmy2N z(nDc5cmHnJnyUhICXdbR-ILg?-Dox1Nz%?eSZgIsU1ELPa|&ehG&D&$Rejn72M)R~ zWKmBgJHDj*tDCR6q;F&-J#)Ww1c*_e z<@5}aKU)13nUu?T@=EZvF!<2(iD(W2t*ZH#PsfOWctj9{4|x6{(N4ryDS3-ipCQ~R zytA)|I=1Q38AZ>O_(eXuM|BR0T%+Jdz+MkK0UXFGw=c4s(!N@F1xXYl0|HQ&&yyv| zY$r`DgNO%#G04l*w}GbzI5L|#I5 z!uVY&GALS!6gjH`Q1tFxo?HPaY9Wg#_9;;AnV;47BB)TEm06vgoOJ;{VQJK7r;krn ztCd4Xk9iM-a@mDD`uciv%Pe9PFaryq0Ct@;EMh?bfF6(tSb&rV_Jw|6FMtN92oe*X zz-$G$6vwyTeCww^`VVXRqv5{z!ponLrwI@OcjwzLGp;H`rBt5V+&Rm@%u!%OJTMc1 z!lH9M6r`_@`5;c-=883T@bICZ`I(>D^T6)m;h~M=hJAqC8;n+QB+hkN}fk?EC7cN9%A8NdiT3u^P1QE#&7;6EK|S0Fe|n!>_v+P6wYe%v*KKJ zaFB@7w9VaoNG1Xz^6YN8@utHMKQcbhUpAp8L1JU76HARl2lt=5EH{^GIe~RIaZt**IR49QW8$uVE|aT5d)< z2N@~rOjN;bC~?Cwck%>!8W+B;^T;Q^@JM59Fn#S?-h9DJUnm%Qmp1m_w`YP1 z9{KHG`<30hcD?JDf34CxVx2d-NQ4qRgByLy`p>O>!<*mu_y6aEx88dD6<1vBM;wq z@7=fc500+iuzACVP33ASOEYlRqmVMbxEPc)%e=QJm}O}x4oqM?i$)|;0HT~LkP*_x zW=YbnqmI%%OFC_(!Zc0OG;O!r?RLA<=~!!>v)=nG%hNOs!;o3hREmtBR;#6yK0Yz= z+~;0*?)euiOiq3Cy?^k?-~Mgv?G}LZv@U}%gYsSw72qVhr5CTkd_1qu-(KCPjKe2P9e;|<@1XVh7204PT@LBCc3J^7(S-pYJ z&YpsJsxTK7Z_;eFvLs8=)Hxd%BO=Ta1VK+vk2YFBw9-Y6RI!hr3_`E0NoFn>G7Gd` zL{^4yk#Io-2u19#Ai&gGd+&w02qrLd7>1*xqn%Et-EI#I4758P5h?nMH=0dEEQav+ z7E12gEkLA*sOUJ(0^Tt*D@CMFB_cuq@7Xz@Ia}OIDUL`Xv-jRJKZfV^gA^oC=FIL7 z7WU7RdB$d|<2@I>+gZdj3rmr#07?juNQ|N|2mr);EC_!TDHgHL6G73UmlPHS^e4~b z3Y5Own?sfX%w?+O0#7e8qlyT3x5jhXqF;Vdq`==+N>Z1TG48Hv3gB7vnP>VsqD{TDu-Q* zkTGb43PKM8DVTC@AUg`-!JLx=4h~wGb5Lh+0)+VR^z@bhw>~6aT?>m0ouWX7prlpR zP$V$~>yM<-?KZh5dFZaWrxbk$0EKAKoH;;??y=%;PqCn;62j_RI|2x>=j_bGMPW#& z&m15H&)H*Q{3i<|Ad1b?PP>iH=`cWrPCSxAqdYo5<%k)G#UWC+F}u&1Eo1H#D}ewU zdtRKJK7M@0dtdG8x%|p2)~p@3&}BV2+373ZBCU1EYUapoBJZWd9TD2}o(!`2))^*Xe6RvwvJY6`R0#MLtkSGw4ZsQyP z#ZVB=c@PC81^Wi7B7LKqXoUa*zFRUb1*$KIu8XKIQ@AhR69^P!dEFvT5O*SVx{Jye z49`wL36cP#y!@4~{P}nPe5+Ff1w_uWWuGEA059Hq&JnCCX!BKIO!>f}i9HVQ zXI>tL#@e<>Va~Hws;l3mnbk66wwbmA`nu}(7T8U8tC|aX2ItW7n%j~Sn zqj0cM&pz|%&pxu}aHnIP74O&tL8TII*|zqQOE22Fb4M7&q{vzDAXbDu+6R~22nn#RWE(}>tC~eY}jZa zF3gWSOI(*%K1%>O0KH*saKoCx3wQkIPk!!;|M;0NPA%3<6l$XkqmVFr1OZ{TELh}} z{)^bPe}IA%$AD)GkbZxM2hOs`$N~KRPC%w~wk=hd{n_*<=@8BuU}T>?RuR>sgoqRg zX;oCWYaj+#CdeRR@dX1{*J4LzhXTm#z0IPaWK96hMEcJ^mmXDvXsxeyt3o6N}lo$-eW<4 zT;%#jBVR3oj{r`fU#qJtl~whJ02stw?e;`&gEMF_0eEJm(yO&QGe~gidAkr85~4x~ zjB?hhDD*7WIT1kwt&MegNi+cr_Vt(`m|LtV6WFw4Z63xw1HD5^8>a#;^{2V*s1Za6 z$&=5MwAJji%aQKX=9={d@xEHAXszQ?X?AwLRIYmQabSjrh7M00uQyxc<71UdSsR_C zi6SDBR;x8KGOCp(!nwKGFbK4wAP77=c=DV%0SPhKmmdCBa)v_FQnXIUB@r6vgbBl**lT)>@l0iw;b|PESg+w_2G- zYra~Fo6W}T;r*qa-i7&vO1V5X5Y0~=Yc4Hrzxb-UmE7g1f-o!*qG6vTjrpbd;}b{E z-?Dw6Z{X08BVio(k3_BZ((ph}wH&uwt&Vlofx#e%6d@uYbb}gDbf}F3&rBMXQV3v- zwl-()qA2vvD#RcN0nz7Phq|ZQ!%X2vfW>g%P2%QoG1f9=C}E*&|>t=hz!a;c6gTd7P>_?K-T z&^|eO`@z5bjkmq|4X@B)1SATwsl(IlPW{p=o`3Y8zp;Kz?}b-hGSm2G-{89aP5R{R zjiqcLG_KXc#ZKesRBh@U@|?GuuHMWXF!*qC;>2curUkh|ma^(c%*@XJ`G5cYU3(vT z-Vxj}c!B!(ozn@RPcPoM)jLL8bGv)8DiQ|Bf+q~ULT`rx>Iu8uW3Fa(0d(s$z?xmm-Mg~-UV(PoI(+f$SJ3oBOt(RS} z^O7ICa{Q``f~_0No405zm!ePXzVqRr*$Shu+#BwA)`cr~Bmz3Xecx%!?N4>MdJc^U zT=4R~@}Txko@D(YfP^mNdp|kvQpVL#cy>}5G3URmZ@DS-kCX^Vfa<39>_OWKL9H4i z5P%m|)(q(2^!>3IelTy{)R|p%I09zkFOB;zj{37z)GrWVCjN7ciB$Zmsm%^#NQEz| ztT{PE&HO0zg-!zB1OS8z+Ds{mKXmy%X|ZCHO9b?JSKE zJRj&A(Z*5VJl`ejSan1VB9+7~p(Fxl;Zv0&DfJZb>_S7!G`m6sBAx}vC=&*GY5~w$ z@B&(E1uVcSQ00h1t%?evqP4iNIPU%`Ji9obGxvZj)*INwzy!`Y z1Z*X3o7=z`K}eD`2#nSyv$lX}6smi6-E;4~_ifm?@zt+>bsWb9(st5Ad)(J1f`Ms$ zcUO9Bf`VZ6D1b=Mv!1E@dd0a@gD)Z&1lh5P=682dU{)E9$a!8m@7&V4J0#CniQOPd zp4Yy8{TV-XPWSisKJ)5Fha)*plTNFVr5&4RL^>B+DutaS`OGK(xu;sX{L)L;jIYVk zPBATh`O2+x${5Es&oe+M_~(sLaU8NBqImCs2)tihT1vBgaA2rht~Q%3?<_MTkvLIW z8Le-*@utI%>>C*v42@Ps6S#654F*vs;o9PoQi>F2Nrs3@YooPNx?qqdA~<+`f6YE~ z=fGP=DwS-{v7oVoCx8ADxVPO`sicd;qwzu?y1tH++mER8wyGdgH$E_X!|vIha{R)# z{pz+$E(UH5Mlll+=N+s}_nd#prbDW6pBy{%(8QX{`}Q4Do6Z|Qztz0!AoOp4_&a{f zmDM-F|DWuLrgU4?TEaK1Q|I ztiNwjqUZNbPPjEAsbti_^>@s=?vGxVI-Pmo>q_K;r3KI8Hae&9n_UvUYu4}zd*>}kRmnptbJEK8E4TrMl6>-B~!ShWZj=I1WG@)@st(_3!; zhrj>CfBWslV@CrdV@#iSz-$n$A^;$S2}1m%_dVy||Az=5efZ&{KlM{1fB5@rUh(ox zFMs*e{l9+8Fa3(S<)(Z7hGp-wWVJDV13Uxou;ikZDx5QoFOZAtmPfJt2F?xo zw+B9d(%hdkbI!9D0r0rojz}SqLPdmxL>Ool1{x5Y^CF4tv^yR}ip{m63aViytXR!$Y%3Q7?O`(iw+Zps@K3ABRX1)ir!+>QI%4PUtE z{7cI{Lnu;>s@}PR`k|X<^28@?C8zKQB)_}-!%8Lkq3hrqQ?S1Yvkp28=;0lI34H_u zlnk3ZE%9^$^BF8Tn6q%qK`Kx}7}Nj=C4mLRC7f*O_Q4$X=5W-(oQI|dFMuQlAaPJP zFzKM~Ar)W%g-{}2LEo$VpgDSu*|<%wdsE-D&B*aDw!id8hl!A%Y!_HS0@O#-#XA}Y z16<92M9kS;P+og}c|2$L1CKuoqH>%ZnE5Bi3BsvmTnNZuBQv&X@YN#zbdX6v6o$uZ zU#lgLXpB}x*#%(J;A!_zzTlC_!Qr5b@Y6TUfNy?C;t_U-*(?+FPq76EMR=cf~0u&_Vw=bpKzFNHQFYS=SQuH@0|O#47QnnLlfj%Q>o1DS z6#z(KYas#xx`J{aL8NF$1|kR|2=K07`i0!*KrHBqobxFvE6zf}6$%c)gP@{_rSz#! ze(f9Ix&^>A8jE}P9eV3qUKa#0a8Bge3jlgA-m}&L0s*Kjb!n34xfO_%DhGisg+?hV z_9^F__ZdLuy-Sk3*-AazI0~au5C)}AJN)av`q0s%lX2Lmbr={8K*Eye`MviYxa;mc z7hZJkD_-#u9fWC?JN7{2fpg&wh)2*u1)VLDMgqg0y?}^U>=gq7I*+746MGLv*fMDn z@=6J67C;g2gag1=z5d64`Zcc{?$cr$oD(YsLWQAGiiM4-pg8dhh(eYvs%os?^y-&v z+`RUKAO7(E<18t1%%n>opz~bIH-(Jp6DP1E+~Oj5QYfKTh2O7 zO;qkJfjB}60_vb#_L4WpL+8WHzR!H>V`G5PhO^5Wl>TW2}B2j)riK+Cao1OW8jhhcR5`0)>X;Dg7G z9a>mi&?+=0$nqQsy$E|RB0->wNKw%v3`sNw$S^rM^S}T4|J-%wu7CH-zqonx<|OHO z&jn8=FWUrEAfhKI=T4-^uYmDTSatAp1^lvz0BLM2+TFJ|!!n&7DJH^B(+`ga7ii3W z7`aCXzygn?X@})>y^8=j%ev59a|Qq&00`iCp6~9Y(dni;000QU<>m4dx-*e({Mvhu z3QAEJ81N#VCChDYtx*Ufoh0cgmjXqlQrt;X1we#exL&LGQm}C3z~Jy$)iVPjV4wiR zyWB0!&$z4|Y3|gP4Ei;L1MIyQ2Bi_PTrM>lwNkk{GB!H9Fb~3tFio<}8#nIXe{lCh z4{zJLB{U|td2erzbME-W@qxa+IEo6}uD_?JRF^~5CHPHouJzgTN{ah0B)R)>iY*%ElKp^;~c(^KUz>h0~F zoI1|ztCdpHTrz>qvLsD9<#M^xY*s2&)LNU8LKBH^vt?}*XA<@3pkiDHRDUL-IFF)0 zu;p1Jg5@S)N!Tl;!;&(AThom7a*|h%kFMMHgayoIfjl-qqJ$LQobZe~FUwqMdGqvWX;l4M% zVD0fVsI}ex1IPPDdOYKy$$aW~YU_O8y{+kbcH!pU#!}}AF0n^R;hdXF`FY=&ZQQb} zIz0M;)EHjHpWgF<-}=cHy#fH7b=v48%W8{@Yu2oJa)B!VD44Q}eNGc7 z7D5scFP@Pyc9kd=RCD#E%ILt@hK)(BRw-42YSmkpHYNwQZg!TJjvQ=1a39qc>&=z~ zfXz;OW2 z!g57?bOHCHj)6#!An#$CA=s#p(Dq>Umwb7<9UK<5J{qb9J1G0Qk4N6jO`jiblS1Nq zJs{&1BrTv3Uu2uEwzXlmf(PKyTMIKghbO|50Nm}wDIn;qPjhdbfQX`E8o+2!01Cwc zSm#ABcRoq;Ffyb7h*610>R1LqLiB(vAP9c>?A-)ZpdzM#%Z#4Ibz`^1J9K%aiu8z+ zRaTLHFHb53y#Nwsbvt)YLzh;0{gKeNeQ6{Zx(FeA(h8GqzTx(youtj|%1hR5-!{7c z;Guo{4-NDm*%9}Bch}9m)vW;c9!SXQ=pvp<;Z|A z3yDZk_3phFCjCT6j0#egTW-1Kjc<7UXtiG}%xpHluwcDwbrJxWOEW|)5S=0zZ*z-? z*16nT0LXI5@|>BYFai)nDw_Dd;~nq#zz06?{`bFs+qP}r^Rqyr?AY=41G_1XVATk( zNac#lSNA;xkjOO}?FV*K6s{7UAmUEP3=g5cK(cIgh@H9f@FU#mtU|PTi5%n zYfe76^Uh{TmL}{SQSmsiS}oTbjil2d;k)m=Yx|CEThHB*rwMshI&#hlNS0w%87LHEYKzh0;LE*tj&vD__eCi>giusIdJ~9?|kr{+pxB4 zaR!d$y=&JU8Mx$K;}!Xxi+k^HUOw^g9dYx}!~?eMxWDbUjrBe6P4BwwvS+xwnSp8N zNpGnVn@~7iUtJo$_BU_+(%&38dbn@j-2H3BkN9l^7ap8Gw6ij+)ytEfQ3DVLDzS9W zY!)g$r&9jqS6}cqpWe0pYY)HX`RC6!+XKDj|M!1CcjGs2**-i!r7tl1^?755!}DG` zRISYK`&@X;4Y?Vr*xA14Kkl_9o}Dq#?CiuJyyrjcy7j9sc-C`X`hshFE6kFiU|3Ss zAkMPP=F-#CZ>pv0$Y`mz-zJ?>7`RT_?kp+o;s_%Z+05iND_3ZEV0}5HUArH;>!z># zxBt-i?LYd<4V%w*&MQr;Zv&@^QJ_#>`^H!O=DYv%%{Slt{1-g0)@ZU921e#;x#FGo z>`{zT3W-b-E4zO8J@J|~SN;6Eo^lKxL7dcgCAQ^JpO(x=z^RnCgkvu|Lt8fi)Y#si zE#B7F6;j(F+IFYoy^q2`X2SN~G5v7z-W^rL*dioIihEa(Lyw1L}@Z_Kr7dT};F>?@TA2Zz_hm6CH7JQoFK0%s_6eaZw0@+L1l znCobjOifha+ENi>S^FYfxS|M;;jo4}N^H2bqJerK$IJpcem>N<0CQ^zNdHEM0(yxm@C)aMsx z(^kFdeT$GPm7%^h)lyGoXlU)$t>;zB!$^Lxr=REt86qBpOFWDNtc#!ucy$0HBwv06 zj^r@qVb(#ypb@G7o`4k}XFi}{)8Ne8nY z<~=kSEC6{35R?N%nDJ2e&{=K(R6?jCw3riaIzKh2OPce3U0M?YJZWq1WGP&Xx=ZeD z9xYL@ivNh%_SvxMxu`-<-tvD!f+B9Nc}MOWcv_i00(wb%qHUW7Uvq}xf~f1sBh!r= z4OPwnz{|S+7a@#3{%dm16?rR#^7hUZX)7MA^IibFwZfp4687G@q9-wX_TD@1kiiQ( z_Rb3t5HNyQ+K^UAsFYsW2w0d=2o(tin!w99zy5Vas;_sTzPK1w;!Zk`%JuZd%#vl$ z$&w%nD)Zv!3&mvCyNiYfRnY^HuaGAhJ#4{_Vrt z&!#^+i;pyp-Kc_!oFPCwxcNnZPe6a7inKOy1aY|-IZ0438dLT=ER{dd-Sjw`R08KYI|e;SFmz6G8+LZIBdbRrq2A zC=L{ZFfyS6g08*-faPNMLN!WJ7+kat>E+dthv|F8` z!yvn^@8Fzc?-4+dNEs*Ii8G|w2?EA(_5S;J|Hg0p<{RJm#+SVKC9uLjiilEN5{Yz) zxuA%_F2`L9&lI5O<|u$qSHPbv0!m|Crl3Tpn+HfJEPA!%+#jTbSmf!RDhQwmg2zI( z3}Q?eo{1mui5qqW!zdR?aY%8fdn(j!rvQQ}D8h0SdhfF|?Fs6Itxm@=PaZp3TUhAtt&R*1 zj;z}#s0u6qKm;6fp4-&3_12Mrx%n9ne#dz`_V3#}KR;*1uUo%<Fzs{9Pf-? zx^;_f*$tbw&5sTqpU;l9oJKXhx3P58pL^vM%7nU7>ZHwkZ~w}`cz(q*clHgG0j$rn zZ5ETpV*A14|L~RjxAg0GzxHJpuDSTmgUx~7xZY~bx9!A2YifaSxbeun_chk_42_rN zCttPw>`(I)DPl$h00Q276_`T{Gq?WwpVjWa`{7=?AWu{AAL{H~4D-LMUG)b){+o~d z=H0*eo4+;^Rljw^^}qg$|L#41_}*8)`qf>Q=_g58gu1XA34SDg-LWC4(A3taWwg78VzrK{KIhke^4R-0a6)t z>C6E9S@dUt!Jlb30SbXR^Ue$1$d49)RRMSf9GyY^cH_w1FP?NsauOBr*$fv!@E+>~ zYndj=zSy1r9R1pnx@8pPj&d0cB?z>0=tQNP=q>97*UQLxT4{c001+v7ZGO9!stC`)^iaWU{*w4u$8z}o3?c< zSZj1b(uwn}Bpp(Lx7Ipg5o3&Wsd>ahx2AxW<6OMl-U^@#L>89v$^QXg>p45mJO4bbjF(hE3ZlK0sX!oRaNq$^1A?FzVqg$<0O%Q&A`&751`pmC)od&g zVi=dk*N(TBmS&Fbcb+>eNzU5(oTe0ta z=38aMdGocoV`)T=&*|4TbzbFJ#`hnVc=9jZ($slt$LIR7Lsy=wkKVWU&XyglmHbe+ zS7q_xmfB$Q1qY*{>5pVGcVlts+Gn44{ln82ZVBJ>p7#w84;(pqwA`v+eBnB&&jclN z#O&;!pSkyu8SU0#bLxN{4jo>)srx7&bNvgTR;Io*^;duPdwcJ{^EEGh{)?}>Hc-yG zj@FvAHl~C~S_75>6Gm}wPh6>>F|qD5s5`KjW{paqqH4$)gpq+r=V%4>*3D~%NBjGS z`mVq6=HLIVU;W+x_5Sg-o1Ak>smG%pwb4qMo#&tTtQTDO{ty1cv!8vnA<PUxv2fhasZoUeSHJH{lk}E zcGdLk@q_#JJ#g2JcRE?KZsWEsJ4Qx^jZt~hcI?O^X|059o++hRBs4}u0%HhKP>eCQ z+0;GO>|F7p< zSD%=Sl>!m*Od=6bk1^Fb)SB9T)`Q}S5?{cI+b%LNuC_<|h@Bk~Jv)hLP z6rwKEsu^a*7oKPU0*RO*vzA!|Ad2I_DDPc=fB)#%SQtmz1gMnKs(?`efD~rdI*&zj zcRV3bbOa9qgGh+9jFBS|5@Dg|34z%&vvbZ`i-^`*cD!;Z5i!P$kB@7uwbogdwOTD^ zE|<&9oTO>BT0Lc3Ig7A}B8rTu)#?*R_aaPsp=ZMss5S{)ctAZvFZ#)pBfY4yfqyUEY%`NT6fX!Ri(8 zz;Fg?zwcc#2Uv7jCRBi0fl{jAU@vOXQNS~M7NTxw*Ly(}L{v%_%b@6TyiEOCWRqf1 z;tsGv?+yUK!d-*&r0OUrnmrdWBV-m%G7EqpQi@{~6kvd&5LOknRV$qK1;2d|gaB~t z;K8?Vi}rA`)uxB@&Ts$jZ)_hJoSr&tYxQP*W@%!!Q?H?i{tyO21>U0vO&E|Ugcjmn zhGVHTb5L===nyH4NBiISvv2+BxBl8wTL=F;0KW_HUq@ldK??u`B!v#hAq!5!qJ^4= zi5!ktNCo;7C=C?^56}Xr7jpwpI7S7hl|nE88bKoj=&PboC6CGBUA|5 z2nj<=V3DE4000336Cgk!kTA5kS%DUD%X+Vh2mDmM7YeaNK}=><0A554p4wpI2P>$l zEWik-zJ~}%pf#1wI$RWnMpX=!&ji3f(H`*3EW*O5wr< z5@$^49i>^~9hb^Fj^a++x!i|AkY`ToDD?>mIOp1}W|n6`7@VAkc9QE+ILRlt+fZn^ z_fi$pJp5OG^*3*O>+8lw`m!|Dfl{IAw6k`jNmLpcS|94FQZX}GNLdOt{chQh z(#m`9oC6^AfTR(EAW&gA=)E`EOdP-7vqgo@JN8Z~BggGl34&Qp~cWSi-Lq(hHA7VF(ABG@OTmlhz$^iJMxUv?NDT6ScZpR=ZYBKTJua9)7 zf{HTbGXd~VG(gNs0f{CJpqvw%IT7c*_rk?1FXEUzh(b_ldwzWV*3IWV=cc>v`Rl*_ z<>`gRFrbUJZ-4u{-Z45}l{`(`vyS&52OgBtsEC9;l2)-9-gwa$KK_3`|M}1Dd1QLD z8ueGSGJT7UL;yFg8@T%FOM9!);eCf5yz%bmJ!6}u0&EcwHY7$7D-?@bYZhVRBH&L* zD@;NFfL#EdRw_ZHAQUO|I|B=wAo$S#`_SaEiLsH9PTJ|Tb7oOW5rAj*-dk&XJ;0F?wvo|Zr2NfWE9|Tzo8Qkx66jq{dxI^ zLNz~4L4S&f05b@$(nf&*x)caMR1xSJoTm#v4&OwUzqaZ(zlWQXB0n2JKs2cUeV`!d z?QL~hoir_Sctfpv`ub7nTwr=`zLTa(Yf{=e7LY8~oE4fI#5)hx+aL=zSDT5}tc$_|YkUL`B|v?|m2q%u{%AJei5^3X5)oXP?WRWCE zv)nVZ3%58)I?m?aI~C}`;j!ZrN6o_0n(=Yx-N@LOiK2Fr96LG*LYp>i(n@J#@-$=b z8922$0)q3TkN}*^*-IE`b{-grRG!;B%e-SEVs@lKYYZY|UEZm;r(C-IjW5=NJuwBP z!L42&Y0OTwa~%f3^DbT+_f@@Z@2c~G#V|0z{4qFOTWI7w)pGk5^`6OK>sarwE_-9s zMklGY$zpqHLBM?b;q>*-tsdO{@aB!@I-4Fpa`Vm$`+KVcNiD5SO%sCAkqWS=NI!n-%;g)$hRVS=AD+ATS;J2# z$kGik0a$=Q(f(sc{`Zf+^XhvWe_J~Ed|dOF?cL8QjeogwWXgA<3jIU%+1LN>w?6po z-L04Iocx22zI$xTkG=Zka8ef7lOj^|i(&*#fTTdPpeCJXnPQntT5%Ya;>tv;CWDp1 zv9;XHO6$i|wQAdS)=6pIIZKBQH+J18Gt)&fGkY4ZSIhuK3_{Z8H0ChL0QMr zc3vqI+u{_FkWgjLCgNHi6BY-O7k&+ZVoI!C=rqt~V|U$O-LyeQvibeT`iF-NDlI@t zV|Z#lib!|&Ig@?$R7>~Nc-m%wXS}K(C6S^dILMg*`0r=<<1rtKv8zpgF?{s{oaKdj zeD9ioXu!Q*e^lI5pq_o*@4dWEi<_!Aw^jY>VClIYKmiDS^=0xlzT~?YPMWp6rv-5NZa1BYIeXnA;bcGT%qePxUEi_+DF;PD@6~8 z2)xYsw*uDVqbn4iToDi!;Z*?mVy>Qa^Wn!|^@0cP-~G&I{MgZ>2X4RpZf8|r?<7My zb-d}5EN#>e9K2`!+HL&+-W!^5Zhq>{J8#!o zBcjh7XD-Xy^Ru(VBWp63DF>w>D3Ms!9hsSKv|3m+e3jMSx-%cM_`7u$0K_|uItYW?ZoBOT zFL=TJ{reH|WVW#|f{t-9rRS2by&O9c3aoKIGFh)&VT!8YwaVG=7wFze*V>$ z51)T+THY``GI;M~J5-f})18(p#W8H{g~8AWLes%w7O7-nB$(~pu}S0eNA@2u{loF* z>oz9IVm6!ROX=RErtCA;hjVp~l6=!(9wR-p5ImG?>>beO4Bv3~?TxvK+2coZ58Kv_ zJZtOFU5jweR_>df8yS7wy?bwKFJcr7Wu^F%v4cl;-}ZRc|MJ7PfA@d?*RI>YeBCoH zeeN~a5~R6JjnXLKbFYCxBnS+XQbtSeT#}Jjp2%iaoRC*&Ni%vxQK%Gx7@$BZDy+mm z_Uvmc(+xM@_J{BJjsNkde^IUsKVHm6AP5W!zV>ym{MDcTmFvIrofp64C7E^197R#l z_L!6cMC)9!teJt?1wnu)%&sU#DzH-Q_DGgA%@Bb|F?%9qf`9<>JZsu~&6*9HHg3H( z>~Klt!NyYIa}1X}A-sT9ZY($Z49-PTHNJZHzde(tBg{NDF|{ypyr0ZK-*^W9@2 z8-U0dtqlM;5O4ENsk&+1`uYF)$MxU(9bq@{7k^fM(`)BG^Z6t1`EAi!$I;RQyT_{o z8-D3mj{f)m+M8sb`=xik>zm(+!|2K9mpbKfoz*^k?C!m1wQs+d-3?J`3Zp2DBWACZ zs#L2sORLo?0FcsT0x1&0SLk;LO<;-KwY-tBvP{iYJ;UhA)Yu49s+ zKvhZ5h8+K1%nDU2jB&&1bqrB z2qlCvgjMQ5Vb}oV0yTyS2PwmV1^~zja)1uQjDtlFh|ouX0EQr8$PsdImeWY(z$#eb z9(YRR`}ZH8Y7t-&20Z;$L=k?>_U!^9!h)-R^Luk|5D5#y3P2)aDfs0Dk>mtG&&(c} z*?AF<0?bTE-dS7**^x*J#|sHnm-6f+Dii@E5eOriot^v2XFuFq39RijTFoektT~26d_;&P=>sh+%9_)%Srl0ioBpW78cJS zgxIYi6)8NL6~9lG`8klpvo(ZyZV`$;=>pwMBX;5dD2V%Ry7ivvxmFYp=dKM1Na(!| z!l8W!mfrUlA9>f${q#9oHY_g8*(~!Os+Hlv!7-Z)d-UF6*TF2vLqsbQ5ohyak1m!J z2qBTPj+FAA_P{Dq%C|HA9a zy=&%=-B(+jMna_&5ar@~dPeTJ<+e|L?Bn~Un~b=aHf`86FxXd(g3$Di zj&It3Y%a-CV@#eorB#vD3IK`}Bcta4RhN+C)LJM(QiV3?Qib4hIs9_Ks!}fBe%o!g z-F{o8rzgv8tCb_^qKHqB<2Y=0I?lRICjq5|#d{CP8c{Lk0GT*Mtx;#W(;}5h<;!3G z(z)ktfA+Jl>2x}3nO3~;1kVzTDjJ#;_w_UY|FnEx;-y5`P^28QAQ~lcWSD|14;(uk zm}*b89LKFjz0vLr4h}UJW=#+Us1oaPCs9;lD9TlH1sDf`uoZ`>m9x2XnNg&4q_lD_ zpPHT-80ed?wXWLQKiiz;>OfDWG&M7=v>xmm92y=xIx!WH?j%hR*}QT6^z8iJy$41| zM~@vny12MFJTx?y&mlmPbSmXCh=06|?w^*YOp44SBJDksRzzAvqA&#X%!L^V^;+Gg zEe_)_Dvt~gv8XJ~g1AzxRy&Pao+jFPFUSB69DKgC!Hjb91u`wR)wu z7qt%Ka=Fr{l-~Quey#P$(4bL}bW&y(M33T`#j_4np}w)(V*wBZiLA9=T&YybugJ9F9jy|$G(j( z2j|)k9>olB!@3HbNW+Iyem+@>4dd9+qwoC1UwAo>zH8IfH*5>u^7sFLc~&$?KINvTuLa>_Npqc^bA zuj<5Kq?_%g6nge7o(w3!EKfzGo}^pKJtAG^eQHq6c)-?{UW=T2TUzV70=#oBjw-7YLIeg03?>hqEf2(`p-XC z36iN=!ycSgTpwAxW&NhLU%T&f*DoF2KED2iFMQRWNA|B>KiHZ4c4zl=@f6Om{&D$3 zA)@QQ{iR#3|Hh>|w_W$l%Rv5r_WnE0vg5c9#jC2jPq_I`p4priIgkJd5CoV>P!vT) zD^SUn__HjFPd^1)KRL-ymVT7&XUUQ&i6UiDIhdjqNrDMXB0z%3Y4gtR>`o3hpU~Y^ z?~ik5cLB@-1W8!7$ijXWvv=;f_k=!us;j;s^;STIUO-zb)_Ne)nh8BIB$-Pxmx+l6 zg5Z=zL}cwbJZ-fM68pihkXlw|XmIy#G_b`<`F@(VzIYMQx#w{KieC z#Sw*<5SySzhh6Q+v;`OM~^)D$OE4_eyq7| z$DWDHtTo{T1f=U%+$IaJ~ z$Vef`!;DDGB7)37sFb2|IkeVh)-Nv36JoVmjZ39M#IjN@d*({D+HSQ94g7*JZ;ZK+ z^gj=75+RDhrN#OA`G=>b{N#8E1@gQYIYflk>-qD&tFEdFxXtbGlE0tv&kHU2;e%TM z1+YJG+5iGhj8`Tm)Kf>FI&%hh?>U%e>9ck0{^3PnltxrW5fVc|CBdTC22z+Fi2!&; z79j#HTu3P}dqiO%C*T>`6KdNLcjwi=Oz;{LJ?q`}ki?+d^x|#jFBN~Yj_JIAR#zF706()U{q^zytcNsUabY)Zcjt#WFw9$ECY|Nn_qsg z*%(<{S;>Qt3a2M|+5n-UhkD{P=5|AKhEwK?K z1SA-WYM=mk1Y}WwTEr6+9`1~c0O)~Hfe0WYkud<4JrA480-%7Hc?dxgKo$XE!VCBM zrkWlCcqkqu0*Fo#v$sZumh{Dr0ssRuGODnfz~?^ygooIP1!V=5umVxSL8)9{T3P+= z_x&|$UkZZn{`P;gXYXESKS+vxxd2)Qi-0)vgBxPghxX?e=35YErw!$K8irA)yEZ?+ zs<4Ep5DA2NC}oETz>=DPgawdFl_=>&X+Lqu7T8LmeNkKwaNu$#bVL^<2^9z^M9&(%^iMWgEFmyz@$zMaT*&RG!5#L+(M? zIWK`0R>BNktT?X~0eSY2XO^9cl&6Y-ot$j!+_~$qM;>sJibht?kKy}zd_A5c2tlD1 zVltozNE`2SBFeLDqutN*JdR7%YT4U-?{zmnxg@{&Yrhj3O;N3Zp<}nvZns+fdZRi$ z+5A`k@?Rag^574>{fB2J_vyIW-q--_lQx+7(CE~`kz-4lMh%b$Ds`b)uU+QSBnYN5 z%bX0f0%LS1vqtMIbwmmn07)wnE;#UBgo%-z-^3Rcfgq}woGyW47h1i=af+}%_SBPq z{0G11y$u4BrWS$3IS^DtKqw&Em^^m{vBRh+$ISX1b?5~ZlFFQb^~!=Ec=CyjBlD}j z@+;j=_pZC%Fi5&Yx)9=GkDTC0wP>R z@EIk5DSTt`tlNJxcopdq(;?py&0M;JJ#2#nU=iTJ|KMlze{ z>=Z_kR$){@GH2Gag$K^R^6=<`XE$bBooc1l?RV?7%G&B00%%RmT3tYx#oD~nZ8w{Z zTCJ8ODG|nTl%xq^WNoe$x-9?uK7U{9ApqWcLdf%6iSe5(NMv73rAd;kt*zE8kuj!H zspv3DGOwbtVLw_bPfkvFYgG_|2@x2q7XU@U*!Tnjl*_eRT}@1H+dk-}Y2Si3VOR@G z-pLqYd!v2!^z4r5X`AL*l34F_6zVX@TWw^}h@mzFz}~yuvUP|Q1VJhS0*X{_b0WHR zNAtdOgY}HdlM~}N94d`B4G3jfiP$JZqhq0-fBn_8Z&E2czk2G4?pklHV|!9Lxq=Ri ziprJAMx#Euy%sFC`iryY?mxS+xZd9}J=F>FldBtw7?oFH{kQ*OaNDll@zd{d6uthn zSB~lR`Puf#74`V(jWFp<)%CU=r9)S2KXe#D*G*(@dD)epzkjYgI`%`~d0W=;(3Ri% z-Sg!@U0ssJiD*u66(tK?Ydm;F3p9b zWffQ34?hxXIQ!tk{k7Fzp5dva zh!;RYjhYCBB?PW(6*Go}m?zS09r^5iH@@vVcI};h;P1XLHa=RZmxAcI6^FhaUyrXs z6kyTk?DnCcN7#ux3BjS4{=_$t07H;lxHi%NWQ7a?K+%Svmz4wX{@}lw`TT>gn*GRf zU`Ct=0(OL?Jz3@b7Wmu(w5k*_%LOTK?+gASFc+@gLV9RfXRTvqLIGk$#9o*sG&HJN zN>PA{!EX$plUQLCz|0FI&dHG4#>_-UYhu7cNDDWcKtxnxty$BJZ1##9RLSSWA{9I42;;}_UXV0Gf*FXEOBf#m= z@e^leXBQXX@>(qN!T}b=cvea+FE79Io$vhCZ~fMS<9O*VUHY;A09x-wcxLOIbH1=u zCc-ERt+i>I9@u~2=o3%O&7Ir3clX5j#M0tQcdhmK!;iAZgI63Tz+SHtg&_$AMm3ww zQn@reJ(XoymgU8Ho0^(5CfHbCUs+r2bul#BXytN$;@GiIeexc5z805+xm>S=aSTd3 zFOyT-#HTB(%b`}uAknp&b3RFu*bMa&n8jLKz$&vWTWXublgR_8JCB}To7%qTQ=k5H z1TsE3dE3o5*PnXtQ9F6qC-?PN-uZifS2F6(*S_M+hJWc4*0B=j{#Y+BkxqMgJB5@@ zgp}mk!OWGV&(?H#(Di)stTCkaUa5@Ad-F@Pf8jS&sd3}U9`K6F)N^sR#s;J>H~i?S}EUh{YxSvzyp?8s|e8wIz@!y2{d>GBJ4A?k_{|}A(HYw7w>&$ z*)cKzfFjM{fIT=;z?sXvU_B_`ar1R68|$C=@L%2d(%Wu(<(mtmkD+GB#j?oL#=lZ% zT|Vdz#+uDF9^ie7`^#P!YoP^ z0`)_+SnJ%dC5BLV$|Hax66WGeCCOlr^j)4eM<-tM`aSLT`qJY3sWWq*n>!oD(dgLt z_UY}-T0M@UG)+AZNhh8;%Q7;QXW81?`mSBOW@l&f!sS(@QmHf=jYhK>g&`5CFk*w1 zsPfeNet+?EpB~dj*cWpJZPLiSsFeBhE{Pmn$;<*ufnVF0KX>Me-+uSX&;5tyzxx-x zjg~@a{N(@TRfH2GS)SP}N#@Stt{r;kp8TmNn?#@fg&xue6lM}r>-2k8VRIi)=%Ny%+ zz3gvhuD$b?TMu7(!_@Sy{-8@*jf~b2DbH-TH}K8{S{*y~@Z8yXn`MJRm)VA4>|EaO zCwD(~^tNw%`E4(G4Koudkxd*MsV&*?MYi+hr^Km(`3zbNb%GKB0SLko3mRce!@dBj z3Y0*Fpo9Pb1NO5_hr)PLCtU@Apb8d0M$b`aAM1se=Cf)NGVH1rs1 z1Z9E{Atopxln_D$DW+xwM4-)STA@+c_uNN@7m)z}_4qPEOkiA!f<_tR$rYdq_H03n zpl43KLlVu-GgJa?C^u00kKVtj)(pYUk(A?%%ibM}Oq)BaLRBr^6Nc zg@yQ+HV%sRzcE1&1b_bL?_XS8h|9H2Pts=~p7FvsA;1b@b46KHIQf#=9Xt*2jV%7e@#F9L zjo(^cSw;YZlrvPKfQS$vG#a#7Z+8_-H82w+qwP++m1U%fm+w|$#GaKt0&5`Ef!cr+Ty>3@2rN0(6T>ke8o97^mq|!7C5j27h411?T z?S)x*<*D8@=FC!x(i4!k?DiF4)85jV47)Ar@wANu5BT}B)G?8;>&n8J$Dpi%n z?K`F>re@l$wL#Xe#7z-40gsH0pFVM{+iBOU)!0Pdv!E!gwKm8MUPzR89$1jUWjS~# zjCYjQUO3OKQfkL&e8L-79htsjKLZSGPQ4^NxAetNK6qeH`G@an9@y#kj4dzBZFJVs zrPcn4)9(IrYG<=Hvkg!8M$QlNSKfZzD_?r35tZKiM;|&nr|adC&v9{a$r%C$6NLTV zU~;-~#kD(c8G)p8?u)0^zwqmij#IxZ$)ckb%eU_t8{64f=k$;N`sfu8pMS%fZrFWr zzb?CaHCSJ1@7%fXgMT~QSzaI?T{%wWKz;K~+d3{ecx%Ha_DjD~M8wRmfAwoV{cnF{ z@u%MX@v*_RuKHw#)s=~s5|9RMC6t6um9MO{4@3*FR_8YlqvX(c#Zh@gy8nRCFdkF1c&as1ez zwd2-T2j!r)eOov>Ht4r4_UqdYcjnKTwC%e+ySzGJunsfN{WQ<4%boWkxn)4`o(Ka6 zo&^*tFFt3<3St?OCM+R%fRxcAsG-*`M~D$J5Rw5!ytcfMbv7RSvk%s$O##j=zo@88iU5HOq4rQ{#1%{g5eNbUh|aoxo@d?*2q6=J zW63j@=AM))D-9%s-g-37w9-rq0#lNS(-IhCop;WQ4*(S^K@<=SplE&wAQsdBMH&=n zEGiM3Jg3474#abTUKK7tt(%o=EU@@R{{L0IQhzV;k&k|$-CdiR-d?Si&!3xp{pz1C?blWa9J$s%Ysm7 zdm#}4GKYr5I&YoPLA74OKrOGdtChfe79>lUF)KmLBxcSW^t>>r5GAqXJcJ4zg9AVT zFW>;Zhvf1qz849>fXw_~{>y)nG;dB%uB@#isUQq(o?j&KUsROEV*f9_Wj56jo~I>W zELD|KK@j}LZ~Vr8`cMC<*=%mHKYw4^zAsL&x5Cb4iBBz&)n$(8 z_cNbqw|b>=JU%nAvbLJ_2aiAcP-+Kzckiu6VHAZ^larHElQT0j=E~ z5Wq7BDB#oH2D!e^)9n5)-2cdf4>|VLas>>HjEpo#M@prVK^2;y)9=^DCYR37agtfq zjp>rNiCBkWXxSPHyjTWSq?jE5Z*SW3v!};k?d0hli*RL}Eqv4KZn^v8pZRBRf6GGn z@>?Wmo$q|t99iZOI69ewbs zUMZ^j-e7Djh(eq{mv%d52bRKil1&A=ti|n(ol~akvVCQ0J7^8mbgd)`#!b?3`e=V= z{@6ngb+<1<_9pewcDH))*4vMN=&?a<+I3oaY4YT!{`Ao8VSD$~Wv>fkp$>`=0N9Uy z=+Bquj^B2}6%(~6ALLOS1E9@a5GoEr?-TNDPzV*U7X;@ViU(#9wAO<6-g(bL3V~2S z2^8v7$b!x*&)^}M7^&WT{na1;)B}I{f%o5V^BqB46&6+WuP!tGZJvc;U=$6K!NI-z zUVYcAf9Ln!|E4#+z7$slL@VRPId%e=XPHvUDCK~eL2Ko`XJ)Mpvj`MPr4~W&z1BKZ z%6k?NVF+}f5WTSTj+u=yg@+Uf=&0na-Pl-Dq-S>Q*|}$b)=id{7tSr5zxUqHG)6{7 z$0m1g-%$!nq@>sF70vi8NwrZM>#INWGe6VX*f@9o{Os&(zt=l^_H34>K^S>~M0|)8 zXYTyR?>YIo&yMN9doO?v1VISU3zmT@+LwhwqyX4!RAN|Rm9qK&^h>=z{KM+||8PS% zLKkH0nK&KT`7FsZN3?YGn4X!*g(HAS>)A824}b7)U-kVzDD2^DXkjaWsFfBG&)#Sq z1c3>Hz?f30q*NhdNg_m~opVGgib_EcFuOvz#CzZG_pNo~UO(@)fxa?EW=$0EL!r&0EN)n6OVn~+WDP3$^^>V{F0<&*ymNm|(+i}&C6+16^uTB`!J`@qh2D}6ZPzyR5FsQ|DE)&5C=u0Zw62b=bK3UM zW>5m-3OIn6pyxp$R0*mCRfGuzy#NeB#!yvICnzIC1SNtP5qNQceUvd8n!tZO{x^wY zh9^=0YCbq|it{!u)IyqHK zxnYbM^tz>TFn7G;oz*%bMF>!^_J?}zh{T1>7XSbvs)7lQ!<<1Y2uMkb;3)xXA!OppA(_ z9milTX5Ju`DGIeQA?ZMeNP&2dLQ1S6uTcd`kpfbvaF}Hq0s_xQoNq0!_FHR{Q&Zmd z^E`o!L+&d#@Z!V-3RUg|edY&UaeZ*92g}w;o`Fx%mTcZon#rkAW+Bur?H#!8 z&f}{=97j%NX;+ii)p~txc{L={bM~o|r)EaS4)30M#g%)i%C4SWj$^|%$4CJ%DFOtx zgP5e}$qSd`aj@EW>8^#Xv-10fa2gzHsm7Tdj@27*3^8u0_-ztyi3PjY@UbwwWWd z3rW8xN>4S%W+umvoc67(B^E#w0THr7tj951C&)?W`&p7^q6yKkLH*y~^V=Zun%BKP z&$G?;KZzHBVfhhI0SL1PD2zIa$I{m&=)WFcS!B86h(UxD6@GpOv5=S!f{;j)Hep-} zl%_B&X*0l{Xyv@OSuTL3Qb{QS5JjY-px5g;!aUE*<&rk4Tq+4Ws@IdG-|6-p+bD`i zsY)zQEq8J+6ZL9f0s-s~k{~qAdc9h296xy~P$tW=W^*LZ?O@O!A0MsPYVB61(Ws4$ zHe0Qh0&F&FCU~X?^Vj2lad_tehy;|@3eXCH0Fd%FAw-O{^Bz15lDyU!F{N^Qt?fLJ zcmeO2*$aruo!3fbN&4gyPb@4fbb9@Mx7Y7>UG70dDV&-fzyA7bue)?IC`4odC%|L~bWs*z1`=j)mO*QATI5A*X%C`sv4Jf zPLJ=Lsy*@f&dPfE%8Bwz?!5Zg>BWanuO4Z)6~gjj>$|_><;hbYefZ&1E~q$fQcP}p z*`EK;oiEvbaQE0~Jr2V(@2swM&pdhVkw+du@FUYZx`W<)A#rGzVw+_T8S zr>pCwsfkjOuaGDlckSbXe}N1L_U;_~v*)2A;5 zN*5^aONVR0K@k9@NH$~h38h3>T_}JLeMb0Fj7y=}^JjndXTSK1zlexMA?Y7j)BVzL z&M{l(tanz32+29uZnv^*Amz&B^wj9Yq#*=k6Po=84z$+R!#HkMs+Cf>YuCaTrs71ZF!MMv9Qf8xV%vbtM5S6>u0(OI z-l$fp=s8a_7HgtXx1SBH-QH|uSt=q(Sf)RPiH{bh_Cw9UY&&^L_O!=$ zjF-0@SDVwX5D1Z?Qzsw&_{aXXS*h*cwacd&k+1_n0ra4irl4RqS|=Wof%UfBvz1KJ?*FyzOn@-R<>3&;&*pyl2`pD?un6kyVkCDy0QH35ozB zl}cfn4n)}dqLrzNY1@i`NYSYU03>qO;!w~TwbIsEak(P`qU}5O?A)`j-{~x`E-kOE z{@uN&tF^}D)O4d-E0-&dSu$^}u)sa{+>_;bx7X`-yBn?cx#i^~P0Mi{B31_poSp4I z^7!)lswHK;bHEHJ0E7?#?E+N;?}Z$o6?p{lK~xpu0Ci+^>5)gDyye#BOK*|uu5aCZ zle+q99H~;CXPL{^TgaTwo#pfAlG&4EKq*5B@e9BEzB}Iby+mI_S!E&Z&RT1&0}~WZ z1Vj{uVI0S5Xq&=HsiQ}a9Y21&-EJ2Z`P^p4=+V*9G)>pm)|_((4(#8vXSY^ne0)5P zBdxWy&RU0vi;Ii*-gn;P{g?jsLU;yJYH7J$Ys7;=wz>+_)78nz!HE-JIDEy+ z@;rSGHHCiw&ozG`l@l(sI%F$kC3`>Aiw9u$}zYptZ{95M_BxzWtP7noF=)&K|~-utVs zyy@yIZ~DZ4|BWAy!)+DkNS$8icRzf7@y1tNcf~C>&x@t|5Cd=tK4TM{ae{Y}K zxM0AOf>J=+%h*R;Sz|cwVctT!Xz&9}6QF{^TDpSJpy4QJC`cJJLWod7XdnateddAm zL++0$#~gynfwN|8sxIk1}8ZOj40^2-C$vrF2R>UbqNFojZ43T1R z9y%y?rJ0`}-nR36^UR%lgeP60Y#ZfQ-5Hhe51y7Ts2Vb~gf)J7- zENNvB5ZRz21Z7mUtecf^v`+PExfJSXwbuLIa*$-c zmocL#aW0o3JZmV{u{j+ODj??z9K-Mz!VJQN*D?bzc=@0#rf0AV>umgbNk^N;nS&Eb9oGX>e&1TcOru+^N&2y6w)6v9W3h zH}9R=HD0Nd6@#~fZV(0tL<)t4!Mx-^gaSfbNZM`1kwDN|ojG&nbD#TM97gP% zE}42G-aFYCt(6B!vTMh-I1G=UoDDUS(3Lx9!a&W3s$?Ly0tlhe;u$Wy--#IZ&EAHO7dVbLFCP!U4#LV%(*8bd71ELrYMpn8LTyW0=6+O>Vh*yvas#aWhF zYmv}sEzCg}Aj+WMt5vI=jg6E&fMn^w1jcA>j4oH=pr^XMZbYFnIxa=+UfwBuT5a+Vaw3wG?Y*x`V#8*~IwR{NiG()fycg>GgUWt=7cYm~}QPm9sn( z-U31PTyD9~Sf#uOAs7Do`}p?%^?@QrhmjIdk%qiSQI;j_AY>=bS?#j+zz$qAUSktd z7z6czJ+cRIBH&oOuwlshy^ntAqo+@t%E3!$05Kp6BjZ_sWpRG-BMXb?PM^K`rt2$X zWf4~1Dep7^1#vgAu>x(7gh>Deb7qC0190F(qbC8ajN+bqU;lVGYFv`|j__!OuiPf>G5ouelvma3_D)`X z)vi->3ky#i;rYehz|Qr$FTZMR&scM9xmOCiX}>2%)%^1sY?(6#e3(3w5U)6ppak*FhoEF z5m3&o6otx^jZsJ%q&w)xCN!nE)#Ic&PE_I(!r9t@C@gtA_H-pB}HzP1HdPceYRS-d&%Y~tzI|m}gjbhf>GYHg6K^O)Lt(1`r0%=mlYtrbrsvrshL3N$l=&=)W zk`n;KP-u&Rfid@x<_?hxWhx}{$bh62X%XjzfdGUEMP$=>Zupemx=irgSMh(rE&m)l z@T_ltE_(ICD zUi3;NqEe}J_uY5D?QL(nuqV&F4lhvR{^))y5ISWd#}0qhEIR;(>LC9^I!ds zdp{MZ~k*sdj_y@RrY*yDs441)EpEHlHP^SbF$Yi0RNH)(XuB>wrL z+Gg+?Ea`arcIXZ4$y1%N=49hcW!uSFx^8i91@d%ZjrUgEa$gz|0fj*sADic1ZW4U~N^o;8ZFP`fMI zW&#M{?)~gXJF5#^4<>|0)hu{!r}!HftVdA#a?Xgg}qX$P_suQ zU_wGd@B-o;Ah3WqVOvNfyGZLpdv`7^KlX+DKKbf5+!e+O`;0H9IqAxBIBLjeFt z8JOTHfLW0>5r@Jcz(~#uih>*wwWg6?Z|V~tyW$fc+XhfOe4z4e-yFRDo3rtemQk>K zU;WCf?)}Z*Dy244#F+`+| z5s@$qPo6scsZV|86}nn4((X&Q#%U@#z}`T2Q7oSd8jfIWNm6}5Y3 zU7Dny`qZcIz4zXByIn4o4_$HP_{4a%S_=Z>tlMa9Q->roh{S*Er2 z%tX}h_j|owuh*NNp5ChU4gkY+f`vm9o<8%WwF}#)tIc|BjCkja4pvrr2-s+r5sJ-G zM50K=alp)%KH8B`1WcgXtz@H>PEIuPEG<{U&6)qwOcN1>z2CEUbn#5e{jfe&PSb31 zvfS>RUtT^xJ~3^ryO`!&auW;4-;V{)S2ar}LEda=3!w0Y8uZf@I}iZC4^MNUkjzw2 zSF!N>M9{>Z*Up?=I6vq59qQG%vmm4fSyrw!My7X^Yt>w4`Mqm)u8Ri}I7#a#<1O^d64XbnR znnSX!sple2aw?jDfylH$Quz7AL&lH^Bmgaj6%PZ35TQXZp<$e0Qp1dfh(Q5V88QI@ z&;TT01r|LZLI4mFuyhk8pa8z22K?nK&@W)~|BcJfms`lbC<|PzH4y^BrdqN93kVP? z0ujzh7`$^fL$*$|^SRLg=$*IDdPd3F4s1W5fWQ)=CN^4o9yptWkRnBZ+5kmLlX3zv zhSQ@vLtXPOjmx$EYMY|L-h<8U(^09)%1{thW2KE5b-ACO*_q|Np6w2jbs(;mn+mgi zho)CI&XOq|zG~OmqlHC9p^y#;MTZ&z3dGG28>105acHz6BI1B_pi~^oNF$sWsf^Z4 zEz+S1LM^3O#fr2-rAZM1qX+Qdo#$PXwcg(P?D>uJ3!VOe2Dx6(^Hv{w4Bi7V3a}zz zk0PK7o;nhf2p6z*DHPoc88m?cQRGBez+Y(F7Yb+~g*%KAfi%qpP$})a1q1|Q@L{0a zt+jo7cfaj>znh(9>$M`l!k$H*TYP1Uu_dCEDnMr5yVt$;b)SFWXl`u~6c5LX&d@`? z?1eR%(SdNOp(Us?`6^PRRVfThCIq7#7z?R~JY!bECL|&t5kWx#@&L{Q2r-aIzdwj0 zQ!jhAc`g|fvrW_PA}8lb7*!ZXq?b^nl|zIZYy&p zj{3g8WYP_nwlGXAjaLTi8*`7``^1TbwSKu|gp}s59igMI$BPmy#3BT!5OZhKbYKEg zh`JMyx0x~V)pvf|z{>si-gETW=`$ynPS18mn~jfu?Cv-!bvHWoax5-Ad~n}Lh>8;p zB@>3ZvltpcB&8Hv6@)rT_LtmKS&S4{DuK;<&04h_*H{=Jw^@Gm;RD-tO;0pR$V{3P zDIy_4r8PhX1d5P6GdmC?q7X%6VTw^;l&BEsgiClbEQ}sjS5`m%;Scva?Xl4@09}st zwwZ~Nh4E@6mC{JL+)om%K>-}tF+Dv}OOj-~QCVtt`ryzxL&Piyfb1)w(Fn0I?7h~I zd2f_r&!SYf(|PcV5ANQ(2i*{agb2)7Y$;E-BfJn_a}9V>mq}3&lzM*aG(=DeNnN&i z!u%B_8F={=swgnL*nx1-`RLj4>>R3Ztrtx=RFxqhqsgb<7(GY^kwm?IB7i})R<6}` z5IEx#P_2Y$=K< ze&!h^K)h(rwMFoYtoovWE;j-SkTt_sv;zo8fHVYcUkoXZ{rM933!6WCFSmU0c_Ysf zn-7Rcymvkq?}WWlD30?i6*0^%PZRQ$q|^1e&GXE$I40*)qM@AI+VaY$KJ}@yXU+$u zI3jf30}JJ>71{tuk;WKA9y|Wj$+=T6yZM%@t~i|AB+2@Y^GYR-%jMpn?U|KUgCz0Z zivTI52nmUWqbNimLW;sD&GOk8-fmfV+l}gq_pyr4^;@ko z*<@hig@IoX-COeUh)hqby)*I5sA<&A-^`J!miBF%E^RzD=$wA(?#hQhD;rC#Pd~PN z;;cKpys_MGJNEzUM4ZVGu-d z6x{l%TR!p8PanGe`uUR&%yky(cWgUz0-_kp)nMC!hKj~Cs57Tl=a=OrPj3cz@6Vh( z^}&zaefr$l8(;d8SKR)JPkrvQk39Lr&DY)V9pCuY_x%3*zVMsxd*{^meWdfjPv?vO zrE<%+wm$ZA!6UcQ_`eCRO(XvK{=@H2PMtIP_p80DZm=N9TlLOEQoT}YE0lk)-g`xD zI-VKF%_s;f?|%2YzyJHczu9bFs3{D`A4lbXc!yv89T#*mDvbxwgedfd`{_e_G-qc>$=(W2-fevEj21+YG)KV4@ zAVneo;vG?2Top+HMt}&Q6)G80-h;qc=bRS}r~ouVrCKV*fnke*ZfABq$<|op^y#Z- z&+VBQW$#(O_A+SHFKUh85+=}#5(KCK)w4Jr2%x^C`4fuG=~>fn@%mSLf4{UK6!zoS z?QIL)V)uYb$(yNMc$Ge4mDJ4csFSgM=J z;H2;e^K?b2H-H!bFY+8&Oi^{bm?q`yM5OR{7m>u}N|W_A&zwdIgTR3>JEgTTDz}aW zy#oQU;zFaM0II^(K;<622Ns+6+rHm*PONpk_Uin(v(@I5u8cb~64bU?P{J926zb?W zWEf!4cwsD<4unVrkDrtxKwe&E(e|CQy3&l~tWpdNWf{&MfV z_aE4QU}br|QjI_L*~i94D!X=XPx|@l`dX(m2y{TyuT~9#1Vf7ZriwyQK`sgT|T$=@w@N(mhVu3 z7V${h5D`)oDE5%&S)sll#dJx)j39Dplj*|K;ey*=QIwgVpZ~(W_ckk)Jj*6V$CfuX zHacyk$a~&CJ@vCc@}1vw$F-AXy?*A@z)@5#J#uVrX=UvLpL%5fw(&--vaKFnxo3KL zt=*{Cj-Fdx>Gc2Z$y2+hMv!rOq}=VNAARi1ld}thL0=L1p}Zk2FE9VnFa6T@e9!k3 z?gkh35H3(jUbxNtFbF{rFgU^cmYx-epcD|nvwJ67zWBVm11Mf>p0jvhQN}m~ zagJS{+uT~eZO4u?CyuvT?fU4*#PsCk_NiD0KFO1ITVax=VZYx$KYOkmmx3q+W*vpV zer0h15tAe>Je#!&0uu%VwNjuYs#bT8x0|InIC)}rkfg1Rb`-{`9w?D4=^sCS9KDb> z{?80bz?cr$8IUXwR_H_!PQGD*>~;1thc;;{`|{ddB?r?Jp!$x?Id05^e?%v z7lso7cm!cVrF3iK++z>j7iqO^VuFML#Cr(<$g$5Y0O#Vt386xPf@S4dY-R&c%46;s zxFFpMA$t&1g`Ot~lS|p7uxE6FfDFKFw@*%NpBy>y#3K)U;oeug^3AZRQ@!Q*M^P-Q zK=Fuhk|f{u?Qg#4qo4k(zxd$y{lMEcI^9A5R%uOC=*Plvl`euPL12i8*%#9fvrm$K z0V2JqY(XT>5mIJT5DelFk-ZlpCE|;P{HAg;0s{LXXBt3RYuoL%(t7ujgW#gtM?)4BPx8?DuS`*)3x zPc|C$J$v^8(Zc+BL@Jk}dabGmyS+iH)#`S;^?Lolfdg?AD#9QL>a|+G-`83r;$Sd< zOYVX#T(=MiRg(43ojW=?5!I?85qKvG)yd=QK%_L9FsoJqVLxmI3y55}zW@MO)WUqb zQY|@`)f<)WfFF5ex!Xx^c*)dAGw{woT{fn8VuE*)_b~4(@kE-ubJLU2>9fbj#%E-R zw%hEjd}TxHvK2NNRwbTq`_1h6GN1E;%QM47Tm%6&^SjOODs0vPV2EcT7!s`j3jLe{ zh6qq(8mCXrpE$a{ywvHmM@E_h<&(}jBCIT}Zgl&NdZp1Ao!ql;-}N_YrMz>9bdhid zAb5a%SD&~fdGJr@?J_AD=LRUer(;o@>}2jhF89+;HiGu zDh1B7R{DWQKl$VT_@7+2G5;%j>w9PFy%Zlf(|vHgbuxqH9QIb~-+#rRsY*YvBYxYV zk-wd{KljtWXvF^bkN?LPtVQ2B2m8l>1qeVR^cW%qbp=&{CPA5C*+Iv{K%haO5ez^8 z5RoW6v*5n%%5Vx)76Nz>kqDry@sX5005||AkOQzrnz8o?Oen(6*&G3#b7^Xof^vo8N>hbnQK>}e z6r_&5bAER2`274i;Q@^YwCl zdc3~0y>s&9(#pnQELUq$Fh|hp<_^FEGP4u{Z-RvbM*!#qxiB)>>;T9n5pmebF6fJb z0O~^ZrAXBfXk&dtk#dd^$&1$rnyB4c-?L}uKmCy(u9l)CNwf+8FD8mFbY*m56RmZU zBvaE<-}AQbdDn0JmIxaYT;?%9xH?s> z%HX_qKI!$6Ry#Jaa+qOROhiDAt*OL8eUDo|+Fp2E^JqKCXl+(!^P-I*%_!`?X41T` z$BPqUokbtVB*L0hDKHGk2qFy1vXh-x-dY*kpAI^I`B#5?-$O?gY3~Os%L`hote4d* zu|h7#L9<$MB&HONOiwuL-JtK-g(}ucqhN&I#?x&zu3dZEXd_nMDyUW}^-|RBCQ+!_ z<(1G()Enr#D5$jtu|!HKR7w*OfENa`MUAOYb*JG<38C+`nxqBmkpE;;0_Sti1I5nt+i@mADk> zh_GHR_0qge7#ocldI1JtX7Bw&4?OVtyIx<4OU}8%rG67?d7&o#^cxnx)*A2v$-r+} zpJxUT$y1S`X27#H6%YZNOVamA-(Ri)AB6P0UHs>Wyijl1Dor7PR4#c2J}bTygrQvW zXUpGaA_=qIn!+ZC7(6}mV^iuoUse{7l-B5}qz$syT63C}%9YG2xy2rC2;35{kELR~9`BehCxkS;8@ zTAl9xJ-d3nPMRjwQVb%MQVII~TVC0>WFp{*3qZIl0_r6eyIgzaro0Tx`O*lV=`dv3pkR zW;XTg{RaWC;u6kM&Yyh}5HOSch3*d#r)eL>duIh*mL|P!TfB2N^Uhj7s6?@=Rr8JR z0GP8Z3{CD5?<_KBxeK+iS@wyKe`0-gtx~UuQq^)r0s28Ixid%u;{jM}rI92mWm)>j zgAbJy?%Xw*q}?bEn6p}S!uphm6e-fGASkf+N@=6DuxM?N&@&@qAuyt~w$2H2!2Wgn z*50sdecbih=R3&&(}eqdi+Oz0Hgooo`8JOPwb8ItPfK=Vqdm8Z*X-i42;X?EoPsP4 zBRPLM-Z(nFt$Or}BWy9QVosmcmPw&`&ixQWuo#Ec< z+WD2!XIEF(my^_4wjv;?S5tT3iUY6zrn~Z9?~SiJ^w?9u>@1x8U)sH(&hB zAS|qq05S1)G^kj10N4Va(D8z^6W3gCy`6a3t=)E~zdXD1<{KE%_PWX0+2uzb){-qh zexl#aid(>Y$0Aw>%;IexC=Cip>D)W=U=Zq26j@L#B!YwrFd$NjggrBdL5S8_o98S{ zw90;ZY(gd7WRS15`|G*ugUSZUk%u2S{F*x?&6Rp4*5|_0XUhf1|ANK!@T<3aLR@aI zUeL$0?+h2pFG>he=|u&qCF1++?6Ybx#X>X_{~QN~09LrqZt$$>7XS!wAYb;1>eB6A z@VPC@e-q>OrSJI1x0m>MFsSY}-AXCBCa)c+z>$p}r1$?>j-L2u=PGvK@cbu zE^K`>>$A+|&I^+O#GzpZ@0@3>1e(QrR3{#Lc=7n-r;k6?>vr-yuT?5Z()G+lFgd-0 zM)#Q=FHz%H0Vx2#$;;dvjf8?A0t6!B3lu*f0}>Drl3eT_ZH*8D0G|tcevV_N@N%Uy z*!;}Ra>g^R(S;lHxi$uuY@Oe3em$t*X?Mr{58n6b&wOTVv`LDz(kIU@l6TuDN2hjP z)9*iV`t)qAHm<|veR~fI3yUy-A|=8@j_p%7-gtw}En>lG z7ZI#+@OW-Eo7<*m9zVBGj?0UyE7n;>%6tFPYYzX9_x}9uz0=%F zeV$hjltPC#hVXJCf2>WKZAmHX?1Cf;`sAD03^*gNyOS`HY*BJN1k7H za}f{`Yk81xl5E+4=Olfe$IliY3*y;XUwGUSX+~sc6{2|dEMt??m64J4l@(M}tCj4a ztyCb^t#k%yUe5Ep-EN;cdisXzUlLbLtJk+19R;hMjn#U+R;||4bU-9gRN}ZwinPL! zks5U-r4z@FkB^R4YNcMg6KT~?ZKt2?-L*dqBCw3c3#-BpTmZG! zN~vKRzUgkb_LU2r!Jq!o2fy>X-!?ltd)>=!J@)uhcfIi&({m3U{rvf>r)OJB*T>>?#GRSQ&ONqzbx>VRwxNkf zlceL0KFUeftp}~@bT1qkb!Uz)*WAL!So7RDJ7XsIuC5)MUTZzNv2ASsU=1tV&C2q^ zaz0;6ry$xvm-zOFG2+B z%m+2h;B#^Nv_5dt72cHR!sbdW04L`0yqD!4)7omHeXDsdnV5fob>r9{|@FbFsS z6zi-n4AqG}IQBj?S`p?J0;0V;cN{zYh0opd$(P^$1|)syuzAM#HwJ}8fQit18Kib% zeC*9{{f6KEgFkx9Ti#Tz)|rKra?T160iYl$B_K?y07Pw;RM+aGR+iOj6|If6mRUAI_rpx=qBYXc4x9l5L9ETJQ;PJS{Z|}1d{t|Gb#-NB zVQuwgy(9rfK!=hdSy6-HTY(F^tHL9?z&EcUtbicu2z-Df$Sjfq^?)6)K`a*)B_IW& zh>S3>bqHO7mR3grzIguZ)$jbJ8~*$QYhK)`6MKld!U%;0h!}v=pZz=esh@fgy^Wru zg78%-KzzATE|;~|L14VMrBbO>DuqE9#qq+z!UsO^fm5fB_xpo5jz>mEuDa^#E3P

o_@dYoJ*3VTq+f}VjRcSN@Xw@c<+rdwQ98(|Ib*?43AzU z41!aqkC>p>Xf)#}5cW#zb~_7$z=Vc~tJQ$L$4gZ#0Se*<0}w&d=T6TqF11%yI#*pg zvwv?b3eAxxm!nY2@L_%FmkvLKP^J%1o;w}o1%~ou;DvRZW$4HqmRzx@k8_@h5}p!(+9qkfXS_krwh5>vV2hQn`s+1`nfTc)=C_jmouH>{tn)M?#h z|MemHrZITet>JHc=&n5BUAlR-4P4VX(tTL=IY%uh>u-k%=zXS$JR3!{vaZf zi+kSs+ra0E&o4L1L((s*Or{hhpe<(bVtM4O?~1r*ulov{UKR@=Lzem$AO3=&4TT9X z5*5^J?E9pTtZ9uhr|X43gz6Z|7`Fann$6?>+a-OxB|~UOTchwq17YEtMgrN^ zJwN{V`EpHWwvCoby4UMS&j+PyrCN`I+91jI?-`xko^?B1Dgiur0gN@A(@_A2zK4KF zD5ww=La22~o5-k0%S_E|n~ru&)~bnWEVX(=M7;M(8|QKnaNbs{l^^-1Z=aeN?RL6>3E7Fr<>6UhLKIKfA{!hG z1~=byGwJYm-}k;O%c3ZH`g<=9Gt{h+N)ZxKMr@1%BdlBw-V2L}bz<2&lmL|`R6-<# z9(~{e3cEFC@y^Q3)WnWjXg5x~kZtRHYw2+}dWh0?87Z2%##i=QM?^_Udi_q~j2Uoir$<#XCJm6Q)40?;wkr9xfSm`xEC4C z|9@mWcZ%|VzG==^IS7;fAg)%GQsA8;V#feNO1qrLCiYGpcnL`Ou@C*t!oq5~)`*o4 zAX?h!SWiKq0wtwTjn_+7TwEU~q#%w@%${L(6Hx>pq(~?nbT+Cx4qpA8Z+qgu{W=FM zoNEDM$g?y_Qv>9kZM9pObFs?x)Pyz)3dRMZ_m;hLLM(#BtdtNDVNt)Yz!YZKG5Q2)wnShGrc1 zUEhbgUWt4)Cz1R48cpusA{c(?WC3Gjy*U4fw^;YYik?j9TgB1A{a_$A_x`= zn!{5*oPZF%hCJW}NMSPY@Bj7rWZ+3X)8`2Rtd-G8^ZoyF$CfN55ilYB-G|nH^WU8b zL)>!e6M=7e`_%YMXmfd?ce((Ch@b3qj-*+%g$vd2^Iui3jcDyep8fFxpb;;Z!XSVZ zxvf%pNqKAMKm^EGKGtsMTe)B%KrS$C^fxt|mwv^$jqFgfQb8wNz#nN$tI)YT3IQO` zauWnu?n@FV}+#0Y9>SFKuO=ihy2xL)X4@;*HN_$!+do0Okwb$9{M5uMO#EC(s3SI~V(c zc<>0~T;^N`F3owsKFiWXLpkQV>In0ERKOgV_cfwckg|z z_4RTb4_wY{4M+93T&>jVl`0AJdaeGT=Nv~-T&>p#sXgc}&d*mWVXM=g7@t5On`Uub za?T-PU`)|V69A*N_XYP+1cVUT`(g#Gl~zi5?|=BvQ#XvHcC|Ox^;tsgtl!V|nU&gy z9&X)!P371A*}nh#_f9^v)~n{@)>;7mKmosn(eX3>)1}U+vM>zOG~K&@uhM!;$o%D+D;NIh3gIyV7S2Qv zAj_;pvET!i_TF8)_Z<#*jRwuh*)QI+^X6-<3YEg{{9@6Wz4;IT=Ls%vZGG7tlV`s0g3hl1fUG^? z53h8-`T7NSP^;ez2`K^^Nbxp zVZx0bHKEeRJI4%R5Psw@|Mb+OpKEtJfQaH0ai_PTP?f<70JYY9~&gNHcT$t+%V7@QM~iN|1?= zl(N=2XAw|D2sIWa%?N_X$N=IToH=ujK?Z|_1$^d;`Wqo7y@3*J)XM!%lJxtW=eFM| z2RijuDI)T}|GV#d;PYSDxnru?tnJvdFVE6Y8&crBXJ%5mpfhiIstS1(B07EQ)QRIK z<5HPLbf5=W%FKuM@BXuQ|NGrDV`JHPmmPu)*M1^eDwThx6nZNOi^oL%U_T)M}c+uH57 zRbKiMpsf}Fgpy_(ANiQ%`4)8qL~&M+j86UF_g#iQA{3bRXFfOo8}FttfXggk>aTf~ z85t4hw)hGWH2T@LO-d<6nn)=^5kwHj-e_cI$G#GmCZ;CaD=Wg>U0<(Ostc>P zjg6H{y8> zN0t|UqfO&0Zf0eqx>xZ>&PX)-d)rE-kGhvm?}D1cRtHBqi>!^>c~Bt_*7{GKo*mVn zkm$NzY9?k@j>5}0%|HLt6K>FW)M0%Tt!!^EFSG-n;l6wdG?vqz4j%YRRhh6$%Z+lW z(QH2Q(8Ie9T{*ctz4MBZyT5Syd$tMUe#NHJ`SI&Ezv9&BHPOJy36f#?3VnLUsjcPR3C>?qH zf%VnJv8f#_MaN}}@n0&%&bcJb3NvD*Ofty6|DPyWaMe8-Rd^LD3$094Q% z5Rnj2ymN#aP)I57Ju@)-3%W|$7y4gALiW)Owx8K!@Sec!B4~2yl9I>?u2#eA7S5C#fq_dgxIM5g;`AtGexauP2{z!^`zsW$ei z%4KC*1cFh;?l~N6w)$j5?|q}u7#SHs#B#ap94ASFgx1;*-+lM&>};0jBO@bw_UyUo z=9~BK-CL_xS60`ac>IZ_W_XgH37`i7_7Fv|ZKfOq zL0prMV;kh z#RiAHQQTZUZ03Xv!whiq)xs}cATYs+bB*|xs2aQ6OB?t1ARCN7D~k<=z)6+py!FCa)*xUd2Wi?{4UR7I0^ z2w=h?{Il4-iSY?)j&Jb#h|gFH)M?VOc2U!=cK*dRX=I?HdV97!*aLz-fKp~7N@B$Trh`<^sAuvFRpiWRlXb?1r zYBW`%g^s+YK@$oyC*u`d@p9I=m@o*S9|DFT5kia*5rhm1Km%xi03jDY=X&S7+NJ^yI(mdT)Iw?cS-Wq~5BD7t3mC$?;p3y7v@z5m$#v;R_Kv_*Lk z(fPqt{Z%*b{?E=2E|<4QW}L--={rw?+K^I;6akSq$bl7D^e(kIBU{JL3451`Pkf4T zT5YIG9m}!TahkEuvyQcGf~?e>pxqKK>X zpx;ZPC`QcT0wfV}6X9J@VurUil4vD{q#A@Jjio@gjfcC(OEVLtI4~p_2VqkTb|G@5>|^X=dE z9XqyfTVG!`+Bj>80>ZCITtW>~K}JNab+6ZZ*)1;vk@vp$z1CW-wR4W>Vr6Z(E>nS& z5;R_ciZoN~Kr64A!2>(XE*C@#fuLqko&eF2aD*OmL^OipA*ak`uy@CyTB(|(tCm*t zq~m*ogx59Y;bHsC z8k@N8`fKYW6^{mj3MXN!(+VAw0_R-MBIRNnM9+OrzJ>x(Y#vU{On%#U%GMS?LSeM> zp}*=s^(4hHTt*S$Yc0rVVad|OI;#W#&C*ut&;)V0UMe%iYu#jeM1wJ80#Kxa0F^P6(dOXxZAbfk6NI~W?>;kkW^`<%JU>4(TCbO4 zm)f$48s$>GH0UP%kb+7OaGF*F-K@k}!htpcWtyN?j*`?Rd2X2<`!I|)HrjJ@=ML;Y zn5B7<9S(hjHpPoJ(>xf?pCVr~4frAil7Ub9TQ%Sj@>E79%;b)6XfOGUO&OvxDUJP( z<1%e||BAeD39P3_E|M_IRxMHh5P%V_CylXNHQ?AVA*PY z1i47|tPjr|_pGQ;J7z#6jn$Y!;KVs1Oa}d^REeXw*%IDK5_i`*)wOFwR)OnRTGSkR7cA7iE6!Bt=DTcV@yEc zyd4bkxKtgT91l#m+FCz$<^)@C4!7^zQx2=E%WGjhF0?M0ePMK@lo9~%UBT;f-YKO3 zA z5+gl+BKhnoU1^riJvFyuqHH8r<#1!Q?=uLJd{+(XC~=Z^yc#&&%LWKa;=m5l!+Wch zz~`Nn<4>)8_KE(3X96ExU8!%3M{A`}jMqQRELwo!fooe((IH4`2}}kLk;G--{@a z!Y@)FL1WwH1vU_b;VYB9680VMJBa$lX~6SW=+F1Ok;vs4#!{?4FFSe>zzXNjdHuc& z7mu$zM1T;M7o$DXrUzzk6(&po`}`KYwNR4eeR%y4RzBp?gYOIxT7MIO8upm z-p%%=lJZaFMsx;*!vY^7D&gn97Ov>7Z+0|^5D=L?2zx)&aq`|JN#-0EX}0%{1%NQt&5j3q!v7vh`oSIyc=A$ z0q@dh?pCkEgq)>W9L9n+PqK}2X<=bC$x@@I%klO`BdgU)-U|^Rpi-((l*w~Dck1-m z*m!fKX`NN1^UQkhqA0vzz^t`yce?ZQ=L2IvT$bgYeHa9}&D;I%UGDPd z7859*BincE7#ST|IeShkwY0j5fTbXM_b>d^o;}-=jgB$F@a%{bzJ&+??3s}exqx2) zD*zHyI25T?mp-B>=&UYJWyvr6^xHrC`NxthLja{zx7+>bM?d<#-}}8oB=#k{bmaZ$QXIZlcdw?WX|^c-T5#eJ9xFH1~9nH<2FO^IX>Q1M(w$?H#tktW4BBE*yh2?Ud=SnGMbio#7@5jcQN}G+f z)wPwSPPZF|VZBkW>&75=^^r!u-_Np)MJlC=A)R{GT8oxE&xr^S{jN7pTyfR7*vicO z<4--cW5@K9PaNC6bI1B)M=A%l2d_L}bmdTFFoOZ-%|^M?O?Cx(p?fH*Y~NeL5d2uy z9-kcFYg8xc853>?joL*~Im$`bw#EGzo|3MToGl)2EjSi4K5KK&t z-u2cu|G}UB#W%g>&7D<}`pfS?ew{yg*(jPzYe@=XljQ`gbr3i`JA3rVky@>` zYxj-=2M!!KaIjo1CrR@7xie?ZY_z)9Tz%!B-ya&C-cRPSI zF+NeWJrR+JYPDLeS}m8$-uuB|a8YZaI5{9%oB8vnlZ5HSL!bN~uB@_Xlr-$}WJ@WX%)SwJZHuqF9?3meKf`7fxZ$?eBdv}9nh};kn z1ePK-WB?d?Onimm(#!DI5!g!DfYPMCT<)YpL;~9v@t4V?UbseAaqvas=MwlO0B|AV zv#C{3)KG_IH^ku-p^Sd)p@;tF&p)udwrZK3^}TM_Ip@50cDhz6MS*_w=&Vcgol{q- za{2t?+SOO@_cmWW^2PeW8_K0JbJ4yM5g@G!clpf@JL6FHM>f0fAR>wiX;UZ?7WQ1y z)zMuC=T<(suhP7_-g*D;zUNJ^eJitwI0PV4Ncim8KvjkDPttB7vFjDG9VnBP(rZK@;wKD2(gERzzI|k5J71e zC13yo2oWj>O@dK1R-r=`m3w*D!>P?>J(C+J^tW6U)HT&LHv-(Kl2jEm1*Q$80AmUe zVN5}lAQ$Kf5I}(bL=HPNCV+UsIoz=&vO<6jmHYX5>)JwIp0x}| zRMvG2RjSc$>-v{-do3vPFJPw-h?G)_MUc>=W$_xccR8AjFtphq%LjsqF>FfhsLWxk z5}#x_OKQZUB2VD6Y>+4Yau7+r-piNMK|08K{j8lPo~_T)-rCw)uixztI^Maxd-j|- zak5&Ds^uxbf#=-%ZWxY@k4>LEaR!_(SF52OKXT+m(pzV*r?!=RPD#=g>c?^I^pk)D zQS6K^Z{F+#2nBO<^FIUtLQ;y6BrrPEREl8dgxNhAPK?*e#-L!OM5S2Au?_-?!ypco zF%&3W04K44=?DTq6sp*n+}bp=IYBSQAcE~PW5Tku)}E{ex0>36(mlS+Acz8pK!rve z4f|U|Kma~%h@s>NBEW=PNFy+?fDj6@13+dUmVl|lWC)umEoW9!5K zY9%D7t=AT`2yuce9w? zQ#)q<>Ic5_j-68_*9lUb7<8ASndxehr|IH=0zi=G@tgY^3lTIyxNZB^4R~gXOB9#B zav9HmND=5D6SmelYmE+|D0YDedkV{AJFiDo?sr$)8{IU?S*ev?)@TF`Gni=9Jm`|* zSkXjtmeP}iJ&~A5$ zg~%AtHut6$q-iEZf@s3HRILZ?%miUvj>YBuR?p@cvrki-h}OmgVITlmx^+8j6XDIq znDgi7W@l%WRv_Zp@7lHfhAXZZsntd+WkeO1N|h+i(zF&uwZN4BU-sTR-moJ-H7Zfp=1A64G7fYUXvroDbPkkTLPl%tO<(=$)31G+5MqOt^k8Fq zaB^B|iy*>=U(0`>5T%3r`2hH`Cdw3iAppLt`;`iXJb#+~TYt21!-D-n0K8>3%ohUS z;nB;@0PKYiQ2>;?mFL?DUceYW4!vHIb48(WW#S^#=xde$5|Nk?VRUp<2<&!yQX&yW zwR*q1mL;8D%jIcxbSz3b`RttW{VH*ygv?B?ebrBjwA-nG8LCyf-ENkpKxC|C03kq2 z1Q5nKBJj1+QV|gfQLR+^{l2GbOe|0;DUG$ZFoEZF`@J;H#>dA`pE;eIqSNaR4-G!z zBA`Mk@%%UVF=w{~ls{H^`lGWuB?yV~ya2ocDZb^hPP{-_1eQv>0EX>_0Qm9)62&)B zqj{lVvSb}I8C$q4VdXKgGuGv)UjzpHSoJLeBT?X*M=)$RjaBJBXLxz$3iPF3~SYz@_ea-APhY}+{##Q4BUP6-hqJ;Pe;|b z=8Ws4-7@b+1VoI)B^q5=3j&FltQAsvN|SSCYReb{LL6CurH-6k%N9G;)ie)~_4{@wV3=@-x6Yo?#JODO1*$c-Br zs5#E|Z;PMrd3PL{KivliBsmfSa}^~0#kCWi18MQW+j?zpY|BO4#~N`>sR)kl+dN-c z9ri2FUR^n2l6$YYINmzCZT6nUdn(5nDm!3zNtSMRy)ZV?TC_)7=&?%3LE zW_Z;^X;tvtH1f{fA~p@wdJNCVwrv`=smsRIv9Kl3Q|e zN7I!z{@h!B`snU={LlaONmzKj+Bs{wuiSa{j^jrSUHmL>{7-9(ul|`IAN()xCm%md zvl*Lf?1+kkd*1U;*B!s-mwx4!U-iQ8K62#9#Kc5V7<5z;^}itiz8v9**^v{>f=GCj zIIy|#cJJJI#ie4nws8M}`piIWe49-&sRXA*zBHG%R?%7oC?qCHKeLPitRu_J%o61q z*{Wb&O3-;al49%h$k52(MVqHTfA?_=(FX>?4q3@c5E}$zjdd;noe*0PB&b8Q&`m5f zSJEPpAds0wFQ@kWic9;C)KQ`H(_vhUhwRMJxts$utIdabB#yAoJ z6#zKr7{Ix*w_v5cc5Cs*&-|m1BFPdU_5)vXK)H?M5Clp@=Xsvi4CKdkU3A6#S4HFH z1_iDY_RqZx8_3G zJdebmbEcPArKM2NsMe01I^EC6(}7|h9~!>%wnI~!r+4q#6^3D!rBJ&1387H_iEeM$B!QyimL*#R;ezmu0H2k*FNhRmt<>gt@JsM%!3z~ z*LyiGAJz534n#(Ncyj>&1gTW}^y!QDY~Q zRdRM3h^0Zd+Phm|IxP3kO2hszG(I!pK?L zXIl`E)xOcDoZbj2fq|H{)|Xv!$-yJX7kc^F=#=nf;EgWM&Gypa#?;PvT&{-0*q-yK zVzMMlv$fQZJlL}J`P(Y{r1sm^R>b_Rx4nPi{?#ZJwR#L%r+Fcm21iC_26oBQa}@jD z&KccJA*$TdIptfGnUq{%(Z*h64M&0Ax%qj9q$^yrM@LS6LTe7aYQN}Omd>Sx)w9d! z!urX%rsw*@!viPgR!LMBZvUFSpkya9Ng*)pug;x1rlbVn0LVBi90eM=d^VI82vUM5 z8B--3qqJ7a8Ou&Oa^!%4%Ia_jECn;L06)8j&Q1;uT(Nh0 z)0WAhM*R0*xqote;PTDmTFH|ut2ZB>2ggf}UVHWK$!c(Fp>=X@W%l%PtDP`Fgu-W# zAQ4Hi0}}Iyp98pxX&WfZ&LK%5oN?!D-`XEI$-ru$n7daU{3qmNJ*pnpH!&Cm1k zjqzFtF*-WhY&Mlr#uP*(q%_8S&&ytxrCAh*CA&AvvQwu{e&*AkIeGGQy<9%4DYS&cr%w6WuUF#GQ+FIWxoKi}`{t4RkIysG-rYMOX?Bm_t9M+XeGSZ_G+xCL zVJ8L>r(;jh=85q){{bR5F{-1B?rwkRRy7AB4 zxcr~q{m$3ETmt=@BFtnzwg7Z{+Sn%bB;*s z^U!pxwMwb~^#{NBpy`gjzV%jsUjw*ah*iz^hJ0)Y5)Yv(AR{1# zs)UTdL&yX;1_2NVs3KOyNJZ|6q;POB;g!s#Jz|DC9silsT>~$B6 z$xLCpNvD^!lD0891G}`}YtFB=x{H&WhO<0TS_J`CDqg$SOp>e;OOt6&jnv~!i*qX~ zmRVK^R7t;Bm~UEY+Z-D8Mn5qopfe{I`f1_?f?dQozAmOwGJpk?aJN8-2ns3YD?9){_&**C6s#43}}f3FaS9$>kA10);*ZZU(d@0VFmz!=$x&@ zmHqp7ed)`0`L%}0asYby%U>3SVXxnnQt-Nx+(VXN-*lYqu@M1?yS=q*o^s{!6DL3V zv46gJ|7Bmh_10<>+k%wVrYM3SSQQf;4w-qi6tTs zI3GM>W+{w?k^0mtXP&XkdCTc(sRLK^AnAun_8hQ}?d}4teTLilyWjOMHy&7s2REra z*)~3L$*xYtQ6*GV8!%BtHAb~fsM3x&TwYoR1+5OQHQoN5V@Ho4TyDGcXr2w)4t7?2=m zETS+)ve9EaybIc3E>fqnR+!Y03&T(dF*Y=`W!v^J4CM5LlG>!j*u=!#nbVslCWw`H!NTlZ zyWOtUYDG~ni*hc@0JOe%6uhBKR*vES;Q;vc@#1`=#yRRt=i6}Ob-uvn>pOpf1JC*S z<~D!yJ;TQG<8ek91X-Sv;|;op@U-#;dnj`ukXbTqo)}Mamt{$#-jGsTXZ;{Z(>?

D+M3~ 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

&>^>&;q!b9nnryFUNr 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 zӵ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%0DlW>vR!ue`J z+BXQ#w3y8WW-w6b&5?Rp&Jfj$>9^sHBaQD$t>ZiM=Tt~fQOzO^gjks$oIfjD9>m1P)smFUIC{b-`*m4KNv>fDP7G*w&) ziA?&5wA&wsicUs?9|i#Je+=*T0h2~V!mzs_rqK;hbBRPXTghT9N(NzX$hCK}!)oPK zUh-79aZz*8zkh8A5-WpBK?0`y`6I-y;p4LKQoz|lrv|?TZ%N&+S|vMwmscdX#8W8C z^F7+`5KDB(1Xj)ImpF^Wcej<_`3t!lHPqA^C(Pl3o|g(DypF=TLj^_^uU+;A3f-63 z-Cye${dmBdZ)}u}3j>-mW)mPY^>tcWyD=8oj?U6fZWb8&e>RyzrajRM!V5#*0d;|B4}#8-T8NU!9E;`w@fea-F%iG4Mw85>U5 zTUVRB#w0q84HC?c_T>)eCirCz`fs~y(+vO4PFX}H>#Lsv^=%ff`+p|5B@YI#CaQz1 zE{u;3%gyReLZ4MX|9NBJgX^q!b#iF}e=g>8iOYRr6}<#`c$oc(z(c;>4T?Bk4B?VO zEgW~*b8wPgjBwA0?g^7Xw2Gn5N8pjM{7q3+?RdA+>HeF}iv%FNnmk!NXC*n6Mtc%D z=XvqL`1=i?h#N}4VZ2(9+Jf<M+M^`$DMe+LpRbVFnISLiGrpu)RnYU9&X#riRagCKnE zvpQYjbf2$@tJ->o!0>ajnWZ8`u+dXLPM46`+-7-x)4|_r>_ykW)uct3lu0%i`79HP z9k0sjcs%0tmf3MsgrZNv2H70eV@C8a(EB>={1O*)$VDRuYtgL_FMFxE-rx49`$X(` zKu9MU>+_+p_b1jC8|4SzP64>YuISt4Am1B&Nm73MVSI}NR>ZqI_-r7Z9etQ)Io0Pc zPMutv6-3&6@wyHOWBxJ{Sj4H9qsUK6zHLyDitaeCQg5(b^^O_0rBE>W4UM9r$4{AK zYa0dpJ;9L)@ar(MiY+=SzcA4QjNRtCksf=ZW6aMKmh=7KpFgKmV(qibYn}a8t&3~? zY|ZCUUz$l+@5*QKEY?P;Cq{KuSaW@^15;UiGZxA~c8c z8I>UlFrE;#m*o)v?2w9~38L;-F%^tNjd;QLyET~wcE}RpI`lb_AC0aKSfJ zCiUJ*0dPU0`}C{b1yT_4fax=kWO%`MEBdhDAtfcm3PTWEm^Z1sAN$LBto^ONqw(!j9n$d{LM0()Zg#<+n>(?kAc^4B*a{PomNUMR zcTclp0f?p;qSRc{-0X*_h9QVaUf>8d<=X8Ri_PKJtQLDJ*90N>!;&?yGu(3qseRxu z_?l6pIN$+@W96sGNq1l}RHD%PFY7#+spPP}71xzxspV>Prvtj*ESq{|H7}sQpLTjJjor_uOhIE01ZVm;(6$CEQIGzf4(He_>IYFpD;DQg zIf_lm6+}`4Ua5%?qefAGce9mx-pzWcbfRG{Y;M9zGxQDNms7F}^t7CUUkFS7=Hywm zpZTo&TFK}lnP-?_w(T|?@8mv&KRD8btl4~^S0 z!0|<$9PYNCI#xV;kR2W#64F*52Lw@(m%S|t|}5p zRo?!5zufE|LVib zM0}t-!je)$9Zj}tJZU;?Lp0a@H%V8$_mxd-7q8RWA1$E6h>rR%NTqiKvx@8OJkK=2 zvX4avKo2JzFp5t{ml|9clY(r#E%kpx@J-Ug@n}Tn#+}`Tdb7s^IrJfZgpa8GEIL+w zT-4)NHUXv5GA!!cFdXITdKaq1#$IRNtr7j@SdMR1wD;7D!pMH+$ullH;>~9~7aeoSQZ4ENBM86xhYpK% z9$sDuUo1Q5`7TnBkFVC}Vh4d@ZY(G5bE(y5Bf?TA;_AJ>zXwC34xp1^8iRGmTPrh% zSC-X{=kBUS-#Rx1+Ka>+QdbMvYA4mnek!<8f!GMYG^SYdBFm+y>S=JstqJpESR=F? zqOlKZWp7DH8qNERn&bcO+OpNu83(lHvSrmnhn`lSeal+X2dug{_i7fSyjfk*`vG7~ zChjDjoDnOx!by~AZ{u8zx*KeP_9~-_RYZ5X>0%~G*#GD!(qLM&Cw)vXYqU|HE7{jE zE1s`4Y+=v=*lsU~iTwSh9~v^DX8+#Np_58po|SR2wa*p+z!jlSI#l(mcHwx{Zyd1b zx)Q-gD(`>nUtdXm? zz5loRo3`aI6oKYJ?{|&8JK=KEFTLbmWqN$=wm<)#LCauNNq?w65>8d$ocN+jIL-5> zH2i>JQXA%pWgB}$!ZDtr7dr%J^>?fH+r3{z?6Cunz20YCm#+G3DpLpvUX7fds+J$8 zR`_j_uRfl4Li@xo&)W6G{$4C$&#-HWkj~tAESzoGr~1L!=Fl>AKImkKHU8a`a3VXD zk5{ob5V?J7?ZeOzl5W`jHxR?VaMvsFeBktSeHygRVj}iLp~|Xd@)F9j82E23k1*9z zB${_~&iY~7cN5{6kZjxp{@eTaZ~TJ2aZP!(C6h}Iwb#1rN_J5$*-jdwumnaklOU(q zSC#lw77UwsTSJ|XOUW#&Z)4scX8j2Tm3N_AiK>h8qszBgZS)YFpXp02%`SZz`(0BQ z*D$WAV{LGqG_?axk7OxKUnbU+Oxb-Q5kkpU3~|^1;y8EmlJueF7mIDX4J1XDC`zqI zL`u@1idIYGlgOK8$D~IF7rfrTB~g=>1fbA@<>e&0@rP|bIDa2O17NM*gy7w0dlvtl zw!Ldi@qTGGSxg=3!8LKF4@ROSkr&%5_mg;I3(KE zeou)@we=ECb+rf#?7Rtp;_PPeM8KFPvv~3zCr+pZ^to9tudqgIv|UP{7=O)VGB$+h zDzRiA=M+zujBtB#tE-?!oYBVOfbcz%=7M|EUt4T5=%YyBJ3oO@D1c0p>l@~SE(LT} z2emz#9?%ZAWydjSuWqOt6KWz7&cbmGk~=r?(OjL!?u={ga(V4R%=CeKIE|%SW7~*b z(@eQ+q;O1iU@c_(T;ccqFBWb|#HdoY)IM!4MI?ZaF|=1`C5=-%LpNC8XJ5soRdWwz zR@INTBpy!uCM6El3&B}Il^97UB8U{Oo%u72*{)uh_;CCRI6Gj@bCgTM5*c&iTgNtmdL+RI6=X^8&}vu z`fg8ow*1`Py>H-$!;ra2K8~aYi*QsnJrR~PDs94i781VmkF*xA-)sh0&6@(gt+;u{ zS!Lp^9obHCMWtHN+l#`2Y0lE$Q+SHrfIf2NEBYp+aiei9>j=3z?V2k!5Rl8tfH-t6 zMUpXcvzR-3bix`yTu42s8ko4P%Z>=63_%}E!2~$z%`7b$f>87G^W!$V5lK21xDlP7_0|>jd=L4VsGr`>Iz@IO1z4dWq?_g9#p8M!4SCr_Fa4DU4^3*DT=U*S0pb< za@eMIF=IYgKS)SGQHFvLM8QcSVV;uL2623VClYQZm)ysY%44ue%B!+*!bF*X(rBq{ijw zTDvch<3>t(%P^T(I;396sOd1_gt|JY>uT5h@m9X=}cw z=5t9R9#s<6EE=wzK6BnXfP*wlQn?TA3{AGH&1?*96>Ozs4P4p5HFI#e`jsfLrsMc@ z?Xdco!;)7tckF)iw1HjjyN7{ymFiouAoy*k_f-7-B3*d0QvB@a^7To7QcL24av2eW ztwG{7kDBG=YAhj%4ac-yJI`4Zzk8hRvyfqB%AvIFL|bPv-f`nWQ^|vu zq5sxmvuvq}-}VrNadt)E^>xqF%dc4UP@jgE%M(I;EZY2aLAmlh9>F&mKYq3F=1L`) z#2!#U6W2Af=P@kt3`JZge2Sl&ckohNd+w~Sd#8yhY~;*=NclgdWkRuSF!7G6lJo2_ zS=da;8rQg#>B%~Qn1DtiQF4w5Ib-;MqYD|-J*1Kiu32?U4!4(Uv8?Gz2TZBkcGvbv z5rW&wy{56BwXQIJ)?5aKsMZOA4!@wnpZ?-$0-rZ=x-eUNp`RNm3|Jdy-Bu>*r%-6*) z0$jJKkkwNRY^A7b`;=f5Pgv9#daSr+1OTsYk7=ojf<)maazkIa z>8J=lIG#~}F&7`>ecr?4|F%>dxk!qJR3t+ngSzQrwbfWSVxN3wn||Q3<$A#`Xj><6 zTQm1wOR6{sUHFEVZJmBc19D*@UVrGhD)e|m93$I@GVbgx025%Zn|-;5vlvfkx{~bY zwXq-;&UJz|2y+oYsUeeRSNi0;d6uC|Xsw)|6Ihini=>;DG6McCN2!?2qBlI64& ziAmYm$WS1rjiNQz{AXlZkp#L?Af2RS_7)69;(M0|x@H9MTu5l#${^{f=6DPw!NlyT zC%zx|s2khBsK66xMc(leLZ!~yoxGd#+%OiTuPl>wvA@4B7O$J1UlK-#I520gKAp@s zh}bV8^1DS<`@g4{JW}cV`i5#i7|4xTR|;F3kEY{Tq7E_{qD z9Ohfjo*&*_Y8VeH$G#KapVMyDCVfjDyZE8+YH(Yr_-_D0beM~(^l$sfOjM)s1&<8( zF~P9K05ewlOm_eWLQ25iLL z8TnNtVt8<|g1CqCW^oQU5sW>fLyMwhAvR+i>>ST^RB2 z$aFg>bb5H0nVVbB%95&t$ZR7*6~CpyP(_~}+ge1p8`l@5-$@-G|44u) zQX<9$k!7hQmZFZ1q{{7)ltypPFib$s7PUe3CpMc9nnSgN-W_v{s{aK{sLTN>%xQ!!D#aRZO!@r08T-% zzM-L2QxoI&-h0n4zWin)T)k#ZZ+DlQ@|cil3((1Grd1r~vzhC!xw_G)&o3_6nKVNd zDiZuGe%B9e1jb@s$sUpDoE3nN$ah8V85g2Dy~;z9B#(d(KJ+LUe94VhdM*>3hrS`B zrL>27(j)!-VHoc}bZlZ`YIL~UwyXpjHX7Ef89sL6h;l9%x7E@||0D z?AT;U7h}x2JRESDLN% z-~Gd9<2ZEfR9C^1wnad5<>vY8S200jljW}Ap3Q5rr)J70C+0NKH5YGOtarY(Yj3Hm z>o5N3559fJouB{GSA`G>u9l=M?Am=~?NHy(KmX#{N_}i{zPBs8y1!J+rDJ1GPR^|! zDrQsevE$=Exh2SuZP}JBxL}21I*v$bA*CZE7nX1c`!@9qUo@P_dIo_z0=N;v;v4~zIR*hW z=ghL0Ryry4$xxGE20(H~NK7D56i3E@F$Bn#ie*3|C(NF~{Q?2ws#TBYCV`zzSsekC z7R6p!=q9b6X&yWxfk5oDVX8r9c>|0DhQQ-y=O90M{K&m`-O<%mQgPIZ%!{70t*bkw zIw7FeS_37}tKd2U6xtYL2pL1}gL0oktEvlXLWAs5pjchEV_ry(2xkqm0rTqA1pp;$(n>tpWt;S-HY} zk9>cz-ei^|jM2EP6U-18sz@`&Gyrh6oPuVS2w`R^Gmj&1E{y?XBsc@c41poTIE$4A z)Jd?1F-8UwJ#gE#W)`Y~QQC3C4qSTiR>!kH^pVdz@0v^3t?jF|g1*777j$0|si0Yp z<1mz2w^fe~XgsSAY1n+FF+Ed#;q{k4y61sQFS+chE6x_hsg$Ew`R$-quQytq1P<@` zt%Zg8Mx#Nb88R-oM3Kl{Xr+|ad0S*GK3wP?Dire>FUxHSXuue=#Ey*_g({vcFLsP_ z9qagf#b-bqkr*0a3=Po|9Uqbu%QK0;XP7pm45?)XJQ*!4HhR^~WB1?g`@W6r{E?xN zQogS%mrbP_?eNrG8Az|mW$M+&sgvVfn>I1w1QA&&XVvN+@Un4i!bV*hBVCUdy1;Sc zR^)Vbla9im9S5P))m6xiC=@Y)GE0@Aml*KpP6euTd?c{EuGH`l@7kEjc9rt!xoX4a zhvOi&QVwSf2pKXWra21&KW;S^XXk3QifWfltFc&X`HfIoSnSL953ee8_dCcEDSO2& zrhtP0W^|;%gdEX;1``7_2#$#Z<{*hwtK+wQzt(J4>WxaR><4}}mGxW?bgW~=xuuAJ z3@~U1e$($5ByO=>SN8O4AuygC%-dT9dgq8Co3qD8o*5$qmbEr2(?WQ{770*8m=>$g zY@J9iz0DX!dbFqbo7Y}kA3Hf(Onu?tiFy>LgdijWPGDBtD4h(dBubS%jY z8c;;~bewL*wOdxXSem6)^xhL4_ykQ)DCq+O0|`G~DV6A9D5b{7$M^5wzk2oRQmJ(M z9!KIw`IWWC$p^x@0%NIA1ClfCy%pdIHJxl~js{D2!GQmI^89*^V($+vk;X z=lm_J1ZQ!g%*q&J;CeP06UPRDl6sRXomhVS+>oA~ozJGTt|Q6lq!n#U^2~?~W9a+3 z-HtqmGlv1-V6hNrELSR?=TzIBQ}c^k^68$8)iXLYkVzezugx{;>$-b44d&3q9q=#e z-sYHvJHPVT4EG<}b;r!~$=TW2?(Xh|`FQ}HWUeua8M+6jYG1nlsPgILiRsp>g?8OZ?;&#UDO)^4@)8nOttiaA|UOmZ}!F#CzZK&O3gv z_Zwfj%Yf>H>{y%cF3%V8-Q{LOsqo@Wn~V-^)MSYxr{jI(eiB<(gLj~TUpK5Sc#4P+Sgic6+?rB)`y;15 z_JL0izVel?{KM~F^}cKFe2U#O00=B?TDA$^-~XE4o}qV z8xLnUzjbr5kQEw$aR36_x8%aa++DZM7ae855OVf}GZ1N|Q@Lzydh$yj{K&DpzrADY zmUsQy>t1^EOTYf%&!u1b@|XYKYb*}$cO=fqW6Z?oggQdDS&kPHLmN%zsYBdlnb1;<2cTKfh z7NiYni+M~N0^+vx(pFH9gL;!?ixgDAZvjIlm;@$-fLQC;03tG;bwvxjh9CSwK06gf zL$+;nyw$P>EO|o3h*)A6f^{HPj^9Y9alZNG!Hu{p18g;zz)SXrbb_x-q5C){jezY50M$LVhH%P+U;k}`$oWs zqETnn+xp&oR%Iswk|^(K?0TT}P>QAW*}_-|U^5$+6!bsXf)F7>^pk| za2R9ww9_x1q9MRPER@gMGz0L7Haqs84X;vX<;OEnk=gvB?3NejemuQ<28<}7*ZxSB zAmtZaaKU@t^PY2+eosEX_10V8`qsDZ-Me>iaPX{vMB<75umAPGzV@}RO-)VxM1<%Q z@2jV`|Dx?1%Zu0Ue!gMzbR@f~AkoeDv7#{}wDwa7OGkp@$=5 zc0v_@>U~)8UB@9t(z7kg73jpVW&1X0KD@9S^3n_(xgv!395_x%t0erSv-m5N)pZ9G19NGXi~ zWXx={rGP~M<2vde=-qkYjsyD-Y0#%mPR0gzUUK=#<3}xF5wX$H(SrvM0>GN#)sE}7 z+pWEO4wuU{$8nyPH8;>3x!zV)rQ+;Ynk8v=l0vG|p*eB~3L_{7(~_BE~bbD#U% zcfIRfN!;YA?zS|b$3YP&B1DK4AcB`dr%2EOY5*{zv~)^f*>N+Fo@>Z>u1H%<#b$MX zsV|%9?a2|vbwi2_OM52P#t*=;(~bmX7UvfFid~-WpbN!Rkr*ztn$T&dEigtat(4Y= zk)fF45ExsQ-qV1bOoTcl)m{pKED;fCd4%XBFtifSUBTd2e#vID{r&x&PA3S01Y+;* z?j9Q(OFV}}=22@MhN0s)3G}X%GR7oikuVHx+b$Feold9KY9*u-%d!#xUI-C}VJelf zEbEC%JZIphD?eA_ZYqjnqaA4}P(}k12TuKk;>`4X7(+gtMr0h(wrtDdJ$&ZJUA z(cxn!4;&cJWz&O0#kH%4nPHrZ3$|^kG-`;PjA0BAn9(MeN?m`|7yj+GeFu(SbJ;dGlLUo~1tJK?R*S_tp zJ)=Y2M^8@g*tYecRVmQy||ca z=RCL73Gb^M%Vpd+R)Ps-bV4F0qQr-|`Q0ye97js-xpq3^I-Zo4bSzs6X<1x4wiJ>h zlfsgc7?Y0UT9)L3OXOTIqXCdH&d6v>3eE&$kmM{FEiq5Gv z_q2@&g^cH>s^9omwB56iof*@9C-NAQ2! zd$`$b=dzhjJA^R2={eh_n*m)1I|qUTW1uv3d@x`Lxaabe4Jw9M0h8RaK@mhDL_`X- z(hT(WO~d_#bP&bM&Nu>qZ96^vJ&W|DT5}|T2j>+L=xOFtB3A$PYh=#q|Nn@VNJAmB zZDa^%i@-d&5rN?N=>E>(qk-+p_aFJkf4Sq=-}c5$ zBfW%Rz8QabDdVt30n20U27#}kNVt{VS`}2?d^NF#!y6^w>N8Wq)uHB23 zINdcQg^q#{2uT~{9Ec3*WT{F3uq631ilRsM?2n=d5jhvdVlki3M>>wfh+$HZ%mjYW zYPS5qZ@1gkTCLVdRjZYDyX~fASJx0&w&*H|oLdWYyV+>9 zTYjfitybI3X5_ZAX-}XeG9Xw=c6)BhBhlSebS$UYYWRMGP9vNkFl~Z0*XE>3=I-eJqbDOU5E1FqzrcWLMhHR}D<*yMNPl%~y4>zuH9U0Ds-eGs zaNh$n^R|?lVw+0@6VhV`Cu=~UwZ*sqjyiTMOEAk2wL3M}E^1QsU@FBkt#+A&kRtR% z4)N>^Jp$su!QiO9zDf0kcvhg75n0gWqSYWGG7Lb20@TZmFYf}BO7z}wMYTGCZ5dlh z!Ay2K03d{Dx7%?XH=E5?tCegN<>%(+5Ye)%QmM3O&z?=2 zHs$mAMAKet9Rxu_sjpNjJ9g|yr_<$fxzp(+ly@RZsPIV#^s@cvaNbXq2_j>FPy=dh zh?dkP0AM9WD5=$u%m#)460XZ*^LbKgy;#U=ZG;fxGvy#|jtmuJGF%E+$?YWr2*~j< zZTqt*qF|-gCchG(^Dg#>>}z_I3Nvtq8={RIz6702sUG! z%WN()JUlu&Fbs@0s?|^d7t%{PskB?E*1dGP=GT-_KB0*XW1KT`xp6F9IB|$-@h`vO zy&PpToch)`{$9AOW#x#%G^d8yL9o&2N6+NB-r4Ku_!+`^v?ee|fIDFIFAF9b?dliTx+O zaO}|H#tmCqbYgH|aBj95MPU%kl&g~yGmmau^Sr*U3o@y^mvRfao?`c~&$@RX`&*-9 z&TV59k-2oso2D0cA3J$pKG*%x&-T3Snma%DIe6tOpHlZY00?&^9Q$JS@?Cuw{cW?&p5K?}aZOmc^)cU?EChi@NoInpL_G{T&L7! zuin04?jOe=JbB>x^~`y1e)q=W`Tzdu-?d!6&41HF@TrxvC5l%R3)t##W5qmJo3=)_ zjHriBJU8PW2s3|Et-D+z$_2mj`MtNlX2T0#yYc#eICfV)Ul?nbSGgVn8XYSg0JDXZ zQZS<-oH+%41Dp&nPJl*mWP%yenuJ6Sh=3~4`7~CFg+hN1OwAWKBeVt(*IM?zMtjJ% zx29an_xJf2wQ9p%{f8E3b89bxhwrum4}^`T^8}r&A0FN|K#B6ai^4t!0H5p%)j5j9 z|L2&E_F0!b1Qf(=w4eNN3oVa%E_2UO?)@iuX+Loz02?vQ*tr0Bc>2P-PuIM21n3z6 zCpy<(SBwl0(UW+v|J5xS{6dINe)5yHZJ*&0CYHp(7Z(?Q`?r6)TCKkQ?Qg&J)?3et ztS=SLEEGQc;Sb+@^UY6#GWZNx0{Q21xofYz*7edCZr_3w&n>RCEW5kAd-dqx>Q()& zXClH$yuiAZarP{qw^tLdh5gPz$URdwc`5xL6JbeQ z3K@}Mh>3b2oK1)h@58a_l*$GPuB68gnW2jUd zbXv$@?D&b{ku`G@6NOx+(QF85_4M^S66&pvlS=Qr@PcE0g|yLcPtK}&s1zlX*q&Wx@6fg7-ZUjL52dr7}5q~L!OJ+ zN2UiMOVk0zz;rP7DULxP7zT`1Y9O4(1YY_lJU%d_wYF`0baZt0?%k7eZ{0)iaTHOzv1Jm1?)!j^iZja)Qgoah%k8PqgckkXG_1&UqZi>(;GHnDI}2>RaJ3 zbB3|fQ5XSm#yA-S29ohjgZ&4OkCBdb981^Xgf`%7$6ZTZ3@|}(MlUc6o^DXTA6%0clDJQE2S;V0%Tx7#X9jQ zv^J@9=Bnpiwt3_Fv6B;%lQWIB-<3;kSi7p!(@h`*XRd1-!;I00NQSgo2{%7Bw3ODT zjeA4{V~jHT!VAv(*x%e@kV($RPR`bvZ6SCyL#tbTV1|$+dJO; z+Q0nk&mbZYFov(ac?$t`6`Yy*+R=lxXdWUXJ4SPkl5-)!P4j%lQ3z!}PG$MA`9`}I zo0xl9D>kgRE0fDxK}1S*%9U1SCallJC?o@8yQp|a>*~ zsxVNF3o`8&daTvMg|4n_+m9zsl-n4bJX(wDK66>ROXO2_*0GAEbiLX+bbMj_cq3?G z93x0#M*rULKBHriakSlY0r1Qao=xlPnXo0o`L-_I<3S^|Y@`?v7{mq&E&#yMW5+lE z80rM^s)6q7pSNT3)YO5)vVpm=(#X0(Zr*ELIySFsfNeUyKC9KHM z_}YwQtqZ#0hj2yEwST+{e?M9Rx0GnxXj^9o;Niy`X9WPTG zITiSX6e?6m%z(N5_B;CW>7D0q@q-u`vuwK>HsYX@PUkd*ZZ<7NrciL=pndr0!TzDX zTrM94tyuZ7^6T~L>|6~&a4zEIwh$NsCM!q+9j(aPCF^xUDt(*>mE`XvH9ZXx7y_bL zF)khxkzFpotBul%nhnJS^IZGnc=`YS!&g7>zTX(=A6c9^^0n_hvUTI=RhMmScS5yP zN8lW87y$xWu6%I!fljOQTfg@5Z{Bric6w~!Fb1U+f{;Q0fz~7xN1=73mC6ZG^sK4* zD8=2HiHR_xn8+|>h-iR-fPo=0kbqI=FioHh=*Kvxh@{9$S=o|lHg=BoZyy=(!P}~Fw#)=yL)~f5RZ%EY9=8Na&7?+XQWyhCo=OwrWQ^&A6opzv%;HH|5n@aS zos(f-i!2+IS%S#`4V)W)hnaHR4zbr!1Gzy_9B_l_&e3B-&%O5iZCmcU?|zFVL1Q9P zN*joMiyL9{f|m~K)rD$fx>DC++i_ioRJWxa$8}OE$z4(b#TFyYB$5g+3Rx6Fa{+3L zo!KcBM}#?(4{Q|7gi*WQZt6;PzSXK#7U$!7S%yA_jK?X7vZKQQjU|XXBSOktIxQIE zU`!megZ2{!rumPuDu2AO#j}zhp0xF)(1bRab5gxgFt*TeU0H7ht9rWL@w}ZM|NcYY zpQ;sPn#VS{z90B!j5>o9lR(+ESorupzQ6#1O|Ji%*I7^P|Ui_S@>Ui^=95?5cR;!#q5)wfmktLCAgZ(pLFxcP( zkB4oXz+f8(Y`_L%FzErpU@%EYVnJD2<*+%-&Q8AhcC2uIfAq{~rQMYPBc9RIVLoE# zPKWBg-4)I^oKB~cZCS6^XJ%%a&8B5pQ4|qTu~^JX$Y=b3%s=edIselj)g!Vc2Qoxt zKtS{;l^XyaT^11G^73+tJFx`R697u35l{$g&!MAZgMB$iXakJlGHrHot$xhneECBF zK;#H0m1zgj*zl0i%T(@1wem{qP8f|2^|rz^2$bjAK;UzD_Guf=J8cc;LJ@Rk>fMRN z0-JkYGwM_e?szfpGmO$O>|G%!`(zkkBwwwF_B8fmR@vCx$P0E;joS;=`L z9>Z1}JDrkali{(Fjx7`tkv51#6iS&QdBSmoAh3^4%|83N=liZrMkDfawNfnfqi|C# z(=?r!neaWYCzord(dhUJHseLHDsWi@a9j&GC7KDLJi+=0$6o&%?=B7Y8C2K(+o#Sf zuHGdMHY$Z~prSOsOk8q)#O63}__cYp{!^dX32C>9?x zJ2VD75BBbbfB6^Kw+}w|Iq2_y6rs;d>HGTNzybKDe}X^zGx*3y;730K&jZ(8+$=Li zT3A>-%Tx0GgQ?~5@KooWFd*nN~C2lup`-V4fTz9%uscl~{+JD-&ZhJ?n z0%Oz#r~Z~>6?fe8mtZW%wj!Op?eErJef7Q{AA<*F60knfcg6a0v1}{Q#xmL4280B_ zfeauSU^b*0R?>@Dz#JxTcZ86l!Eim*yXhA4y$Vdb=qezB7<#=%@uF5D5tGpSaL1(tKTGu4V~ z=d3*AWt%Vh?A_m}^o@5-Qd-R0X)xNcEkXb!8Maw{ngj0zPwbL0Ya+t zx!lMpo2;^~OfML%i(~=A6}Iph*M`>FR!hpFWw*lashrV4hUDPCy1s_Vd&<@E1D>z%2dzUx_C;?~mK6r!V>r zOCa>S-~H~h&p!KPkVZCVedjyhdF03u+qSR0_S&y}q$*WOWP47dIinVues$P)T-VME8zpLBG`M9Gx|O(C zA*GfQuaBA)J#KZdoct%lGCuC&ZFuIvdnTUx2*a>Zo9pfEv4G9BThr51<#NgKa!H&- z-6V>-_uu!xk;4<5Tejme#>kj7O�acHRYzx!JTE8e?)fe_>7oM@=e8H~?}X<`?QS z*WXB_&p79-)hky;aabr8dwYB4W{wgi{e6QRbWdM33X{3nIjw)Px)QMTDlHSFIOjhm zTDh!vFveVZ>80nKbIy((I}owmK5-e!)~ZJTb;jjB1%Q%p%ijE{^B zTGHr9DXo+ag&_wmZ3J+^h#8|b7n*#v;T zzP_w7Vg|-%r%ThcTrTJH`K)^4PnwV-B5jOJC1sU#H5e^TDwS00N5>Xsr;|=c05aqN zU@_tPLI{D32_bT>XZwtZ!XT*CXBXz?nhOobamwYg>o{b{5J{zyByp6sl?Ff}VjSIa zu_Cw|L|Pfg&*jP$mh-@Ni5p~W$#Mq0n5A% zA|j)w>$QQt9yBUR(mi_*u3fWc^O}_eptMP~0%VyUMkxj$viFY&7-PzqEHTHJr4$j# zY;;`~vTLOPaj>svc(5;u!kM|o+(L8W@ch0#M;yoZ^Z7!-Ef&0TsqA~U;GCny8KzPh zZ43bd13<0i;<#-L5E-JLa_PPA{QoSA15hW3NP(Rb#}ErJ%PVFVyYs$>4jee}+AA+P z@9gu3{^VV2J~8^S&wP$CHaR_ibao+5bviN4xJacTGAqZ2Kk}hJz5d3VUik9Y?b@{` zNm9<3HacUdENU7NGakQI=EzhHh%CX9L`tKCW>V`P-L?1GXKi?7=Oh31-5*|X_V&L4 zfTaZH2Y&BggvCe4%dt)u=7QEt+G<#>w&5Iv%^jBwj(gj-j`@z$ZiPc@{k{8UCwI$E zoALu5ckC7Y#cEFxEUVCmI_VxbG`(<`Y}ex!0m$)nrBhDt|KW|3`wveJ4dzEzL+_KZ7bpfYZul}$ zqDngX*(u|i*uAo zBxNGpzIT4$-xfOX@ZN*-Gt<@H{#U;2C4ceWkFH)b-q%}B;^dC|9)9TyFTd!rD-TW1 z{`KE~WC^jroM)eR=BBs5?#c~o`o{W8|Ld)<_}-oOHd?Xk*c@3DMCYEr(JS;EnavQ9 z$9FIYpn)OMOUJ-RW`2rtaOUU7Ap9v}G57RTB~yQ_20X!^p14&R;GK0iK(wsaT3S#5 z0C2&%5=tqX@gPnore+5R2Nv4ha<^M4l!PTZt!{tc;Occ7`i94q(yf{4`|jTKaxf>QClSQkZ<8LD| zhRE=?yY|h^*M9l6&po_%rjnx_H{E^8hBf=X@r@tcxT7|?cK@N;+pf8!6D9_MA&{nJ zLcsF1WMnv4Tv zQpjeKWFTW&v+TP=#sHHvVFZ?A1AtK)kbnbeLJJXqq?Cp{;G7w-kbsm_8G&1aMnpo= zS{t1rf#Bk#tH?HJO-diDfCm6#%(h%lbGB}{ckQ~dV(*}^>@*I7+FUCQxq~K=gZ-7! zp+V9LgoE5Mx{Dm*+RWs``(%ox;nDKwC@=)Aj8-JL@I2(iIG1VEnVs9`tWyH{lFKL& z0VAzXS_FQ!X%b`idp=pb6UIU%cAQAm)!tsm_XX#G0E|czC`p)78pVy~eGfhob7$Y| z-1lz2W9`O`|KFS667G3$*PY+(>zgQyuP+Rb=X?6IDlCR&kwm7yc$O=3t(!%1MI6+iJk1@+j(=bU|$a!GZI5UB)wjp(2xC2D3uwj9v(x%0b7}I2cIHFoU{W98{O{I=?chBJVY=f+z zd&arR^y^9~%d*lmou8k->#n;xozCp+Y{nkmy?eLoy1wtv&dxTQ&3*g!_4oI$U%#F) z_Q)fTY}~jpgVim|;+!8ndNhin{rmSHIdUXPlFaKq48zROD{D`@6wADyr%edX7-t-r zTpXIux{HW_LAE-=MfdqdR2~q4WezqhN#fmyW-h+q6d{<5HA9Y=S;rr% zTVCwPmup{T0vALg#D!+q>;#p3MJkompaMe##5hlq)Ut%*atI$S5D#F6`YQm^XvHis z*=>fL8$eP4Ljy`%h)O3$S!lTHd6p&eEwipJ(H>!G#Ww;2#hl#LriP6 zvA=iNwPYCCAQq-3>#b?Dxgm{+h!!vf#t2OV#bULXU+8pzV9oGgshD#t+hWKVx4k@C zmL@cs!bC?w)K@6RVH_kK%gIA(JYm1%&2LFm^4stEv-Rs&qLIvCCt^yJc^`zaD$MMA z$>i;~XtnJ*XP$fN@VyW2zjN>0bDwqog)h7qVtLV})Bp6hAG_o^7hUq=7t{{yE3I6! zEnkYdal!LOM~7X@QH%=)Z@cR9?_T%A&6~HXdYyauOU~H-uiv>TOqG!7mes>K&qHCi zgBG%MZmz!n;MCSr+*VhXVz9kf2v4a8L!^3W|T9Gz7|q&_?JG6LMbWjpMh^7}Jo z>4YZ0S*G%D|MqWhxZ#FYtMzj;qR*E1S6p$$>tFx+tYL__a^iY< z@;q7oqk5QRd2PL^YgP0KJd`|d=ruV zbUddlAN^D8n05PE`gqxQ^a&ClS+eHXeShMnW?CNxAUH4pWWW)O0ggZlRD-wyi;?4E z&_WQJxYW!TLz*iIQJQjs@oH~AUrLOcn44<_^G0eVi{)G%G)^B~SkY5CYwbD}K`U%F zqoAF3q$EhCt&?-NukJ+Y&b{;C+F*MCJ)rYI761@f02)CNBM^j&h%YUyj*G{yf0x$9 zQp$3<%oywM?@!Y-2m&IqZQF62WwJu4RNA|DZ>?7IJkR(2;o)J&aXin#E^VsvQBhLxV@WG0o1t}u{E9T(@2K!hwKu>k-uhD(XM z#cdWn6_f%6LO3hNMpmvE(n`0QL8INCS*Xv=)h4G>&N%^b!HQnFkn@H|dP;@7l1giX zxPwM1te~ zN~!DtUdkl`07E1Muq~GkdUprD}r{Ls7?bh2G>0%-fB=X54Ff%>JxNtqJ9EmJ9Pd*cfK|t7rduyTXOUJcr zhn;z9PtOR2LBP?IK#Ih^gL>b=1KOCL{)!=f`(3FvIU}@fF|MUT;vN*L&e0ju=_aIs zNGVAyRSdO6P+jVFb=;w}8H2EuR-iLhg)v5lld`Y>X_bFq2*%JEefr8Z^z}mmfIA3m z$rI0U9Ieq9dt`X!++6*#OE0yirh``fwJ(0|Ku_gefAR+`X@BM0w|3IT;e&@>apfgn z{_NjC&b{qBKiIsccm0O-GD&BqX1=@Q_HTawhp+hU51(_|DFc=K3ocx{a`jMc=l<*g zH3rW({VYH{+z4!zJHGGa09|D+AEhl7W8l~_s?Ws#wa9t^%d!BL?Dv+6tY;fA#)z~r zMlf!)Mnujn1)3ov-jXZqTp`!(2KPVsz|pC>O3$E7Rn)F`!e;+apX)eL z619SEn8w{W)XI=ShA6W-;fO?wIDDo~T&|`JOLazIY5Ba|8zUltL{vlqXi4{o2!O^c zcAMD}dl8u?rj#ib{Z6MFbb|4b^1ZtbEi_s(QLSd@lr^PqTszzCB)%i0%!5E|K4j8l}f3E z5Lv;CY%~#qGsbM&J~BC(@dC*hhKyT6YYjwNr9l`*QIsSyknj`{IYXc&I z3}`n-YtovCvh)ZUlND+p0z(SoR3q~o!2~fvMOvv;NhuMKab^jDNS5me+lr#p6T(L9 z7zJdIFB;mL>>ODkX_A65rL|Ni&Rw(t6agbpk2P~-1WA&*j%YN4#(dNAa*pTABr#I9 z8_k0Ur_u5T`-SB?nt+u`EDkBsXnFbmo`qW;`2LPNhX#jMuNoa3tmdmF#sw41D!7*K z0b@Bw)cxTJ-OG$pfJ-Z400MPV{2dlj%>;%CZ!FA}xTReXe%0jjr64Z%Rt-Y}PK=C9 zOcKiWd^9)Rsn=~oLu*bMSs4~A(>Jzud}uI?yL@6zzNciDdX!;CAqOBEF~?0^Ce22D z|NgnT**(*KVzKi4cDK1Oxw|_zm9(c(c0ol+(iSF7nL$Qe z5aZRjd9>x1TiYbGCE|q0ANMm zUt{*)dE;mQ=(k^WQ#p6bVXzU@u_Fr+0J8;SgiP2en1!gF<2G`pL6X)p!J$59Semdc z8_i^X(Cw|IHNouTj1q|%Kym^T5TJ{BMxqTJ-}v0p7UMw3Q*LuNWGQA9>6hk&neaVZ zj4X?yv-(zu>XLD;ZW+`EaVW?O{ zTo^zCnSkdSp^T=Uf)~V4@R)7QD6NdKh_n#O<}OoaRW2Akf8FF<@65t{qtjVvg|m%j zkjPl2NfK*hzTbY^M+YB4EBt(f7Pb^TVlDN}sH=8Xt$I{4_Mn%#{Wjulh zcJAEzqkr3V{S8yfY0gb;+Oj!Z*@>CIestK(F32Pu>?{4=|N5=T&T1RlsBy^w8pEh zqRTFWk9`b3`&nwYp;7_HU~XU&jzAL6DF9Yd>1P!Jn=hxHSSM_c^qzC|C0{%+^WE>={@zq}1b2r4%1TO}-0EUMjdElncd}8w@&)xQtm&bv8+zW_^QmWF(@Yu%9oS9}vBSR#{J*@p; zw>2Hx1y?d09P+;W@7LXZ=dH{tr80~QAcV~<4ghlx{ouF@V6;eTAy7mW&n^c#veW0U zg>TNo!RE!jR}$|1X*!=q785z!T?p&Ffv{=Ug@_BCJmyB3im2}r= z5iqOuLk5vC#!wqXuF}+E%pomjrro|3rZR$s!%(_ge5gNsS3_UHzfM?>FcqV?F$kxLj``E`k&pV;{d^QNy>-D$2 z?QP4mRnGb3{^U5zVH9xAO7KT zMgRbW5WT&Qt2>W5pH2%JdA2gS*`9gU@r=$!Waiun6VMk znUyn`C08v(T;%t25Ks~);-$Lw6a z(myaaGY!Ug#p3g?eDUT}w(a=NHk`#=*=dRmq%PLnYeSLkivn^xDvVLM^^G_GY zYq&GOZ27NG;i&}!TM%$SMC8B_I49--O8^WQ3D^d1C|B)sc)K=VYX#kkZz7Wh3i6CG zr>9)%=^yZgU2o0K&NXTa-C{9Us#Gea%HeLf_wdmJ2PQ`=m9pRCd->2PW<>^>)L=1O zIa=nbJ9g|?yLN4MDBt(90`Rq3txzbeT)Fbw-~M(km)o{&Tc(c4 zrWRRVEURL(+(W{$mU_9vJf<Z&ABQVNjumB@K zV{8SGo;c8ls7tu05md+;`aWD znNE->r8Oj4^{)7;Ras`nq*kMxz9p!i~A`(-K zWoje|u~1zuBW+|V6Rot;DR{X&7iruHQw`l-mLHU|Q0QlIdRZ=CPlxb{#^h57@?j;v~@NYi;*YEq?;WaCu z(>7YIS+}P9xo_s&5`g}lH@zMV>8bg1&pz|??b{TQpD%##y!wrA*uV3R%dUCL-h)SP zx^?2(Z(UcY^!NCJfsiICRC`|V+>7@|G!a_>Z9$U0w)Hq0b^FCn=7TI81^tid)^N8zsWFIK#|+BReA^Ln4N>40Xd}=TwVc9gnS?r42Ix903e5 zhPL2ZYrz0G>ZPjXndDS!jRNC1UNt({YIbI(+ZSJW?k)H1`{uW9Id#j*>v!CuL0xk3 zdBvQc$S_xMqeKEjGGG805)pGbOO!e~)42QoeUnEg&OYmmp^LPb4MPA#LePYY zOn*oMUB5IkcG%nw|#6|tPZdunzv4991y*=Xs6 zIlRz2+%qbKooXM!yZqwkp_Oaid#7&ARr>qv!EvX55DB@LC+0JjN82*4=k^c5?gLx; z<+_(WPZz4|t7WI>v}v~y#;V7*RP*q{o*(JBW8x;NP;2B&+cvWVIKnZgqi7+n-=CU5 zv{ous2FoInDhTY8xdHy-1Sbm_L*kq{Qp)1U>FY1O!l=L7lMGf1Mc+ER zc=*<@eX5hDptT{9O~MxEenf(!;DV7MV1ikolden`2tNBb@sQ5{6-+P{{J4)oPV776d`5RLXoZk|gPNyY+hA z7-L!1+}vEd-JYA9Yc`uoDc|>_C<=lgTNy=Blx?3KEeykMx0|h=mZ_XSpGEOg9Rgr+ zam2U)V4Pc-uL==lc2=X~vk~oB?PK z8i|Zi09r{KGwBStPCn7KvRx@!d1h4NYS(k??XJ=`GLkAKLmJ7%agHyXUUvP#wMt;3 zD3YlpMrf3jY0?qowi<2S?Kqy}=DksEp0jFn^U&a-nfXQ>bP^dUO2{xysY+r6NgBJh zIWo7siq^kdx^8E|9OZ>MQ4)^G;Mxhx+>0kFHplo9pumHaSA@MyvU? zuUsec#q%yXhcq}o-}BJks)=SEc;x=jU$<$k9k+JgyK884@THe+?HTR`O^#!kFfO?6 zZ~eh3sAvFMa!)Aqt_@fH3ZMJN2o_$%pR${!Mp1=c<>L2YXbz#W~lh%=PxH z=&w`?`PaVcaz{Adz3GlS?z`{kY@;ppx-ILyp7OqflMD0nLf9+T_jOy{g{dxbOm*rN z*vQsWlG=`^AGoJMq+8waF`)agL4=&cr#=O{cSE%bN-eTE0DyB?Sit8#7yj<=7Jcbo z^BTPV`s^r+N6Y>%v#H;*CF62~)>x^)yWb5jeldRd!*Ih55Jga{f!4TeO271j%cnc` zfLSyeXxos>J%OdsAKiG-C70~@>o0CD6$*^;FpOc*e49A8Q`tQ@b;}v+eoLw(Th-}9oOk&@PrT6_RNtUD!t)$GFFAfENzK4Ve< zG}>syC^W@FfieD9pWFPqm+W{#4F1aipiz)PQ0ZU)-Y?r9z7=wjVb(GH_^j9iC~keA z?+V+>o!@UI0<}zS%d&(pVQ1#Sd++<+ckcP-XEvU7;n^>LS*xS)L>VQcbiUs$jIY}N z$nNbIY!ADNAt*)B-7~6_e*a7Vb@7{D_#a=n`OR50+*V)#r}GCtA{hmP%4KV-fxQ=TC*E_SJ=hsEqiwyJka>9GhW{36h{g@wMJVT z%8L3}oVU9Y2#v|i&H*TM&SnUV5pgnt30~-7D>nG6R(1MTot8TUqDJdW6gW=Bi3W0X za3LCS)~wyy(@Cs{?iu3Nk+LfW`tx3Hy3@IEgGn1rC5_EcKOIs)&%`tFOgwpH)6I9j z^PLx7c;U&+=QFtd_kQp9jvP6%Y#*0x{PB-}{ME01^|PM!tS2y{|Mg%0^)G($i#OhQ zFKAl~9eBbezElEig>og?6$XJ!$AunJ|pf=J_ z!V6<+ABB-)_koQr7D~|dSLgx zmEL}^?Y@<(y0f)`fqr3FEY;lP^n9&ZDi&V&va1iy)=8zSSFNO|{iEyt%k^x=i4bkq zv2D8@b~|A(G&FSXh38!V-5bLo{OM%nKjFoiWsvOH&wm~|1Iq@Bqaun^AR@~FhT!qV zYDEG7fK-e+RJ^BJDUbI!yLKIEwf$}}pD0a&+m2f;_X*dZo|}x5KoXU!0}k(^^)Ogmi)?!AkNOtRw|V!il(Qho6Y8$HERlm z!X0#dICY~H-tvaBo-mN6uJ-_PZ8%S+40!SKr;9zRlNB68QW zl~HM$B5)~_R8tZ~edTI3UkX|sN>WG_=K_q;N+m(WZAWrN07;q#?N*v3MoH2drD4Ws zAWH~sNGFm5a?Xu5B2{E@AOOyZgCUlc0W~T{;~3NCmIaJ~F@OxR9zT_!6i6i)Te)tH z#YL;pFbG~gr-8yKT2g`kV#o3uw=81-03u9M$+%Ady$!!LV^E} zI#4YYb|0L4+wZ=+Qtr9^&Yj=9Zii>H*Szl4cin#5t#{rdgtdF$f#Kf5s^MX+4f02o z9*B$F0)WiL6}2%NSC5>rY1OxHzRz=PL=56YFzj~XC{>MC@WKmD^DO?6fB)KL7e5PN zk(59LQLH+VvDt;A%@DX_0g=%LmC7mu8Lk|1EDq8TFebR8N%I2hUD;nO zxxVkrFSN$Xx#7*C8(|tN2(Ty$X(ExJ+evkpBDcjtVr=y8XE z%a{<|>89+;R2dY&9Y#QeitH3P=N1Ys?6Q|a>e`&U*p^Q>_bEakV9LPrhO7ZweR^*i z7;82~0N8%&X~J_&95#cXkn=U87r*HFcisO`{ieINty_88Md!>nx|`PbzvGS9{PH{h zvZtq)v}w2FZ+`s;frKQLK^PWu&S+2R`InrzdT?mp;RB!g&^zw9>%o8h+RfA5WMp`B zdVcPCFL=@BZQE~MAcI^GnPdBThN;mN7hbo~_Lx${#4mi`^K^(~`nO|vy2cnHVF^S` zjb=;cURg)M83W{6Yi)=DGss&(G%-2t2repR&Z)Pz=vp~p`Gm|xL}A)dqJY{#5JqXU z)ddu;>jQO`I7kc^4Z0p@1dd1sls23(#`*FUA)*l6 z7)rJ2D;GQmKl#P)6@7l%=Jm~b>qoafEDh`L8!444kL)`bOYC&w)3&Z?Hp5cY1wxso z4Do0?3d8vBhYqY7>s`C)qN$1LdaX4))HmPm{Kdz=@wG31X?V?<|Mr=Ge&3(G|I9Pb zx^Bmi^>kTI6!x&e@wAtgKYg*b^bkXso71lM&KJ5>Sa#2)?pp52RXuYUnM_|YiXt79f#vx-2jnT%av)8O~bXd+84;`I+aQ}f; zkaWY;QmU`u4(8n;PUpIDGfvz>zPFSgtQI$~S>t>DU|!pv+&wYt*><8$=7CCPIRlS` zMxXo@RtA_M^%#v6aqigpl4>-kYaNWzpc8qHsMVWyA3C~gt|bl}PLiY*CG9X?HQpx} z*6N){4o}rO-LmUm@#2eL^YZ6^{;Ss?X>^3+0l3nS!LuXtd zfrIA@*)H3OCY5MOU<@aYz`0=@iJ<^+K*?kQ+E$$Ch|1{twuM4TNB_br;2C)UHbVyJ zFd;ww;cs5?lDA)Y%|HC;KmNAS_;$Nhn{HM%3=a?XR4I&KcjnfTD*`=_T93XG8q#X{5=%=h}t4o$@2(Ulqk5~u>}EwZXg zB>*NAb!2Fvd*wOna{%Anecwte-w*>+27 zJuxxS)6>HkTeoiA>8GF07`yY%J8QMtbD#U%?c28x4GjT+Wm!QG)a&(ced}A3laoV3 zLqQNYj?-$jGT1%{0szQBccoNTX+BL;+qQ|Q)9GZ><7Ts&;q;l!2`qah{^HO71(6{_ z#xkEfTAD6rH#!?IAhVH2#z-3=U<_di9cRc=sgzQl?<7gmQ_A<23;o5l^=7NyY?RBD zfq{x+30PYGWeWfz%8Cpj%kpc8$kIfrROUQUF678SwgWOW89I;IzYPMWhT=38=z%c` zh+9l*#gJ)j5V@PPO&GUk(v(n944jlU8i15m$|$86vb^WIjt|0Bmd_cvEG_2C+;$wl zz>GO^;Nfn!V?&ZU!t>ms?T%Z1XL9n~_3N#3c$7x%SkE-u)9uD&E7&*Ns&!j^wz=f= zt=qS4wHzx6!nv85si{LIX|Eg}*4%Ri#$k{oHNWH)l71=m?!%Lu39t*$B~3i(G#=V> zpirz9m`0UYES(SdMyMa@q{C}AT=mA++asgjzwWxbcYJU2=os@n+3HxFfv}X)!V+(M z=Ue~vZ$2_{!*#tQ0}tG^v({)f;()rrk(nd?t5;pL?Udx`QQI#nB%>t*>se=S`{aLq z@6E4yiSJvNo^#r0Z{^neAG!8BHx$b~-5^|;UnmvJt#%i@B&ulu!+;ffZH;!dx0JBX z+<~s=x=|dEI!Wf;7+?%0Cg2mFfI?xhpnF!8hcT$t;MK2&_rD*6STvb`*0W&iR(RwQ z@VsMd6@b>z+Y75#gVu}3R0@b-%NF>=C*b<);r;K2*;(Km9tUZpDFgwu+t6%6y$+2A zEG)p0BXIO6xGr390X*+{;QJ?RI}!Xb{L%aHeINePDb-5RXpF+x7-LAoVmSuQ7{74q zyBXT4>>xgRYGaHgoYiYah)gm+>N-8PUCcQb4GmXZ*FVlNkK&|z-sX2s*LOzAJY#m| z$3uz`Fbpx5%X7y5^0S-%;0ZAJhpqwuX2^7Bj9dVs{*T;0sgZy~RsjeZ0T^Hf=zgzs z#$CPVyn1b^>dI!j6)w#0-}A_xyLV1McwcS*E-(Q=!rXic3`m`@Kn?<;g0WN2JalM+ zArKi9R@zEvZyoZ^@4WYa7e4-%Q-=?{ z2}mg%jkP^~j|o=v6auTWe`2-6swiH2)|H@Pz|Fty_J7;lJO11)&mJlF-Cb`jD(A?A zVHDSbJT6*6Awx0}3;`KtjKjbaB8Lp-<}W&b{kyI*(ZU@g>69X24dj!xV`ZgS)o-N9 z1f=gi>xF|m4Y_-IRBg+)vsP_7t^dKj3qhA`cii5^10-%gYBTUmJQL5v(>EAnN~sMS zHvH+I{^<#Aua85}vzgCZ-tv~a?z&3|al&MMHtYSzfBeTY&pb1$ z3;WcH4v7F@^XARXX0u!_FQW))nr3!$j^iv}rZFZ>(~P4Uh9MDc*s$RRFL=SHKJ}?( zoBd~C_+Q8{1T4!FEs4vQ{0g(VKVufNg+@X{2EiZ!!^p5yDU}2qErFP4Zax%7N9AhK zaUA9#xkShUpkkrN#()HAlvb&ajjz>7jK<*7+G4R8ER&OD&_VX`BHwYTp|tpOEaUT; zC+?Ye$|8fT=H?cLM@BO1O3(Fcb4>(7CgzV!4ULY(QFzl2uJ;_*aooh{pxr1Hdu-RY z7&n?mM#l)XRO#Trh>XK#qh$%P=fS(ml|E_o{s-=wo}L-(>v0_C@ZowGM~v}Op-?Cm zr>3WN@7|N9#PH`tF=32liI3$^vi{s(S|vS&-8%;WAZZ>QLRdz{){A`r7?2Xkfbg1K zef4uUIx^~}aXTpmMmFM3HT7CyJ!wvNqpst5#d2OLmc;t52OlZ+PaR!o*{-cfb(6#j z+e%4=08DF0EJ_Trjso-?^lkEbh^j;^>j0575F_RR697r3A0`d}k5;2y#@A2gTSH65 z+E=bz*=n`!x#ym2kj<1OnP+38(P%UpgM)*+cI|35n_BBVd-edprcIlAdU_TX7Lp`6 z<&;yTlsDgevk+q4x^zeXI!n_-~MikWnJjrP8^K3js`OV+hQ;b*rc6 z=F(JYrL~b@G&h7w0U{|TjW$xEAtR+sk|^jRGRB2bQX8Vo1elN^w3(mkkF{%3(DUO{7 zW_Y&ax}GN*jd~#`kXu1JPE&~hJMVwEr&8FuX;qvg2y98kP6&%NTV-;h-Iuj zTW240Iy7c6DYvXC&$54uNq?n{Q2@rZ-3{wkkB<+}&MzD|c=X8h%z0;>Vl#V5cAoj= zFw3<|1z*Q$JBR@&ReFh0x0u__=EI1X^W18&n9q4R*C`kLYTkX>Rac*S&gsrSv))qv z)D0^JtK~~Bx#&N?`SnNkPb&lGZaGgYxp-L_JC7m4V<((ML^M9wxA)NW1A8WHi`$kM zAMW)n%V<3@*FXfbp~0Ra-0#42r=U-7L2yzDaFMs`S zU-P`XHsAce&{c*dGl|tujUTa$>Ete3^;;TgqC>y1~X)9 zO%{7*>iIt-j>X*@J4hg9qK#uSKw(>9oVL0_tKAKwv{^}dTQ&z9&yYHcW!jcQ^C<>z${ryp*^A-2jJ9mwa6n)2!!_{Rv$cgaK1Ku%S}Ig^Q$gBw14vVfBhwY(n&w`&)5FNJ73jkbs(!L4vSUm zHL`lW#u#IWwqkm8JUM5Qz#YLiMSvoFYy(Q0vJr7n*k8I=|}cBtYBG z$n?k^=5YX<0E8O~>7_tQNfw9781!vqreJf+vTV+nF^q^336X1Dk8%ZfaKtL)j83HM zQ_&|c2ZEFB8)5sFH8e1$b=+y^y3Ix!w*U-rG(sqbWCRd1DWvgyNKr%OC0aSpEjeV8 zUw8oCFy!QMWJGAOJmdDgJ0IG1%BAPO{O_Z=n;*LAA8YOVZrgicRjY69VBeaRBX509 zkC(Im^^W^3VP%{kfsBAs(4p2$v(=t>{@~EL1N~#AVuE_6n>>;eUz%>|gpo0^>NdLV zs$UMeq2MCxNHk^21QE*SF77Z(ClV zWG$*Kn?NsDvs%8c~_12M#J;G6)RSFo;Nr+xMIbMnVA{JSf|r* zUDtJ8DP^x&WZjXvA^6jJ`jeLS%wrB28qFAzK_57L7&$zz{JY0Md#W!(~SiA|O!6S-sV6 zwYn=t2lAd>DY#lHrDUO)8!ioNsfvYyRw`QpWTx?ujYF6%2^M9_oI9;nQ^vAXEOEg! z7+3`UGp8$Hh+&fEJRb<^oj44n)o&Rh3%~|NoDnhyI50N6qPXk!Lq5v|I#sq{4o}gf z#5i!JNhy=Jn9o>IxOSz_t@I*T0AM<`C}<|Sb!gX~xtXJuXKMh*&*yTbO3xqnb zPihmh%`i2}XwI!9>4uTy)_~*qKl=9f5(D!HyLWu2+S@bGUjSst zK9})!G}K#^*U54p!MP>0MKm0+ushq z|ND@Yct-@KfOB~H%i$0I5Q@b`h}{?sO8I0LFx0C)_{}|wX;ISxB%>2&z@H+s1 zy%Q{!h^#Y3APs;FbQkS^7=9h>-hJyQ|K$hWPSk2*w^ptAr)@u_Bbzk}EVn3=c2KKR z3MWM00RS13F^q3NbMkBVBrzZ&a2C&Wtm*E8sdaRtb9ky$8vggMeEg#y{_JEtcn z|A()ZdoNhE=_~toGZYyOLMBPt>9U-KWXKpI1q2L{8_mH8G9KW7#jH}#X@k~4^L|Q9 ziWX-CD&U*eTe5B>reJ!V>RFAoIbu$6MTPd2hE{9}e4C&hN#xuWF&K-UdRfvl@k~4u z|JP%g5c<)Ne$@B<6IOrECZ?@c>o5@ z_q^vl?|ILAo>CEfmYyh=%Y{PWhd=z`1s7b<)6W!vwUfdM&rPN0|yTt z%-{i~R1`&TfBV}%^O?_Nm!{M+RHR?bKq7+~R03d@ZG)C)4@AU-O$LCGU_2$o8FRUA z*IGyC5}|qCPzxQO15uKnF8SPcJdqpdfl^KSoEJ-e$!8pluuY+isYWtOLcL>R5h4OY zgA9RyFvH&Pn7;!)`YRzIuxHYs&%{$0TAS(VIp5z?E*E@1m!^qUa_zcxX`0T=%pBae zfAyMG5ke=9q%rk&nnGo2&}5O|K?Y&PRC7#~|TG%$S2O?R~0q3u{twfsGkLBILUZ{D$E$DjS#pIv?R z)tUETmeJ0}AR)x^aPSmF3;;k#%mI$z3KX1}4T6v(0S87PfS8LmTUe;hOdq=X6=&ak z=l-A;M>^l>1W`GhZOq0=nzwT@k*;UEMJc%5Y;+DBn5k6rzVC!_6iYeZQD}j~xL_6$ z6U;Cm&X{p5DCPhQM1GcU$PB&_JcKG(AsCIeCIi6P5)SCWF`4uy4W-of?c0+i*|~FP zMsdq>ESa6-wBe3Zp0p zWRh~rMg)eawKj$fnQk{IbVADwgr5V3U^pNFGUSYLPTCNF20~A34x53L`G>v zHh1zl6{oev{B&)`_k2Lc8F9vti%`Zt#U=lbievTY%Sy+M>sH=-|K6F|#>A1?y?YJ= zk?q>eX19{xWDLP#5tb!Y=aR)dAR~GVWha}ean7^CxET2)$T;iFd!l>z|UEpV<%E&30z|g zL)2Q04)(w8mtJt-(6l22%V>L{n{ADY|dG?9kn6o ztrYu8g-g!Zvd|13+&gjl*3GaenLx%c=|%uZ1fBVSArH|w9x@48b@?=wj1U1C=SG{k zM!3+5fe8R|ec#JDNlWhAImr+?XTTY0mhNto(u`Y6L`K~zgw^rBv@4slZN@oit&N#_ zaNeXc)ynmpI7t{GA=xF@&3jraLsG^Hh#8{+LB>)^WdMv)qzxb{t&z;Jeu__zKw#N- zBM?%;u`*mf&OZAHzjr=)>B{o!U;pc;Ryu$Gh40BUx$^3(0eEv}|J1~RvGEZ#Iep~t z;VrAHe$iV!(syKfW;@&J=DfT}LCsxp$(j51md4!FEBl=}yB(#QR}AX;*3rqMt#-gT z{>z`db@gcP=5;HsyYZoJt)91w26QGGVyGoB4d(UZdQ-_VCK~~se&mN=>{wo;Gektj zk!5QJK}bq3A`SoqoG}m_2?>Z91Egdj=l7JnsoD8_x#Sf5g6~O04|uVhi%7PkkOZ%F zgGMJ@s5b@h;okmMBNTwjXwJDoA|OEIz?M_ucuW%ZbTPfAk;c zr>9$;&i8+?^Br$`X|2_ooD_vZ0rLeZqoZ@JVr*S-)|Q1@tDdxptWGyc5_#Xg10~y@ z>!^z^dY0Cjp|xi1`m3*c@nvVPzVO_QhmOopv-8@Qo%efx@tOHr({&v(83#HeMxqdw zlA3X_7?+rGPMjg<1f&qTR*@k9#t;P{Lqal!q(%U(m02Q8NGY?PGMf%@&KE~BFq#N7 zXw6;E11ZM`dVM$7*XXpv&}FQWbJwk0T`m_xqnZi`>}t*(=<#eoy$sFah1#&ptZb|OPY zGmIEk12>c@%e&{T8NT4m4c%@VkmalS7hZDu4R=0R>vlGbR|W=)UTCaJvneMuhJgXoOj?jo62u8C&VDW15sX`|Q*?4wKYvPL zU614TdhNMfuCK4pvaAe@w{3gl#*Jy3E-Wm# zt~)2zR;6Yw+(0hy|oF=QDMk3f&HGD8Aw zbf%G6u0FN+S0W%pWI5k&Hru{8fDG%cP9dKgELV(@rGhWGV8|8|Ziq%JrS;OJKl|bt z00T0uZr8T#R2oYNM3xPanNt)Z8UmH-V$K0FIorabZ?xf@r%6{^uF|oV5}6276t>9q zJN4x;e2lwRm`V=9 z^K+t-cZ90;^zPobtG_SbYdf7V;+o|-XJJsW?Ne8dcRTI9Q!~=4Hl%TF%vEx1cA--C zTite{K$<7*D4bbn=L@AAV<7zAo_?d^x%rtLI}Z-`4bD#=nyR(RB^#1tbg*}HXyoAD zhwfNdxZ=gn*|>GBYR`+?{^P$sd95?Dsnx3Qy8Hf(TQ^f2gCSB94KM@b^8Qn{9(v?J z8t%4ooEhk;6rO*{+3Pl~1MV`2ItLFf%yuUa9*I#uaNxj!qcb^2%pdu;?dNRYyk%n$ z#l6)^so5Gp*8v+RCO2;`>9XHx96j@rkxmFRM{BZ;Nko+~_teWqcHcRZv>vZ}TYQJL zM$YNhTk${tlS(Db(09%$O)-k#kN${$?bkr-M`i1o3F@!>3V!mFv~M5yJ_y{R_hb-7l(be2JpZA?Ux<=9#_a5k0)VW`Q%3u~+uK+8(7$i_y-Rj{=}T8# zef5_gcQOFryiS<2`~x5Omp^{@+rgB80LVOUxF&mIj~~o(R_7&dcIJt+764P7CnUp zZRhPF&V(Uz4QlL=p!bt4qoD;Zp}2LsGQ*s#{iB*Uf=h zUGvuR0^>2LE)Yk?SXM&n@lOye+v*-48M*r;e*^$P00zk5IDBI1^Cw;QW!jt*ZkBzH zPtpKn$Qb;@LmdJ#c=8>e>f`^S2Ls@U{C}Re4g=uubiey2i42E$>s#M?$t9OOvHASF z-u1472M?YQJI`SI_rL%BuXx2PHgDd1LK%H_qTl`9-~Gy0zH-k!_Z+)o|Ct9OZrHG4 z`}XZ?*REZj?*c%7e}Ab|Iu>q0#A>yg&*xXIT2-snW@l$7CnvAJ{`zaKx#rcce)VTR z``NLvF~-=zg9o3Yrv5(_1cpw;Yh3#LXAU_NWJL@C0MHQO(hOu-OeciRj8F(1nP6O} z2^iU1@cIe`)QrWq3$us!vbE#=z3Txj?)0LcXP}mJ?vKg- zKRT17Md3RVr^W5ECzD{&cOJ5V^n`cgNkOP5?O6YtNBHkI;1@iW929=~c;bDZ>f=9l zQv@Nnu&f{qilvfeS%_?5VQy+_y05R_bL|8B_W|P@w{D#{c%V=&P9Hp|q>0;&N?*_V zO&fOJeoODbkd$ioy?0AxiiI3cc)Qsu7Arxc)$T@fIz=STMK_8;>teCk)6=7*LB_Xi z-*VTj_he4v|BZ`%lE{Xky?gh5>QkQrfIt89KY#VBUkw16IQzhX1Gn6AOO|sfl}b-p zD^dUfjDZ5+0)zv|!9w7YvKn+u03s1blyP<73-{XF=65d~IkIxFKZ;f8$yh6l4FINO z!cHKK^b1a|Q0g5TXm`6g-%Hb^8Fb?~ky3&Hf#7ha2#m0$(O{JEU2yvWdl4-lBCr6e zKo)>QP(dC5ZvlqLIAKiHV6yrIH;m48wA{{8LXDJ=a0x zK@bsXi`xL&vYl2CDZ*T-6v?22~Y}@WB7fR() zZ@Kif>vrs(nAo;$H8KXs3{jTGFiY8q#W8egD9?_cRn4T#U503>(gXoBj5CIeBa>Py zZ2n)Z|WmiDKq4$xfos&e$7dU`hLQ%!6ov z%#%-FmUlmH<^^<&$t7ctpPOZ$|9FNjguo~RCfK?n_ic0MJbUp<+^~LivHNhh8N^|# zlX*Emf90hYKzbVZ?1LZq#@zJb5B=_IR&H9kdDY0y`}SPPW*Ibxa^ZO|Kz(b znqdCKP0C*6#C9=LjZh8QNRw_DcEh04X@gQj{eykQ%3)_7nZ*D=h|B>FmXMRjKqOBV^Yw0_QYw{voyOVS zL&kt06WJ}JBtRsD#f4ymTANDQe$izYDir%4xU(^JkRW=&g&VhRzWlEHcYXTv*L~u% z-(Ee|_kzpL_Z|BSU;gfvjjQ_yilpt``zFF5ShHrd-HvAKt?|*`GqYQOTYSt zVxa(FG|;d8^6SoBKk$kdKlk(3-gNN=TV>QL`96`JnyYPDJ03*olApgZS{rT1kkk@{ zakv1(vQ;WB)^ayd6bZp>+eX8fVaT}AWHQS45>XF;7~`3?(-@Pav6f0}i2y{@(k58H zatyd{TRo+ren0B?IY|Z#*$k_m&vf;)wQH3j(yCI(_4W0np!ZMDlneQ;+o5{f794;W zV~jIxjFb`>3L!W{I{CY%2)F@ti~=4AO`6)hD|xPHRFZI>#u0ZMA?(D^R4dTPayj1s z0fTnb38QY+buT@AiV3io zK+YYDX8@p16$-&EhJ;3IGzOFcB*u{07P&UKF2u?pa>2Q9I1?sp7&5thk!g!T9Ccf* zMxz@>z&J7kAh{rAj7qU1txjq>K@`OiX>c9#kMnRjVd~>23VgyO<)n;&U`oh#-4q7 z+ex%`5w^O{CB5bISB?5Y?3|gsZgTG4PN$`HpS`-JY6e@3xf)F;448!9fBo-lK4;6^ zk(tTK$p`n{KRJD9AYUrEPQkTJ8unItrWO`*Md#rB(I4G)`}58|_1ULv{;wOp^T}Ip zC9o5vge|P4b>%V>Xz^-}>9R86d$vx=XugjD!ic7)r+wcy#>8=4sZ^@fYO~qQ<#Oe6 zIm>ot<=$=E)>=nVG&wm50G&>!-EM2G@44q5rPS7~Tifk+)*A#tuw1n>Q`@I$x?Fqy z*w!9PZ~BD}LCAn10V5ELUkPIw!8xPAXP103enghNb3HFk<9a)sn5iRUaTJH`&d|_M zbE1I~*RJUA$z>S)ViSmv@m9N)sI*utC5*gsHdMN*X(rb1@uj#o^sk{RKTfm^Nom&siG&hY8?%%u5s}!4( z5Ft#}9fziF*>mXhZJUON2XaLxm$R*~%>`G)bgUb5k?RyRSwT?8gt{$D1>DVR#&!Qt zrNdR!O&`DV&t6fb@UQ-AaXM}c2mw)qr4sz>zry+FXNWOKN!>1HF7b^9PEW(-m*e<2 z4GlrHisdro^H8b4d)|XDe>voGnEAIO5@WzQa!#CQk0un0k7}y2=QWP8(}79_F29^! z{c1Stti=p&rn%1`|Kr}?FMau{tFM0F-+g7<@MurFk#@SB%ru@0wm7u{lsX(JZ|^B= zj?*pz9xs2-!m_MFp_r`?9mgS}lgSy0q-*tz_B`v6$AoH0Pm{Of4xowO~hyzz`f2lt*edj6ez z7xqrJns2-)%|Gud{x%LQO_RB)$qP@vVqxzC8_zy3N(^dRcA7u#`ZHSrhJ;!f1a0T@ z;8$v0cF%p$?RU%`I#8Q!w+oDZ?G?Y(PC5nK%W>NRE&%sW?fc#De*B_!&(3%KcG^bZ z-C83SkuA$)6v_liB1zQBLU0)?Ti%ds#ZIN~%F9-jzMFKJ00M0Q4fl|{DOkqXn2_!( z_5uO{b8~ApI&LEg%Mo3c9~Gq*nAycegrVbCJ9bv%=;V=-Ia!Ja0TfU`(wry_!~g@5 zlAgqO&cP?DO=f`P$-W2x1WYLD>VO!TpKzvvfC;6MiJokmr||f{=z##CF)gJuYS!8~p!HATYslL?@Uk z5NN?%MDer6;MsB^Sj=*c$FRRL#RKO8P!oaH#$rq{ic;-!EAI&;p*>6tC8Nb|6{+{HJ|Hv#(n| z(H2kf@gEn)kPw0)*6K~8Y3sIadv@;@ocag)%B9Ne{FH6Gy#oXH-hEfWbEgi}NJ~Rl zDpksb>cpXgW2;sJgQL54kB+R2QdubYTE`Oy4-F6NG)Z##e5FvDn3&kSWpl1rx#!N? zgCGE4-EOzrX$#M`9ZRO_=Rn4*R;#}6r)fGdG4aule)N}r`ImFKT%*zW^BuR+q zSF#3k!IGC&-2Vbgp54`x<4?X+6yYJgZ8 zMW7e}P)mixg>Bi4i@tnMu~hD)q2NxfS&tGUjY(2fD7v-)+Y%|rSehu3()OTGCRQOR z0~LS>poyReG!X|PGELAiWz{+sS7!z~i>?1Lzo0C64CKTaEt z9h$R$=RGe?I<_T}L;(jd#5hm2nW)dNT)Ps}2pA<&N~K8~BMcIdlE9hLnn)>`Mq$U0 zF^a+7{j@hCb6*XTrLM-qB#8tpR^|lhMc2)^6mvSDMRup!r&JR0U#3K z*x2ak=-^TzNQ&a<$mIMPr=Cgx#vmCuMWgEIXIIt=Z>Nrd*(7+XPH2 zoy01Nx^XIlFe>Ey{=SN3abvhtav2v{oTIYL785Op1Gn}bUTCyBt%X+qh@Sx|*_}bO zW^3(k5a&GS?ne$9puA%j^FHT{h%$7lkoV6&ZNn$O@_hocdCiFDIbpl2m14~5uU7N^ zyldNe+sWtrp|O#7{?70G!F%6pSz@Z*eE-M4zIn~q)t8_5-J2i0{r+> z{v23baG|9UT;zL-CXr-}a9!6EQAe6saSp<E!F4yBJ(Ao#1$jVu6B3sj~^2&;xx06H~t$Dx&x6&jn3_i}36)84aiIa9=j)!Oepzr*YArp z1QBYHVTeZ~`q3PX53juYx*tqT&Cb;W?$}6-;us70*~1fG{o0p4{D;4B{^@I>+kW2p z+rPTwe)JrImLU!rR3{=7pcAWq@Q&+lT{%=(xpF9}H~;o?-}#kSUiRL%zH0jDgj=ol z=GaW#&J`=2qa>I@5CSli=Hh;M(GVC!`$@7pPaY-+!5qhaSiWc>&~;9VLL*X=npB>Y z#fiW?_bKIgCMl7j6Q6>JakQRr{wx(On~fj0J0OB>|749nR%O0;mQ1603`gWx*oFZx zB+eKkP7H}aYYO71lq+mmxABp^k4zt(aU8E)bX%!TKmnuFK(p0dn5`#4JXo!+7#gsI zW#@blHbWNb6c_?9Tv8PNM9cQA>qpzIBucs*8JWe&#UjUp5d$;^$Pj0^d_l$-!JU=E zJ!5NDyzE66t0Ya*Xl|kQ&FgM&cH%ev>Wc?@itE>`-u1}->Dk7X4dbcOZt71h)Yh-< zk2?8oEAU+5_LoaJ_q#XTH9b@NrPsWUF{U)V<;`zh*9*V(=9hfvBiH6!*9Qu%Trpqp zZM)VAm_Xu)f@gMUj%#;X&Fo^OHYQFi&Miv-Lk?&d0U;-W1Za?qHl%edk#RsoWPres zI0q%Q)=C2@CAHRMhyWM@B4dn6EgNWrV4O2WWN}t4=9{h7e4{ozIE+kqj>n{~WQX0QwE7$Jc-dkSXSSM0o%f z4#bJH4QZFGoHNyI1LJwuVhlNBuHX*CbwhnGe9pN8BYjq(AY)aVo(_Vj-fDgQd$+VZ z!Nq5T0EA?e zv0UJSAx8iW2ElM58Aqrh$98O%=g@1U>U4s7Gj4}qP%zX4sWzlZgvxZK;T$=`FjcLt zI!@V796k2ar#O&EYkC4#q@Vrq4N4?bI!R=+T-h!xZ{MLEYgSy`>=Y*^K6T{2&#fp` zR+oLt%H2NS3BstaSY(oVi-li1=lnxQrW0*^M+`aq^h*AWm81PR@A`ccpFcb`5o^J% zoUn(S4IZ0465gv(`xahu`sx4Qm6vbba?w<)F_Y8_JYH3B`k_w(aF%kLIesodNrJlF z_Vc%G*>_~-f!+7qaMul=`q8azupMNKbKA0$Br!`hiI%&^$E^-B06tCAtor-0e_9s7 zA3b_Bm&+wdGCMmP1Oex~Ua#MF+ilrOXT^#Y{r&wTBO}#n_3+`t2M-=}UAM2VkBD~f z-rebRF1_^9Q%^nhM?d<}641Q(vKeEtlXA|pS@CiQejKOj7dymaUx=UqjG<-c`DOGS z0ALA#&tT5%qBHPaFwV4Ubi+!uXfa-JoUs)nlSgM4+TDZG_bI6(MK-6g{&FWuY};)# zYSprP%#9;$G)I`6tqF@cmH;w{%ot;E(Tl?n2`(m%OwH7q{Qyfrw7xwhKupq98_gJM zFgeZ@LM&52JBhTg5RfBS8#j&39GO{|KcW;c5Lq#7L=X-G3nb}Or3_obb~L6YmlMM4 z%+7^j$Qer$-HpTE@}M?qVs5gLs)bIvFuzdF36!bSk};-HMn<;M6q!OJ3(T?8RCL>D zr4@^0(btj%K>%QsOjT@xFy@ve5c~2)^u2a5GD&UM{(bEWpFbTXdVj-n^DIWeOOvyy zN<-ha{mS6OGxtKAc+woIr-jqc-mqq6uT4j$jH_X9`9&B}+1<#q9X~tozT=g2Ac)}8mSsgIA0 z56{;-+~L$>h70amacE?uOI7f#emj?<)p}r8-FAApWk_qD*Oq*I?jDQ*&f)+3AGqTV zs8&%a5CS?K=1b#qHL59Vwtw{1ZKiSMzN&F zKNI20%ji4jESI;UNTrEVq`IB1@4J>G{_absU48Yvbix_z(x?CM;opIezqW4oW@|9R zc)>(B7q{J&+x#bMgo@H>WRrL8!jcKn)M|&_ATb8GfI`mk zeHR%^V>58-nRo1eZE!$`o>G@74PwilTM(+G?Lqfkj^l!MFy)JoBOU0id`i$)t%>jLJ06wAbZ zCI&6hOY_3GmhjykPza#GUunBNGVXFFR)`)OV=(Db1-i#zR0L!rzaySGB0Dzn<0;}< zJj)v?b4StRRq_ZZ$@FvYdH#y5D$L{W6QCr$(ke`7wzs|Q!yo?eQ(;6uJUl!QmIs2*A0T;XWQEUXMzw#qUI0He(WT<8$uLe ze1M_zlXjj@bXEXZn$jOTuUK@K%}hACh0GvvWr&m{&4@b^xRlJ|787J+nvx1S5eciy zbH1`LwYkNrL;a*lphXKNS9A=j4}@v|B5Py_K} zNnAu=S$OaL?Wvhqh!ZQo2;kf^%f+Hl>hTsx+3rWDH!JEJ3xTVgd<(fB=CTz**+);^UTr^|j7Jl5`|lBxR{sR5}e( z*=}_$@N6#9?zC(NplPPnot~>T8l84GvZ{X1V8ODOK^~KVjb8L$_q0>ptd zP!6(6>kByB1K&4Vyv0?=PWK_9aE;ltbRV)?}ac*vI!-frMn!2vbIbU98E}wDv zzsG)ZvJEUQ1QS|7lIS!E7-NEY#_{gjv(K@d^EYn*rPDNuWaKL0IVg>`fa_Euf^FN# z$bi;brKxJRI=18cp2vi+ZQJ!+VcCYzv0W6x7(xIIq~qAcF>^ga#<(Cr1_q>pMVC}Y zQlilaf(vft{P}|iZ}|TA>h(Gxc?iOC5FkyZWu0J^^iu}`3A7iILwh>62zEjY9+gSP z{cU6ZDUy;WHWK^sl0* zO*FSagRy{hqxd^NdY~Jo#he?3X|o;0Nt`bhf=+X$(da4V+RgCXQ`WYdb6@%NN8j-F zcmGRY@BjDa-^jVno{5>MxrR*R3%0G@wrQnJC}qkxBMw4Rt=;|35ATgrnMzg4d3`-4 z1e~w6O8H!==+4)qZ`rAaTOU4@bFFjE*>-5A1^^5hp|Q&zXrl#$?bOaWP6g1mxIll< zO%^CgB+m(NAWu$|wp6ayEA{1DGcAzJcvdTs6^{>&Rw{lzMV5fd5Bgrt&gb1IA=eQ? zAZNm8<++ySagQ-6n4NP}qQDRkdLGO7`JE(+Wa^Y{%eLA_Z7c6uLIa>7?Uvm%NIUIt zkr1Jbk_ricjPG(v*s)I%Y3Z#yMf42dq5=M6A8=$O)6QKxke!6V#<=b_QCKGifQitu zqWura#vCYpg2x|`wDLA>XO0g>AD^Nkqj|3Q<7k{Qn~MS{GCw#93V6YSuN+MO*D0Ge zY}s(i=Ha{UzGvTkyM~J;(3pwboiRiu!L3$3(^FU&zZvP{-XLBDAb@Vk)@fezZ^Y6(CZQdZ(;+H?5)L zF?b?ij1t-T!EGjy$k|V$C4chf!>OBn-(&hX3sE8v0&8`(|6nY{2{ihMAQg=b+rvZl z@zd{Y1Et{M-O&mEda}q?uNmcN5lUJtl#5H!aavBpGDHD{1OgZNyTmNuws5^vroFxW zn{7UEbn?K#!~FxQQ0fspPU5)Ts?X2O1f6iGcW7*=Kj*knss~rBs2rR)bmRzkZKDkk zpdrk<%Vjq6j}f`NU#|2rMlwwVGFV*uEb3DUh%;e;05oG905kGKx7)qs!c*V*r~m%N z|Jbo|tS1VjCbfCP>a)){MJGwS5!`eCZs7K+(NSTUP2)ph5KEIzFSJ~A2L=Zod1&t$ zXKeoFckcK<|M9&SU3ul2HEZS<=HL6S|NX2}+*iNsweSA(&urN|_L7Uv=ysEtcH8#6 zLLt}c#>j0&2}5KSDvkF&d}P(wU`E(x76M@+wbURu6Nm_gfEaR~p_V`l7;!WFi1SBBVxwiiuV?loUs`Mx)(2TAwfHtA0Cd)E;qjIm5(#4?H|F z+#KrbL!yv05|^&C5X25L1BL)otq~zBBW;w<+?AhTLaWST@%3ZBMlxFD%GTI6HT4K` zw>M{_#b?{yR+JX=J{l0nY|dOu^ymDuH?MEkTZi@@sm-?P^YwP4HrEMnIXHR2d1t=i zm1kR!RC=ndAd0(D!F3x!qIhJqQrvp11wD`fb@F+4sx$y8!w8uruvl>0o%(gxU-z2V zzM)hd3_A5x#tvsXO_U+av%mlY0L}~`A|P?fYDqIqgrJFtbRroF0AnO!qEKrj(m)8v z2!RRBfsjxWV>)a#EYP;aEyhKzq|>xg?K?WxX*QY)5CN4=l_6l900n2RK--2;>rRl! zV=`L=B+#Ace6^80z|sB5F>*AN`eJl-`Im^)@eHS@==ewi(HiJ|4uGFZ{ki}1NkQYc z-+ymy?%RhS_`=q~k&&`JoXc69elXQAXhuqfb{NWTbGYoh@xs&h?0TeBD2^1|)qT}! zu5kavq5n8|WOrCGdX))cDM3g0-||G)zeUHf0(?S$RD<9c4sfU5SC zOsb1czSU^dqxRvWv(1P$^;f+9fvp2QJMVkwhll4{hI|VQArZxKOoou*u@CpLG^XXr zq%kHFpf9f%mU}kFm=Gcef{BTVp`oFLg#`epR;#vc7Yc<&qk)J@siC2vQmHgEGqZ2s zzIwf$InuXUtxl)&(wDyUw9`)0TI)wW(c#$kWU~9r)Bf1<^G~M`Ssy0|8A(8A`MKr% zQ6F4Q29OwIM1Zh3)G^M8j5f+Edk-F(XWUA7ymiCs2Oim7s#JQ4wo#SdO1V@m)N1Xy z`MKetp`pH#B{&dU6ul4;XvcAaZXl)Xsr0z6V@M-103riK1_>>W*{dU3qn{?l1{hNd^z^Gl^E0PhV#uv zshk%ERTSsSy}q3f!xlHhISW7|5(BNm5Sc|%Nnk@m1DyLqj<0k+h}`)Szlp4}Z!x5$ zVMn?yL)YU#Dd+`mCvhNLFB;qY^4I)Qs-j}KaK-a4>mTfU`0jfL2L`H@GANCTKo|z3 zx^0!j2+ZmoV)+8g7s~6l6npy5&B>wO5=SE#mrCZzVdyj#<| zOC~r%1Pp}Z59Fi!<_|wuKlD&jrFzwA)#_l++EbjN6*VAU%4w||3r9j>?{llTGRq6Ix;U|EnE&fj?_eE<7!$t9pQWMKJ`BY5Np z2mwk#2E8x)H{s&+3bR9L4V?}E;MT2h)m3oil~Ac50A%Pzb~MQLJHb2rM+EP~FaOQw zx8`!r>})3rL)W!)1v?H^*pUX55X=}LFbv&-yJ7&t7J2GIbb2R_>2+^jy21L@ExE2>{sq&~cY|LX(c#q#&DJZnTzOh${I=I!A*<0EU@I7WcAXthd&c=Amvp|Y(MPs@$sdvg zcHl6clM&Y{gKNX}&}0wQe^K#y(qEbI2Ar3WSYmvf(y>A{bKU(005-*(KNjmF?>7(IcH8ygoUS`{PO-u zum8jlLioO4s#F#i=9TjHKKQ^X+qc&T>jw@TnmlrZ1dXp+9mh$bP;gcQ*k-$Z+Rn2b zW0a+};nCr-(S^muUboX*i2T6!{2&PYG)e{s2WMudq(G&DEY(x(BMdMyGB!{zmn-F{ zm;My84J(EvAN$zHUhsk!+f0SKh$FEt}=u-#31T!HEsdlLX-00h(kO9*9f#XJWE z41fioF3SqgQ$Zw5-v`qMTgrF;VR6DqENxa^JLihU;^5%m?Ch+Rve9T9IB;NOWTeyS z%+1Y}N~Lt9dPbYx^iYn{vAb9yyTE3a(jQJJh2 zF7|}SUPvkx!nD)TI$;LuoWoR*6f(SZ_wG(}Y1^g^p+b{oX`0#4`bt^rIMYGs6Ns=F z6w_jNX(@_h$F5KaJx`$&VIe4&OO;x+G*DAvV89`wuar=fq?yUIN0L#1k0b;VIwt2B zoy$9x0s{({^x}PYJ#_!w_sq@DiQF6jhRq=yuEKS;3qqksuz&omD9ZuclW-l`OV zQrD}gQNpu;lP5|9zrq{!%g(qjcVXt-%NGHyF%LX=WPHt7ty-|w=JjgO7d!OX_m%dX zD`$V@O2`EOgSGP7vEf_p-J7N98K-S27XlI@iXz|hyHPa1)I5Cna2%(Wu~aO3o?$DA1>FmIhhi0G^f18?p4kRYrU3dUIkXm@)9 zwep7Xp>s~%h=9E~I{(abMpv!ykWvT8F|-A8AFYt{1({n^uF6GtFM76SwCh3dtDPT8f%+BFIT8XO1q^ zM~j)RXU6ujtP}MVd8yX6Wzu$(b-}Pk3((HeZj!O~Dgisk&L-U~iw&n%N7@4FG_$F; zhSMyHoAD#BK?G}pO{a!i&N$Hk$3W7>y}3`l&qf_QUZD=az(@k+@#KB~N=1@-aVDFa zJZbd_^YE{}(Hogyot{V|g3OMy$DY44L(XP`MEB(*u)B>#&l(h+)P1*&XO3=r-o@uF z^s?Xn-9M~Wt7YHYyr%vu7jFOLSFZoJo9-K}S5MzKe!;~%uldtg{?R-C{<`bF^PHz& zL;|wRHd>vjxtaFt%tdFcd-bneZ09?h){VdSFMj*T-nm=9`Ow*0S6z7SDS!FC&t3Uj ze|pnAv_TCZ_5cdXy=`U`K70N>(-p$_&7&i(D~l&-S6IxzIS2*KGVUD z&Gi>N+hxh49SE3F3fqplH{A|Tv@gi9ICXnCJfyUC#}n{=KzkmHAABe|!6Z3Pa9LQr z%Ddp)Qk=NsZK_B>9P^%iu|B!N|9Is3NIrIQ>Rg@-C8T2q<@_2T5Jcl^HlP>G&dnX2nf4ajmL1sCWLimDzi!>g;9%f+S(ZgQp4hM@xc%OCytf+o zEHLj&!;bAS>X+qufQJjDjz^~%eebS&o^#o`)ly)x43Ght8Ke-vz|J{#nbw}j=R2Gi z7-%-W=grJ5MaFL1Hh#ecXD&4w6Qe`Z(@STZwq<6iz5npxH4|gAQ;Ta>)xLlG?p~bi zJY$>HF|w>xf<_$u$<_bc3+b{;&-(xV`=8vm>)t>7{WrbgSI;}^tkZwzPp&y*>!xQu z<+M&5&2`hi`}==;@7w-MoMpuzKxZX@aKJ<+)4TT^Sv@jDMAlf)xm*(*xWqWY4~Ii& z0NwJCE(8!TIOg1cKDT#TX_?V)b}pbVigL^XX=^59CjBEO^=L^$T%$t zxoyju^6=K{{{80HzVugK`^J|q9KHYO{>jYRrA9{}^%5Ipwxoa%v}JJu1^h`TJF#OT z@|09c1imbVGVqGuyXo7fZQe98Hhkl^@87Z|7D6JCMC4uvrD7%XXa@*@h_z!Y2!Kq_ zx(tlSTR%HNNQlm2=2)Q9T9PK=asD=1WD8nn?Y5F$zwL z>1RG?pju{4i>(LOufA+!k9|1wr64;I8Ju(bHEe<2xR#RYNJP(LD`=VQCa>wNM_Y6h_OH@c|L~ z4+R3VG&WAmOwBZwdUKt0q1DJRXt_kAIdCxk^6sNmuUrYM?aWDuc3C>b{W8z~fVRSI zKWg%lE8uhId3Yo@pR@1zS2~?e-VbYjem;t#p`oEQYu1d7jSUP8tW0gR*5z_}W@bhy z_27dK&dkg_|M}0q@WKn*?Y5M1WMt%cY12wAY2J(ZWX7UD?~wVuzA{3rXx;O75RsPq z!!!50O|6_N1aJ;RPx)bZ_pZICpRyL%hQ2sDHI1YM%E_g;chBCnqt!FFZ}5V^F(Nze zOP865gj9{C_SD>b;Q50C)ig;E`lefm2nQ4NaZoI_y4`BMMnbZ&Brr{S$n1F`sR9H62<3FP?(DPP`N6mU z$Bp0p%;&#Z^Q4d*dPG541fglS_U%9NvO+l1BN%(_ z2tf8)ad*+S8{N@O-W}gqtPE5tLk{qf6JTZ_f@`jUBS&Ch003ZV3C=$suDJ$AM`7JM z`1GgYb+79a@cHeuB4N+#xR4V<2`+f}g@V0~it)bn9LIIxs zba=%p;2F<=oF>T!+8>f#`1Yj$*ONp*lci>GxU5qb_4K~|^MC!{Cg1b9)2Tn3HJ+&Z zVpN;NT8B@NPSu!9iee~NckG-1MTE@o#+TmpKR>p)?kZv62?gy|?3|?^$ocOYb^ze? z;b2vpY945E_K3gg8{v)@PuNjkG9b!Zh&cZ``9{k&n{PPFicg^ly-&(!x zbfW&@uT`r`3SNF1z%j}R1gh7H#+YVv$ypYjS1N~!#BxEr$QNeoi~(TQrT_p}zYXB( zN9->Gt8&n2PW^$2RkaKz~ce)Y{y8~z?nb*(B%u)r?= zO#(Hhi{Jx6R;-VXt8uWJ5CB6Nt|^HHsjkM8^(M9G?aDkP0ZnlN0cdp`6G$ zc>UNGtUqXO5}J6ClV`jDtMSxSTSscYYY(hparlq7FY&_k_-bc3_!AVE(JkSfXxh*3ahuWC&^?Cl<&Pma0mi&rH%m- zcuZ`A%Zw4`9)kIM$CL$}>;h8?L!Z2p6Y!5cd=j1X>$$7tV;I!u@O^U3$J^i|0uleH z2Ae;3Kvak!J|2Yu00_h%WP$q=UjGTfj!96v)w}byThF=RDXZ76ky0(rH`uvV6XWyq z3xmU>^Ru(euGLzq*Q?!5cYf+%W^5rSEVh<_u+?g|TCJgh;WSCK)}>N8?)8-C0RR%^ z3V>R@a{v7g?%#iS)v6)6Y`gc9evYm@|5vSAb>odUe)hAU{rJZ}e%o!g zPB+!MTCSwV4h_^Y4={zI5+%neG73G+VvIEw)l8M?eh%O|Yq= zBxVnQn5)<~{b67Mpn(8z2+V3Q7Q`Xohe?hfaDF92ps@R;z_Vp-?Dzo|hy^nx?&8?{EI*Z%#k`^gJhph)I$trB)Pv zCwwp-D_%K%0dgF86e?&FXv+lBSVkpK%FNKs`zP-_H1+JWPOYsOvDO-6obLkydeS1G zR9;Xllx&bB%~m@M{c^eBEZ3{`f#IQnp`rTVs49jw2v8{!2*8Taxqbx}v14Z#9RM*B zA|YF64fLZ6w}1abx88NT6yyb-bvDg1KM2DxOw&{l5#nPPJO1ckLg`WAWCT0|3p@!u z`M5W^oZMW=cP*#K`h{_XqTB6sTG55)trr5dez;~1mpetSyz{8@d+hs}wWprCJvDIs zt@oa~ZF3>;oC6}x=@93fwW-crqt!Y(ztm~P43s2Mv(X7cZ)mu%xjH&f4r}##K?N2` z8*}XS){A<#+`H@LFTCQt*Zgl|-Nev9qZ`GEW=3sorVS!{N?F6}#|KFY;X#(UI8H|f zM}(lorMZCQ)(xwZG--Rq@s=zH~gVP;;>Ew+XSD&XLry@v{(zhlcLA-xqogP8>)Dy2e6 zfX*-pWjd+pW}Xb31m#JSYLR$J*C6PC{a!0Z&B7;Hk=~LgglxoCRSE-@g7qZaf4JT5 z89P9dK%nO<<#8Bk%q+|&u{LbdUgjCqo@!!1X=X?|C8Y%ySsO)(uRNcM0NP~^ z!AN#!tVuN?=*Z|KV+T6XSyzYkM-6AlS$dMk5d#UAMyNdU3veP4d>&gprgEB5DwHQ5 zL%DB3&pJDCq=oR?RT#D-Ira`=*9Iy zF)T=s;^omrhZpAq&l{^1xY<2*`?fE9=#Rg3^R6QY?n>fJ`Bbe{Pu)3o=GLc_>m`U{ z00y=o)!%&L^Pm6rt~bBpX%|i}R>w~n*|P0p-`9asOkg!!IL>Q}=orNlRB+~ck?nRN zJMQ>6#|7s2goO($M-Ms8Y?^SlcRT?PQn+sPlMucii!|dncG{jm0q@vlkJ(=d0kq*b zc5%ihAm9no^l|Py_Wv%I1~On?nA6X>EwdVc)&Y>vOxCewA^jjSE@5%@B~Rad?_I3a zs?}?PLTI#;$_E6&8XO1`p64mgXCw@QbsIM~ZGb`Hw4G<~-t&O(djc4U3D`M&)SY#F zN!;=w0|2Pj3*C0F+l>aQb(7ay5jkMTED#xy8I)AO776=~WB>?|rrFp?k)%9#=k_$} zLBbF0K6vUWW4GP&;7GMnDpZyho2Q?$;lQD(k>Tprji)!8Z7!BS|D|s&&NXkoci#m& zx4+>v&%1Mf-0ns1_#bb6`|rPWaCGS9zw`fl>E##y>Ps$2wFB!u{^@T#`hZzM0SVF1?;@;OGhwWD&H;jyxjLV%Wg>FyBncw0)&YY-%cS=`y2c-&ezfBdw@Y@JcES8pb8YVW(4M-pt%fibESNI5Tx|uM;`u zB+JqyEBR`+6?uhFnzT&mLKgV=aE3HLF2*vnPrRp62A=W*4~m{F7Q9eN&-Vn{&wt_5 zXYDv$Aherp-}61C7&1hM=s+@pbd2l-AP7Xqz?s7=b2?5l=Xpg`NRp5gv*pxaF>u;C zh`~n`hz=19*;Kc>S-0aW2?!3rA)#OJR9G&S>eV9mbkS1*v9%VR4m|cfupm955R9)V zNgq{=#S%kBRYj%8L69RWiI0^$`AMwbIU}fa;h8(6?@dql&OY}vodw0hZ8zxIuv{Mw zgEiHG(SgcMlar}+X=Cn&eTSdDd6SK!f8G1QSv$_#xc;oh)IF)gwiZppNp0-RQ%845 zMB;%`kpvqs)^d_$PKhMxWE^>gU}kZ~7@S&Y_Bv^=+eR0vue~h$dh3MhFJB2$ouspW>8WDvMN~vzQd+5-ia=DzQX`xUMLUg;` zT)EzCHgnmM)>;U$ckf;Rc=3y0e9k%NXsz>m@QN$0xZ#Ey78e%*V5Nj~WsAp3a=R2x(-Xp6YC|-R(t?p%4V+LaE2>G?oit5O~UgKr+At z!c#s9k5nKW=$I3WsmoX~dQ=KS4+MgcfiHyg1D`qTkhacz#eJ;Y^2Hjqa-TW!*B(MkGBLELLrjt=yJuEeHV*JOH2i z6jZB#2n!4F+~>ky|1}hgU@b7iC6~Zo{w4h3A40j@j}%vOqSivG1UKFY4?F;;oB~+} zLcl%u^m+70fd~*GNg#?~co<&r0=V)@IP0wbr^fUPvH*VAc=X!<0M0QI`hl0kcA?Sy z|9)d1GgR7_l3j3&i0Ih(Vpw3o7=3KBhGUC^a;(gdkAL&{jXMTl3gzmKxgD@ymSS+iPF?x82io`{iIYQDH-8-8fFHNlex;x??mU zv*D&r9Uv0^(T(q0T^b2dSe*e0UGQ4bIY}- zj6{|dF@oiO){gh*?aLM0G5gH4}S220|Nsm zREp;h^C*g5|N7UjJncXBv5!6PdCyDJ^f9;!=iI`=f-%PT{Sz*bJI`N!`Q@*A)vNyT zAOG;EWJbh!Yo)JW*g~t@Z0(_qxf+ z$$$H|f0I&5DPQ@@SHALZy%{C!#T0PHrUO>}NO3wZYm}XHBO@c_a=G1ZCrMH+m*Y4Ng5Z=>PN`O_zVG|KpLam) zbUMtOWf>6#K`<~daK;&DtX;cSDW#NZHk-r4!+GcUV|C9b+xp2q@_iq5CP{=rK$(+5 zWd@zKfauuCFzj~Y$+^ZUt4Fgm&9rvRBJ zLV<;#ViCqhUAqCTw#$rAk^&!q}->qf9EKTQ@8b_v=mKGPp@TkrV31D{ps#=sni1E?V#P~QcGPv9V zR7ypJmccpBj7=>gJZy2Fmkum7+Hbk~eII@IpOH{(vs%4aD)`#jIMG51v{n+0)T=^3 zsTj^LwgXg^ia$3uKRQ%lQl3{i@9Z7+?%fX_IO-((rJ}`vFz`LBRLY1rGFW+F|5VZU zhu4*XowXdLX0TpqwK~?>N*K&EJ0z&!d6BQ1?T7(~yr3KgOS*e_W^rT)d^mnEaVo4!jTDT`j)Z2z;Gj3xA&J@(zVEX&X|t=8pLnrMG;2$qwZ7^5Q{&*IYlC7Yx!Gf1Qz+bD$t%!HY?>>OJQ$mEkwj+;K<$x8GYhybZ?YRr$O z34iG8^)U-T^9)a(e0yBeSVRWLl3;H$`TRppU_ml412PCkt--YA(}ZsZ_62blQo!JwRz$7$rFfwr}5B8=3gS|NfVSYW;;T zeaV0O!~f|@oLDpJ`~H!+Znau!#~tAX^-8&y#=Y2_d)lVY{_}N* zr{`zp=V#~Ir)(PetN;G0mp%V!AN}-q9F6_$yZ+?8fBtH}PdUOA%)&0$9hn(LD91bXEvKDA>7v2^jaMoq!Ao4jlD!g(wBgHlt=IN|LT$EG~2x z!I&bJgvrXDuMs%P7UKjYmzB2^^+JOEvkMQ-%mH&R=ct783qEjOIxZ>&WvuJOse5z} z@`qvE2?=-r=TNEQIWNu*+&U8{-@4}j0u@WarnRdU=9}7BDuja*Jxqj4%UP0iBk706 zH~}C8GFX&-$7|0MT5CsIG64~?C1aw+DQ9}BP;ej+0RfZ}e!(x73uE9iLJI$6!wufIT+yFaDrqp5XOME@w`+TDH?!N;7-^u7gUhI&$#7 zf+U637o23tZ72QdJ0o^E-hqr;=<_Ws+;@nqiLDi^^&>}j#gcIB|v*6VcuXfztmxw*NyR;!g| zSrkQw4sl4*aD|hbP2>?>coT}frapQ0Q_HTdq!ykU|!3S4rVvdbw zS2}GSTOaVFp1z+=$bJhB$i?oMpMjOYIv+e7J95}}hVN&Q`V$5sa@GZ&ShIT7k;C&r zAV!9VgCHIouWw&7RHRxYB2-ee{`W3;_G4dqmhsL^p+Q)U(DGirDM)Btf~- zbE@EbCC-dwP)IJd&L<~4Rlp?GLMRZBbQ)2+se8sttp`ZH5*UD+$IOH#1)$7X(`;gv zS+Fb#lt0_c;xth~SPVS@Ac&Px&bc^=oweO|yBl@dog~g&Stw@X41<$#mKMT#wOWr; z$If(;78w{WvLX_QQVM1k2#8J~Ng~a*UJ7Sg>i&BV@4Wb|UV^nPXK>mD08+vk>lZ^E zCB|7WHi>$JBf|(zBdE|f#<11kjFdi-*PETHNIw7Ev+vmV(B_fC)LgF-FJ5xicAF;m z9-Qk$y}%0{TNLuag~pkF*;?v!Qv{598KRa-I;Wg7&Dm`Kt~msnJ=&T*+Il#!Ss|g{ z^)5^jsMTP89$xh-{>#5aB5;m{KmaxdUiwm4Sit}JKY3sPt%YM$M*LpoR1~zVl7rqc){9;(M1^_U3(jWpUA9a78kPJAM2)z30>jB`+ zuek61pW8{G-+1Ny0Pwlbz3gpoyY}jQ53<3-53_o#sa%6A}o*V!G z046~QeD%|>|L}*;sn<7NdF8bL@OPg-Gj0o=Apl%`+4U!1*<}E*DW2c$SMMyYKP}#; z$^T;M>{>O*gt)(>w-$soTv$ICY@B%4Z@p!Hizv!SH$316a=G2+CHIcI^TVycSFftg z%DQy}Bai_QAqvM10ogH<{YC9Z{v@8n|KrGshgZJxmA~>Uzj894_S_lit#5tn?%lgR z&&#sxcIZ4QuMS-FD{m=lSdBLY6EdEQcAVkoqO-ScW7uNj*?n!AWdVbgcM@u zSv$QToST_#EVbe&R!T}K9wRgOgdq1mnVg*b#3w!h0Iz!0t3LhdPa|TQrb?;t@$r=< z^TIFZoKot~{_M~4*r0U(0#00jU73IGqV z!dOI%v6xLYY6p%U2@v*9E)+|ZlJc0i&V)~I-6!%3K1#~rO-Ch4jSEbda9Ks z+0bBhGA;p*11f|9+W@$NV42f?mIEEY5V%$B7J&`(U6A#V4Ifj9d$NksW8ddxy>i|L ze$}c~Q53~-oVQU##5j&OZ{A$1)p8Er^SnIkRIAmB#bRD95k*nGUa!~d-EOztZkI}> zIF4(z8XS|5I$7oSO7L(jbqWB!AY&m2gBnvW(cLK4nI%$LmN^E2q&%;Yq>;&##9o$F z356ujQ$!$zWMGx~!jpw!VPT=M*l5l!EVhz(WNai1LR12j0;8eRq$r-5nTe8kY}Ht) z5IBUsoUbob%>O!P5s-;seqnxYex}iFRw@NKF5{Aisl_ z$KJl^C66}q%$s9ux7)R1p;!u2s|k_WIc5aR@8ac5U7s1{Wr<`?*YvN1{OB?>I4@u+ zkdSh2p8D)N0)urf&75PivK~ORnO+eW&Un3WcE6iL%TLR0{20(#vci2nAuI8*QqU=bGKy?!4==XFY#tY|TRp(^_+unX-`E zww-1yl8|GgBft8RU-{#|cz2=TjSkj&QJf^1r#wcRWJ#L&3@nuZL4ooTt!J0o!vp1R zH*UA$YFHSk7X^u#`NseG>W$BT=J~I`@&zCHKVSI!PyfsEF=s(SFLkscaww44St$er zJ_DOxS0Dk2$T_18TlD+@eDcBoG!wHb`y@ot2@r9(R%Eg>`(_W`bF^42M2isx1c_rL zByi5PW|n*dA`yskDP*0Ib1`7onSpA^y=-Br8F~Sch+19C z00``~D1{`*SX(L=i(}>gl#BK!2kSr*%y!M+Jw!bhlm#2t7cvWkr5Mye3H?Hv#(u$f z+6V+B5C9CqC60g*37L_QopsGtzl{+y0At=QocdBgBnL*fTD{Ak^Yn=g+b{m*m;ckW zymb!iiVTAQM-F08h}Jm)%T1|~pDdC883J*xUjhO^MgS%N1ajCH!7oeV^AQF!3yf?m zk_u1=?clugFTCsSyZ-)DpML+}ygN{8YX6?j+^pu2_1AL68!J4p&GnL^c)y$Z>ADkASxStj}*}04W6# zT4VYXA@uzjgCr)OY^PpS~&qe&rkA z^`=)p@1@Us>WBa7KfZs*-ka~(z4MF>6;FQY-|yVKc_>Zd`K9LSp<2ca07|LMrE@dQ zVqw^mC=dxy2!Q~ogmzX*WsPAr4v5(~$2M;wo}VB@B6QA5BJJVQE4vtDLQ#u%rmFGMd&3&k+i zFg#cqz?O02X1S~cpf9MhCl7N9zE|{B=#eLp*rGAkfJO3^LJt?)&1Sn*tJe|HQ;LAu zYGeY-&I9xv1F&{zjAYa8bU5Qet%QMM11ubqKxXSW9|{Q!xC~eVlXC{*xVtdzD>BX@ z5(6QjAo2pQ5c<_H5Qc?7cFuwoz{+D1M2>|-Uw|WH@#o%D9Fd5;n{WR{yEFBSr~Pga z6al6++3?=9Us!IukE?3#EEaRL0aDJsfeWLb9Zx#!+- z#~nwH9*v?X3`0bmot-V0%S5!exY%qqlO#Fy)Kf3N{PG<;b}(~ZJDbz(#+XYly>w}5 z>Hhogzwf^LwAQUwYj$=v&v`1PJkQJZ^l%cr>(4KwwG2Q+geZ7r286U?GT>b9350n| zDquiD=9Mu9Nsx7J)$l+RXGfSH{ZX7jQ?P{%_ z4`B1H$PazvsHC7;4bWMs43?BHC4i`k%1kibjer>eoN?foGOdLtKq!GElq{A@bB*rg zLc2OVHo9hXY~AW&SWI;0;&gh?zPZ`iR6sbst$TEKX7{e`XKW1$-qEQ}oawLv&;)w$p4V;S-Sn5~TdVD}-U%O+D#cn$0zuwNl9o%QlIGW8o};)o}tOyh4eW zr^n3T95a#8dT?myv)A7~S}ct1I0c$hU;4_wUwrv9>Vp-lGbx2O8nhD#^|6s&qp|0K z153ShY<%q0?HfrFu!y>GZ)sMvnlF9M(+9V2`RG4f`^B$)>$J_Q+ubZOj{I<`-2q}L zg+kFvk~Gaoh@Q=y?VIT^bCzaVngL)EHv~!R3=*+BMo{7$2mxRF8eVrDl*_QR#DDmQ z_+S4kGP84-o2nzC5Nr&*{`Ii1fFJr03=M(S59cYY#bOb@_BD9J8*p@#TP=9#A@sa{ zLV*aZ#de#8fSo(xW#wxIhJs9vMh zd;`zbdr;?H+3MNL@jTrqIzyz4Gq`Jik-KWb_k&R zoU|2}QGA7ts&Xt)hxLX8e&eK1!&CIOc6a4vZ)kBCR|1Wdod}i$})zIhr z9^BOOY`ODO)Xw`L%wyrd)i^JE0%f}CCnQtiOL z71+Id`M%8iy$lxdUgiwjSTi;6B(8jYyDtmmCx6`xG4XhHoBsWcK1({W?<%(oQlYp- z{eEyX9cOI>A%&im_ecq=nAeb1eiU)yH^OdA^3kfE7kD|>%K7tWWg1V$cQ1y<_46pt z|))Llv8g&sqYC4op6NWNhp${dZ;i{RnR)tZ|KyUKk8W*psZ(&-oUU{@ZFO5c#R?nh zeMeFk3#S__NwAo_2G|-l8D!{h0&L5dPrihx+;63|SFm#1-%lj4%~x7{t?#((uV!$v z5YpO#TLIc2>-Pg(z>$LN`PfWo*_w0x^|mR`ZO!9>>4(hUifF9=$N=k4Yj?0+^m-SO z`0e`=kY;LmKL&ohUl-xBypj zNm@xL{xU}M$y1WXK8}aCNFqEU<{O!aS$!>xX%2C<`K4Qd8`O-;o}doF1--8s`~@@R zdpfNpjM3af3^Qopxxos8p#do@39}Cteo3b%_Qr%K;D5||I?70mBk0Z z*B2HR&d=?M2Z4cGiDnc6!HWV`On?LT`T5!BZgt+aNlH@EvOzoZ_uSI+892)y$K-cx z@s5VzNfdpBx+peZ&gVJa^`rrAQFaIl1oVXX%Sc;0`_@pbjB`KUU|Of4j*xPu>eHsA=jvd~ zB6fssL0DQ8RjVzFuYv~e(pPSe2* z>@TWK6s9Sy2b1BocNv4M-@&Xx69k~Kqy#hF1I>RYY_+5gztMI&W`Ytq1v6{XnAg(1APyF7mI+R|hR}%xzRydRz5pv9SBHg@ z4Uidp^?4#&Nck<3Y1(laoXE-$Q=!Mj3a(NjQc!suHS2KfR?WNZNoyNDEYdAAZC~Kc zA}}KK$?*CdWaNDOH!tmreKbh?T|CUfP7;2fEtdc*N2|#dT^Qa1kE=9@@eDJ7hfMNi zxKpfXWm^z3HFiYZa`2VOcg>^vA?R*!^hoN6PjQ`}gRAN1$wJGl)!FLP#M;YMtE)hb z4Iub>+bkdFHhDP&z`HA_#=LTG4_Qrqhvi;Vx1+6ZPxK!X9@^h7?yB84r|BBDtk#~_ z5;%19UdqziZ|8q^KD~tLy`*+NoRsH2)R(kzpWHep%53$)1nO9GeoJHr^ziR+5K4;- zjPXq*>&^wn&5xpQio)d+GdpHO$wi@{0Ds5K2$Ceo`C%G9&wAg$2fGEwq1Y{nc`DZNs%X(atm} zOdubQJ^Wm-$F_TO^iAfUgZ{0 z!=Pcomhgz-985vN!x^i%C5$0aOvO^enHiAE#7kMuW{Mdoylh)i=-o+!z{k0P?AXrB zHxfRSnll`)MQ7m!wqP1P;~@_cbuoVbK~}RYaQcg_RJ$oy4N=^T0|o_2W(HCqS*$G| zjb$A|jy-f-VPY0T1w|=ufJ})KRU!wp%NryYx6^#Xu8f)6gXZ}o8Oz5KcbGvTP_#JQ zmdY1v`Dzy?&@8{hmGyQkQpwVQpo?+MmPn?_k!09M#w^88Ie$xIUrpWKt~47_IUF}PP^C7qn7AMnQj#-&pfB(FfA~H_ck_NTbl@Qi@+C#MztIB!RME* zf6@FmENxxz@!4WwoTY#E(B|WzXE@qPv}dm#=+8aqGL6)>ReskyO`>LYLhy!k6B%JT zd`9u8m`+qFo3*4ZW^CCn05G8r4i1w5Li&PVQTD(?k05k=d)q9>Wp2?duibK%Zs@_3 zQZrYT$fyG-JCgD`n*)dyU;uDi_qhWIqW}JLq0j$t%TX!QWrQ{iHLuPWTIcz$Q9S8- z>2Zu?hix{axK_EGX?%gQ&~H0F1Co(&9*jklip9UCGa1&FroLnM(uU4VhlnCdbjjZ; z_;MIwoD*&9NZw;4BOSr*s(=X|N7=bL)2S|68hWKn)4UZwpsvjv_be!V2aQ6$M#rK* z$eJt#8k-7}&7q@x=&ivTM1F^*@Pmk8a1KER7iKt6KOPqIeZjt~uzFO8%Eaja1Y8Fa zcErhB*&h;`u20N> zkfnh!?vk}+TG|Uv=pHx@O(-9QL9EMC%}n~k`B{!Y}yj>lK`L?%81 z`EunXC0E=cMG8tJN9j`mZ+m})+aR`ImkJ|+=E7Lby<8ww@wEDfnZ^3-+j+AuU*v|*862fFw)-I8d0BavHo2&FRSo3rUBFyV-Wv}S zLl;yCBPi&vHE%a)!-HGk{oCDJ&)GBj=_;y|)5eoOvKC@HX{xOK!|r*cMptp#R;`1; zr$9`4Y;W(Pj|RJ<`W`+#iW=v&^u@2ltm}t(xnMg%MT%j`<_-FQz zGE(-l?&-ik?JO#pu&{Dj>_9p+gt^NVZzuDb9git(H|wM6=gSk*z`FfBz4pzd>YZ{$ z=Pr)7rmdlAzdNp1+jBm$xApbc*3^awEJFKn7EE4yM0EzP%R$_~z9^+|28gH(T|5Se zj`G2M!Q`0V&GNay6dn&*2dHH4Zr6>ZxOz^Prw)A9|B|__*BtTS3jlY_r|gC-4rg14 zDFz$7^weU#=8uv+4ZbvTEHxmfB8V0+GleTlpC9|t%; zKYx%pFK+w(KZ)2Dc*-qh5V z%^#)E^)tALujHAL3s>17A;KdbrY#6~@9y;SL!aBWKRkF{+ADId*b7^UbyY-J<=Ew5<jk6;W2V@duS>+|*n>bnA; zw2&dtBp+4V#tk%P5DF%Of#Er`K0K8H30(ub;EwUrzOIHl>g1vIjX?tgeDL-aRRqcm25#c&LH#*kh6u_ck5Ob}j;7jkdT5IPN9&4?m-m`7^%rvXl-P{>{n zJ7ScY`$F>xx2=~%d;Hs#a>IsJYNdXsuetgDP{OAe$)F6N9gZt8Jw5%ug3o9S-=NRPP(%KXMk7-x zj7hb?3u`SoEXq`+7A0d^z)rhVU~I-f#0f%2$WKh1aI1=hR|zgI0G|#`%9K!{cIs9R zcW06lpz&jegYXD4avW%elSn~0a5_=J&G+Oo1*V0xA-GhIV|gr+vKd_I*6bg(v$WeU zx9@fz6bE}7^EOgnaMkI~13+7PZ4>4Qz6)d^LgG41*n||}&nAgWqeU{7OYIelmRwmm zpROv^ON`NDUS=p|--P(5H$X<;ryh22a)!*T#w&ZXF6~+px23{5v zO*ZvqC-;_Bxp5&Ef%DWDoyKT1Mc}D*(S1;isvu-?a&Mr-m_jEeUORhay-;)8j_~UUVM& zm^{OFo zM5?IsM5AwSH&{@kXj}ELiYlQNQ73XskXvPhyhvDDZ2P0IjGgyl{2t4N zdW~|DAv{vcVR9PT`0S=xjw!HGAS>wl#^c8_!@-3=s}~qzZS5%63Mn(JUA|;VQ7dS5 zdIC3ysW2VQ8*;eRSYlWCl{#69S!9-}Nf5v^`Vr z-G~03zLsyjfx-4@;_%NkoybH%!Bio2^5JOQYD|@6WF0T3 zV%1MK^yp(hjf3uVoosx5S+W*-4{O`4ab9%3J~!n$LO6{QZK-*9SI>*eaA(|Xg|3Uw zi1h^itljJT*_h@(EOGhSU(JDiFusxLNxyE4b#}U}3cK_cR~BMqH||2B#+P54-k?PK z_fu~3)*toxSf-*>K{XXst($8J`Hx-azhrQ(rI9a-3`}$lD<-v4>GCN@B20Y$&Vwjb z^jJf?kcC0gJK3M8#Q!ON+Pw5nM=g-@@b^4+YRxpmh`J%!Z@J`tN0+ug~?*9tU?`>c03C4c;b z6^S@lubnkihB6|ifrbiBYa4sJC-AUgyG~Ib$=4w)o3u}1*&Umt8n^7zV$w|+lJK1Q zk3E8gg1X>nkcxX3qe8(244+#05tV?a^HdE9F~Mg_VI>t_=Y4X!if!nO(rawIr>YWqKNrd)U140^P81?A8B>jO-dV=fsLZDW9v-kZK}iD zB`xfd2nDuYG<6yzy!dUZsKkmas?xD~!BV*Haa3&Sq3ZU%S--^3IY@4PzjZZNbsv3= zUOW6FDI#LGC2SU#KD9$W+;r=tWg?U|R*`rO9B%$VtvoW#s#4LNsM^a?!7QqqZW>iM z;pOL=m-CeIQWNBeUy#ovYy>589F50f=eSmql`R${*z1;~VSCEr5l#fah}%=zO9Yhy z$Eg~1QtP{q%BlTyTBp`eL;f&Wpec42$ZoC*eZ&0UmGvK`z9l6eU|$z3Bm`Mt{2v}3 zPL`X1v2v*I~_a`nK-B!jHRU*|kIQ8p6Tj4^2 zgPd^3KZ$ynT@^dBPjYj%3>53Q)AW)`crYMx7m$+qW8iZ)u4AXAWN9-xN9 zWOQHdc;nvZN+sYU+tk?}M>hl^V3X4KTVv}R&`2yB%b3!mM}r|el=Ujy2OdM(B`T5m z7fMAr=ANZ)%c6~UT~l8RH)IMIQ4af7hZh$Y4~9iUmR4P7Y^+c}B2OThVrJK*SbV(G zt|iwjb)9kIMU}BHCa_xb+EDuK!Zz0+3T8k6H7!>ff~^-U-od|<3JxTEjGYS~iv7xs zd0b)Zs@*HrFsF2*D&=}WHLd5d4u{0lu>;$P7B1_VsWO&LMN4xwipuyrU+uk}yNcA| zy=pTTu_^2E!-uAqJA&8iR&mY6T;Tiq&%yg{q?tmz-1mrR?D>=5Xte@RyyI+T$9-gR$P~28v%GJC1)=|cNIf;Tq zvwux0pSm3q1EWgKUu3Qo&<(G7yI~BH2aq9PJ0d)TYoE6Bum(#+ zFP-B2M~{(u%x#rY&qm)>N&4d;4=D!!Sa${eY-9gm`|N9R^tJyhRd@@y5&;%Gcu0>? zPi>~nF37Hep=D(XkL!>P+FsaazVixTM#;|6PqYM*q~h_S;t@B2Ti%~?bB}gceYb3n zX^Z(IUP_-X15C&%T2_nFc&S3d(>iWia8BDNAUzG}1G#QX-@Q_A0S)oDgvpa4F%>N{ z622pb3j6b9u1uaUQW)`EAqaC_h&kjxu@DaG-5(_`&f3^ieRqXkX{Gr#tIlYd>O+1Z zr}MrZ&UgC0xwvKfJ@%IfomG(VxeY;HvbD;g|EfTx<=^`pm#`G^+q1aO$FwN72| z*5_fE&4LlY1n%1rUxKR-h)_DOi%ee>ZQhDKrkyoH~*aB=ZS4GhA&@MkG0ntdN=nDhp9s zT9J$paRtVlq|_lC-0T);5sd>W;P$p3Y<0X7euW+?{Sd<|KB;PJ;weMircLGbpUP%;xpEq|Akk8T>3Np ze*`8e!OH|g@L%hYM|g_5Uud9!AsII$bvW{P1XmEc^lgp_AqcGwkr58J3q`3IK2)|i z5NR#HFe*Z3p(P@Kx8RzeN2%%~W{jTdyLErP$Yr*6=eq#H>$aP$&?uNbhAX+yJFek;-JK&@^LXFZJi0n(k2kUnEt ziprp(BbkeToR67_UUuiL*!WUoXSB9ByrObGe921Gj%Hi6fIfBnSff?6K?ZmOt= zO-RYQvQ83N1h&Ein(YG74*L^|81}+UKtO;TSU{KD8vujMFI~5SjDf8D&K13z@)I*T zud#tWgvDR1FQmBtAfuH1TdJS>dWwJ|@~sVPj_MZ58O+->A`@Txr#q)l5FT+#DpM&@ z^TNtm(9aHLxLT*wx9{%sWhRN_Lv z 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%0D#n6u_C}8Dh5kogzPJUDhDbGz#t)@ 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

8!FJMhHq-=rDWrV9hKh@GeO<9-yKA4w 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 LWD4vpt`lQI!Kb}QJ*UpUi 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 z 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

~pF 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 X!16|-Uw~+v00000NkvXXu0mjf+Ecls From 53fb23009812b8e29b843722f78724ccc3e2ac41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Sch=C3=B6ppach?= Date: Tue, 17 Apr 2018 12:08:44 +0200 Subject: [PATCH 065/156] Fix typo --- include/nlohmann/json.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 7ecf631f..54e66d90 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -3405,7 +3405,7 @@ class basic_json @return copy of the element at key @a key or @a default_value if @a key is not found - @throw type_error.306 if the JSON value is not an objec; in that case, + @throw type_error.306 if the JSON value is not an object; in that case, using `value()` with a key makes no sense. @complexity Logarithmic in the size of the container. From 65b4d8251b9d2e9e6db24022f015e84fc9cfc6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Sch=C3=B6ppach?= Date: Tue, 17 Apr 2018 13:02:36 +0200 Subject: [PATCH 066/156] Fix typo in single_include, too --- single_include/nlohmann/json.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index b7558aa5..c9ef7581 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -13046,7 +13046,7 @@ class basic_json @return copy of the element at key @a key or @a default_value if @a key is not found - @throw type_error.306 if the JSON value is not an objec; in that case, + @throw type_error.306 if the JSON value is not an object; in that case, using `value()` with a key makes no sense. @complexity Logarithmic in the size of the container. From b5d1755dfbf59db5c2cf2ab304cffac9939bb03a Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 22 Apr 2018 15:41:42 +0200 Subject: [PATCH 067/156] :fire: removed commented-out test cases #1060 --- test/src/unit-allocator.cpp | 23 --- test/src/unit-cbor.cpp | 26 +--- test/src/unit-class_lexer.cpp | 11 -- test/src/unit-regression.cpp | 47 +----- test/src/unit-ubjson.cpp | 285 ---------------------------------- 5 files changed, 7 insertions(+), 385 deletions(-) diff --git a/test/src/unit-allocator.cpp b/test/src/unit-allocator.cpp index debe69ad..7dea7616 100644 --- a/test/src/unit-allocator.cpp +++ b/test/src/unit-allocator.cpp @@ -175,29 +175,6 @@ TEST_CASE("controlled bad_alloc") CHECK_THROWS_AS(my_json::json_value(v), std::bad_alloc&); next_construct_fails = false; } - - /* - SECTION("json_value(const object_t&)") - { - next_construct_fails = false; - my_json::object_t v {{"foo", "bar"}}; - CHECK_NOTHROW(my_json::json_value j(v)); - next_construct_fails = true; - CHECK_THROWS_AS(my_json::json_value j(v), std::bad_alloc&); - next_construct_fails = false; - } - */ - /* - SECTION("json_value(const array_t&)") - { - next_construct_fails = false; - my_json::array_t v = {"foo", "bar", "baz"}; - CHECK_NOTHROW(my_json::json_value j(v)); - next_construct_fails = true; - CHECK_THROWS_AS(my_json::json_value j(v), std::bad_alloc&); - next_construct_fails = false; - } - */ } SECTION("class basic_json") diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index 6b9eac52..120093b3 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -491,7 +491,6 @@ TEST_CASE("CBOR") } } - /* SECTION("-32768..-129 (int 16)") { for (int16_t i = -32768; i <= -129; ++i) @@ -517,14 +516,13 @@ TEST_CASE("CBOR") // check individual bytes CHECK(result[0] == 0xd1); - int16_t restored = (result[1] << 8) + result[2]; + int16_t restored = static_cast((result[1] << 8) + result[2]); CHECK(restored == i); // roundtrip CHECK(json::from_msgpack(result) == j); } } - */ } SECTION("unsigned") @@ -1044,28 +1042,6 @@ TEST_CASE("CBOR") // roundtrip CHECK(json::from_cbor(result) == j); } - - /* - SECTION("array with uint64_t elements") - { - json j(4294967296, nullptr); - std::vector expected(j.size() + 9, 0xf6); // all null - expected[0] = 0x9b; // array 64 bit - expected[1] = 0x00; // size (0x0000000100000000), byte 0 - expected[2] = 0x00; // size (0x0000000100000000), byte 1 - expected[3] = 0x00; // size (0x0000000100000000), byte 2 - expected[4] = 0x01; // size (0x0000000100000000), byte 3 - expected[5] = 0x00; // size (0x0000000100000000), byte 4 - expected[6] = 0x00; // size (0x0000000100000000), byte 5 - expected[7] = 0x00; // size (0x0000000100000000), byte 6 - expected[8] = 0x00; // size (0x0000000100000000), byte 7 - const auto result = json::to_cbor(j); - CHECK(result == expected); - - // roundtrip - CHECK(json::from_cbor(result) == j); - } - */ } SECTION("object") diff --git a/test/src/unit-class_lexer.cpp b/test/src/unit-class_lexer.cpp index 164dc67d..c134ea5b 100644 --- a/test/src/unit-class_lexer.cpp +++ b/test/src/unit-class_lexer.cpp @@ -173,15 +173,4 @@ TEST_CASE("lexer class") s += "\""; CHECK((scan_string(s.c_str()) == json::lexer::token_type::value_string)); } - - /* NOTE: to_unicode function has been removed - SECTION("to_unicode") - { - // lexer to call to_unicode on - json::lexer dummy_lexer("", 0); - CHECK(dummy_lexer.to_unicode(0x1F4A9) == "💩"); - CHECK_THROWS_AS(dummy_lexer.to_unicode(0x200000), json::parse_error); - CHECK_THROWS_WITH(dummy_lexer.to_unicode(0x200000), "[json.exception.parse_error.103] parse error: code points above 0x10FFFF are invalid"); - } - */ } diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 01e68957..c66caa90 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -136,19 +136,19 @@ TEST_CASE("regression tests") SECTION("issue #70 - Handle infinity and NaN cases") { - /* + // previously, NAN/INFINITY created a null value; now, the values are + // properly stored, but are dumped as "null" SECTION("NAN value") { - CHECK(json(NAN) == json()); - CHECK(json(json::number_float_t(NAN)) == json()); + CHECK(json(NAN).dump() == "null"); + CHECK(json(json::number_float_t(NAN)).dump() == "null"); } SECTION("infinity") { - CHECK(json(INFINITY) == json()); - CHECK(json(json::number_float_t(INFINITY)) == json()); + CHECK(json(INFINITY).dump() == "null"); + CHECK(json(json::number_float_t(INFINITY)).dump() == "null"); } - */ // With 3.0.0, the semantics of this changed: NAN and infinity are // stored properly inside the JSON value (no exception or conversion @@ -1213,41 +1213,6 @@ TEST_CASE("regression tests") CHECK(j["bool_vector"].dump() == "[false,true,false,false]"); } - /* NOTE: m_line_buffer is not used any more - SECTION("issue #495 - fill_line_buffer incorrectly tests m_stream for eof but not fail or bad bits") - { - SECTION("setting failbit") - { - std::stringstream ss; - ss << "[1,2,3\n,4,5]"; - - json::lexer l(ss); - - CHECK(l.m_line_buffer == "[1,2,3\n"); - - l.m_stream->setstate(std::ios_base::failbit); - - CHECK_THROWS_AS(l.fill_line_buffer(), json::parse_error&); - CHECK_THROWS_WITH(l.fill_line_buffer(), "[json.exception.parse_error.111] parse error: bad input stream"); - } - - SECTION("setting badbit") - { - std::stringstream ss; - ss << "[1,2,3\n,4,5]"; - - json::lexer l(ss); - - CHECK(l.m_line_buffer == "[1,2,3\n"); - - l.m_stream->setstate(std::ios_base::badbit); - - CHECK_THROWS_AS(l.fill_line_buffer(), json::parse_error&); - CHECK_THROWS_WITH(l.fill_line_buffer(), "[json.exception.parse_error.111] parse error: bad input stream"); - } - } - */ - SECTION("issue #504 - assertion error (OSS-Fuzz 856)") { std::vector vec1 = {0xf9, 0xff, 0xff, 0x4a, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x37, 0x02, 0x38}; diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index e2f77234..c335c7ad 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -1477,257 +1477,6 @@ TEST_CASE("UBJSON") } } -/* -// use this testcase outside [hide] to run it with Valgrind -TEST_CASE("single UBJSON roundtrip") -{ - SECTION("sample.json") - { - std::string filename = "test/data/json_testsuite/sample.json"; - - // parse JSON file - std::ifstream f_json(filename); - json j1 = json::parse(f_json); - - // parse MessagePack file - std::ifstream f_ubjson(filename + ".ubj", std::ios::binary); - std::vector packed((std::istreambuf_iterator(f_ubjson)), - std::istreambuf_iterator()); - json j2; - CHECK_NOTHROW(j2 = json::from_ubjson(packed)); - - // compare parsed JSON values - CHECK(j1 == j2); - - SECTION("roundtrips") - { - SECTION("std::ostringstream") - { - std::ostringstream ss; - json::to_ubjson(j1, ss); - json j3 = json::from_ubjson(ss.str()); - CHECK(j1 == j3); - } - - SECTION("std::string") - { - std::string s; - json::to_ubjson(j1, s); - json j3 = json::from_ubjson(s); - CHECK(j1 == j3); - } - } - - // check with different start index - // packed.insert(packed.begin(), 5, 0xff); - // CHECK(j1 == json::from_ubjson(packed.begin() + 5, packed.end())); - } -} -*/ - -/* -TEST_CASE("UBJSON roundtrips", "[hide]") -{ - SECTION("input from py-ubjson") - { - for (std::string filename : - { - "test/data/json_nlohmann_tests/all_unicode.json", - "test/data/json.org/1.json", - "test/data/json.org/2.json", - "test/data/json.org/3.json", - "test/data/json.org/4.json", - "test/data/json.org/5.json", - "test/data/json_roundtrip/roundtrip01.json", - "test/data/json_roundtrip/roundtrip02.json", - "test/data/json_roundtrip/roundtrip03.json", - "test/data/json_roundtrip/roundtrip04.json", - "test/data/json_roundtrip/roundtrip05.json", - "test/data/json_roundtrip/roundtrip06.json", - "test/data/json_roundtrip/roundtrip07.json", - "test/data/json_roundtrip/roundtrip08.json", - "test/data/json_roundtrip/roundtrip09.json", - "test/data/json_roundtrip/roundtrip10.json", - "test/data/json_roundtrip/roundtrip11.json", - "test/data/json_roundtrip/roundtrip12.json", - "test/data/json_roundtrip/roundtrip13.json", - "test/data/json_roundtrip/roundtrip14.json", - "test/data/json_roundtrip/roundtrip15.json", - "test/data/json_roundtrip/roundtrip16.json", - "test/data/json_roundtrip/roundtrip17.json", - "test/data/json_roundtrip/roundtrip18.json", - "test/data/json_roundtrip/roundtrip19.json", - "test/data/json_roundtrip/roundtrip20.json", - "test/data/json_roundtrip/roundtrip21.json", - "test/data/json_roundtrip/roundtrip22.json", - "test/data/json_roundtrip/roundtrip23.json", - "test/data/json_roundtrip/roundtrip24.json", - "test/data/json_roundtrip/roundtrip25.json", - "test/data/json_roundtrip/roundtrip26.json", - "test/data/json_roundtrip/roundtrip27.json", - "test/data/json_roundtrip/roundtrip28.json", - "test/data/json_roundtrip/roundtrip29.json", - "test/data/json_roundtrip/roundtrip30.json", - "test/data/json_roundtrip/roundtrip31.json", - "test/data/json_roundtrip/roundtrip32.json", - "test/data/json_testsuite/sample.json", // kills AppVeyor - "test/data/json_tests/pass1.json", - "test/data/json_tests/pass2.json", - "test/data/json_tests/pass3.json", - "test/data/regression/floats.json", - "test/data/regression/signed_ints.json", - "test/data/regression/unsigned_ints.json", - "test/data/regression/working_file.json", - "test/data/nst_json_testsuite/test_parsing/y_array_arraysWithSpaces.json", - "test/data/nst_json_testsuite/test_parsing/y_array_empty-string.json", - "test/data/nst_json_testsuite/test_parsing/y_array_empty.json", - "test/data/nst_json_testsuite/test_parsing/y_array_ending_with_newline.json", - "test/data/nst_json_testsuite/test_parsing/y_array_false.json", - "test/data/nst_json_testsuite/test_parsing/y_array_heterogeneous.json", - "test/data/nst_json_testsuite/test_parsing/y_array_null.json", - "test/data/nst_json_testsuite/test_parsing/y_array_with_1_and_newline.json", - "test/data/nst_json_testsuite/test_parsing/y_array_with_leading_space.json", - "test/data/nst_json_testsuite/test_parsing/y_array_with_several_null.json", - "test/data/nst_json_testsuite/test_parsing/y_array_with_trailing_space.json", - "test/data/nst_json_testsuite/test_parsing/y_number.json", - "test/data/nst_json_testsuite/test_parsing/y_number_0e+1.json", - "test/data/nst_json_testsuite/test_parsing/y_number_0e1.json", - "test/data/nst_json_testsuite/test_parsing/y_number_after_space.json", - "test/data/nst_json_testsuite/test_parsing/y_number_double_close_to_zero.json", - "test/data/nst_json_testsuite/test_parsing/y_number_double_huge_neg_exp.json", - //"test/data/nst_json_testsuite/test_parsing/y_number_huge_exp.json", - "test/data/nst_json_testsuite/test_parsing/y_number_int_with_exp.json", - "test/data/nst_json_testsuite/test_parsing/y_number_minus_zero.json", - "test/data/nst_json_testsuite/test_parsing/y_number_negative_int.json", - "test/data/nst_json_testsuite/test_parsing/y_number_negative_one.json", - "test/data/nst_json_testsuite/test_parsing/y_number_negative_zero.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_capital_e.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_capital_e_neg_exp.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_capital_e_pos_exp.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_exponent.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_fraction_exponent.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_neg_exp.json", - //"test/data/nst_json_testsuite/test_parsing/y_number_real_neg_overflow.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_pos_exponent.json", - //"test/data/nst_json_testsuite/test_parsing/y_number_real_pos_overflow.json", - "test/data/nst_json_testsuite/test_parsing/y_number_real_underflow.json", - "test/data/nst_json_testsuite/test_parsing/y_number_simple_int.json", - "test/data/nst_json_testsuite/test_parsing/y_number_simple_real.json", - //"test/data/nst_json_testsuite/test_parsing/y_number_too_big_neg_int.json", - //"test/data/nst_json_testsuite/test_parsing/y_number_too_big_pos_int.json", - //"test/data/nst_json_testsuite/test_parsing/y_number_very_big_negative_int.json", - "test/data/nst_json_testsuite/test_parsing/y_object.json", - "test/data/nst_json_testsuite/test_parsing/y_object_basic.json", - "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json", - "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key_and_value.json", - "test/data/nst_json_testsuite/test_parsing/y_object_empty.json", - "test/data/nst_json_testsuite/test_parsing/y_object_empty_key.json", - "test/data/nst_json_testsuite/test_parsing/y_object_escaped_null_in_key.json", - "test/data/nst_json_testsuite/test_parsing/y_object_extreme_numbers.json", - "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json", - "test/data/nst_json_testsuite/test_parsing/y_object_simple.json", - "test/data/nst_json_testsuite/test_parsing/y_object_string_unicode.json", - "test/data/nst_json_testsuite/test_parsing/y_object_with_newlines.json", - "test/data/nst_json_testsuite/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json", - "test/data/nst_json_testsuite/test_parsing/y_string_UTF-16_Surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json", - "test/data/nst_json_testsuite/test_parsing/y_string_accepted_surrogate_pair.json", - "test/data/nst_json_testsuite/test_parsing/y_string_accepted_surrogate_pairs.json", - "test/data/nst_json_testsuite/test_parsing/y_string_allowed_escapes.json", - "test/data/nst_json_testsuite/test_parsing/y_string_backslash_and_u_escaped_zero.json", - "test/data/nst_json_testsuite/test_parsing/y_string_backslash_doublequotes.json", - "test/data/nst_json_testsuite/test_parsing/y_string_comments.json", - "test/data/nst_json_testsuite/test_parsing/y_string_double_escape_a.json", - "test/data/nst_json_testsuite/test_parsing/y_string_double_escape_n.json", - "test/data/nst_json_testsuite/test_parsing/y_string_escaped_control_character.json", - "test/data/nst_json_testsuite/test_parsing/y_string_escaped_noncharacter.json", - "test/data/nst_json_testsuite/test_parsing/y_string_in_array.json", - "test/data/nst_json_testsuite/test_parsing/y_string_in_array_with_leading_space.json", - "test/data/nst_json_testsuite/test_parsing/y_string_last_surrogates_1_and_2.json", - "test/data/nst_json_testsuite/test_parsing/y_string_newline_uescaped.json", - "test/data/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json", - "test/data/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+1FFFF.json", - "test/data/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json", - "test/data/nst_json_testsuite/test_parsing/y_string_null_escape.json", - "test/data/nst_json_testsuite/test_parsing/y_string_one-byte-utf-8.json", - "test/data/nst_json_testsuite/test_parsing/y_string_pi.json", - "test/data/nst_json_testsuite/test_parsing/y_string_simple_ascii.json", - "test/data/nst_json_testsuite/test_parsing/y_string_space.json", - "test/data/nst_json_testsuite/test_parsing/y_string_three-byte-utf-8.json", - "test/data/nst_json_testsuite/test_parsing/y_string_two-byte-utf-8.json", - "test/data/nst_json_testsuite/test_parsing/y_string_u+2028_line_sep.json", - "test/data/nst_json_testsuite/test_parsing/y_string_u+2029_par_sep.json", - "test/data/nst_json_testsuite/test_parsing/y_string_uEscape.json", - "test/data/nst_json_testsuite/test_parsing/y_string_unescaped_char_delete.json", - "test/data/nst_json_testsuite/test_parsing/y_string_unicode.json", - "test/data/nst_json_testsuite/test_parsing/y_string_unicodeEscapedBackslash.json", - "test/data/nst_json_testsuite/test_parsing/y_string_unicode_2.json", - "test/data/nst_json_testsuite/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json", - "test/data/nst_json_testsuite/test_parsing/y_string_unicode_U+2064_invisible_plus.json", - "test/data/nst_json_testsuite/test_parsing/y_string_unicode_escaped_double_quote.json", - // "test/data/nst_json_testsuite/test_parsing/y_string_utf16.json", - "test/data/nst_json_testsuite/test_parsing/y_string_utf8.json", - "test/data/nst_json_testsuite/test_parsing/y_string_with_del_character.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_false.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_int.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_negative_real.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_null.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_string.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_true.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_string_empty.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_trailing_newline.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_true_in_array.json", - "test/data/nst_json_testsuite/test_parsing/y_structure_whitespace_array.json" - }) - { - CAPTURE(filename); - - // parse JSON file - std::ifstream f_json(filename); - json j1 = json::parse(f_json); - - SECTION("std::vector") - { - // parse UBJSON file - std::ifstream f_ubjson(filename + ".ubj", std::ios::binary); - std::vector packed( - (std::istreambuf_iterator(f_ubjson)), - std::istreambuf_iterator()); - json j2; - CHECK_NOTHROW(j2 = json::from_ubjson(packed)); - - // compare parsed JSON values - CHECK(j1 == j2); - } - - SECTION("std::ifstream") - { - // parse UBJSON file - std::ifstream f_ubjson(filename + ".ubj", std::ios::binary); - json j2; - CHECK_NOTHROW(j2 = json::from_ubjson(f_ubjson)); - - // compare parsed JSON values - CHECK(j1 == j2); - } - - SECTION("uint8_t* and size") - { - // parse UBJSON file - std::ifstream f_ubjson(filename + ".ubj", std::ios::binary); - std::vector packed( - (std::istreambuf_iterator(f_ubjson)), - std::istreambuf_iterator()); - json j2; - CHECK_NOTHROW(j2 = json::from_ubjson({packed.data(), packed.size()})); - - // compare parsed JSON values - CHECK(j1 == j2); - } - } - } -} -*/ - TEST_CASE("Universal Binary JSON Specification Examples 1") { SECTION("Null Value") @@ -2037,40 +1786,6 @@ TEST_CASE("Universal Binary JSON Specification Examples 1") } } -/* -TEST_CASE("Universal Binary JSON Specification Examples 2") -{ - for (std::string prefix : - { - "test/data/universal-binary-json-java/CouchDB4k", - "test/data/universal-binary-json-java/MediaContent", - "test/data/universal-binary-json-java/TwitterTimeline" - }) - { - CAPTURE(prefix); - - // parse JSON file - std::ifstream f_json(prefix + ".formatted.json"); - json j1 = json::parse(f_json); - - SECTION("std::vector") - { - // parse UBJSON file - std::ifstream f_ubjson(prefix + ".ubj", std::ios::binary); - std::vector packed( - (std::istreambuf_iterator(f_ubjson)), - std::istreambuf_iterator()); - json j2; - CHECK_NOTHROW(j2 = json::from_ubjson(packed)); - - // compare parsed JSON values - CHECK(j1 == j2); - } - } -} -*/ - - TEST_CASE("all UBJSON first bytes", "[!throws]") { // these bytes will fail immediately with exception parse_error.112 From ed69e50ad24b7edf07444248242c3e5a06d1f17f Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 3 May 2018 17:41:45 +0200 Subject: [PATCH 068/156] :page_facing_up: added SPDX-License-Identifier --- include/nlohmann/json.hpp | 1 + single_include/nlohmann/json.hpp | 1 + test/src/unit-algorithms.cpp | 1 + test/src/unit-allocator.cpp | 1 + test/src/unit-alt-string.cpp | 1 + test/src/unit-capacity.cpp | 1 + test/src/unit-cbor.cpp | 1 + test/src/unit-class_const_iterator.cpp | 1 + test/src/unit-class_iterator.cpp | 1 + test/src/unit-class_lexer.cpp | 1 + test/src/unit-class_parser.cpp | 1 + test/src/unit-comparison.cpp | 1 + test/src/unit-concepts.cpp | 1 + test/src/unit-constructor1.cpp | 1 + test/src/unit-constructor2.cpp | 1 + test/src/unit-convenience.cpp | 1 + test/src/unit-conversions.cpp | 1 + test/src/unit-deserialization.cpp | 1 + test/src/unit-element_access1.cpp | 1 + test/src/unit-element_access2.cpp | 1 + test/src/unit-inspection.cpp | 1 + test/src/unit-items.cpp | 1 + test/src/unit-iterators1.cpp | 1 + test/src/unit-iterators2.cpp | 1 + test/src/unit-json_patch.cpp | 1 + test/src/unit-json_pointer.cpp | 1 + test/src/unit-merge_patch.cpp | 1 + test/src/unit-meta.cpp | 1 + test/src/unit-modifiers.cpp | 1 + test/src/unit-msgpack.cpp | 1 + test/src/unit-noexcept.cpp | 1 + test/src/unit-pointer_access.cpp | 1 + test/src/unit-readme.cpp | 1 + test/src/unit-reference_access.cpp | 1 + test/src/unit-regression.cpp | 1 + test/src/unit-serialization.cpp | 1 + test/src/unit-testsuites.cpp | 1 + test/src/unit-to_chars.cpp | 1 + test/src/unit-ubjson.cpp | 1 + test/src/unit-udt.cpp | 1 + test/src/unit-unicode.cpp | 1 + test/src/unit-wstring.cpp | 1 + test/src/unit.cpp | 1 + 43 files changed, 43 insertions(+) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 54e66d90..fb9c66a1 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 9278b877..8c9942bb 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-algorithms.cpp b/test/src/unit-algorithms.cpp index 6579c4a5..b9747b9b 100644 --- a/test/src/unit-algorithms.cpp +++ b/test/src/unit-algorithms.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-allocator.cpp b/test/src/unit-allocator.cpp index 7dea7616..2566d298 100644 --- a/test/src/unit-allocator.cpp +++ b/test/src/unit-allocator.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index 36c8b83b..cc05039c 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2018 Vitaliy Manushkin . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-capacity.cpp b/test/src/unit-capacity.cpp index 47ac03cc..3cdaed92 100644 --- a/test/src/unit-capacity.cpp +++ b/test/src/unit-capacity.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index 120093b3..1f584fc3 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-class_const_iterator.cpp b/test/src/unit-class_const_iterator.cpp index 8319fef5..20cc7529 100644 --- a/test/src/unit-class_const_iterator.cpp +++ b/test/src/unit-class_const_iterator.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-class_iterator.cpp b/test/src/unit-class_iterator.cpp index 484a49de..07218d9f 100644 --- a/test/src/unit-class_iterator.cpp +++ b/test/src/unit-class_iterator.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-class_lexer.cpp b/test/src/unit-class_lexer.cpp index c134ea5b..35338a80 100644 --- a/test/src/unit-class_lexer.cpp +++ b/test/src/unit-class_lexer.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 29a948e8..d1f73d13 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-comparison.cpp b/test/src/unit-comparison.cpp index 0659c1db..da394407 100644 --- a/test/src/unit-comparison.cpp +++ b/test/src/unit-comparison.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-concepts.cpp b/test/src/unit-concepts.cpp index e2aac157..735ca0cb 100644 --- a/test/src/unit-concepts.cpp +++ b/test/src/unit-concepts.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-constructor1.cpp b/test/src/unit-constructor1.cpp index 35652bd8..bba24b71 100644 --- a/test/src/unit-constructor1.cpp +++ b/test/src/unit-constructor1.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-constructor2.cpp b/test/src/unit-constructor2.cpp index e36de923..120cb06b 100644 --- a/test/src/unit-constructor2.cpp +++ b/test/src/unit-constructor2.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-convenience.cpp b/test/src/unit-convenience.cpp index 15596032..6711fdd9 100644 --- a/test/src/unit-convenience.cpp +++ b/test/src/unit-convenience.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index d67f5acb..351dec8a 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp index 2886f009..e02ac862 100644 --- a/test/src/unit-deserialization.cpp +++ b/test/src/unit-deserialization.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-element_access1.cpp b/test/src/unit-element_access1.cpp index d06b97ca..af7818c4 100644 --- a/test/src/unit-element_access1.cpp +++ b/test/src/unit-element_access1.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-element_access2.cpp b/test/src/unit-element_access2.cpp index 5ea4b8a5..eb0d943f 100644 --- a/test/src/unit-element_access2.cpp +++ b/test/src/unit-element_access2.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-inspection.cpp b/test/src/unit-inspection.cpp index 111e6ea2..4c03cf96 100644 --- a/test/src/unit-inspection.cpp +++ b/test/src/unit-inspection.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-items.cpp b/test/src/unit-items.cpp index 8f18884d..579e1141 100644 --- a/test/src/unit-items.cpp +++ b/test/src/unit-items.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-iterators1.cpp b/test/src/unit-iterators1.cpp index c8125ce7..ef8d3185 100644 --- a/test/src/unit-iterators1.cpp +++ b/test/src/unit-iterators1.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-iterators2.cpp b/test/src/unit-iterators2.cpp index 2d369881..b3e1b820 100644 --- a/test/src/unit-iterators2.cpp +++ b/test/src/unit-iterators2.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-json_patch.cpp b/test/src/unit-json_patch.cpp index 1a71621d..d2079b4e 100644 --- a/test/src/unit-json_patch.cpp +++ b/test/src/unit-json_patch.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-json_pointer.cpp b/test/src/unit-json_pointer.cpp index c630da56..ec49e114 100644 --- a/test/src/unit-json_pointer.cpp +++ b/test/src/unit-json_pointer.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-merge_patch.cpp b/test/src/unit-merge_patch.cpp index 2daaf00f..7e36c432 100644 --- a/test/src/unit-merge_patch.cpp +++ b/test/src/unit-merge_patch.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-meta.cpp b/test/src/unit-meta.cpp index 6fc84998..db03453a 100644 --- a/test/src/unit-meta.cpp +++ b/test/src/unit-meta.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-modifiers.cpp b/test/src/unit-modifiers.cpp index ada65f20..1092dae3 100644 --- a/test/src/unit-modifiers.cpp +++ b/test/src/unit-modifiers.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index d8bdb08b..17dde080 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-noexcept.cpp b/test/src/unit-noexcept.cpp index 4b3dcade..2d49b327 100644 --- a/test/src/unit-noexcept.cpp +++ b/test/src/unit-noexcept.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-pointer_access.cpp b/test/src/unit-pointer_access.cpp index 5670269a..fe56efbd 100644 --- a/test/src/unit-pointer_access.cpp +++ b/test/src/unit-pointer_access.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-readme.cpp b/test/src/unit-readme.cpp index 4c163afa..974adeaf 100644 --- a/test/src/unit-readme.cpp +++ b/test/src/unit-readme.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-reference_access.cpp b/test/src/unit-reference_access.cpp index 3c92096f..43a096a7 100644 --- a/test/src/unit-reference_access.cpp +++ b/test/src/unit-reference_access.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index c66caa90..8bdd2dc3 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-serialization.cpp b/test/src/unit-serialization.cpp index ebe64297..3abc7fb1 100644 --- a/test/src/unit-serialization.cpp +++ b/test/src/unit-serialization.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-testsuites.cpp b/test/src/unit-testsuites.cpp index 5f77a737..a668abd5 100644 --- a/test/src/unit-testsuites.cpp +++ b/test/src/unit-testsuites.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-to_chars.cpp b/test/src/unit-to_chars.cpp index 841e164b..fc86f30f 100644 --- a/test/src/unit-to_chars.cpp +++ b/test/src/unit-to_chars.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index c335c7ad..4a1925bd 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-udt.cpp b/test/src/unit-udt.cpp index 9cfc6e97..040c3e98 100644 --- a/test/src/unit-udt.cpp +++ b/test/src/unit-udt.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-unicode.cpp b/test/src/unit-unicode.cpp index 95925dee..568d1d7c 100644 --- a/test/src/unit-unicode.cpp +++ b/test/src/unit-unicode.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit-wstring.cpp b/test/src/unit-wstring.cpp index 37cf42db..a1f4e545 100644 --- a/test/src/unit-wstring.cpp +++ b/test/src/unit-wstring.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 95659955..6380265b 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -5,6 +5,7 @@ |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . +SPDX-License-Identifier: MIT Copyright (c) 2013-2018 Niels Lohmann . Permission is hereby granted, free of charge, to any person obtaining a copy From 86b0732a101d5bd0ca2e6cffb883a08667514f56 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 3 May 2018 18:11:42 +0200 Subject: [PATCH 069/156] :memo: added public key used for commits and releases --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 47c3ae21..d09794c8 100644 --- a/README.md +++ b/README.md @@ -865,6 +865,10 @@ If you have questions regarding the library, I would like to invite you to [open Only if your request would contain confidential information, please [send me an email](mailto:mail@nlohmann.me). For encrypted messages, please use [this key](https://keybase.io/nlohmann/pgp_keys.asc). +## Security + +[Commits by Niels Lohmann](https://github.com/nlohmann/json/commits) and [releases](https://github.com/nlohmann/json/releases) are signed with this [PGP Key](https://keybase.io/nlohmann/pgp_keys.asc?fingerprint=797167ae41c0a6d9232e48457f3cea63ae251b69). + ## Thanks From 14f01e1981763f988eb3d5aff23780519d2e7f57 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 3 May 2018 18:32:53 +0200 Subject: [PATCH 070/156] :wrench: update issue templates --- .github/ISSUE_TEMPLATE/Bug_report.md | 19 +++++++++++++++++++ .github/ISSUE_TEMPLATE/Feature_request.md | 9 +++++++++ 2 files changed, 28 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/Bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/Feature_request.md diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md new file mode 100644 index 00000000..177a4b39 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -0,0 +1,19 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +- What is the issue you have? + +- Please describe the steps to reproduce the issue. Can you provide a small but working code example? + +- What is the expected behavior? + +- And what is the actual behavior instead? + +- Which compiler and operating system are you using? Is it a [supported compiler](https://github.com/nlohmann/json#supported-compilers)? + +- Did you use a released version of the library or the version from the `develop` branch? + +- If you experience a compilation error: can you [compile and run the unit tests](https://github.com/nlohmann/json#execute-unit-tests)? diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md new file mode 100644 index 00000000..f5ea57ca --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Feature_request.md @@ -0,0 +1,9 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +- Describe the feature in as much detail as possible. + +- Include sample usage where appropriate. From 7bbe7bb98f8eea283b524610282b469ea47fc7fe Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 3 May 2018 18:35:21 +0200 Subject: [PATCH 071/156] :fire: removed old issue template --- .github/ISSUE_TEMPLATE.md | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index a3140bc1..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,22 +0,0 @@ -**Bug Report** - -- What is the issue you have? - -- Please describe the steps to reproduce the issue. Can you provide a small but working code example? - -- What is the expected behavior? - -- And what is the actual behavior instead? - -- Which compiler and operating system are you using? Is it a [supported compiler](https://github.com/nlohmann/json#supported-compilers)? - -- Did you use a released version of the library or the version from the `develop` branch? - -- If you experience a compilation error: can you [compile and run the unit tests](https://github.com/nlohmann/json#execute-unit-tests)? - - -**Feature Request** - -- Describe the feature in as much detail as possible. - -- Include sample usage where appropriate. From 377e956655a52296ccdf29ec4922c4c1118aa565 Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Thu, 3 May 2018 22:42:52 +0200 Subject: [PATCH 073/156] fix typo in readme The README says: > "The library itself contains of a single header file ..." I guess "consists of a" is the wording that was intended here. Alternatively, "contains a" might also be what was intended. Either way, I think both versions work equally well and thus choose the one that I believe was intended. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d09794c8..74710bfe 100644 --- a/README.md +++ b/README.md @@ -994,7 +994,7 @@ Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I ## Used third-party tools -The library itself contains of a single header file licensed under the MIT license. However, it is built, tested, documented, and whatnot using a lot of third-party tools and services. Thanks a lot! +The library itself consists of a single header file licensed under the MIT license. However, it is built, tested, documented, and whatnot using a lot of third-party tools and services. Thanks a lot! - [**amalgamate.py - Amalgamate C source and header files**](https://github.com/edlund/amalgamate) to create a single header file - [**American fuzzy lop**](http://lcamtuf.coredump.cx/afl/) for fuzz testing From ae213721b1d51570f8d922c8b3f7a7fa13ccdbdf Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 6 May 2018 14:05:29 +0200 Subject: [PATCH 074/156] :hammer: removed unget function for wstring parsers --- .../nlohmann/detail/input/input_adapters.hpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index 6a3ffa2b..d1c7fea1 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -123,13 +123,6 @@ class wide_string_input_adapter : public input_adapter_protocol std::char_traits::int_type get_character() noexcept override { - // unget_character() was called previously: return the last character - if (next_unget) - { - next_unget = false; - return last_char; - } - // check if buffer needs to be filled if (utf8_bytes_index == utf8_bytes_filled) { @@ -149,12 +142,7 @@ class wide_string_input_adapter : public input_adapter_protocol // use buffer assert(utf8_bytes_filled > 0); assert(utf8_bytes_index < utf8_bytes_filled); - return (last_char = utf8_bytes[utf8_bytes_index++]); - } - - void unget_character() noexcept override - { - next_unget = true; + return utf8_bytes[utf8_bytes_index++]; } private: @@ -278,11 +266,6 @@ class wide_string_input_adapter : public input_adapter_protocol std::size_t utf8_bytes_index = 0; /// number of valid bytes in the utf8_codes array std::size_t utf8_bytes_filled = 0; - - /// the last character (returned after unget_character() is called) - std::char_traits::int_type last_char = 0; - /// whether get_character() should return last_char - bool next_unget = false; }; class input_adapter From e94862a6495d9cfa8ea7f7c4b042fcd996705059 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 6 May 2018 19:00:49 +0200 Subject: [PATCH 075/156] :ambulance: fixed error in callback logic --- include/nlohmann/detail/input/json_sax.hpp | 23 ++++++++---- single_include/nlohmann/json.hpp | 42 +++++++++------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 561bbe1c..6f3aa99c 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -349,10 +349,10 @@ class json_sax_dom_callback_parser : public json_sax bool start_object(std::size_t len) override { // check callback for object start - const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::object_start, discarded); + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); keep_stack.push_back(keep); - auto val = handle_value(BasicJsonType::value_t::object); + auto val = handle_value(BasicJsonType::value_t::object, true); ref_stack.push_back(val.second); // check object limit @@ -424,10 +424,10 @@ class json_sax_dom_callback_parser : public json_sax bool start_array(std::size_t len) override { - const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::array_start, discarded); + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); keep_stack.push_back(keep); - auto val = handle_value(BasicJsonType::value_t::array); + auto val = handle_value(BasicJsonType::value_t::array, true); ref_stack.push_back(val.second); // check array limit @@ -507,15 +507,22 @@ class json_sax_dom_callback_parser : public json_sax private: /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + @invariant If the ref stack is empty, then the passed value will be the new root. @invariant If the ref stack contains a value, then it is an array or an object to which we can add elements + @return pair of boolean (whether value should be kept) and pointer (to the passed value in the ref_stack hierarchy; nullptr if not kept) */ template - std::pair handle_value(Value&& v) + std::pair handle_value(Value&& v, const bool skip_callback = false) { assert(not keep_stack.empty()); @@ -526,9 +533,11 @@ class json_sax_dom_callback_parser : public json_sax return {false, nullptr}; } - // create value and check callback + // create value auto value = BasicJsonType(std::forward(v)); - const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // check callback + const bool keep = skip_callback or callback(static_cast(ref_stack.size()), parse_event_t::value, value); // do not handle this value if we just learnt it shall be discarded if (not keep) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index fa7f585d..95077359 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1697,13 +1697,6 @@ class wide_string_input_adapter : public input_adapter_protocol std::char_traits::int_type get_character() noexcept override { - // unget_character() was called previously: return the last character - if (next_unget) - { - next_unget = false; - return last_char; - } - // check if buffer needs to be filled if (utf8_bytes_index == utf8_bytes_filled) { @@ -1723,12 +1716,7 @@ class wide_string_input_adapter : public input_adapter_protocol // use buffer assert(utf8_bytes_filled > 0); assert(utf8_bytes_index < utf8_bytes_filled); - return (last_char = utf8_bytes[utf8_bytes_index++]); - } - - void unget_character() noexcept override - { - next_unget = true; + return utf8_bytes[utf8_bytes_index++]; } private: @@ -1852,11 +1840,6 @@ class wide_string_input_adapter : public input_adapter_protocol std::size_t utf8_bytes_index = 0; /// number of valid bytes in the utf8_codes array std::size_t utf8_bytes_filled = 0; - - /// the last character (returned after unget_character() is called) - std::char_traits::int_type last_char = 0; - /// whether get_character() should return last_char - bool next_unget = false; }; class input_adapter @@ -3670,10 +3653,10 @@ class json_sax_dom_callback_parser : public json_sax bool start_object(std::size_t len) override { // check callback for object start - const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::object_start, discarded); + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); keep_stack.push_back(keep); - auto val = handle_value(BasicJsonType::value_t::object); + auto val = handle_value(BasicJsonType::value_t::object, true); ref_stack.push_back(val.second); // check object limit @@ -3745,10 +3728,10 @@ class json_sax_dom_callback_parser : public json_sax bool start_array(std::size_t len) override { - const bool keep = callback(static_cast(ref_stack.size()) + 1, parse_event_t::array_start, discarded); + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); keep_stack.push_back(keep); - auto val = handle_value(BasicJsonType::value_t::array); + auto val = handle_value(BasicJsonType::value_t::array, true); ref_stack.push_back(val.second); // check array limit @@ -3828,15 +3811,22 @@ class json_sax_dom_callback_parser : public json_sax private: /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + @invariant If the ref stack is empty, then the passed value will be the new root. @invariant If the ref stack contains a value, then it is an array or an object to which we can add elements + @return pair of boolean (whether value should be kept) and pointer (to the passed value in the ref_stack hierarchy; nullptr if not kept) */ template - std::pair handle_value(Value&& v) + std::pair handle_value(Value&& v, const bool skip_callback = false) { assert(not keep_stack.empty()); @@ -3847,9 +3837,11 @@ class json_sax_dom_callback_parser : public json_sax return {false, nullptr}; } - // create value and check callback + // create value auto value = BasicJsonType(std::forward(v)); - const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // check callback + const bool keep = skip_callback or callback(static_cast(ref_stack.size()), parse_event_t::value, value); // do not handle this value if we just learnt it shall be discarded if (not keep) From 4639bb2c8faa14a1a11ba48ed25bc62d279317a9 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 17 May 2018 10:10:01 +0200 Subject: [PATCH 076/156] :white_check_mark: added more tests from recent nst's JSONTestSuite --- test/data/nst_json_testsuite2/LICENSE | 21 + test/data/nst_json_testsuite2/README.md | 55 +++ .../i_number_double_huge_neg_exp.json | 1 + .../test_parsing/i_number_huge_exp.json | 1 + .../i_number_neg_int_huge_exp.json | 1 + .../i_number_pos_double_huge_exp.json | 1 + .../i_number_real_neg_overflow.json | 1 + .../i_number_real_pos_overflow.json | 1 + .../test_parsing/i_number_real_underflow.json | 1 + .../i_number_too_big_neg_int.json | 1 + .../i_number_too_big_pos_int.json | 1 + .../i_number_very_big_negative_int.json | 1 + .../i_object_key_lone_2nd_surrogate.json | 1 + ..._string_1st_surrogate_but_2nd_missing.json | 1 + ...tring_1st_valid_surrogate_2nd_invalid.json | 1 + .../i_string_UTF-16LE_with_BOM.json | Bin 0 -> 12 bytes .../i_string_UTF-8_invalid_sequence.json | 1 + .../i_string_UTF8_surrogate_U+D800.json | 1 + ...incomplete_surrogate_and_escape_valid.json | 1 + .../i_string_incomplete_surrogate_pair.json | 1 + ...ng_incomplete_surrogates_escape_valid.json | 1 + .../i_string_invalid_lonely_surrogate.json | 1 + .../i_string_invalid_surrogate.json | 1 + .../test_parsing/i_string_invalid_utf-8.json | 1 + .../i_string_inverted_surrogates_U+1D11E.json | 1 + .../test_parsing/i_string_iso_latin_1.json | 1 + .../i_string_lone_second_surrogate.json | 1 + .../i_string_lone_utf8_continuation_byte.json | 1 + .../i_string_not_in_unicode_range.json | 1 + .../i_string_overlong_sequence_2_bytes.json | 1 + .../i_string_overlong_sequence_6_bytes.json | 1 + ...string_overlong_sequence_6_bytes_null.json | 1 + .../i_string_truncated-utf-8.json | 1 + .../test_parsing/i_string_utf16BE_no_BOM.json | Bin 0 -> 10 bytes .../test_parsing/i_string_utf16LE_no_BOM.json | Bin 0 -> 10 bytes .../i_structure_500_nested_arrays.json | 1 + .../i_structure_UTF-8_BOM_empty_object.json | 1 + .../n_array_1_true_without_comma.json | 1 + .../test_parsing/n_array_a_invalid_utf8.json | 1 + .../n_array_colon_instead_of_comma.json | 1 + .../n_array_comma_after_close.json | 1 + .../n_array_comma_and_number.json | 1 + .../test_parsing/n_array_double_comma.json | 1 + .../n_array_double_extra_comma.json | 1 + .../test_parsing/n_array_extra_close.json | 1 + .../test_parsing/n_array_extra_comma.json | 1 + .../test_parsing/n_array_incomplete.json | 1 + .../n_array_incomplete_invalid_value.json | 1 + .../n_array_inner_array_no_comma.json | 1 + .../test_parsing/n_array_invalid_utf8.json | 1 + .../n_array_items_separated_by_semicolon.json | 1 + .../test_parsing/n_array_just_comma.json | 1 + .../test_parsing/n_array_just_minus.json | 1 + .../test_parsing/n_array_missing_value.json | 1 + .../n_array_newlines_unclosed.json | 3 + .../n_array_number_and_comma.json | 1 + .../n_array_number_and_several_commas.json | 1 + .../n_array_spaces_vertical_tab_formfeed.json | 1 + .../test_parsing/n_array_star_inside.json | 1 + .../test_parsing/n_array_unclosed.json | 1 + .../n_array_unclosed_trailing_comma.json | 1 + .../n_array_unclosed_with_new_lines.json | 3 + .../n_array_unclosed_with_object_inside.json | 1 + .../test_parsing/n_incomplete_false.json | 1 + .../test_parsing/n_incomplete_null.json | 1 + .../test_parsing/n_incomplete_true.json | 1 + .../n_multidigit_number_then_00.json | Bin 0 -> 4 bytes .../test_parsing/n_number_++.json | 1 + .../test_parsing/n_number_+1.json | 1 + .../test_parsing/n_number_+Inf.json | 1 + .../test_parsing/n_number_-01.json | 1 + .../test_parsing/n_number_-1.0..json | 1 + .../test_parsing/n_number_-2..json | 1 + .../test_parsing/n_number_-NaN.json | 1 + .../test_parsing/n_number_.-1.json | 1 + .../test_parsing/n_number_.2e-3.json | 1 + .../test_parsing/n_number_0.1.2.json | 1 + .../test_parsing/n_number_0.3e+.json | 1 + .../test_parsing/n_number_0.3e.json | 1 + .../test_parsing/n_number_0.e1.json | 1 + .../test_parsing/n_number_0_capital_E+.json | 1 + .../test_parsing/n_number_0_capital_E.json | 1 + .../test_parsing/n_number_0e+.json | 1 + .../test_parsing/n_number_0e.json | 1 + .../test_parsing/n_number_1.0e+.json | 1 + .../test_parsing/n_number_1.0e-.json | 1 + .../test_parsing/n_number_1.0e.json | 1 + .../test_parsing/n_number_1_000.json | 1 + .../test_parsing/n_number_1eE2.json | 1 + .../test_parsing/n_number_2.e+3.json | 1 + .../test_parsing/n_number_2.e-3.json | 1 + .../test_parsing/n_number_2.e3.json | 1 + .../test_parsing/n_number_9.e+.json | 1 + .../test_parsing/n_number_Inf.json | 1 + .../test_parsing/n_number_NaN.json | 1 + .../n_number_U+FF11_fullwidth_digit_one.json | 1 + .../test_parsing/n_number_expression.json | 1 + .../test_parsing/n_number_hex_1_digit.json | 1 + .../test_parsing/n_number_hex_2_digits.json | 1 + .../test_parsing/n_number_infinity.json | 1 + .../test_parsing/n_number_invalid+-.json | 1 + .../n_number_invalid-negative-real.json | 1 + .../n_number_invalid-utf-8-in-bigger-int.json | 1 + .../n_number_invalid-utf-8-in-exponent.json | 1 + .../n_number_invalid-utf-8-in-int.json | 1 + .../test_parsing/n_number_minus_infinity.json | 1 + ...mber_minus_sign_with_trailing_garbage.json | 1 + .../test_parsing/n_number_minus_space_1.json | 1 + .../n_number_neg_int_starting_with_zero.json | 1 + .../n_number_neg_real_without_int_part.json | 1 + .../n_number_neg_with_garbage_at_end.json | 1 + .../n_number_real_garbage_after_e.json | 1 + ...number_real_with_invalid_utf8_after_e.json | 1 + ...n_number_real_without_fractional_part.json | 1 + .../n_number_starting_with_dot.json | 1 + .../test_parsing/n_number_with_alpha.json | 1 + .../n_number_with_alpha_char.json | 1 + .../n_number_with_leading_zero.json | 1 + .../test_parsing/n_object_bad_value.json | 1 + .../test_parsing/n_object_bracket_key.json | 1 + .../n_object_comma_instead_of_colon.json | 1 + .../test_parsing/n_object_double_colon.json | 1 + .../test_parsing/n_object_emoji.json | 1 + .../test_parsing/n_object_garbage_at_end.json | 1 + .../n_object_key_with_single_quotes.json | 1 + ...uation_byte_in_key_and_trailing_comma.json | 1 + .../test_parsing/n_object_missing_colon.json | 1 + .../test_parsing/n_object_missing_key.json | 1 + .../n_object_missing_semicolon.json | 1 + .../test_parsing/n_object_missing_value.json | 1 + .../test_parsing/n_object_no-colon.json | 1 + .../test_parsing/n_object_non_string_key.json | 1 + ...on_string_key_but_huge_number_instead.json | 1 + .../n_object_repeated_null_null.json | 1 + .../n_object_several_trailing_commas.json | 1 + .../test_parsing/n_object_single_quote.json | 1 + .../test_parsing/n_object_trailing_comma.json | 1 + .../n_object_trailing_comment.json | 1 + .../n_object_trailing_comment_open.json | 1 + .../n_object_trailing_comment_slash_open.json | 1 + ...railing_comment_slash_open_incomplete.json | 1 + .../n_object_two_commas_in_a_row.json | 1 + .../test_parsing/n_object_unquoted_key.json | 1 + .../n_object_unterminated-value.json | 1 + .../n_object_with_single_string.json | 1 + .../n_object_with_trailing_garbage.json | 1 + .../test_parsing/n_single_space.json | 1 + .../n_string_1_surrogate_then_escape.json | 1 + .../n_string_1_surrogate_then_escape_u.json | 1 + .../n_string_1_surrogate_then_escape_u1.json | 1 + .../n_string_1_surrogate_then_escape_u1x.json | 1 + .../n_string_accentuated_char_no_quotes.json | 1 + .../test_parsing/n_string_backslash_00.json | Bin 0 -> 6 bytes .../test_parsing/n_string_escape_x.json | 1 + .../n_string_escaped_backslash_bad.json | 1 + .../n_string_escaped_ctrl_char_tab.json | 1 + .../test_parsing/n_string_escaped_emoji.json | 1 + .../n_string_incomplete_escape.json | 1 + ...n_string_incomplete_escaped_character.json | 1 + .../n_string_incomplete_surrogate.json | 1 + ...g_incomplete_surrogate_escape_invalid.json | 1 + .../n_string_invalid-utf-8-in-escape.json | 1 + .../n_string_invalid_backslash_esc.json | 1 + .../n_string_invalid_unicode_escape.json | 1 + .../n_string_invalid_utf8_after_escape.json | 1 + .../n_string_leading_uescaped_thinspace.json | 1 + .../n_string_no_quotes_with_bad_escape.json | 1 + .../n_string_single_doublequote.json | 1 + .../test_parsing/n_string_single_quote.json | 1 + ...string_single_string_no_double_quotes.json | 1 + .../n_string_start_escape_unclosed.json | 1 + .../n_string_unescaped_crtl_char.json | Bin 0 -> 7 bytes .../n_string_unescaped_newline.json | 2 + .../test_parsing/n_string_unescaped_tab.json | 1 + .../n_string_unicode_CapitalU.json | 1 + .../n_string_with_trailing_garbage.json | 1 + .../n_structure_100000_opening_arrays.json | 1 + .../n_structure_U+2060_word_joined.json | 1 + .../n_structure_UTF8_BOM_no_data.json | 1 + .../n_structure_angle_bracket_..json | 1 + .../n_structure_angle_bracket_null.json | 1 + .../n_structure_array_trailing_garbage.json | 1 + ...tructure_array_with_extra_array_close.json | 1 + ..._structure_array_with_unclosed_string.json | 1 + .../n_structure_ascii-unicode-identifier.json | 1 + .../n_structure_capitalized_True.json | 1 + .../n_structure_close_unopened_array.json | 1 + ...ucture_comma_instead_of_closing_brace.json | 1 + .../n_structure_double_array.json | 1 + .../test_parsing/n_structure_end_array.json | 1 + .../n_structure_incomplete_UTF8_BOM.json | 1 + .../n_structure_lone-invalid-utf-8.json | 1 + .../n_structure_lone-open-bracket.json | 1 + .../test_parsing/n_structure_no_data.json | 0 .../n_structure_null-byte-outside-string.json | Bin 0 -> 3 bytes ...tructure_number_with_trailing_garbage.json | 1 + ...ure_object_followed_by_closing_object.json | 1 + .../n_structure_object_unclosed_no_value.json | 1 + .../n_structure_object_with_comment.json | 1 + ...tructure_object_with_trailing_garbage.json | 1 + .../n_structure_open_array_apostrophe.json | 1 + .../n_structure_open_array_comma.json | 1 + .../n_structure_open_array_object.json | 1 + .../n_structure_open_array_open_object.json | 1 + .../n_structure_open_array_open_string.json | 1 + .../n_structure_open_array_string.json | 1 + .../test_parsing/n_structure_open_object.json | 1 + .../n_structure_open_object_close_array.json | 1 + .../n_structure_open_object_comma.json | 1 + .../n_structure_open_object_open_array.json | 1 + .../n_structure_open_object_open_string.json | 1 + ...e_open_object_string_with_apostrophes.json | 1 + .../test_parsing/n_structure_open_open.json | 1 + .../n_structure_single_eacute.json | 1 + .../test_parsing/n_structure_single_star.json | 1 + .../test_parsing/n_structure_trailing_#.json | 1 + ...n_structure_uescaped_LF_before_string.json | 1 + .../n_structure_unclosed_array.json | 1 + ...structure_unclosed_array_partial_null.json | 1 + ...cture_unclosed_array_unfinished_false.json | 1 + ...ucture_unclosed_array_unfinished_true.json | 1 + .../n_structure_unclosed_object.json | 1 + .../n_structure_unicode-identifier.json | 1 + ...ructure_whitespace_U+2060_word_joiner.json | 1 + .../n_structure_whitespace_formfeed.json | 1 + .../y_array_arraysWithSpaces.json | 1 + .../test_parsing/y_array_empty-string.json | 1 + .../test_parsing/y_array_empty.json | 1 + .../y_array_ending_with_newline.json | 1 + .../test_parsing/y_array_false.json | 1 + .../test_parsing/y_array_heterogeneous.json | 1 + .../test_parsing/y_array_null.json | 1 + .../y_array_with_1_and_newline.json | 2 + .../y_array_with_leading_space.json | 1 + .../y_array_with_several_null.json | 1 + .../y_array_with_trailing_space.json | 1 + .../test_parsing/y_number.json | 1 + .../test_parsing/y_number_0e+1.json | 1 + .../test_parsing/y_number_0e1.json | 1 + .../test_parsing/y_number_after_space.json | 1 + .../y_number_double_close_to_zero.json | 1 + .../test_parsing/y_number_int_with_exp.json | 1 + .../test_parsing/y_number_minus_zero.json | 1 + .../test_parsing/y_number_negative_int.json | 1 + .../test_parsing/y_number_negative_one.json | 1 + .../test_parsing/y_number_negative_zero.json | 1 + .../test_parsing/y_number_real_capital_e.json | 1 + .../y_number_real_capital_e_neg_exp.json | 1 + .../y_number_real_capital_e_pos_exp.json | 1 + .../test_parsing/y_number_real_exponent.json | 1 + .../y_number_real_fraction_exponent.json | 1 + .../test_parsing/y_number_real_neg_exp.json | 1 + .../y_number_real_pos_exponent.json | 1 + .../test_parsing/y_number_simple_int.json | 1 + .../test_parsing/y_number_simple_real.json | 1 + .../test_parsing/y_object.json | 1 + .../test_parsing/y_object_basic.json | 1 + .../test_parsing/y_object_duplicated_key.json | 1 + .../y_object_duplicated_key_and_value.json | 1 + .../test_parsing/y_object_empty.json | 1 + .../test_parsing/y_object_empty_key.json | 1 + .../y_object_escaped_null_in_key.json | 1 + .../y_object_extreme_numbers.json | 1 + .../test_parsing/y_object_long_strings.json | 1 + .../test_parsing/y_object_simple.json | 1 + .../test_parsing/y_object_string_unicode.json | 1 + .../test_parsing/y_object_with_newlines.json | 3 + .../y_string_1_2_3_bytes_UTF-8_sequences.json | 1 + .../y_string_accepted_surrogate_pair.json | 1 + .../y_string_accepted_surrogate_pairs.json | 1 + .../y_string_allowed_escapes.json | 1 + ...y_string_backslash_and_u_escaped_zero.json | 1 + .../y_string_backslash_doublequotes.json | 1 + .../test_parsing/y_string_comments.json | 1 + .../y_string_double_escape_a.json | 1 + .../y_string_double_escape_n.json | 1 + .../y_string_escaped_control_character.json | 1 + .../y_string_escaped_noncharacter.json | 1 + .../test_parsing/y_string_in_array.json | 1 + .../y_string_in_array_with_leading_space.json | 1 + .../y_string_last_surrogates_1_and_2.json | 1 + .../test_parsing/y_string_nbsp_uescaped.json | 1 + ...y_string_nonCharacterInUTF-8_U+10FFFF.json | 1 + .../y_string_nonCharacterInUTF-8_U+FFFF.json | 1 + .../test_parsing/y_string_null_escape.json | 1 + .../test_parsing/y_string_one-byte-utf-8.json | 1 + .../test_parsing/y_string_pi.json | 1 + ...ring_reservedCharacterInUTF-8_U+1BFFF.json | 1 + .../test_parsing/y_string_simple_ascii.json | 1 + .../test_parsing/y_string_space.json | 1 + ...rogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json | 1 + .../y_string_three-byte-utf-8.json | 1 + .../test_parsing/y_string_two-byte-utf-8.json | 1 + .../y_string_u+2028_line_sep.json | 1 + .../test_parsing/y_string_u+2029_par_sep.json | 1 + .../test_parsing/y_string_uEscape.json | 1 + .../y_string_uescaped_newline.json | 1 + .../y_string_unescaped_char_delete.json | 1 + .../test_parsing/y_string_unicode.json | 1 + .../y_string_unicodeEscapedBackslash.json | 1 + .../test_parsing/y_string_unicode_2.json | 1 + .../y_string_unicode_U+10FFFE_nonchar.json | 1 + .../y_string_unicode_U+1FFFE_nonchar.json | 1 + ...tring_unicode_U+200B_ZERO_WIDTH_SPACE.json | 1 + ..._string_unicode_U+2064_invisible_plus.json | 1 + .../y_string_unicode_U+FDD0_nonchar.json | 1 + .../y_string_unicode_U+FFFE_nonchar.json | 1 + ...y_string_unicode_escaped_double_quote.json | 1 + .../test_parsing/y_string_utf8.json | 1 + .../y_string_with_del_character.json | 1 + .../y_structure_lonely_false.json | 1 + .../test_parsing/y_structure_lonely_int.json | 1 + .../y_structure_lonely_negative_real.json | 1 + .../test_parsing/y_structure_lonely_null.json | 1 + .../y_structure_lonely_string.json | 1 + .../test_parsing/y_structure_lonely_true.json | 1 + .../y_structure_string_empty.json | 1 + .../y_structure_trailing_newline.json | 1 + .../y_structure_true_in_array.json | 1 + .../y_structure_whitespace_array.json | 1 + test/src/unit-testsuites.cpp | 419 ++++++++++++++++++ 321 files changed, 813 insertions(+) create mode 100644 test/data/nst_json_testsuite2/LICENSE create mode 100644 test/data/nst_json_testsuite2/README.md create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_UTF-16LE_with_BOM.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_utf16BE_no_BOM.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_string_utf16LE_no_BOM.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_1_true_without_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_a_invalid_utf8.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_colon_instead_of_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_comma_after_close.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_comma_and_number.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_double_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_double_extra_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_extra_close.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_extra_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_incomplete.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_incomplete_invalid_value.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_inner_array_no_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_invalid_utf8.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_items_separated_by_semicolon.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_just_comma.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_just_minus.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_missing_value.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_newlines_unclosed.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_number_and_comma.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_number_and_several_commas.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_spaces_vertical_tab_formfeed.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_array_star_inside.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_unclosed.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_trailing_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_new_lines.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_object_inside.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_incomplete_false.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_incomplete_null.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_incomplete_true.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_multidigit_number_then_00.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_++.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_+1.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_+Inf.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_-01.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_-1.0..json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_-2..json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_-NaN.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_.-1.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_.2e-3.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_0.1.2.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_0.3e+.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_0.3e.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_0.e1.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E+.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_0e+.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_0e.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_1.0e+.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_1.0e-.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_1.0e.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_1_000.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_1eE2.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_2.e+3.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_2.e-3.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_2.e3.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_9.e+.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_Inf.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_NaN.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_U+FF11_fullwidth_digit_one.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_expression.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_hex_1_digit.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_hex_2_digits.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_infinity.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_invalid+-.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_invalid-negative-real.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-bigger-int.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-exponent.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-int.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_minus_infinity.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_minus_sign_with_trailing_garbage.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_minus_space_1.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_neg_int_starting_with_zero.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_neg_real_without_int_part.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_neg_with_garbage_at_end.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_real_garbage_after_e.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_real_with_invalid_utf8_after_e.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_real_without_fractional_part.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_starting_with_dot.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha_char.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_number_with_leading_zero.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_bad_value.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_bracket_key.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_comma_instead_of_colon.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_double_colon.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_emoji.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_garbage_at_end.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_key_with_single_quotes.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_lone_continuation_byte_in_key_and_trailing_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_missing_colon.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_missing_key.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_missing_semicolon.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_missing_value.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_no-colon.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key_but_huge_number_instead.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_repeated_null_null.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_several_trailing_commas.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_single_quote.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_open.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open_incomplete.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_object_two_commas_in_a_row.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_unquoted_key.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_unterminated-value.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_with_single_string.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_object_with_trailing_garbage.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_single_space.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1x.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_accentuated_char_no_quotes.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_backslash_00.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_escape_x.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_escaped_backslash_bad.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_escaped_ctrl_char_tab.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_escaped_emoji.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escape.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escaped_character.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate_escape_invalid.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_invalid-utf-8-in-escape.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_invalid_backslash_esc.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_invalid_unicode_escape.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_invalid_utf8_after_escape.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_leading_uescaped_thinspace.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_no_quotes_with_bad_escape.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_single_doublequote.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_single_quote.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_single_string_no_double_quotes.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_start_escape_unclosed.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_crtl_char.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_newline.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_tab.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_unicode_CapitalU.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_string_with_trailing_garbage.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_U+2060_word_joined.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_UTF8_BOM_no_data.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_..json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_null.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_array_trailing_garbage.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_extra_array_close.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_unclosed_string.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_ascii-unicode-identifier.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_capitalized_True.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_close_unopened_array.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_comma_instead_of_closing_brace.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_double_array.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_end_array.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_incomplete_UTF8_BOM.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_lone-invalid-utf-8.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_lone-open-bracket.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_no_data.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_null-byte-outside-string.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_number_with_trailing_garbage.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_object_followed_by_closing_object.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_object_unclosed_no_value.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_comment.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_trailing_garbage.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_apostrophe.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_object.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_string.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_string.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_object.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_close_array.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_comma.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_array.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_string.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_string_with_apostrophes.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_open_open.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_single_eacute.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_single_star.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_trailing_#.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_uescaped_LF_before_string.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_partial_null.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_false.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_true.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_object.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/n_structure_unicode-identifier.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_U+2060_word_joiner.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_formfeed.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_array_arraysWithSpaces.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_array_empty-string.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_array_empty.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_array_ending_with_newline.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_array_false.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_array_heterogeneous.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_array_null.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_array_with_1_and_newline.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_array_with_leading_space.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_array_with_several_null.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_array_with_trailing_space.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_number_0e+1.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_number_0e1.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_after_space.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_number_double_close_to_zero.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_number_int_with_exp.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_number_minus_zero.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_negative_int.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_negative_one.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_negative_zero.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_neg_exp.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_pos_exp.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_real_exponent.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_real_fraction_exponent.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_real_neg_exp.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_real_pos_exponent.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_simple_int.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_number_simple_real.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_object.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_object_basic.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key_and_value.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_object_empty.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_object_empty_key.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_object_escaped_null_in_key.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_object_extreme_numbers.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_object_long_strings.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_object_simple.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_object_string_unicode.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_object_with_newlines.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pair.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pairs.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_allowed_escapes.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_backslash_and_u_escaped_zero.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_backslash_doublequotes.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_comments.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_a.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_n.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_escaped_control_character.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_escaped_noncharacter.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_in_array.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_in_array_with_leading_space.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_last_surrogates_1_and_2.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_nbsp_uescaped.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_null_escape.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_one-byte-utf-8.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_pi.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_reservedCharacterInUTF-8_U+1BFFF.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_simple_ascii.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_space.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_three-byte-utf-8.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_two-byte-utf-8.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_u+2028_line_sep.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_u+2029_par_sep.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_uEscape.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_uescaped_newline.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_unescaped_char_delete.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_unicodeEscapedBackslash.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_2.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+10FFFE_nonchar.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+1FFFE_nonchar.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+2064_invisible_plus.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FDD0_nonchar.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FFFE_nonchar.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_unicode_escaped_double_quote.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_string_utf8.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_string_with_del_character.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_false.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_int.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_negative_real.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_null.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_string.json create mode 100755 test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_true.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_structure_string_empty.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_structure_trailing_newline.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_structure_true_in_array.json create mode 100644 test/data/nst_json_testsuite2/test_parsing/y_structure_whitespace_array.json diff --git a/test/data/nst_json_testsuite2/LICENSE b/test/data/nst_json_testsuite2/LICENSE new file mode 100644 index 00000000..c4b3621d --- /dev/null +++ b/test/data/nst_json_testsuite2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Nicolas Seriot + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/test/data/nst_json_testsuite2/README.md b/test/data/nst_json_testsuite2/README.md new file mode 100644 index 00000000..775ccfd6 --- /dev/null +++ b/test/data/nst_json_testsuite2/README.md @@ -0,0 +1,55 @@ +# JSON Parsing Test Suite +A comprehensive test suite for RFC 8259 compliant JSON parsers + +This repository was created as an appendix to the article [Parsing JSON is a Minefield 💣](http://seriot.ch/parsing_json.php). + +**/parsers/** + +This directory contains several parsers and tiny wrappers to turn the parsers into JSON validators, by returning a specific value. + +- `0` the parser did accept the content +- `1` the parser did reject the content +- `>1` the process did crash +- `timeout` happens after 5 seconds + +**/test\_parsing/** + +The name of these files tell if their contents should be accepted or rejected. + +- `y_` content must be accepted by parsers +- `n_` content must be rejected by parsers +- `i_` parsers are free to accept or reject content + +**/test\_transform/** + +These files contain weird structures and characters that parsers may understand differently, eg: + +- huge numbers +- dictionaries with similar keys +- NULL characters +- escaped invalid strings + +These files were used to produce `results/transform.html`. + +**/run_tests.py** + +Run all parsers with all files: + + $ python3 run_tests.py + +Run all parsers with a specific file: + + $ python3 run_tests.py file.json + +Run specific parsers with all files: + + $ echo '["Python 2.7.10", "Python 3.5.2"]' > python_only.json + $ python3 run_tests.py --filter=python_only.json + +The script writes logs in `results/logs.txt`. + +The script then reads `logs.txt` and generates `results/parsing.html`. + +**/results/** + +JSON Parsing Tests diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json b/test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json new file mode 100644 index 00000000..ae4c7b71 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json @@ -0,0 +1 @@ +[123.456e-789] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json b/test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json new file mode 100644 index 00000000..9b5efa23 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json @@ -0,0 +1 @@ +[0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json b/test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json new file mode 100755 index 00000000..3abd58a5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json @@ -0,0 +1 @@ +[-1e+9999] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json b/test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json new file mode 100755 index 00000000..e10a7eb6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json @@ -0,0 +1 @@ +[1.5e+9999] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json b/test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json new file mode 100644 index 00000000..3d628a99 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json @@ -0,0 +1 @@ +[-123123e100000] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json b/test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json new file mode 100644 index 00000000..54d7d3dc --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json @@ -0,0 +1 @@ +[123123e100000] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json b/test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json new file mode 100644 index 00000000..c5236eb2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json @@ -0,0 +1 @@ +[123e-10000000] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json b/test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json new file mode 100644 index 00000000..dfa38461 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json @@ -0,0 +1 @@ +[-123123123123123123123123123123] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json b/test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json new file mode 100644 index 00000000..338a8c3c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json @@ -0,0 +1 @@ +[100000000000000000000] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json b/test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json new file mode 100755 index 00000000..e2d9738c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json @@ -0,0 +1 @@ +[-237462374673276894279832749832423479823246327846] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json b/test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json new file mode 100644 index 00000000..5be7ebaf --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json @@ -0,0 +1 @@ +{"\uDFAA":0} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json b/test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json new file mode 100644 index 00000000..3b9e37c6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json @@ -0,0 +1 @@ +["\uDADA"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json b/test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json new file mode 100644 index 00000000..48759283 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json @@ -0,0 +1 @@ +["\uD888\u1234"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_UTF-16LE_with_BOM.json b/test/data/nst_json_testsuite2/test_parsing/i_string_UTF-16LE_with_BOM.json new file mode 100644 index 0000000000000000000000000000000000000000..2a79c0629a49133d8f715bddbef19cfb3ef025bd GIT binary patch literal 12 ScmezWFPcG#;Uy5qG5`P~Km+3d literal 0 HcmV?d00001 diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json b/test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json new file mode 100755 index 00000000..e2a968a1 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json @@ -0,0 +1 @@ +["日ш"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json b/test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json new file mode 100644 index 00000000..916bff92 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json b/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json new file mode 100755 index 00000000..3cb11d22 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json @@ -0,0 +1 @@ +["\uD800\n"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json b/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json new file mode 100755 index 00000000..38ec23bb --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json @@ -0,0 +1 @@ +["\uDd1ea"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json b/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json new file mode 100755 index 00000000..c9cd6f6c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json @@ -0,0 +1 @@ +["\uD800\uD800\n"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json b/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json new file mode 100755 index 00000000..3abbd8d8 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json @@ -0,0 +1 @@ +["\ud800"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json b/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json new file mode 100755 index 00000000..ffddc04f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json @@ -0,0 +1 @@ +["\ud800abc"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json b/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json new file mode 100644 index 00000000..8e45a7ec --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json b/test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json new file mode 100755 index 00000000..0d5456cc --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json @@ -0,0 +1 @@ +["\uDd1e\uD834"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json b/test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json new file mode 100644 index 00000000..9389c982 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json b/test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json new file mode 100644 index 00000000..1dbd397f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json @@ -0,0 +1 @@ +["\uDFAA"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json b/test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json new file mode 100644 index 00000000..729337c0 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json b/test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json new file mode 100644 index 00000000..df90a291 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json b/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json new file mode 100644 index 00000000..c8cee5e0 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json b/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json new file mode 100755 index 00000000..9a91da79 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json b/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json new file mode 100755 index 00000000..d24fffdd --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json b/test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json new file mode 100644 index 00000000..63c7777f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_utf16BE_no_BOM.json b/test/data/nst_json_testsuite2/test_parsing/i_string_utf16BE_no_BOM.json new file mode 100644 index 0000000000000000000000000000000000000000..57e5392ff6309134268c7e3ec2a9289b99ff7148 GIT binary patch literal 10 PcmZRGW>8{y3B<7g33~zN literal 0 HcmV?d00001 diff --git a/test/data/nst_json_testsuite2/test_parsing/i_string_utf16LE_no_BOM.json b/test/data/nst_json_testsuite2/test_parsing/i_string_utf16LE_no_BOM.json new file mode 100644 index 0000000000000000000000000000000000000000..c49c1b25d8e5819591993d4d45e4649a46c1b3e0 GIT binary patch literal 10 Pcma!MP-1uq#IXzj3t$1} literal 0 HcmV?d00001 diff --git a/test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json b/test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json new file mode 100644 index 00000000..71184058 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json b/test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json new file mode 100755 index 00000000..22fdca1b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_1_true_without_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_1_true_without_comma.json new file mode 100644 index 00000000..c14e3f6b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_1_true_without_comma.json @@ -0,0 +1 @@ +[1 true] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_a_invalid_utf8.json b/test/data/nst_json_testsuite2/test_parsing/n_array_a_invalid_utf8.json new file mode 100644 index 00000000..38a86e2e --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_a_invalid_utf8.json @@ -0,0 +1 @@ +[a] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_colon_instead_of_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_colon_instead_of_comma.json new file mode 100644 index 00000000..0d02ad44 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_colon_instead_of_comma.json @@ -0,0 +1 @@ +["": 1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_comma_after_close.json b/test/data/nst_json_testsuite2/test_parsing/n_array_comma_after_close.json new file mode 100644 index 00000000..2ccba8d9 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_comma_after_close.json @@ -0,0 +1 @@ +[""], \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_comma_and_number.json b/test/data/nst_json_testsuite2/test_parsing/n_array_comma_and_number.json new file mode 100755 index 00000000..d2c84e37 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_comma_and_number.json @@ -0,0 +1 @@ +[,1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_double_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_double_comma.json new file mode 100755 index 00000000..0431712b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_double_comma.json @@ -0,0 +1 @@ +[1,,2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_double_extra_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_double_extra_comma.json new file mode 100644 index 00000000..3f01d312 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_double_extra_comma.json @@ -0,0 +1 @@ +["x",,] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_extra_close.json b/test/data/nst_json_testsuite2/test_parsing/n_array_extra_close.json new file mode 100644 index 00000000..c12f9fae --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_extra_close.json @@ -0,0 +1 @@ +["x"]] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_extra_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_extra_comma.json new file mode 100644 index 00000000..5f8ce18e --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_extra_comma.json @@ -0,0 +1 @@ +["",] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_incomplete.json b/test/data/nst_json_testsuite2/test_parsing/n_array_incomplete.json new file mode 100644 index 00000000..cc65b0b5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_incomplete.json @@ -0,0 +1 @@ +["x" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_incomplete_invalid_value.json b/test/data/nst_json_testsuite2/test_parsing/n_array_incomplete_invalid_value.json new file mode 100644 index 00000000..c21a8f6c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_incomplete_invalid_value.json @@ -0,0 +1 @@ +[x \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_inner_array_no_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_inner_array_no_comma.json new file mode 100644 index 00000000..c70b7164 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_inner_array_no_comma.json @@ -0,0 +1 @@ +[3[4]] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_invalid_utf8.json b/test/data/nst_json_testsuite2/test_parsing/n_array_invalid_utf8.json new file mode 100644 index 00000000..6099d344 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_invalid_utf8.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_items_separated_by_semicolon.json b/test/data/nst_json_testsuite2/test_parsing/n_array_items_separated_by_semicolon.json new file mode 100755 index 00000000..d4bd7314 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_items_separated_by_semicolon.json @@ -0,0 +1 @@ +[1:2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_just_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_just_comma.json new file mode 100755 index 00000000..9d7077c6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_just_comma.json @@ -0,0 +1 @@ +[,] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_just_minus.json b/test/data/nst_json_testsuite2/test_parsing/n_array_just_minus.json new file mode 100755 index 00000000..29501c6c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_just_minus.json @@ -0,0 +1 @@ +[-] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_missing_value.json b/test/data/nst_json_testsuite2/test_parsing/n_array_missing_value.json new file mode 100644 index 00000000..3a6ba86f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_missing_value.json @@ -0,0 +1 @@ +[ , ""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_newlines_unclosed.json b/test/data/nst_json_testsuite2/test_parsing/n_array_newlines_unclosed.json new file mode 100644 index 00000000..64668006 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_newlines_unclosed.json @@ -0,0 +1,3 @@ +["a", +4 +,1, \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_number_and_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_number_and_comma.json new file mode 100755 index 00000000..13f6f1d1 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_number_and_comma.json @@ -0,0 +1 @@ +[1,] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_number_and_several_commas.json b/test/data/nst_json_testsuite2/test_parsing/n_array_number_and_several_commas.json new file mode 100755 index 00000000..0ac408cb --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_number_and_several_commas.json @@ -0,0 +1 @@ +[1,,] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_spaces_vertical_tab_formfeed.json b/test/data/nst_json_testsuite2/test_parsing/n_array_spaces_vertical_tab_formfeed.json new file mode 100755 index 00000000..6cd7cf58 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_spaces_vertical_tab_formfeed.json @@ -0,0 +1 @@ +[" a"\f] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_star_inside.json b/test/data/nst_json_testsuite2/test_parsing/n_array_star_inside.json new file mode 100755 index 00000000..5a519464 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_star_inside.json @@ -0,0 +1 @@ +[*] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed.json b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed.json new file mode 100644 index 00000000..06073305 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed.json @@ -0,0 +1 @@ +["" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_trailing_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_trailing_comma.json new file mode 100644 index 00000000..6604698f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_trailing_comma.json @@ -0,0 +1 @@ +[1, \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_new_lines.json b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_new_lines.json new file mode 100644 index 00000000..4f61de3f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_new_lines.json @@ -0,0 +1,3 @@ +[1, +1 +,1 \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_object_inside.json b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_object_inside.json new file mode 100644 index 00000000..043a87e2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_object_inside.json @@ -0,0 +1 @@ +[{} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_incomplete_false.json b/test/data/nst_json_testsuite2/test_parsing/n_incomplete_false.json new file mode 100644 index 00000000..eb18c6a1 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_incomplete_false.json @@ -0,0 +1 @@ +[fals] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_incomplete_null.json b/test/data/nst_json_testsuite2/test_parsing/n_incomplete_null.json new file mode 100644 index 00000000..c18ef538 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_incomplete_null.json @@ -0,0 +1 @@ +[nul] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_incomplete_true.json b/test/data/nst_json_testsuite2/test_parsing/n_incomplete_true.json new file mode 100644 index 00000000..f451ac6d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_incomplete_true.json @@ -0,0 +1 @@ +[tru] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_multidigit_number_then_00.json b/test/data/nst_json_testsuite2/test_parsing/n_multidigit_number_then_00.json new file mode 100644 index 0000000000000000000000000000000000000000..c22507b864f7f089c91c1eb85b1b15cc63b943a6 GIT binary patch literal 4 LcmXpsGG+h(0mJ~8 literal 0 HcmV?d00001 diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_++.json b/test/data/nst_json_testsuite2/test_parsing/n_number_++.json new file mode 100644 index 00000000..bdb62aaf --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_++.json @@ -0,0 +1 @@ +[++1234] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_+1.json b/test/data/nst_json_testsuite2/test_parsing/n_number_+1.json new file mode 100755 index 00000000..3cbe58c9 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_+1.json @@ -0,0 +1 @@ +[+1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_+Inf.json b/test/data/nst_json_testsuite2/test_parsing/n_number_+Inf.json new file mode 100755 index 00000000..871ae14d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_+Inf.json @@ -0,0 +1 @@ +[+Inf] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_-01.json b/test/data/nst_json_testsuite2/test_parsing/n_number_-01.json new file mode 100755 index 00000000..0df32bac --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_-01.json @@ -0,0 +1 @@ +[-01] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_-1.0..json b/test/data/nst_json_testsuite2/test_parsing/n_number_-1.0..json new file mode 100755 index 00000000..7cf55a85 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_-1.0..json @@ -0,0 +1 @@ +[-1.0.] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_-2..json b/test/data/nst_json_testsuite2/test_parsing/n_number_-2..json new file mode 100755 index 00000000..9be84365 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_-2..json @@ -0,0 +1 @@ +[-2.] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_-NaN.json b/test/data/nst_json_testsuite2/test_parsing/n_number_-NaN.json new file mode 100755 index 00000000..f61615d4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_-NaN.json @@ -0,0 +1 @@ +[-NaN] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_.-1.json b/test/data/nst_json_testsuite2/test_parsing/n_number_.-1.json new file mode 100644 index 00000000..1c9f2dd1 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_.-1.json @@ -0,0 +1 @@ +[.-1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_.2e-3.json b/test/data/nst_json_testsuite2/test_parsing/n_number_.2e-3.json new file mode 100755 index 00000000..c6c976f2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_.2e-3.json @@ -0,0 +1 @@ +[.2e-3] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0.1.2.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0.1.2.json new file mode 100755 index 00000000..c83a2562 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0.1.2.json @@ -0,0 +1 @@ +[0.1.2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0.3e+.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0.3e+.json new file mode 100644 index 00000000..a55a1bfe --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0.3e+.json @@ -0,0 +1 @@ +[0.3e+] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0.3e.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0.3e.json new file mode 100644 index 00000000..3dd5df4b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0.3e.json @@ -0,0 +1 @@ +[0.3e] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0.e1.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0.e1.json new file mode 100644 index 00000000..c92c71cc --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0.e1.json @@ -0,0 +1 @@ +[0.e1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E+.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E+.json new file mode 100644 index 00000000..3ba2c7d6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E+.json @@ -0,0 +1 @@ +[0E+] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E.json new file mode 100755 index 00000000..5301840d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E.json @@ -0,0 +1 @@ +[0E] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0e+.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0e+.json new file mode 100644 index 00000000..8ab0bc4b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0e+.json @@ -0,0 +1 @@ +[0e+] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_0e.json b/test/data/nst_json_testsuite2/test_parsing/n_number_0e.json new file mode 100644 index 00000000..47ec421b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_0e.json @@ -0,0 +1 @@ +[0e] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e+.json b/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e+.json new file mode 100755 index 00000000..cd84b9f6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e+.json @@ -0,0 +1 @@ +[1.0e+] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e-.json b/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e-.json new file mode 100755 index 00000000..4eb7afa0 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e-.json @@ -0,0 +1 @@ +[1.0e-] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e.json b/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e.json new file mode 100755 index 00000000..21753f4c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_1.0e.json @@ -0,0 +1 @@ +[1.0e] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_1_000.json b/test/data/nst_json_testsuite2/test_parsing/n_number_1_000.json new file mode 100755 index 00000000..7b18b66b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_1_000.json @@ -0,0 +1 @@ +[1 000.0] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_1eE2.json b/test/data/nst_json_testsuite2/test_parsing/n_number_1eE2.json new file mode 100755 index 00000000..4318a341 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_1eE2.json @@ -0,0 +1 @@ +[1eE2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_2.e+3.json b/test/data/nst_json_testsuite2/test_parsing/n_number_2.e+3.json new file mode 100755 index 00000000..4442f394 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_2.e+3.json @@ -0,0 +1 @@ +[2.e+3] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_2.e-3.json b/test/data/nst_json_testsuite2/test_parsing/n_number_2.e-3.json new file mode 100755 index 00000000..a65060ed --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_2.e-3.json @@ -0,0 +1 @@ +[2.e-3] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_2.e3.json b/test/data/nst_json_testsuite2/test_parsing/n_number_2.e3.json new file mode 100755 index 00000000..66f7cf70 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_2.e3.json @@ -0,0 +1 @@ +[2.e3] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_9.e+.json b/test/data/nst_json_testsuite2/test_parsing/n_number_9.e+.json new file mode 100644 index 00000000..732a7b11 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_9.e+.json @@ -0,0 +1 @@ +[9.e+] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_Inf.json b/test/data/nst_json_testsuite2/test_parsing/n_number_Inf.json new file mode 100755 index 00000000..c40c734c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_Inf.json @@ -0,0 +1 @@ +[Inf] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_NaN.json b/test/data/nst_json_testsuite2/test_parsing/n_number_NaN.json new file mode 100755 index 00000000..49923179 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_NaN.json @@ -0,0 +1 @@ +[NaN] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_U+FF11_fullwidth_digit_one.json b/test/data/nst_json_testsuite2/test_parsing/n_number_U+FF11_fullwidth_digit_one.json new file mode 100644 index 00000000..b14587e5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_U+FF11_fullwidth_digit_one.json @@ -0,0 +1 @@ +[1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_expression.json b/test/data/nst_json_testsuite2/test_parsing/n_number_expression.json new file mode 100644 index 00000000..76fdbc8a --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_expression.json @@ -0,0 +1 @@ +[1+2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_hex_1_digit.json b/test/data/nst_json_testsuite2/test_parsing/n_number_hex_1_digit.json new file mode 100644 index 00000000..3b214880 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_hex_1_digit.json @@ -0,0 +1 @@ +[0x1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_hex_2_digits.json b/test/data/nst_json_testsuite2/test_parsing/n_number_hex_2_digits.json new file mode 100644 index 00000000..83e516ab --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_hex_2_digits.json @@ -0,0 +1 @@ +[0x42] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_infinity.json b/test/data/nst_json_testsuite2/test_parsing/n_number_infinity.json new file mode 100755 index 00000000..8c2baf78 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_infinity.json @@ -0,0 +1 @@ +[Infinity] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_invalid+-.json b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid+-.json new file mode 100644 index 00000000..1cce602b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid+-.json @@ -0,0 +1 @@ +[0e+-1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-negative-real.json b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-negative-real.json new file mode 100644 index 00000000..5fc3c1ef --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-negative-real.json @@ -0,0 +1 @@ +[-123.123foo] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-bigger-int.json b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-bigger-int.json new file mode 100644 index 00000000..3b97e580 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-bigger-int.json @@ -0,0 +1 @@ +[123] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-exponent.json b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-exponent.json new file mode 100644 index 00000000..ea35d723 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-exponent.json @@ -0,0 +1 @@ +[1e1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-int.json b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-int.json new file mode 100644 index 00000000..371226e4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-int.json @@ -0,0 +1 @@ +[0] diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_minus_infinity.json b/test/data/nst_json_testsuite2/test_parsing/n_number_minus_infinity.json new file mode 100755 index 00000000..cf4133d2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_minus_infinity.json @@ -0,0 +1 @@ +[-Infinity] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_minus_sign_with_trailing_garbage.json b/test/data/nst_json_testsuite2/test_parsing/n_number_minus_sign_with_trailing_garbage.json new file mode 100644 index 00000000..a6d8e78e --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_minus_sign_with_trailing_garbage.json @@ -0,0 +1 @@ +[-foo] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_minus_space_1.json b/test/data/nst_json_testsuite2/test_parsing/n_number_minus_space_1.json new file mode 100644 index 00000000..9a5ebedf --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_minus_space_1.json @@ -0,0 +1 @@ +[- 1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_neg_int_starting_with_zero.json b/test/data/nst_json_testsuite2/test_parsing/n_number_neg_int_starting_with_zero.json new file mode 100644 index 00000000..67af0960 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_neg_int_starting_with_zero.json @@ -0,0 +1 @@ +[-012] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_neg_real_without_int_part.json b/test/data/nst_json_testsuite2/test_parsing/n_number_neg_real_without_int_part.json new file mode 100755 index 00000000..1f2a4349 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_neg_real_without_int_part.json @@ -0,0 +1 @@ +[-.123] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_neg_with_garbage_at_end.json b/test/data/nst_json_testsuite2/test_parsing/n_number_neg_with_garbage_at_end.json new file mode 100644 index 00000000..2aa73119 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_neg_with_garbage_at_end.json @@ -0,0 +1 @@ +[-1x] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_real_garbage_after_e.json b/test/data/nst_json_testsuite2/test_parsing/n_number_real_garbage_after_e.json new file mode 100644 index 00000000..9213dfca --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_real_garbage_after_e.json @@ -0,0 +1 @@ +[1ea] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_real_with_invalid_utf8_after_e.json b/test/data/nst_json_testsuite2/test_parsing/n_number_real_with_invalid_utf8_after_e.json new file mode 100644 index 00000000..1e52ef96 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_real_with_invalid_utf8_after_e.json @@ -0,0 +1 @@ +[1e] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_real_without_fractional_part.json b/test/data/nst_json_testsuite2/test_parsing/n_number_real_without_fractional_part.json new file mode 100755 index 00000000..1de287cf --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_real_without_fractional_part.json @@ -0,0 +1 @@ +[1.] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_starting_with_dot.json b/test/data/nst_json_testsuite2/test_parsing/n_number_starting_with_dot.json new file mode 100755 index 00000000..f682dbdc --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_starting_with_dot.json @@ -0,0 +1 @@ +[.123] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha.json b/test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha.json new file mode 100644 index 00000000..1e42d818 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha.json @@ -0,0 +1 @@ +[1.2a-3] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha_char.json b/test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha_char.json new file mode 100644 index 00000000..b79daccb --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha_char.json @@ -0,0 +1 @@ +[1.8011670033376514H-308] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_number_with_leading_zero.json b/test/data/nst_json_testsuite2/test_parsing/n_number_with_leading_zero.json new file mode 100755 index 00000000..7106da1f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_number_with_leading_zero.json @@ -0,0 +1 @@ +[012] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_bad_value.json b/test/data/nst_json_testsuite2/test_parsing/n_object_bad_value.json new file mode 100644 index 00000000..a03a8c03 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_bad_value.json @@ -0,0 +1 @@ +["x", truth] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_bracket_key.json b/test/data/nst_json_testsuite2/test_parsing/n_object_bracket_key.json new file mode 100644 index 00000000..cc443b48 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_bracket_key.json @@ -0,0 +1 @@ +{[: "x"} diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_comma_instead_of_colon.json b/test/data/nst_json_testsuite2/test_parsing/n_object_comma_instead_of_colon.json new file mode 100644 index 00000000..8d563770 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_comma_instead_of_colon.json @@ -0,0 +1 @@ +{"x", null} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_double_colon.json b/test/data/nst_json_testsuite2/test_parsing/n_object_double_colon.json new file mode 100644 index 00000000..80e8c7b8 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_double_colon.json @@ -0,0 +1 @@ +{"x"::"b"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_emoji.json b/test/data/nst_json_testsuite2/test_parsing/n_object_emoji.json new file mode 100644 index 00000000..cb4078ea --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_emoji.json @@ -0,0 +1 @@ +{🇨🇭} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_garbage_at_end.json b/test/data/nst_json_testsuite2/test_parsing/n_object_garbage_at_end.json new file mode 100644 index 00000000..80c42cba --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_garbage_at_end.json @@ -0,0 +1 @@ +{"a":"a" 123} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_key_with_single_quotes.json b/test/data/nst_json_testsuite2/test_parsing/n_object_key_with_single_quotes.json new file mode 100755 index 00000000..77c32759 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_key_with_single_quotes.json @@ -0,0 +1 @@ +{key: 'value'} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_lone_continuation_byte_in_key_and_trailing_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_object_lone_continuation_byte_in_key_and_trailing_comma.json new file mode 100644 index 00000000..aa2cb637 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_lone_continuation_byte_in_key_and_trailing_comma.json @@ -0,0 +1 @@ +{"":"0",} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_missing_colon.json b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_colon.json new file mode 100644 index 00000000..b98eff62 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_colon.json @@ -0,0 +1 @@ +{"a" b} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_missing_key.json b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_key.json new file mode 100755 index 00000000..b4fb0f52 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_key.json @@ -0,0 +1 @@ +{:"b"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_missing_semicolon.json b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_semicolon.json new file mode 100755 index 00000000..e3451384 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_semicolon.json @@ -0,0 +1 @@ +{"a" "b"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_missing_value.json b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_value.json new file mode 100644 index 00000000..3ef538a6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_missing_value.json @@ -0,0 +1 @@ +{"a": \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_no-colon.json b/test/data/nst_json_testsuite2/test_parsing/n_object_no-colon.json new file mode 100644 index 00000000..f3797b35 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_no-colon.json @@ -0,0 +1 @@ +{"a" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key.json b/test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key.json new file mode 100755 index 00000000..b9945b34 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key.json @@ -0,0 +1 @@ +{1:1} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key_but_huge_number_instead.json b/test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key_but_huge_number_instead.json new file mode 100755 index 00000000..b37fa86c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key_but_huge_number_instead.json @@ -0,0 +1 @@ +{9999E9999:1} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_repeated_null_null.json b/test/data/nst_json_testsuite2/test_parsing/n_object_repeated_null_null.json new file mode 100755 index 00000000..f7d2959d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_repeated_null_null.json @@ -0,0 +1 @@ +{null:null,null:null} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_several_trailing_commas.json b/test/data/nst_json_testsuite2/test_parsing/n_object_several_trailing_commas.json new file mode 100755 index 00000000..3c9afe8d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_several_trailing_commas.json @@ -0,0 +1 @@ +{"id":0,,,,,} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_single_quote.json b/test/data/nst_json_testsuite2/test_parsing/n_object_single_quote.json new file mode 100644 index 00000000..e5cdf976 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_single_quote.json @@ -0,0 +1 @@ +{'a':0} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comma.json new file mode 100755 index 00000000..a4b02509 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comma.json @@ -0,0 +1 @@ +{"id":0,} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment.json b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment.json new file mode 100644 index 00000000..a372c655 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment.json @@ -0,0 +1 @@ +{"a":"b"}/**/ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_open.json b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_open.json new file mode 100644 index 00000000..d557f41c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_open.json @@ -0,0 +1 @@ +{"a":"b"}/**// \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open.json b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open.json new file mode 100644 index 00000000..e335136c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open.json @@ -0,0 +1 @@ +{"a":"b"}// \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open_incomplete.json b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open_incomplete.json new file mode 100644 index 00000000..d892e49f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open_incomplete.json @@ -0,0 +1 @@ +{"a":"b"}/ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_two_commas_in_a_row.json b/test/data/nst_json_testsuite2/test_parsing/n_object_two_commas_in_a_row.json new file mode 100755 index 00000000..7c639ae6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_two_commas_in_a_row.json @@ -0,0 +1 @@ +{"a":"b",,"c":"d"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_unquoted_key.json b/test/data/nst_json_testsuite2/test_parsing/n_object_unquoted_key.json new file mode 100644 index 00000000..8ba13729 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_unquoted_key.json @@ -0,0 +1 @@ +{a: "b"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_unterminated-value.json b/test/data/nst_json_testsuite2/test_parsing/n_object_unterminated-value.json new file mode 100644 index 00000000..7fe699a6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_unterminated-value.json @@ -0,0 +1 @@ +{"a":"a \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_with_single_string.json b/test/data/nst_json_testsuite2/test_parsing/n_object_with_single_string.json new file mode 100644 index 00000000..d63f7fbb --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_with_single_string.json @@ -0,0 +1 @@ +{ "foo" : "bar", "a" } \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_object_with_trailing_garbage.json b/test/data/nst_json_testsuite2/test_parsing/n_object_with_trailing_garbage.json new file mode 100644 index 00000000..787c8f0a --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_object_with_trailing_garbage.json @@ -0,0 +1 @@ +{"a":"b"}# \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_single_space.json b/test/data/nst_json_testsuite2/test_parsing/n_single_space.json new file mode 100755 index 00000000..0519ecba --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_single_space.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape.json b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape.json new file mode 100644 index 00000000..acec66d8 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape.json @@ -0,0 +1 @@ +["\uD800\"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u.json b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u.json new file mode 100644 index 00000000..e834b05e --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u.json @@ -0,0 +1 @@ +["\uD800\u"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1.json b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1.json new file mode 100644 index 00000000..a04cd348 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1.json @@ -0,0 +1 @@ +["\uD800\u1"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1x.json b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1x.json new file mode 100644 index 00000000..bfbd2340 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1x.json @@ -0,0 +1 @@ +["\uD800\u1x"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_accentuated_char_no_quotes.json b/test/data/nst_json_testsuite2/test_parsing/n_string_accentuated_char_no_quotes.json new file mode 100644 index 00000000..fd689569 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_accentuated_char_no_quotes.json @@ -0,0 +1 @@ +[é] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_backslash_00.json b/test/data/nst_json_testsuite2/test_parsing/n_string_backslash_00.json new file mode 100644 index 0000000000000000000000000000000000000000..b5bf267b5d4ee922d20cec1543b66d1530ff76cf GIT binary patch literal 6 Ncma!6ieXTS1pox&0a*Y5 literal 0 HcmV?d00001 diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_escape_x.json b/test/data/nst_json_testsuite2/test_parsing/n_string_escape_x.json new file mode 100644 index 00000000..fae29193 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_escape_x.json @@ -0,0 +1 @@ +["\x00"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_backslash_bad.json b/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_backslash_bad.json new file mode 100755 index 00000000..016fcb47 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_backslash_bad.json @@ -0,0 +1 @@ +["\\\"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_ctrl_char_tab.json b/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_ctrl_char_tab.json new file mode 100644 index 00000000..f35ea382 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_ctrl_char_tab.json @@ -0,0 +1 @@ +["\ "] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_emoji.json b/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_emoji.json new file mode 100644 index 00000000..a2777542 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_escaped_emoji.json @@ -0,0 +1 @@ +["\🌀"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escape.json b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escape.json new file mode 100755 index 00000000..3415c33c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escape.json @@ -0,0 +1 @@ +["\"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escaped_character.json b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escaped_character.json new file mode 100755 index 00000000..0f2197ea --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escaped_character.json @@ -0,0 +1 @@ +["\u00A"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate.json b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate.json new file mode 100755 index 00000000..75504a65 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate.json @@ -0,0 +1 @@ +["\uD834\uDd"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate_escape_invalid.json b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate_escape_invalid.json new file mode 100755 index 00000000..bd965606 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate_escape_invalid.json @@ -0,0 +1 @@ +["\uD800\uD800\x"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_invalid-utf-8-in-escape.json b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid-utf-8-in-escape.json new file mode 100644 index 00000000..0c430064 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid-utf-8-in-escape.json @@ -0,0 +1 @@ +["\u"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_backslash_esc.json b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_backslash_esc.json new file mode 100755 index 00000000..d1eb6092 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_backslash_esc.json @@ -0,0 +1 @@ +["\a"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_unicode_escape.json b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_unicode_escape.json new file mode 100644 index 00000000..7608cb6b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_unicode_escape.json @@ -0,0 +1 @@ +["\uqqqq"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_utf8_after_escape.json b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_utf8_after_escape.json new file mode 100644 index 00000000..2f757a25 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_invalid_utf8_after_escape.json @@ -0,0 +1 @@ +["\"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_leading_uescaped_thinspace.json b/test/data/nst_json_testsuite2/test_parsing/n_string_leading_uescaped_thinspace.json new file mode 100755 index 00000000..7b297c63 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_leading_uescaped_thinspace.json @@ -0,0 +1 @@ +[\u0020"asd"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_no_quotes_with_bad_escape.json b/test/data/nst_json_testsuite2/test_parsing/n_string_no_quotes_with_bad_escape.json new file mode 100644 index 00000000..01bc70ab --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_no_quotes_with_bad_escape.json @@ -0,0 +1 @@ +[\n] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_single_doublequote.json b/test/data/nst_json_testsuite2/test_parsing/n_string_single_doublequote.json new file mode 100755 index 00000000..9d68933c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_single_doublequote.json @@ -0,0 +1 @@ +" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_single_quote.json b/test/data/nst_json_testsuite2/test_parsing/n_string_single_quote.json new file mode 100644 index 00000000..caff239b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_single_quote.json @@ -0,0 +1 @@ +['single quote'] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_single_string_no_double_quotes.json b/test/data/nst_json_testsuite2/test_parsing/n_string_single_string_no_double_quotes.json new file mode 100755 index 00000000..f2ba8f84 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_single_string_no_double_quotes.json @@ -0,0 +1 @@ +abc \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_start_escape_unclosed.json b/test/data/nst_json_testsuite2/test_parsing/n_string_start_escape_unclosed.json new file mode 100644 index 00000000..db62a46f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_start_escape_unclosed.json @@ -0,0 +1 @@ +["\ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_crtl_char.json b/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_crtl_char.json new file mode 100755 index 0000000000000000000000000000000000000000..9f21348071d3d736bdd469f159cea674c09237af GIT binary patch literal 7 Ocma!6N@Pe>iUj}$`2oKG literal 0 HcmV?d00001 diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_newline.json b/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_newline.json new file mode 100644 index 00000000..700d3608 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_newline.json @@ -0,0 +1,2 @@ +["new +line"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_tab.json b/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_tab.json new file mode 100644 index 00000000..160264a2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_tab.json @@ -0,0 +1 @@ +[" "] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_unicode_CapitalU.json b/test/data/nst_json_testsuite2/test_parsing/n_string_unicode_CapitalU.json new file mode 100644 index 00000000..17332bb1 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_unicode_CapitalU.json @@ -0,0 +1 @@ +"\UA66D" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_string_with_trailing_garbage.json b/test/data/nst_json_testsuite2/test_parsing/n_string_with_trailing_garbage.json new file mode 100644 index 00000000..efe3bd27 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_string_with_trailing_garbage.json @@ -0,0 +1 @@ +""x \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json new file mode 100644 index 00000000..a4823eec --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_U+2060_word_joined.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_U+2060_word_joined.json new file mode 100644 index 00000000..81156a69 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_U+2060_word_joined.json @@ -0,0 +1 @@ +[⁠] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_UTF8_BOM_no_data.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_UTF8_BOM_no_data.json new file mode 100755 index 00000000..5f282702 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_UTF8_BOM_no_data.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_..json b/test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_..json new file mode 100755 index 00000000..a56fef0b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_..json @@ -0,0 +1 @@ +<.> \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_null.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_null.json new file mode 100755 index 00000000..617f2625 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_null.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_array_trailing_garbage.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_array_trailing_garbage.json new file mode 100644 index 00000000..5a745e6f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_array_trailing_garbage.json @@ -0,0 +1 @@ +[1]x \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_extra_array_close.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_extra_array_close.json new file mode 100755 index 00000000..6cfb1398 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_extra_array_close.json @@ -0,0 +1 @@ +[1]] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_unclosed_string.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_unclosed_string.json new file mode 100755 index 00000000..ba6b1788 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_unclosed_string.json @@ -0,0 +1 @@ +["asd] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_ascii-unicode-identifier.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_ascii-unicode-identifier.json new file mode 100644 index 00000000..ef2ab62f --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_ascii-unicode-identifier.json @@ -0,0 +1 @@ +aå \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_capitalized_True.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_capitalized_True.json new file mode 100755 index 00000000..7cd88469 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_capitalized_True.json @@ -0,0 +1 @@ +[True] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_close_unopened_array.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_close_unopened_array.json new file mode 100755 index 00000000..d2af0c64 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_close_unopened_array.json @@ -0,0 +1 @@ +1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_comma_instead_of_closing_brace.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_comma_instead_of_closing_brace.json new file mode 100644 index 00000000..ac61b820 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_comma_instead_of_closing_brace.json @@ -0,0 +1 @@ +{"x": true, \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_double_array.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_double_array.json new file mode 100755 index 00000000..058d1626 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_double_array.json @@ -0,0 +1 @@ +[][] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_end_array.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_end_array.json new file mode 100644 index 00000000..54caf60b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_end_array.json @@ -0,0 +1 @@ +] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_incomplete_UTF8_BOM.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_incomplete_UTF8_BOM.json new file mode 100755 index 00000000..bfcdd514 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_incomplete_UTF8_BOM.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_lone-invalid-utf-8.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_lone-invalid-utf-8.json new file mode 100644 index 00000000..8b1296ca --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_lone-invalid-utf-8.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_lone-open-bracket.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_lone-open-bracket.json new file mode 100644 index 00000000..8e2f0bef --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_lone-open-bracket.json @@ -0,0 +1 @@ +[ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_no_data.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_no_data.json new file mode 100644 index 00000000..e69de29b diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_null-byte-outside-string.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_null-byte-outside-string.json new file mode 100644 index 0000000000000000000000000000000000000000..326db14422a756e9bd39221edf37b844cb8471c7 GIT binary patch literal 3 Kcma!Mhy?%vaR9jh literal 0 HcmV?d00001 diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_number_with_trailing_garbage.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_number_with_trailing_garbage.json new file mode 100644 index 00000000..0746539d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_number_with_trailing_garbage.json @@ -0,0 +1 @@ +2@ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_object_followed_by_closing_object.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_followed_by_closing_object.json new file mode 100644 index 00000000..aa9ebaec --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_followed_by_closing_object.json @@ -0,0 +1 @@ +{}} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_object_unclosed_no_value.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_unclosed_no_value.json new file mode 100644 index 00000000..17d04514 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_unclosed_no_value.json @@ -0,0 +1 @@ +{"": \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_comment.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_comment.json new file mode 100644 index 00000000..ed1b569b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_comment.json @@ -0,0 +1 @@ +{"a":/*comment*/"b"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_trailing_garbage.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_trailing_garbage.json new file mode 100644 index 00000000..9ca2336d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_trailing_garbage.json @@ -0,0 +1 @@ +{"a": true} "x" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_apostrophe.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_apostrophe.json new file mode 100644 index 00000000..8bebe3af --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_apostrophe.json @@ -0,0 +1 @@ +[' \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_comma.json new file mode 100644 index 00000000..6295fdc3 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_comma.json @@ -0,0 +1 @@ +[, \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json new file mode 100644 index 00000000..e870445b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json @@ -0,0 +1 @@ +[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"":[{"": diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_object.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_object.json new file mode 100644 index 00000000..7a63c8c5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_object.json @@ -0,0 +1 @@ +[{ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_string.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_string.json new file mode 100644 index 00000000..9822a6ba --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_string.json @@ -0,0 +1 @@ +["a \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_string.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_string.json new file mode 100644 index 00000000..42a61936 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_string.json @@ -0,0 +1 @@ +["a" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object.json new file mode 100644 index 00000000..81750b96 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object.json @@ -0,0 +1 @@ +{ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_close_array.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_close_array.json new file mode 100755 index 00000000..eebc700a --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_close_array.json @@ -0,0 +1 @@ +{] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_comma.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_comma.json new file mode 100644 index 00000000..47bc9106 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_comma.json @@ -0,0 +1 @@ +{, \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_array.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_array.json new file mode 100644 index 00000000..381ede5d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_array.json @@ -0,0 +1 @@ +{[ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_string.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_string.json new file mode 100644 index 00000000..328c30cd --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_string.json @@ -0,0 +1 @@ +{"a \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_string_with_apostrophes.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_string_with_apostrophes.json new file mode 100644 index 00000000..9dba1709 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_string_with_apostrophes.json @@ -0,0 +1 @@ +{'a' \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_open_open.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_open.json new file mode 100644 index 00000000..841fd5f8 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_open_open.json @@ -0,0 +1 @@ +["\{["\{["\{["\{ \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_single_eacute.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_single_eacute.json new file mode 100644 index 00000000..92a39f39 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_single_eacute.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_single_star.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_single_star.json new file mode 100755 index 00000000..f59ec20a --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_single_star.json @@ -0,0 +1 @@ +* \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_trailing_#.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_trailing_#.json new file mode 100644 index 00000000..89861108 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_trailing_#.json @@ -0,0 +1 @@ +{"a":"b"}#{} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_uescaped_LF_before_string.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_uescaped_LF_before_string.json new file mode 100755 index 00000000..df2f0f24 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_uescaped_LF_before_string.json @@ -0,0 +1 @@ +[\u000A""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array.json new file mode 100755 index 00000000..11209515 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array.json @@ -0,0 +1 @@ +[1 \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_partial_null.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_partial_null.json new file mode 100644 index 00000000..0d591762 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_partial_null.json @@ -0,0 +1 @@ +[ false, nul \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_false.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_false.json new file mode 100644 index 00000000..a2ff8504 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_false.json @@ -0,0 +1 @@ +[ true, fals \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_true.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_true.json new file mode 100644 index 00000000..3149e8f5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_true.json @@ -0,0 +1 @@ +[ false, tru \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_object.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_object.json new file mode 100755 index 00000000..694d69db --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_object.json @@ -0,0 +1 @@ +{"asd":"asd" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_unicode-identifier.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_unicode-identifier.json new file mode 100644 index 00000000..7284aea3 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_unicode-identifier.json @@ -0,0 +1 @@ +å \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_U+2060_word_joiner.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_U+2060_word_joiner.json new file mode 100755 index 00000000..81156a69 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_U+2060_word_joiner.json @@ -0,0 +1 @@ +[⁠] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_formfeed.json b/test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_formfeed.json new file mode 100755 index 00000000..a9ea535d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_formfeed.json @@ -0,0 +1 @@ +[ ] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_arraysWithSpaces.json b/test/data/nst_json_testsuite2/test_parsing/y_array_arraysWithSpaces.json new file mode 100755 index 00000000..58229079 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_arraysWithSpaces.json @@ -0,0 +1 @@ +[[] ] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_empty-string.json b/test/data/nst_json_testsuite2/test_parsing/y_array_empty-string.json new file mode 100644 index 00000000..93b6be2b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_empty-string.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_empty.json b/test/data/nst_json_testsuite2/test_parsing/y_array_empty.json new file mode 100755 index 00000000..0637a088 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_ending_with_newline.json b/test/data/nst_json_testsuite2/test_parsing/y_array_ending_with_newline.json new file mode 100755 index 00000000..eac5f7b4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_ending_with_newline.json @@ -0,0 +1 @@ +["a"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_false.json b/test/data/nst_json_testsuite2/test_parsing/y_array_false.json new file mode 100644 index 00000000..67b2f076 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_false.json @@ -0,0 +1 @@ +[false] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_heterogeneous.json b/test/data/nst_json_testsuite2/test_parsing/y_array_heterogeneous.json new file mode 100755 index 00000000..d3c1e264 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_heterogeneous.json @@ -0,0 +1 @@ +[null, 1, "1", {}] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_null.json b/test/data/nst_json_testsuite2/test_parsing/y_array_null.json new file mode 100644 index 00000000..500db4a8 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_null.json @@ -0,0 +1 @@ +[null] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_with_1_and_newline.json b/test/data/nst_json_testsuite2/test_parsing/y_array_with_1_and_newline.json new file mode 100644 index 00000000..99482550 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_with_1_and_newline.json @@ -0,0 +1,2 @@ +[1 +] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_with_leading_space.json b/test/data/nst_json_testsuite2/test_parsing/y_array_with_leading_space.json new file mode 100755 index 00000000..18bfe642 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_with_leading_space.json @@ -0,0 +1 @@ + [1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_with_several_null.json b/test/data/nst_json_testsuite2/test_parsing/y_array_with_several_null.json new file mode 100755 index 00000000..99f6c5d1 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_with_several_null.json @@ -0,0 +1 @@ +[1,null,null,null,2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_array_with_trailing_space.json b/test/data/nst_json_testsuite2/test_parsing/y_array_with_trailing_space.json new file mode 100755 index 00000000..de9e7a94 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_array_with_trailing_space.json @@ -0,0 +1 @@ +[2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number.json b/test/data/nst_json_testsuite2/test_parsing/y_number.json new file mode 100644 index 00000000..e5f5cc33 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number.json @@ -0,0 +1 @@ +[123e65] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_0e+1.json b/test/data/nst_json_testsuite2/test_parsing/y_number_0e+1.json new file mode 100755 index 00000000..d1d39670 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_0e+1.json @@ -0,0 +1 @@ +[0e+1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_0e1.json b/test/data/nst_json_testsuite2/test_parsing/y_number_0e1.json new file mode 100755 index 00000000..3283a793 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_0e1.json @@ -0,0 +1 @@ +[0e1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_after_space.json b/test/data/nst_json_testsuite2/test_parsing/y_number_after_space.json new file mode 100644 index 00000000..623570d9 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_after_space.json @@ -0,0 +1 @@ +[ 4] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_double_close_to_zero.json b/test/data/nst_json_testsuite2/test_parsing/y_number_double_close_to_zero.json new file mode 100755 index 00000000..96555ff7 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_double_close_to_zero.json @@ -0,0 +1 @@ +[-0.000000000000000000000000000000000000000000000000000000000000000000000000000001] diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_int_with_exp.json b/test/data/nst_json_testsuite2/test_parsing/y_number_int_with_exp.json new file mode 100755 index 00000000..a4ca9e75 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_int_with_exp.json @@ -0,0 +1 @@ +[20e1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_minus_zero.json b/test/data/nst_json_testsuite2/test_parsing/y_number_minus_zero.json new file mode 100755 index 00000000..37af1312 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_minus_zero.json @@ -0,0 +1 @@ +[-0] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_negative_int.json b/test/data/nst_json_testsuite2/test_parsing/y_number_negative_int.json new file mode 100644 index 00000000..8e30f8bd --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_negative_int.json @@ -0,0 +1 @@ +[-123] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_negative_one.json b/test/data/nst_json_testsuite2/test_parsing/y_number_negative_one.json new file mode 100644 index 00000000..99d21a2a --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_negative_one.json @@ -0,0 +1 @@ +[-1] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_negative_zero.json b/test/data/nst_json_testsuite2/test_parsing/y_number_negative_zero.json new file mode 100644 index 00000000..37af1312 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_negative_zero.json @@ -0,0 +1 @@ +[-0] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e.json b/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e.json new file mode 100644 index 00000000..6edbdfcb --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e.json @@ -0,0 +1 @@ +[1E22] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_neg_exp.json b/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_neg_exp.json new file mode 100644 index 00000000..0a01bd3e --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_neg_exp.json @@ -0,0 +1 @@ +[1E-2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_pos_exp.json b/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_pos_exp.json new file mode 100644 index 00000000..5a8fc097 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_pos_exp.json @@ -0,0 +1 @@ +[1E+2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_real_exponent.json b/test/data/nst_json_testsuite2/test_parsing/y_number_real_exponent.json new file mode 100644 index 00000000..da2522d6 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_real_exponent.json @@ -0,0 +1 @@ +[123e45] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_real_fraction_exponent.json b/test/data/nst_json_testsuite2/test_parsing/y_number_real_fraction_exponent.json new file mode 100644 index 00000000..3944a7a4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_real_fraction_exponent.json @@ -0,0 +1 @@ +[123.456e78] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_real_neg_exp.json b/test/data/nst_json_testsuite2/test_parsing/y_number_real_neg_exp.json new file mode 100644 index 00000000..ca40d3c2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_real_neg_exp.json @@ -0,0 +1 @@ +[1e-2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_real_pos_exponent.json b/test/data/nst_json_testsuite2/test_parsing/y_number_real_pos_exponent.json new file mode 100644 index 00000000..343601d5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_real_pos_exponent.json @@ -0,0 +1 @@ +[1e+2] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_simple_int.json b/test/data/nst_json_testsuite2/test_parsing/y_number_simple_int.json new file mode 100644 index 00000000..e47f69af --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_simple_int.json @@ -0,0 +1 @@ +[123] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_number_simple_real.json b/test/data/nst_json_testsuite2/test_parsing/y_number_simple_real.json new file mode 100644 index 00000000..b02878e5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_number_simple_real.json @@ -0,0 +1 @@ +[123.456789] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object.json b/test/data/nst_json_testsuite2/test_parsing/y_object.json new file mode 100755 index 00000000..78262eda --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object.json @@ -0,0 +1 @@ +{"asd":"sdf", "dfg":"fgh"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_basic.json b/test/data/nst_json_testsuite2/test_parsing/y_object_basic.json new file mode 100755 index 00000000..646bbe7b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_basic.json @@ -0,0 +1 @@ +{"asd":"sdf"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key.json b/test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key.json new file mode 100755 index 00000000..bbc2e1ce --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key.json @@ -0,0 +1 @@ +{"a":"b","a":"c"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key_and_value.json b/test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key_and_value.json new file mode 100755 index 00000000..211581c2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key_and_value.json @@ -0,0 +1 @@ +{"a":"b","a":"b"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_empty.json b/test/data/nst_json_testsuite2/test_parsing/y_object_empty.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_empty.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_empty_key.json b/test/data/nst_json_testsuite2/test_parsing/y_object_empty_key.json new file mode 100755 index 00000000..c0013d3b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_empty_key.json @@ -0,0 +1 @@ +{"":0} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_escaped_null_in_key.json b/test/data/nst_json_testsuite2/test_parsing/y_object_escaped_null_in_key.json new file mode 100644 index 00000000..593f0f67 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_escaped_null_in_key.json @@ -0,0 +1 @@ +{"foo\u0000bar": 42} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_extreme_numbers.json b/test/data/nst_json_testsuite2/test_parsing/y_object_extreme_numbers.json new file mode 100644 index 00000000..a0d3531c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_extreme_numbers.json @@ -0,0 +1 @@ +{ "min": -1.0e+28, "max": 1.0e+28 } \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_long_strings.json b/test/data/nst_json_testsuite2/test_parsing/y_object_long_strings.json new file mode 100644 index 00000000..bdc4a087 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_long_strings.json @@ -0,0 +1 @@ +{"x":[{"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_simple.json b/test/data/nst_json_testsuite2/test_parsing/y_object_simple.json new file mode 100644 index 00000000..dacac917 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_simple.json @@ -0,0 +1 @@ +{"a":[]} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_string_unicode.json b/test/data/nst_json_testsuite2/test_parsing/y_object_string_unicode.json new file mode 100644 index 00000000..8effdb29 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_string_unicode.json @@ -0,0 +1 @@ +{"title":"\u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0417\u0435\u043c\u043b\u0435\u043a\u043e\u043f\u0430" } \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_object_with_newlines.json b/test/data/nst_json_testsuite2/test_parsing/y_object_with_newlines.json new file mode 100644 index 00000000..246ec6b3 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_object_with_newlines.json @@ -0,0 +1,3 @@ +{ +"a": "b" +} \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json b/test/data/nst_json_testsuite2/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json new file mode 100755 index 00000000..9967ddeb --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json @@ -0,0 +1 @@ +["\u0060\u012a\u12AB"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pair.json b/test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pair.json new file mode 100755 index 00000000..996875cc --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pair.json @@ -0,0 +1 @@ +["\uD801\udc37"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pairs.json b/test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pairs.json new file mode 100755 index 00000000..3401021e --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pairs.json @@ -0,0 +1 @@ +["\ud83d\ude39\ud83d\udc8d"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_allowed_escapes.json b/test/data/nst_json_testsuite2/test_parsing/y_string_allowed_escapes.json new file mode 100644 index 00000000..7f495532 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_allowed_escapes.json @@ -0,0 +1 @@ +["\"\\\/\b\f\n\r\t"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_backslash_and_u_escaped_zero.json b/test/data/nst_json_testsuite2/test_parsing/y_string_backslash_and_u_escaped_zero.json new file mode 100755 index 00000000..d4439eda --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_backslash_and_u_escaped_zero.json @@ -0,0 +1 @@ +["\\u0000"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_backslash_doublequotes.json b/test/data/nst_json_testsuite2/test_parsing/y_string_backslash_doublequotes.json new file mode 100644 index 00000000..ae03243b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_backslash_doublequotes.json @@ -0,0 +1 @@ +["\""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_comments.json b/test/data/nst_json_testsuite2/test_parsing/y_string_comments.json new file mode 100644 index 00000000..2260c20c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_comments.json @@ -0,0 +1 @@ +["a/*b*/c/*d//e"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_a.json b/test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_a.json new file mode 100644 index 00000000..6715d6f4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_a.json @@ -0,0 +1 @@ +["\\a"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_n.json b/test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_n.json new file mode 100644 index 00000000..44ca56c4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_n.json @@ -0,0 +1 @@ +["\\n"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_escaped_control_character.json b/test/data/nst_json_testsuite2/test_parsing/y_string_escaped_control_character.json new file mode 100644 index 00000000..5b014a9c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_escaped_control_character.json @@ -0,0 +1 @@ +["\u0012"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_escaped_noncharacter.json b/test/data/nst_json_testsuite2/test_parsing/y_string_escaped_noncharacter.json new file mode 100755 index 00000000..2ff52e2c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_escaped_noncharacter.json @@ -0,0 +1 @@ +["\uFFFF"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_in_array.json b/test/data/nst_json_testsuite2/test_parsing/y_string_in_array.json new file mode 100755 index 00000000..21d7ae4c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_in_array.json @@ -0,0 +1 @@ +["asd"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_in_array_with_leading_space.json b/test/data/nst_json_testsuite2/test_parsing/y_string_in_array_with_leading_space.json new file mode 100755 index 00000000..9e1887c1 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_in_array_with_leading_space.json @@ -0,0 +1 @@ +[ "asd"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_last_surrogates_1_and_2.json b/test/data/nst_json_testsuite2/test_parsing/y_string_last_surrogates_1_and_2.json new file mode 100644 index 00000000..3919cef7 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_last_surrogates_1_and_2.json @@ -0,0 +1 @@ +["\uDBFF\uDFFF"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_nbsp_uescaped.json b/test/data/nst_json_testsuite2/test_parsing/y_string_nbsp_uescaped.json new file mode 100644 index 00000000..2085ab1a --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_nbsp_uescaped.json @@ -0,0 +1 @@ +["new\u00A0line"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json b/test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json new file mode 100755 index 00000000..059e4d9d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json @@ -0,0 +1 @@ +["􏿿"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json b/test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json new file mode 100755 index 00000000..4c913bd4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json @@ -0,0 +1 @@ +["￿"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_null_escape.json b/test/data/nst_json_testsuite2/test_parsing/y_string_null_escape.json new file mode 100644 index 00000000..c1ad8440 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_null_escape.json @@ -0,0 +1 @@ +["\u0000"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_one-byte-utf-8.json b/test/data/nst_json_testsuite2/test_parsing/y_string_one-byte-utf-8.json new file mode 100644 index 00000000..15718592 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_one-byte-utf-8.json @@ -0,0 +1 @@ +["\u002c"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_pi.json b/test/data/nst_json_testsuite2/test_parsing/y_string_pi.json new file mode 100644 index 00000000..9df11ae8 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_pi.json @@ -0,0 +1 @@ +["π"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_reservedCharacterInUTF-8_U+1BFFF.json b/test/data/nst_json_testsuite2/test_parsing/y_string_reservedCharacterInUTF-8_U+1BFFF.json new file mode 100755 index 00000000..10a33a17 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_reservedCharacterInUTF-8_U+1BFFF.json @@ -0,0 +1 @@ +["𛿿"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_simple_ascii.json b/test/data/nst_json_testsuite2/test_parsing/y_string_simple_ascii.json new file mode 100644 index 00000000..8cadf7d0 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_simple_ascii.json @@ -0,0 +1 @@ +["asd "] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_space.json b/test/data/nst_json_testsuite2/test_parsing/y_string_space.json new file mode 100644 index 00000000..efd782cc --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_space.json @@ -0,0 +1 @@ +" " \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json b/test/data/nst_json_testsuite2/test_parsing/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json new file mode 100755 index 00000000..7620b665 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json @@ -0,0 +1 @@ +["\uD834\uDd1e"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_three-byte-utf-8.json b/test/data/nst_json_testsuite2/test_parsing/y_string_three-byte-utf-8.json new file mode 100644 index 00000000..108f1d67 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_three-byte-utf-8.json @@ -0,0 +1 @@ +["\u0821"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_two-byte-utf-8.json b/test/data/nst_json_testsuite2/test_parsing/y_string_two-byte-utf-8.json new file mode 100644 index 00000000..461503c3 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_two-byte-utf-8.json @@ -0,0 +1 @@ +["\u0123"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_u+2028_line_sep.json b/test/data/nst_json_testsuite2/test_parsing/y_string_u+2028_line_sep.json new file mode 100755 index 00000000..897b6021 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_u+2028_line_sep.json @@ -0,0 +1 @@ +["
"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_u+2029_par_sep.json b/test/data/nst_json_testsuite2/test_parsing/y_string_u+2029_par_sep.json new file mode 100755 index 00000000..8cd998c8 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_u+2029_par_sep.json @@ -0,0 +1 @@ +["
"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_uEscape.json b/test/data/nst_json_testsuite2/test_parsing/y_string_uEscape.json new file mode 100755 index 00000000..f7b41a02 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_uEscape.json @@ -0,0 +1 @@ +["\u0061\u30af\u30EA\u30b9"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_uescaped_newline.json b/test/data/nst_json_testsuite2/test_parsing/y_string_uescaped_newline.json new file mode 100644 index 00000000..3a5a220b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_uescaped_newline.json @@ -0,0 +1 @@ +["new\u000Aline"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unescaped_char_delete.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unescaped_char_delete.json new file mode 100755 index 00000000..7d064f49 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unescaped_char_delete.json @@ -0,0 +1 @@ +[""] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode.json new file mode 100644 index 00000000..3598095b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode.json @@ -0,0 +1 @@ +["\uA66D"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicodeEscapedBackslash.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicodeEscapedBackslash.json new file mode 100755 index 00000000..0bb3b51e --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicodeEscapedBackslash.json @@ -0,0 +1 @@ +["\u005C"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_2.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_2.json new file mode 100644 index 00000000..a7dcb976 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_2.json @@ -0,0 +1 @@ +["⍂㈴⍂"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+10FFFE_nonchar.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+10FFFE_nonchar.json new file mode 100644 index 00000000..9a8370b9 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+10FFFE_nonchar.json @@ -0,0 +1 @@ +["\uDBFF\uDFFE"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+1FFFE_nonchar.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+1FFFE_nonchar.json new file mode 100644 index 00000000..c51f8ae4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+1FFFE_nonchar.json @@ -0,0 +1 @@ +["\uD83F\uDFFE"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json new file mode 100644 index 00000000..626d5f81 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json @@ -0,0 +1 @@ +["\u200B"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+2064_invisible_plus.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+2064_invisible_plus.json new file mode 100644 index 00000000..1e23972c --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+2064_invisible_plus.json @@ -0,0 +1 @@ +["\u2064"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FDD0_nonchar.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FDD0_nonchar.json new file mode 100644 index 00000000..18ef151b --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FDD0_nonchar.json @@ -0,0 +1 @@ +["\uFDD0"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FFFE_nonchar.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FFFE_nonchar.json new file mode 100644 index 00000000..13d261fd --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FFFE_nonchar.json @@ -0,0 +1 @@ +["\uFFFE"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_escaped_double_quote.json b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_escaped_double_quote.json new file mode 100755 index 00000000..4e625785 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_unicode_escaped_double_quote.json @@ -0,0 +1 @@ +["\u0022"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_utf8.json b/test/data/nst_json_testsuite2/test_parsing/y_string_utf8.json new file mode 100644 index 00000000..40878435 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_utf8.json @@ -0,0 +1 @@ +["€𝄞"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_string_with_del_character.json b/test/data/nst_json_testsuite2/test_parsing/y_string_with_del_character.json new file mode 100755 index 00000000..8bd24907 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_string_with_del_character.json @@ -0,0 +1 @@ +["aa"] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_false.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_false.json new file mode 100644 index 00000000..02e4a84d --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_false.json @@ -0,0 +1 @@ +false \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_int.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_int.json new file mode 100755 index 00000000..f70d7bba --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_int.json @@ -0,0 +1 @@ +42 \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_negative_real.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_negative_real.json new file mode 100755 index 00000000..b5135a20 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_negative_real.json @@ -0,0 +1 @@ +-0.1 \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_null.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_null.json new file mode 100644 index 00000000..ec747fa4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_null.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_string.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_string.json new file mode 100755 index 00000000..b6e982ca --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_string.json @@ -0,0 +1 @@ +"asd" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_true.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_true.json new file mode 100755 index 00000000..f32a5804 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_true.json @@ -0,0 +1 @@ +true \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_string_empty.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_string_empty.json new file mode 100644 index 00000000..3cc762b5 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_string_empty.json @@ -0,0 +1 @@ +"" \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_trailing_newline.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_trailing_newline.json new file mode 100644 index 00000000..0c3426d4 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_trailing_newline.json @@ -0,0 +1 @@ +["a"] diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_true_in_array.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_true_in_array.json new file mode 100644 index 00000000..de601e30 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_true_in_array.json @@ -0,0 +1 @@ +[true] \ No newline at end of file diff --git a/test/data/nst_json_testsuite2/test_parsing/y_structure_whitespace_array.json b/test/data/nst_json_testsuite2/test_parsing/y_structure_whitespace_array.json new file mode 100644 index 00000000..2bedf7f2 --- /dev/null +++ b/test/data/nst_json_testsuite2/test_parsing/y_structure_whitespace_array.json @@ -0,0 +1 @@ + [] \ No newline at end of file diff --git a/test/src/unit-testsuites.cpp b/test/src/unit-testsuites.cpp index a668abd5..7de00c55 100644 --- a/test/src/unit-testsuites.cpp +++ b/test/src/unit-testsuites.cpp @@ -882,6 +882,425 @@ TEST_CASE("nst's JSONTestSuite") } } +TEST_CASE("nst's JSONTestSuite (2)") +{ + SECTION("test_parsing") + { + SECTION("y") + { + for (auto filename : + { + "test/data/nst_json_testsuite2/test_parsing/y_array_arraysWithSpaces.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_empty-string.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_empty.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_ending_with_newline.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_false.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_heterogeneous.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_null.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_with_1_and_newline.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_with_leading_space.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_with_several_null.json", + "test/data/nst_json_testsuite2/test_parsing/y_array_with_trailing_space.json", + "test/data/nst_json_testsuite2/test_parsing/y_number.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_0e+1.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_0e1.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_after_space.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_double_close_to_zero.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_int_with_exp.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_minus_zero.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_negative_int.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_negative_one.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_negative_zero.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_neg_exp.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_pos_exp.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_real_exponent.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_real_fraction_exponent.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_real_neg_exp.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_real_pos_exponent.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_simple_int.json", + "test/data/nst_json_testsuite2/test_parsing/y_number_simple_real.json", + "test/data/nst_json_testsuite2/test_parsing/y_object.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_basic.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key_and_value.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_empty.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_empty_key.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_escaped_null_in_key.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_extreme_numbers.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_long_strings.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_simple.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_string_unicode.json", + "test/data/nst_json_testsuite2/test_parsing/y_object_with_newlines.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pair.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pairs.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_allowed_escapes.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_backslash_and_u_escaped_zero.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_backslash_doublequotes.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_comments.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_a.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_n.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_escaped_control_character.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_escaped_noncharacter.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_in_array.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_in_array_with_leading_space.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_last_surrogates_1_and_2.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_nbsp_uescaped.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_null_escape.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_one-byte-utf-8.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_pi.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_reservedCharacterInUTF-8_U+1BFFF.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_simple_ascii.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_space.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_three-byte-utf-8.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_two-byte-utf-8.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_u+2028_line_sep.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_u+2029_par_sep.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_uEscape.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_uescaped_newline.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unescaped_char_delete.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicodeEscapedBackslash.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_2.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+10FFFE_nonchar.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+1FFFE_nonchar.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+2064_invisible_plus.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FDD0_nonchar.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FFFE_nonchar.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_escaped_double_quote.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_utf8.json", + "test/data/nst_json_testsuite2/test_parsing/y_string_with_del_character.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_false.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_int.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_negative_real.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_null.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_string.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_true.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_string_empty.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_trailing_newline.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_true_in_array.json", + "test/data/nst_json_testsuite2/test_parsing/y_structure_whitespace_array.json" + } + ) + { + CAPTURE(filename); + std::ifstream f(filename); + CHECK_NOTHROW(json::parse(f)); + std::ifstream f2(filename); + CHECK(json::accept(f2)); + } + } + + SECTION("n") + { + for (auto filename : + { + "test/data/nst_json_testsuite2/test_parsing/n_array_1_true_without_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_a_invalid_utf8.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_colon_instead_of_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_comma_after_close.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_comma_and_number.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_double_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_double_extra_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_extra_close.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_extra_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_incomplete.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_incomplete_invalid_value.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_inner_array_no_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_invalid_utf8.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_items_separated_by_semicolon.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_just_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_just_minus.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_missing_value.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_newlines_unclosed.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_number_and_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_number_and_several_commas.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_spaces_vertical_tab_formfeed.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_star_inside.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_trailing_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_new_lines.json", + "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_object_inside.json", + "test/data/nst_json_testsuite2/test_parsing/n_incomplete_false.json", + "test/data/nst_json_testsuite2/test_parsing/n_incomplete_null.json", + "test/data/nst_json_testsuite2/test_parsing/n_incomplete_true.json", + //"test/data/nst_json_testsuite2/test_parsing/n_multidigit_number_then_00.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_++.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_+1.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_+Inf.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_-01.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_-1.0..json", + "test/data/nst_json_testsuite2/test_parsing/n_number_-2..json", + "test/data/nst_json_testsuite2/test_parsing/n_number_-NaN.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_.-1.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_.2e-3.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0.1.2.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0.3e+.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0.3e.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0.e1.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E+.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0e+.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_0e.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_1.0e+.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_1.0e-.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_1.0e.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_1_000.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_1eE2.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_2.e+3.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_2.e-3.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_2.e3.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_9.e+.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_Inf.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_NaN.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_U+FF11_fullwidth_digit_one.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_expression.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_hex_1_digit.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_hex_2_digits.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_infinity.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_invalid+-.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-negative-real.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-bigger-int.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-exponent.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-int.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_minus_infinity.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_minus_sign_with_trailing_garbage.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_minus_space_1.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_neg_int_starting_with_zero.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_neg_real_without_int_part.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_neg_with_garbage_at_end.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_real_garbage_after_e.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_real_with_invalid_utf8_after_e.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_real_without_fractional_part.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_starting_with_dot.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha_char.json", + "test/data/nst_json_testsuite2/test_parsing/n_number_with_leading_zero.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_bad_value.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_bracket_key.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_comma_instead_of_colon.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_double_colon.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_emoji.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_garbage_at_end.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_key_with_single_quotes.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_lone_continuation_byte_in_key_and_trailing_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_missing_colon.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_missing_key.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_missing_semicolon.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_missing_value.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_no-colon.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key_but_huge_number_instead.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_repeated_null_null.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_several_trailing_commas.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_single_quote.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_open.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open_incomplete.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_two_commas_in_a_row.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_unquoted_key.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_unterminated-value.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_with_single_string.json", + "test/data/nst_json_testsuite2/test_parsing/n_object_with_trailing_garbage.json", + "test/data/nst_json_testsuite2/test_parsing/n_single_space.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1x.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_accentuated_char_no_quotes.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_backslash_00.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_escape_x.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_escaped_backslash_bad.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_escaped_ctrl_char_tab.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_escaped_emoji.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escape.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escaped_character.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate_escape_invalid.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_invalid-utf-8-in-escape.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_invalid_backslash_esc.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_invalid_unicode_escape.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_invalid_utf8_after_escape.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_leading_uescaped_thinspace.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_no_quotes_with_bad_escape.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_single_doublequote.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_single_quote.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_single_string_no_double_quotes.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_start_escape_unclosed.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_crtl_char.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_newline.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_tab.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_unicode_CapitalU.json", + "test/data/nst_json_testsuite2/test_parsing/n_string_with_trailing_garbage.json", + //"test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_U+2060_word_joined.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_UTF8_BOM_no_data.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_..json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_null.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_array_trailing_garbage.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_extra_array_close.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_unclosed_string.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_ascii-unicode-identifier.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_capitalized_True.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_close_unopened_array.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_comma_instead_of_closing_brace.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_double_array.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_end_array.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_incomplete_UTF8_BOM.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_lone-invalid-utf-8.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_lone-open-bracket.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_no_data.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_null-byte-outside-string.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_number_with_trailing_garbage.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_object_followed_by_closing_object.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_object_unclosed_no_value.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_comment.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_trailing_garbage.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_apostrophe.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_comma.json", + //"test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_object.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_string.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_string.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_close_array.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_comma.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_array.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_string.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_string_with_apostrophes.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_open.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_single_eacute.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_single_star.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_trailing_#.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_uescaped_LF_before_string.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_partial_null.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_false.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_true.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_object.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_unicode-identifier.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_U+2060_word_joiner.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_formfeed.json" + } + ) + { + CAPTURE(filename); + std::ifstream f(filename); + CHECK_THROWS_AS(json::parse(f), json::parse_error); + std::ifstream f2(filename); + CHECK(not json::accept(f2)); + } + } + + SECTION("i -> y") + { + for (auto filename : + { + "test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json", + //"test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_UTF-16LE_with_BOM.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_utf16BE_no_BOM.json", + //"test/data/nst_json_testsuite2/test_parsing/i_string_utf16LE_no_BOM.json", + "test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json", + "test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json" + } + ) + { + CAPTURE(filename); + std::ifstream f(filename); + CHECK_NOTHROW(json::parse(f)); + std::ifstream f2(filename); + CHECK(json::accept(f2)); + } + } + + SECTION("i -> n") + { + for (auto filename : + { + //"test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json", + "test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json", + //"test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json", + "test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_UTF-16LE_with_BOM.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_utf16BE_no_BOM.json", + "test/data/nst_json_testsuite2/test_parsing/i_string_utf16LE_no_BOM.json", + //"test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json", + //"test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json" + } + ) + { + CAPTURE(filename); + std::ifstream f(filename); + CHECK_THROWS_AS(json::parse(f), json::exception); // could be parse_error or out_of_range + std::ifstream f2(filename); + CHECK(not json::accept(f2)); + } + } + } +} + std::string trim(const std::string& str); // from http://stackoverflow.com/a/25829178/266378 From 1f84cc2c88c6522e5c953483d741f39bf384df08 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 17 May 2018 16:50:37 +0200 Subject: [PATCH 077/156] :white_check_mark: adjusted test cases --- test/src/unit-testsuites.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/src/unit-testsuites.cpp b/test/src/unit-testsuites.cpp index 7de00c55..24c4195d 100644 --- a/test/src/unit-testsuites.cpp +++ b/test/src/unit-testsuites.cpp @@ -1139,7 +1139,6 @@ TEST_CASE("nst's JSONTestSuite (2)") "test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_tab.json", "test/data/nst_json_testsuite2/test_parsing/n_string_unicode_CapitalU.json", "test/data/nst_json_testsuite2/test_parsing/n_string_with_trailing_garbage.json", - //"test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_U+2060_word_joined.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_UTF8_BOM_no_data.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_..json", @@ -1165,7 +1164,6 @@ TEST_CASE("nst's JSONTestSuite (2)") "test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_trailing_garbage.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_apostrophe.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_comma.json", - //"test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_object.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_string.json", "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_string.json", @@ -1199,6 +1197,21 @@ TEST_CASE("nst's JSONTestSuite (2)") } } + SECTION("n (previously overflowed)") + { + for (auto filename : + { + "test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json", + "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json" + } + ) + { + CAPTURE(filename); + std::ifstream f(filename); + CHECK(not json::accept(f)); + } + } + SECTION("i -> y") { for (auto filename : From 90eb0a91e0caffdf9b33939760880a92ec132aba Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 26 May 2018 13:26:40 +0200 Subject: [PATCH 078/156] :zap: keys are now returned as const reference #1098 --- .../nlohmann/detail/iterators/iter_impl.hpp | 2 +- .../detail/iterators/iteration_proxy.hpp | 18 +++++++++++++---- single_include/nlohmann/json.hpp | 20 ++++++++++++++----- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/include/nlohmann/detail/iterators/iter_impl.hpp b/include/nlohmann/detail/iterators/iter_impl.hpp index 52ede17b..08108a22 100644 --- a/include/nlohmann/detail/iterators/iter_impl.hpp +++ b/include/nlohmann/detail/iterators/iter_impl.hpp @@ -583,7 +583,7 @@ class iter_impl @brief return the key of an object iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ - typename object_t::key_type key() const + const typename object_t::key_type& key() const { assert(m_object != nullptr); diff --git a/include/nlohmann/detail/iterators/iteration_proxy.hpp b/include/nlohmann/detail/iterators/iteration_proxy.hpp index 7547d038..39c35a2e 100644 --- a/include/nlohmann/detail/iterators/iteration_proxy.hpp +++ b/include/nlohmann/detail/iterators/iteration_proxy.hpp @@ -21,6 +21,10 @@ template class iteration_proxy IteratorType anchor; /// an index for arrays (used to create key names) std::size_t array_index = 0; + /// a string representation of the array index + std::string array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + const std::string empty_str = ""; public: explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} @@ -35,7 +39,13 @@ template class iteration_proxy iteration_proxy_internal& operator++() { ++anchor; - ++array_index; + + assert(anchor.m_object != nullptr); + if (anchor.m_object->is_array()) + { + // update array index and string representation + array_index_str = std::to_string(++array_index); + } return *this; } @@ -47,7 +57,7 @@ template class iteration_proxy } /// return key of the iterator - std::string key() const + const std::string& key() const { assert(anchor.m_object != nullptr); @@ -55,7 +65,7 @@ template class iteration_proxy { // use integer array index as key case value_t::array: - return std::to_string(array_index); + return array_index_str; // use key from the object case value_t::object: @@ -63,7 +73,7 @@ template class iteration_proxy // use an empty key for all primitive types default: - return ""; + return empty_str; } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 8c9942bb..0b2e055c 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -4636,7 +4636,7 @@ class iter_impl @brief return the key of an object iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ - typename object_t::key_type key() const + const typename object_t::key_type& key() const { assert(m_object != nullptr); @@ -4691,6 +4691,10 @@ template class iteration_proxy IteratorType anchor; /// an index for arrays (used to create key names) std::size_t array_index = 0; + /// a string representation of the array index + std::string array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + const std::string empty_str = ""; public: explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} @@ -4705,7 +4709,13 @@ template class iteration_proxy iteration_proxy_internal& operator++() { ++anchor; - ++array_index; + + assert(anchor.m_object != nullptr); + if (anchor.m_object->is_array()) + { + // update array index and string representation + array_index_str = std::to_string(++array_index); + } return *this; } @@ -4717,7 +4727,7 @@ template class iteration_proxy } /// return key of the iterator - std::string key() const + const std::string& key() const { assert(anchor.m_object != nullptr); @@ -4725,7 +4735,7 @@ template class iteration_proxy { // use integer array index as key case value_t::array: - return std::to_string(array_index); + return array_index_str; // use key from the object case value_t::object: @@ -4733,7 +4743,7 @@ template class iteration_proxy // use an empty key for all primitive types default: - return ""; + return empty_str; } } From 1c6b332dcdaff5d5d7ccdf8e11f847f91217523d Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 26 May 2018 14:10:13 +0200 Subject: [PATCH 079/156] :ok_hand: mitigating cppcheck bug #1101 --- include/nlohmann/json_fwd.hpp | 2 +- single_include/nlohmann/json.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/json_fwd.hpp b/include/nlohmann/json_fwd.hpp index 750adb64..7f003a88 100644 --- a/include/nlohmann/json_fwd.hpp +++ b/include/nlohmann/json_fwd.hpp @@ -21,7 +21,7 @@ This serializer ignores the template arguments and uses ADL ([argument-dependent lookup](http://en.cppreference.com/w/cpp/language/adl)) for serialization. */ -template +template struct adl_serializer; template class ObjectType = diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 8c9942bb..9e532961 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -70,7 +70,7 @@ This serializer ignores the template arguments and uses ADL ([argument-dependent lookup](http://en.cppreference.com/w/cpp/language/adl)) for serialization. */ -template +template struct adl_serializer; template class ObjectType = From 481ace65c49dc198ab3255f71d43b5bb50fd9af1 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 27 May 2018 12:04:22 +0200 Subject: [PATCH 080/156] :hammer: only calculate array index string when needed #1098 --- .../detail/iterators/iteration_proxy.hpp | 19 +++++++++++-------- single_include/nlohmann/json.hpp | 19 +++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/nlohmann/detail/iterators/iteration_proxy.hpp b/include/nlohmann/detail/iterators/iteration_proxy.hpp index 39c35a2e..047e1855 100644 --- a/include/nlohmann/detail/iterators/iteration_proxy.hpp +++ b/include/nlohmann/detail/iterators/iteration_proxy.hpp @@ -21,8 +21,10 @@ template class iteration_proxy IteratorType anchor; /// an index for arrays (used to create key names) std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; /// a string representation of the array index - std::string array_index_str = "0"; + mutable std::string array_index_str = "0"; /// an empty string (to return a reference for primitive values) const std::string empty_str = ""; @@ -39,13 +41,7 @@ template class iteration_proxy iteration_proxy_internal& operator++() { ++anchor; - - assert(anchor.m_object != nullptr); - if (anchor.m_object->is_array()) - { - // update array index and string representation - array_index_str = std::to_string(++array_index); - } + ++array_index; return *this; } @@ -65,7 +61,14 @@ template class iteration_proxy { // use integer array index as key case value_t::array: + { + if (array_index != array_index_last) + { + array_index_str = std::to_string(array_index); + array_index_last = array_index; + } return array_index_str; + } // use key from the object case value_t::object: diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 0b2e055c..24d2269a 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -4691,8 +4691,10 @@ template class iteration_proxy IteratorType anchor; /// an index for arrays (used to create key names) std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; /// a string representation of the array index - std::string array_index_str = "0"; + mutable std::string array_index_str = "0"; /// an empty string (to return a reference for primitive values) const std::string empty_str = ""; @@ -4709,13 +4711,7 @@ template class iteration_proxy iteration_proxy_internal& operator++() { ++anchor; - - assert(anchor.m_object != nullptr); - if (anchor.m_object->is_array()) - { - // update array index and string representation - array_index_str = std::to_string(++array_index); - } + ++array_index; return *this; } @@ -4735,7 +4731,14 @@ template class iteration_proxy { // use integer array index as key case value_t::array: + { + if (array_index != array_index_last) + { + array_index_str = std::to_string(array_index); + array_index_last = array_index; + } return array_index_str; + } // use key from the object case value_t::object: From 3cdc4d784b04db0579523ec717cb57c1601c1014 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 27 May 2018 18:07:53 +0200 Subject: [PATCH 081/156] :memo: added documentation --- include/nlohmann/detail/input/json_sax.hpp | 18 ++++++++++++++++++ single_include/nlohmann/json.hpp | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 6f3aa99c..5970afd5 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -122,6 +122,19 @@ struct json_sax namespace detail { +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ template class json_sax_dom_parser : public json_sax { @@ -131,6 +144,11 @@ class json_sax_dom_parser : public json_sax using number_float_t = typename BasicJsonType::number_float_t; using string_t = typename BasicJsonType::string_t; + /*! + @param[in, out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) : root(r), allow_exceptions(allow_exceptions_) {} diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index ca3539e3..6559d23d 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3426,6 +3426,19 @@ struct json_sax namespace detail { +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ template class json_sax_dom_parser : public json_sax { @@ -3435,6 +3448,11 @@ class json_sax_dom_parser : public json_sax using number_float_t = typename BasicJsonType::number_float_t; using string_t = typename BasicJsonType::string_t; + /*! + @param[in, out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) : root(r), allow_exceptions(allow_exceptions_) {} From c5e63fd68430469f3734b0468b1db2e9d4fc5674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= Date: Mon, 14 May 2018 11:51:37 +0200 Subject: [PATCH 082/156] Provide a from_json overload for std::map This overload is chosen only when BasicJsonType::string_t is not constructible from std::map::key_type. Currently, converting a map to json treats it as an array of pairs. fixes #1079 --- .../nlohmann/detail/conversions/from_json.hpp | 20 ++++++++++++++++++ single_include/nlohmann/json.hpp | 20 ++++++++++++++++++ test/src/unit-conversions.cpp | 21 +++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index eccc04f1..ac4cea5f 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -5,6 +5,7 @@ #include // and, not #include // forward_list #include // inserter, front_inserter, end +#include // map #include // string #include // tuple, make_tuple #include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible @@ -277,6 +278,25 @@ void from_json(const BasicJsonType& j, std::tuple& t) from_json_tuple_impl(j, t, index_sequence_for {}); } +template ::value>> +void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_UNLIKELY(not j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); + } + for (const auto& p : j) + { + if (JSON_UNLIKELY(not p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + struct from_json_fn { private: diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 8c9942bb..e3112f77 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -909,6 +909,7 @@ inline bool operator<(const value_t lhs, const value_t rhs) noexcept #include // and, not #include // forward_list #include // inserter, front_inserter, end +#include // map #include // string #include // tuple, make_tuple #include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible @@ -1185,6 +1186,25 @@ void from_json(const BasicJsonType& j, std::tuple& t) from_json_tuple_impl(j, t, index_sequence_for {}); } +template ::value>> +void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_UNLIKELY(not j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); + } + for (const auto& p : j) + { + if (JSON_UNLIKELY(not p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + struct from_json_fn { private: diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 351dec8a..79ccf681 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -1079,6 +1079,26 @@ TEST_CASE("value conversion") j5.get>(); } + SECTION("std::map (array of pairs)") + { + std::map m{{0, 1}, {1, 2}, {2, 3}}; + json j6 = m; + + auto m2 = j6.get>(); + CHECK(m == m2); + + json j7 = {0, 1, 2, 3}; + CHECK_THROWS_AS((j7.get>()), json::type_error&); + CHECK_THROWS_WITH((j7.get>()), "[json.exception.type_error.302] type must be array, but is number"); + + SECTION("superfluous entries") + { + json j8 = {{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}; + m2 = j8.get>(); + CHECK(m == m2); + } + } + SECTION("exception in case of a non-object type") { CHECK_THROWS_AS((json().get>()), json::type_error&); @@ -1094,6 +1114,7 @@ TEST_CASE("value conversion") CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); } } } From a49644ab7487c7e1b41959da0ff21476d535976c Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 28 May 2018 17:57:22 +0200 Subject: [PATCH 083/156] :ambulance: adjusted Fuzzer to new parser out_of_range exceptions where unexpected before - the parser used to crash in these situations... --- test/src/fuzzer-parse_cbor.cpp | 4 ++++ test/src/fuzzer-parse_json.cpp | 4 ++++ test/src/fuzzer-parse_msgpack.cpp | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/test/src/fuzzer-parse_cbor.cpp b/test/src/fuzzer-parse_cbor.cpp index 0520ae7c..45dd01f3 100644 --- a/test/src/fuzzer-parse_cbor.cpp +++ b/test/src/fuzzer-parse_cbor.cpp @@ -58,6 +58,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { // type errors can occur during parsing, too } + catch (const json::out_of_range&) + { + // out of range errors can occur during parsing, too + } // return 0 - non-zero return values are reserved for future use return 0; diff --git a/test/src/fuzzer-parse_json.cpp b/test/src/fuzzer-parse_json.cpp index 2d13c26b..0694bb70 100644 --- a/test/src/fuzzer-parse_json.cpp +++ b/test/src/fuzzer-parse_json.cpp @@ -63,6 +63,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { // parse errors are ok, because input may be random bytes } + catch (const json::out_of_range&) + { + // out of range errors may happen if provided sizes are excessive + } // return 0 - non-zero return values are reserved for future use return 0; diff --git a/test/src/fuzzer-parse_msgpack.cpp b/test/src/fuzzer-parse_msgpack.cpp index 6f98409f..c274816a 100644 --- a/test/src/fuzzer-parse_msgpack.cpp +++ b/test/src/fuzzer-parse_msgpack.cpp @@ -58,6 +58,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { // type errors can occur during parsing, too } + catch (const json::out_of_range&) + { + // out of range errors may happen if provided sizes are excessive + } // return 0 - non-zero return values are reserved for future use return 0; From 8efbf8d7bb54d8506f8645d27b743091f3d7c071 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 28 May 2018 18:14:44 +0200 Subject: [PATCH 084/156] :memo: documentation to avoid future issues like #1108 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 74710bfe..691cd105 100644 --- a/README.md +++ b/README.md @@ -602,6 +602,7 @@ Likewise, when calling `get()`, the `from_json` method will be called Some important things: * Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined). +* Those methods **MUST** be available (e.g., properly headers must be included) everywhere you use the implicit conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise. * When using `get()`, `your_type` **MUST** be [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). (There is a way to bypass this requirement described later.) * In function `from_json`, use function [`at()`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a93403e803947b86f4da2d1fb3345cf2c.html#a93403e803947b86f4da2d1fb3345cf2c) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior. * In case your type contains several `operator=` definitions, code like `your_variable = your_json;` [may not compile](https://github.com/nlohmann/json/issues/667). You need to write `your_variable = your_json.get();` instead. From 64acb42aa79f469c1d437302b2203df661847759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20M=C3=B6ller?= Date: Thu, 31 May 2018 13:27:11 +0200 Subject: [PATCH 085/156] remove stringstream dependency --- include/nlohmann/detail/input/binary_reader.hpp | 10 ++++------ include/nlohmann/detail/input/lexer.hpp | 11 ++++------- include/nlohmann/detail/output/serializer.hpp | 15 ++++++--------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index e4e1f176..a45d9983 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -6,12 +6,10 @@ #include // ldexp #include // size_t #include // uint8_t, uint16_t, uint32_t, uint64_t +#include // snprinft #include // memcpy -#include // setw, setfill -#include // hex #include // back_inserter #include // numeric_limits -#include // stringstream #include // char_traits, string #include // make_pair, move @@ -1665,9 +1663,9 @@ class binary_reader */ std::string get_token_string() const { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return ss.str(); + char cr[3]; + snprintf(cr, 3, "%.2X", current); + return std::string{cr}; } private: diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 7b31068f..3fb79068 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -3,10 +3,8 @@ #include // localeconv #include // size_t #include // strtof, strtod, strtold, strtoll, strtoull +#include // snprintf #include // initializer_list -#include // hex, uppercase -#include // setw, setfill -#include // stringstream #include // char_traits, string #include // vector @@ -1174,10 +1172,9 @@ scan_number_done: if ('\x00' <= c and c <= '\x1F') { // escape control characters - std::stringstream ss; - ss << "(c) << ">"; - result += ss.str(); + char cs[9]; + snprintf(cs, 9, "", c); + result += cs; } else { diff --git a/include/nlohmann/detail/output/serializer.hpp b/include/nlohmann/detail/output/serializer.hpp index a6442644..f6fa152a 100644 --- a/include/nlohmann/detail/output/serializer.hpp +++ b/include/nlohmann/detail/output/serializer.hpp @@ -9,11 +9,8 @@ #include // size_t, ptrdiff_t #include // uint8_t #include // snprintf -#include // setfill -#include // next #include // numeric_limits #include // string -#include // stringstream #include // is_same #include @@ -389,9 +386,9 @@ class serializer case UTF8_REJECT: // decode found invalid UTF-8 byte { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << static_cast(byte); - JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + ss.str())); + std::string sn(3, '\0'); + snprintf(&sn[0], sn.size(), "%.2X", byte); + JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + sn)); } default: // decode found yet incomplete multi-byte code point @@ -417,9 +414,9 @@ class serializer else { // we finish reading, but do not accept: string was incomplete - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << static_cast(static_cast(s.back())); - JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + ss.str())); + std::string sn(3,'\0'); + snprintf(&sn[0], sn.size(), "%.2X", s.back()); + JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + sn)); } } From 48656a49f59494789758008f662a5bad2b188a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20M=C3=B6ller?= Date: Thu, 31 May 2018 15:32:21 +0200 Subject: [PATCH 086/156] typo --- include/nlohmann/detail/input/binary_reader.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index a45d9983..e20763c4 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -6,7 +6,7 @@ #include // ldexp #include // size_t #include // uint8_t, uint16_t, uint32_t, uint64_t -#include // snprinft +#include // snprintf #include // memcpy #include // back_inserter #include // numeric_limits From ecadcdb5938fb17ef238dcad031de0de37ccf57f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20M=C3=B6ller?= Date: Thu, 31 May 2018 16:36:16 +0200 Subject: [PATCH 087/156] added char cast should fix the GCC unittest --- include/nlohmann/detail/output/serializer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/nlohmann/detail/output/serializer.hpp b/include/nlohmann/detail/output/serializer.hpp index f6fa152a..19ab9894 100644 --- a/include/nlohmann/detail/output/serializer.hpp +++ b/include/nlohmann/detail/output/serializer.hpp @@ -415,7 +415,7 @@ class serializer { // we finish reading, but do not accept: string was incomplete std::string sn(3,'\0'); - snprintf(&sn[0], sn.size(), "%.2X", s.back()); + snprintf(&sn[0], sn.size(), "%.2X", static_cast(s.back())); JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + sn)); } } From 714c5926803cbf790396fee5776a8d63fe566c9b Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Fri, 1 Jun 2018 14:22:57 -0400 Subject: [PATCH 088/156] Disabled implicit conversion to string_view on MSVC 15.13 and older --- include/nlohmann/json.hpp | 4 ++-- single_include/nlohmann/json.hpp | 13 +++---------- test/src/unit-conversions.cpp | 7 +++++++ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 7ecf631f..38b31240 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -2821,9 +2821,9 @@ class basic_json not detail::is_basic_json::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value -#endif -#if defined(JSON_HAS_CPP_17) +#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1913 and not std::is_same::value +#endif #endif , int >::type = 0 > operator ValueType() const diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 498ba880..2c9c94fd 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1321,16 +1321,6 @@ struct external_constructor j.m_value = std::move(s); j.assert_invariant(); } - - template::value, - int> = 0> - static void construct(BasicJsonType& j, const CompatibleStringType& str) - { - j.m_type = value_t::string; - j.m_value.string = j.template create(str); - j.assert_invariant(); - } }; template<> @@ -12480,6 +12470,9 @@ class basic_json not detail::is_basic_json::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value +#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1913 + and not std::is_same::value +#endif #endif , int >::type = 0 > operator ValueType() const diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index b059087c..ef27ac6f 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -39,6 +39,13 @@ using nlohmann::json; #include #include +#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 +#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 +#endif + #if defined(JSON_HAS_CPP_17) #include #endif From 4778c02ab5e224cb463f27158b6cf1d79732acf4 Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Fri, 1 Jun 2018 14:42:25 -0400 Subject: [PATCH 089/156] Set MSVC version from 1514 and older --- include/nlohmann/json.hpp | 2 +- single_include/nlohmann/json.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 38b31240..9fef16f1 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -2821,7 +2821,7 @@ class basic_json not detail::is_basic_json::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value -#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1913 +#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1914 and not std::is_same::value #endif #endif diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 2c9c94fd..a886cc9e 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -12470,7 +12470,7 @@ class basic_json not detail::is_basic_json::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value -#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1913 +#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1914 and not std::is_same::value #endif #endif From e0e7fa39e755fd1868267eb075c335f7c8a58eee Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Sun, 3 Jun 2018 23:49:13 -0400 Subject: [PATCH 090/156] Re-added external_constructor with string compatible types --- include/nlohmann/detail/conversions/to_json.hpp | 10 ++++++++++ single_include/nlohmann/json.hpp | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp index ce2bc0aa..b147d077 100644 --- a/include/nlohmann/detail/conversions/to_json.hpp +++ b/include/nlohmann/detail/conversions/to_json.hpp @@ -51,6 +51,16 @@ struct external_constructor j.m_value = std::move(s); j.assert_invariant(); } + + template::value, + int> = 0> + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } }; template<> diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index a886cc9e..630e4027 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1321,6 +1321,16 @@ struct external_constructor j.m_value = std::move(s); j.assert_invariant(); } + + template::value, + int> = 0> + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } }; template<> From 5676a2a0762ea3a657b2be02d8d9f851f05513a8 Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Sun, 3 Jun 2018 23:51:07 -0400 Subject: [PATCH 091/156] Aligned template declaration --- include/nlohmann/detail/conversions/to_json.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp index b147d077..2d4449f4 100644 --- a/include/nlohmann/detail/conversions/to_json.hpp +++ b/include/nlohmann/detail/conversions/to_json.hpp @@ -53,8 +53,8 @@ struct external_constructor } template::value, - int> = 0> + enable_if_t::value, + int> = 0> static void construct(BasicJsonType& j, const CompatibleStringType& str) { j.m_type = value_t::string; From 7acd90b6517e34c2482366d4b960b2bedafdfa89 Mon Sep 17 00:00:00 2001 From: Guillaume Racicot Date: Mon, 4 Jun 2018 11:18:19 -0400 Subject: [PATCH 092/156] Fixed check for compatible string type --- include/nlohmann/detail/conversions/from_json.hpp | 4 +--- include/nlohmann/detail/meta.hpp | 3 ++- single_include/nlohmann/json.hpp | 7 +++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index b066b2b4..b71bb0ec 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -75,9 +75,7 @@ template < enable_if_t < is_compatible_string_type::value and not std::is_same::value and - std::is_constructible < - BasicJsonType, typename CompatibleStringType::value_type >::value, + CompatibleStringType>::value, int > = 0 > void from_json(const BasicJsonType& j, CompatibleStringType& s) { diff --git a/include/nlohmann/detail/meta.hpp b/include/nlohmann/detail/meta.hpp index 780efba8..50200304 100644 --- a/include/nlohmann/detail/meta.hpp +++ b/include/nlohmann/detail/meta.hpp @@ -127,7 +127,8 @@ template struct is_compatible_string_type_impl { static constexpr auto value = - std::is_same::value; + std::is_same::value and + std::is_constructible::value; }; template diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index a886cc9e..555aa1de 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -360,7 +360,8 @@ template struct is_compatible_string_type_impl { static constexpr auto value = - std::is_same::value; + std::is_same::value and + std::is_constructible::value; }; template @@ -1001,9 +1002,7 @@ template < enable_if_t < is_compatible_string_type::value and not std::is_same::value and - std::is_constructible < - BasicJsonType, typename CompatibleStringType::value_type >::value, + CompatibleStringType>::value, int > = 0 > void from_json(const BasicJsonType& j, CompatibleStringType& s) { From 4feb8211caf7adda630103b7c5dbfc99238c743e Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Mon, 11 Jun 2018 18:03:46 +0300 Subject: [PATCH 093/156] test (non)equality for alt_string implementation --- test/src/unit-alt-string.cpp | 45 ++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index cc05039c..4fe7123d 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -60,17 +60,36 @@ class alt_string } template - bool operator==(op_type&& op) const + typename std::enable_if< // disable for alt_string + !std::is_same< alt_string, + typename std::remove_reference::type + >::value, + bool>::type + operator==(op_type&& op) const { return str_impl == op; } + bool operator==(const alt_string& op) const + { + return str_impl == op.str_impl; + } + template - bool operator!=(op_type&& op) const + typename std::enable_if< // disable for alt_string + !std::is_same< alt_string, + typename std::remove_reference::type + >::value, + bool>::type + operator!=(op_type&& op) const { return str_impl != op; } + bool operator!=(const alt_string& op) const { + return str_impl != op.str_impl; + } + std::size_t size() const noexcept { return str_impl.size(); @@ -210,4 +229,26 @@ TEST_CASE("alternative string type") alt_string dump = doc.dump(); CHECK(dump == R"({"foo":"bar"})"); } + + SECTION("equality") + { + alt_json doc; + doc["Who are you?"] = "I'm Batman"; + + CHECK("I'm Batman" == doc["Who are you?"]); + CHECK(doc["Who are you?"] == "I'm Batman"); + + CHECK("I'm Bruce Wayne" != doc["Who are you?"]); + CHECK(doc["Who are you?"] != "I'm Bruce Wayne"); + + { + const alt_json& const_doc = doc; + + CHECK("I'm Batman" == const_doc["Who are you?"]); + CHECK(const_doc["Who are you?"] == "I'm Batman"); + + CHECK("I'm Bruce Wayne" != const_doc["Who are you?"]); + CHECK(const_doc["Who are you?"] != "I'm Bruce Wayne"); + } + } } From 3d3055909cf83250e2b610b84956fc444079d68f Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Mon, 11 Jun 2018 19:09:57 +0300 Subject: [PATCH 094/156] define global operator< for const char* and alt_string --- test/src/unit-alt-string.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index 4fe7123d..8f1a64b0 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -106,7 +106,12 @@ class alt_string } template - bool operator<(op_type&& op) const + typename std::enable_if< // disable for alt_string + !std::is_same< alt_string, + typename std::remove_reference::type + >::value, + bool>::type + operator<(op_type&& op) const { return str_impl < op; } @@ -153,6 +158,8 @@ class alt_string private: std::string str_impl; + + friend bool ::operator<(const char*, const alt_string&); }; @@ -168,6 +175,11 @@ using alt_json = nlohmann::basic_json < nlohmann::adl_serializer >; +bool operator<(const char* op1, const alt_string& op2) { + return op1 < op2.str_impl; +} + + TEST_CASE("alternative string type") { From cd28d872e70072fba0eb3b61143c0b7af7563136 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Mon, 11 Jun 2018 20:50:39 +0300 Subject: [PATCH 095/156] forward declarations to make new compilers happy --- test/src/unit-alt-string.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index 8f1a64b0..4371d3ff 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -33,6 +33,12 @@ SOFTWARE. #include #include + +/* forward declarations */ +class alt_string; +bool operator<(const char* op1, const alt_string& op2); + + /* * This is virtually a string class. * It covers std::string under the hood. From f574d7e084519f06958587959b79ee592d37efa3 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 13 Jun 2018 19:47:29 +0300 Subject: [PATCH 096/156] simplify templates for operators, add more checks --- test/src/unit-alt-string.cpp | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index 4371d3ff..c5e89111 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -66,12 +66,7 @@ class alt_string } template - typename std::enable_if< // disable for alt_string - !std::is_same< alt_string, - typename std::remove_reference::type - >::value, - bool>::type - operator==(op_type&& op) const + bool operator==(const op_type& op) const { return str_impl == op; } @@ -82,12 +77,7 @@ class alt_string } template - typename std::enable_if< // disable for alt_string - !std::is_same< alt_string, - typename std::remove_reference::type - >::value, - bool>::type - operator!=(op_type&& op) const + bool operator!=(const op_type& op) const { return str_impl != op; } @@ -112,12 +102,7 @@ class alt_string } template - typename std::enable_if< // disable for alt_string - !std::is_same< alt_string, - typename std::remove_reference::type - >::value, - bool>::type - operator<(op_type&& op) const + bool operator<(const op_type& op) const { return str_impl < op; } @@ -255,18 +240,26 @@ TEST_CASE("alternative string type") CHECK("I'm Batman" == doc["Who are you?"]); CHECK(doc["Who are you?"] == "I'm Batman"); + CHECK_FALSE("I'm Batman" != doc["Who are you?"]); + CHECK_FALSE(doc["Who are you?"] != "I'm Batman"); CHECK("I'm Bruce Wayne" != doc["Who are you?"]); CHECK(doc["Who are you?"] != "I'm Bruce Wayne"); + CHECK_FALSE("I'm Bruce Wayne" == doc["Who are you?"]); + CHECK_FALSE(doc["Who are you?"] == "I'm Bruce Wayne"); { const alt_json& const_doc = doc; CHECK("I'm Batman" == const_doc["Who are you?"]); CHECK(const_doc["Who are you?"] == "I'm Batman"); + CHECK_FALSE("I'm Batman" != const_doc["Who are you?"]); + CHECK_FALSE(const_doc["Who are you?"] != "I'm Batman"); CHECK("I'm Bruce Wayne" != const_doc["Who are you?"]); CHECK(const_doc["Who are you?"] != "I'm Bruce Wayne"); + CHECK_FALSE("I'm Bruce Wayne" == const_doc["Who are you?"]); + CHECK_FALSE(const_doc["Who are you?"] == "I'm Bruce Wayne"); } } } From 1566ad40535a38b27f03ab53ef95a6308436f96e Mon Sep 17 00:00:00 2001 From: Danielc Date: Sat, 16 Jun 2018 12:01:49 +0300 Subject: [PATCH 097/156] fixed compile error for #1045; to_json for iternation_proxy_internal was needed --- .../nlohmann/detail/conversions/to_json.hpp | 10 ++++++++++ single_include/nlohmann/json.hpp | 19 ++++++++++++++++--- test/src/unit-regression.cpp | 5 +++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp index ce2bc0aa..e8e09015 100644 --- a/include/nlohmann/detail/conversions/to_json.hpp +++ b/include/nlohmann/detail/conversions/to_json.hpp @@ -284,6 +284,16 @@ void to_json(BasicJsonType& j, const std::pair& p) j = {p.first, p.second}; } +template class iteration_proxy; // TODO: Forward decl needed, maybe move somewhere else +template::iteration_proxy_internal>::value, int> = 0> +void to_json(BasicJsonType& j, T b) noexcept +{ + typename BasicJsonType::object_t tmp_obj; + tmp_obj[b.key()] = b.value(); // TODO: maybe there is a better way? + external_constructor::construct(j, std::move(tmp_obj)); +} + template void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence) { diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index ce534f34..bbba0292 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1516,6 +1516,16 @@ void to_json(BasicJsonType& j, const std::pair& p) j = {p.first, p.second}; } +template class iteration_proxy; // TODO: Forward decl needed, maybe move somewhere else +template::iteration_proxy_internal>::value, int> = 0> +void to_json(BasicJsonType& j, T b) noexcept +{ + typename BasicJsonType::object_t tmp_obj; + tmp_obj[b.key()] = b.value(); // TODO: maybe there is a better way? + external_constructor::construct(j, std::move(tmp_obj)); +} + template void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence) { @@ -7393,7 +7403,7 @@ boundaries compute_boundaries(FloatType value) constexpr int kMinExp = 1 - kBias; constexpr uint64_t kHiddenBit = uint64_t{1} << (kPrecision - 1); // = 2^(p-1) - using bits_type = typename std::conditional< kPrecision == 24, uint32_t, uint64_t >::type; + using bits_type = typename std::conditional::type; const uint64_t bits = reinterpret_bits(value); const uint64_t E = bits >> (kPrecision - 1); @@ -7804,7 +7814,10 @@ inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, // = ((p1 ) * 2^-e + (p2 )) * 2^e // = p1 + p2 * 2^e - const diyfp one(uint64_t{1} << -M_plus.e, M_plus.e); + const diyfp one(uint64_t + { + 1 + } << -M_plus.e, M_plus.e); uint32_t p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e @@ -17268,7 +17281,7 @@ struct hash /// @note: do not remove the space after '<', /// see https://github.com/nlohmann/json/pull/679 template<> -struct less< ::nlohmann::detail::value_t> +struct less<::nlohmann::detail::value_t> { /*! @brief compare two value_t enum values diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index d26e0e57..cea8dd87 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -1631,9 +1631,10 @@ TEST_CASE("regression tests") p2.begin(), p2.end(), std::inserter(diffs, diffs.end()), [&](const it_type & e1, const it_type & e2) -> bool { - return (e1.key() < e2.key()) and (e1.value() < e2.value()); + using comper_pair = std::pair; // Trying to avoid unneeded copy + return comper_pair(e1.key(), e1.value()) < comper_pair(e2.key(), e2.value()); // Using pair comper }); - CHECK(diffs.size() == 2); + CHECK(diffs.size() == 1); // Note the change here, was 2 } } From 299469cfd5142f25225fff08eb49c913d921db04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= Date: Mon, 18 Jun 2018 10:52:11 +0200 Subject: [PATCH 098/156] from_json: add missing template arguments for std::map --- include/nlohmann/detail/conversions/from_json.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index ac4cea5f..e77ad5d2 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -278,10 +278,10 @@ void from_json(const BasicJsonType& j, std::tuple& t) from_json_tuple_impl(j, t, index_sequence_for {}); } -template ::value>> -void from_json(const BasicJsonType& j, std::map& m) +void from_json(const BasicJsonType& j, std::map& m) { if (JSON_UNLIKELY(not j.is_array())) { From 2b37d7ed86926f0c7c865651b4dee29aaae2015b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= Date: Mon, 18 Jun 2018 10:53:30 +0200 Subject: [PATCH 099/156] from_json: add overload for std::unordered_map Fixes #1133 --- .../nlohmann/detail/conversions/from_json.hpp | 20 ++++++++ test/src/unit-conversions.cpp | 50 +++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index e77ad5d2..7fe19f57 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -9,6 +9,7 @@ #include // string #include // tuple, make_tuple #include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map #include // pair, declval #include // valarray @@ -297,6 +298,25 @@ void from_json(const BasicJsonType& j, std::map& } } +template ::value>> +void from_json(const BasicJsonType& j, std::unordered_map& m) +{ + if (JSON_UNLIKELY(not j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); + } + for (const auto& p : j) + { + if (JSON_UNLIKELY(not p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + struct from_json_fn { private: diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 79ccf681..0691bbf4 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -40,6 +40,14 @@ using nlohmann::json; #include #include +namespace +{ +template +void map_type_conversion_checks() +{ +} +} + TEST_CASE("value conversion") { SECTION("get an object (explicit)") @@ -1088,14 +1096,48 @@ TEST_CASE("value conversion") CHECK(m == m2); json j7 = {0, 1, 2, 3}; + json j8 = 2; CHECK_THROWS_AS((j7.get>()), json::type_error&); - CHECK_THROWS_WITH((j7.get>()), "[json.exception.type_error.302] type must be array, but is number"); + CHECK_THROWS_AS((j8.get>()), json::type_error&); + CHECK_THROWS_WITH((j7.get>()), + "[json.exception.type_error.302] type must be array, " + "but is number"); + CHECK_THROWS_WITH((j8.get>()), + "[json.exception.type_error.302] type must be array, " + "but is number"); SECTION("superfluous entries") { - json j8 = {{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}; - m2 = j8.get>(); - CHECK(m == m2); + json j9 = {{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}; + m2 = j9.get>(); + CHECK(m == m2); + } + } + + SECTION("std::unordered_map (array of pairs)") + { + std::unordered_map m{{0, 1}, {1, 2}, {2, 3}}; + json j6 = m; + + auto m2 = j6.get>(); + CHECK(m == m2); + + json j7 = {0, 1, 2, 3}; + json j8 = 2; + CHECK_THROWS_AS((j7.get>()), json::type_error&); + CHECK_THROWS_AS((j8.get>()), json::type_error&); + CHECK_THROWS_WITH((j7.get>()), + "[json.exception.type_error.302] type must be array, " + "but is number"); + CHECK_THROWS_WITH((j8.get>()), + "[json.exception.type_error.302] type must be array, " + "but is number"); + + SECTION("superfluous entries") + { + json j9{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}; + m2 = j9.get>(); + CHECK(m == m2); } } From 2c920a103246f97587704a7befae8c9bdf06d760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= Date: Mon, 18 Jun 2018 10:53:51 +0200 Subject: [PATCH 100/156] run make amalgamate --- include/nlohmann/detail/output/serializer.hpp | 2 +- single_include/nlohmann/json.hpp | 60 ++- test/src/unit-conversions.cpp | 430 ++++++++++++------ 3 files changed, 316 insertions(+), 176 deletions(-) diff --git a/include/nlohmann/detail/output/serializer.hpp b/include/nlohmann/detail/output/serializer.hpp index 19ab9894..c0f81776 100644 --- a/include/nlohmann/detail/output/serializer.hpp +++ b/include/nlohmann/detail/output/serializer.hpp @@ -414,7 +414,7 @@ class serializer else { // we finish reading, but do not accept: string was incomplete - std::string sn(3,'\0'); + std::string sn(3, '\0'); snprintf(&sn[0], sn.size(), "%.2X", static_cast(s.back())); JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + sn)); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 2b387a8b..2921cba8 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -913,6 +913,7 @@ inline bool operator<(const value_t lhs, const value_t rhs) noexcept #include // string #include // tuple, make_tuple #include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map #include // pair, declval #include // valarray @@ -1186,10 +1187,29 @@ void from_json(const BasicJsonType& j, std::tuple& t) from_json_tuple_impl(j, t, index_sequence_for {}); } -template ::value>> -void from_json(const BasicJsonType& j, std::map& m) +void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_UNLIKELY(not j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); + } + for (const auto& p : j) + { + if (JSON_UNLIKELY(not p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +template ::value>> +void from_json(const BasicJsonType& j, std::unordered_map& m) { if (JSON_UNLIKELY(not j.is_array())) { @@ -1973,10 +1993,8 @@ class input_adapter #include // localeconv #include // size_t #include // strtof, strtod, strtold, strtoll, strtoull +#include // snprintf #include // initializer_list -#include // hex, uppercase -#include // setw, setfill -#include // stringstream #include // char_traits, string #include // vector @@ -3146,10 +3164,9 @@ scan_number_done: if ('\x00' <= c and c <= '\x1F') { // escape control characters - std::stringstream ss; - ss << "(c) << ">"; - result += ss.str(); + char cs[9]; + snprintf(cs, 9, "", c); + result += cs; } else { @@ -5619,12 +5636,10 @@ class output_adapter #include // ldexp #include // size_t #include // uint8_t, uint16_t, uint32_t, uint64_t +#include // snprintf #include // memcpy -#include // setw, setfill -#include // hex #include // back_inserter #include // numeric_limits -#include // stringstream #include // char_traits, string #include // make_pair, move @@ -7283,9 +7298,9 @@ class binary_reader */ std::string get_token_string() const { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; - return ss.str(); + char cr[3]; + snprintf(cr, 3, "%.2X", current); + return std::string{cr}; } private: @@ -8272,11 +8287,8 @@ class binary_writer #include // size_t, ptrdiff_t #include // uint8_t #include // snprintf -#include // setfill -#include // next #include // numeric_limits #include // string -#include // stringstream #include // is_same // #include @@ -9753,9 +9765,9 @@ class serializer case UTF8_REJECT: // decode found invalid UTF-8 byte { - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << static_cast(byte); - JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + ss.str())); + std::string sn(3, '\0'); + snprintf(&sn[0], sn.size(), "%.2X", byte); + JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + sn)); } default: // decode found yet incomplete multi-byte code point @@ -9781,9 +9793,9 @@ class serializer else { // we finish reading, but do not accept: string was incomplete - std::stringstream ss; - ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << static_cast(static_cast(s.back())); - JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + ss.str())); + std::string sn(3, '\0'); + snprintf(&sn[0], sn.size(), "%.2X", static_cast(s.back())); + JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + sn)); } } diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 0691bbf4..061a2458 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -52,7 +52,13 @@ TEST_CASE("value conversion") { SECTION("get an object (explicit)") { - json::object_t o_reference = {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} }; + json::object_t o_reference = {{"object", json::object()}, + {"array", {1, 2, 3, 4}}, + {"number", 42}, + {"boolean", false}, + {"null", nullptr}, + {"string", "Hello world"} + }; json j(o_reference); SECTION("json::object_t") @@ -63,19 +69,22 @@ TEST_CASE("value conversion") SECTION("std::map") { - std::map o = j.get>(); + std::map o = + j.get>(); CHECK(json(o) == j); } SECTION("std::multimap") { - std::multimap o = j.get>(); + std::multimap o = + j.get>(); CHECK(json(o) == j); } SECTION("std::unordered_map") { - std::unordered_map o = j.get>(); + std::unordered_map o = + j.get>(); CHECK(json(o) == j); } @@ -88,34 +97,55 @@ TEST_CASE("value conversion") SECTION("exception in case of a non-object type") { - CHECK_THROWS_AS(json(json::value_t::null).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::array).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::string).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::null).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::array).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::string).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::boolean).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_integer).get(), + json::type_error&); + CHECK_THROWS_AS( + json(json::value_t::number_unsigned).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_float).get(), + json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "[json.exception.type_error.302] type must be object, but is null"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "[json.exception.type_error.302] type must be object, but is array"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "[json.exception.type_error.302] type must be object, but is string"); + CHECK_THROWS_WITH( + json(json::value_t::null).get(), + "[json.exception.type_error.302] type must be object, but is null"); + CHECK_THROWS_WITH( + json(json::value_t::array).get(), + "[json.exception.type_error.302] type must be object, but is array"); + CHECK_THROWS_WITH( + json(json::value_t::string).get(), + "[json.exception.type_error.302] type must be object, but is string"); CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "[json.exception.type_error.302] type must be object, but is boolean"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "[json.exception.type_error.302] type must be object, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "[json.exception.type_error.302] type must be object, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "[json.exception.type_error.302] type must be object, but is number"); + "[json.exception.type_error.302] type must be object, " + "but is boolean"); + CHECK_THROWS_WITH( + json(json::value_t::number_integer).get(), + "[json.exception.type_error.302] type must be object, but is number"); + CHECK_THROWS_WITH( + json(json::value_t::number_unsigned).get(), + "[json.exception.type_error.302] type must be object, but is number"); + CHECK_THROWS_WITH( + json(json::value_t::number_float).get(), + "[json.exception.type_error.302] type must be object, but is number"); } } SECTION("get an object (implicit)") { - json::object_t o_reference = {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} }; + json::object_t o_reference = {{"object", json::object()}, + {"array", {1, 2, 3, 4}}, + {"number", 42}, + {"boolean", false}, + {"null", nullptr}, + {"string", "Hello world"} + }; json j(o_reference); SECTION("json::object_t") @@ -151,7 +181,8 @@ TEST_CASE("value conversion") SECTION("get an array (explicit)") { - json::array_t a_reference {json(1), json(1u), json(2.2), json(false), json("string"), json()}; + json::array_t a_reference{json(1), json(1u), json(2.2), + json(false), json("string"), json()}; json j(a_reference); SECTION("json::array_t") @@ -171,9 +202,11 @@ TEST_CASE("value conversion") std::forward_list a = j.get>(); CHECK(json(a) == j); - CHECK_THROWS_AS(json(json::value_t::null).get>(), json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::null).get>(), - "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_AS(json(json::value_t::null).get>(), + json::type_error&); + CHECK_THROWS_WITH( + json(json::value_t::null).get>(), + "[json.exception.type_error.302] type must be array, but is null"); } SECTION("std::vector") @@ -181,9 +214,11 @@ TEST_CASE("value conversion") std::vector a = j.get>(); CHECK(json(a) == j); - CHECK_THROWS_AS(json(json::value_t::null).get>(), json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::null).get>(), - "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_AS(json(json::value_t::null).get>(), + json::type_error&); + CHECK_THROWS_WITH( + json(json::value_t::null).get>(), + "[json.exception.type_error.302] type must be array, but is null"); #if not defined(JSON_NOEXCEPTION) SECTION("reserve is called on containers that supports it") @@ -222,36 +257,52 @@ TEST_CASE("value conversion") SECTION("exception in case of a non-array type") { - CHECK_THROWS_AS(json(json::value_t::null).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::object).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::string).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::null).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::object).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::string).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::boolean).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_integer).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_float).get(), + json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::object).get>(), - "[json.exception.type_error.302] type must be array, but is object"); - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "[json.exception.type_error.302] type must be array, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "[json.exception.type_error.302] type must be array, but is object"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "[json.exception.type_error.302] type must be array, but is string"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "[json.exception.type_error.302] type must be array, but is boolean"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "[json.exception.type_error.302] type must be array, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "[json.exception.type_error.302] type must be array, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "[json.exception.type_error.302] type must be array, but is number"); + CHECK_THROWS_WITH( + json(json::value_t::object).get>(), + "[json.exception.type_error.302] type must be array, but is object"); + CHECK_THROWS_WITH( + json(json::value_t::null).get(), + "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH( + json(json::value_t::object).get(), + "[json.exception.type_error.302] type must be array, but is object"); + CHECK_THROWS_WITH( + json(json::value_t::string).get(), + "[json.exception.type_error.302] type must be array, but is string"); + CHECK_THROWS_WITH( + json(json::value_t::boolean).get(), + "[json.exception.type_error.302] type must be array, but is boolean"); + CHECK_THROWS_WITH( + json(json::value_t::number_integer).get(), + "[json.exception.type_error.302] type must be array, but is number"); + CHECK_THROWS_WITH( + json(json::value_t::number_unsigned).get(), + "[json.exception.type_error.302] type must be array, but is number"); + CHECK_THROWS_WITH( + json(json::value_t::number_float).get(), + "[json.exception.type_error.302] type must be array, but is number"); } } SECTION("get an array (implicit)") { - json::array_t a_reference {json(1), json(1u), json(2.2), json(false), json("string"), json()}; + json::array_t a_reference{json(1), json(1u), json(2.2), + json(false), json("string"), json()}; json j(a_reference); SECTION("json::array_t") @@ -287,7 +338,7 @@ TEST_CASE("value conversion") SECTION("get a string (explicit)") { - json::string_t s_reference {"Hello world"}; + json::string_t s_reference{"Hello world"}; json j(s_reference); SECTION("string_t") @@ -304,34 +355,49 @@ TEST_CASE("value conversion") SECTION("exception in case of a non-string type") { - CHECK_THROWS_AS(json(json::value_t::null).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::object).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::array).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::null).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::object).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::array).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::boolean).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_integer).get(), + json::type_error&); + CHECK_THROWS_AS( + json(json::value_t::number_unsigned).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_float).get(), + json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "[json.exception.type_error.302] type must be string, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "[json.exception.type_error.302] type must be string, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "[json.exception.type_error.302] type must be string, but is array"); + CHECK_THROWS_WITH( + json(json::value_t::null).get(), + "[json.exception.type_error.302] type must be string, but is null"); + CHECK_THROWS_WITH( + json(json::value_t::object).get(), + "[json.exception.type_error.302] type must be string, but is object"); + CHECK_THROWS_WITH( + json(json::value_t::array).get(), + "[json.exception.type_error.302] type must be string, but is array"); CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "[json.exception.type_error.302] type must be string, but is boolean"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "[json.exception.type_error.302] type must be string, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "[json.exception.type_error.302] type must be string, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "[json.exception.type_error.302] type must be string, but is number"); + "[json.exception.type_error.302] type must be string, " + "but is boolean"); + CHECK_THROWS_WITH( + json(json::value_t::number_integer).get(), + "[json.exception.type_error.302] type must be string, but is number"); + CHECK_THROWS_WITH( + json(json::value_t::number_unsigned).get(), + "[json.exception.type_error.302] type must be string, but is number"); + CHECK_THROWS_WITH( + json(json::value_t::number_float).get(), + "[json.exception.type_error.302] type must be string, but is number"); } } SECTION("get a string (implicit)") { - json::string_t s_reference {"Hello world"}; + json::string_t s_reference{"Hello world"}; json j(s_reference); SECTION("string_t") @@ -349,7 +415,7 @@ TEST_CASE("value conversion") SECTION("get a boolean (explicit)") { - json::boolean_t b_reference {true}; + json::boolean_t b_reference{true}; json j(b_reference); SECTION("boolean_t") @@ -366,34 +432,53 @@ TEST_CASE("value conversion") SECTION("exception in case of a non-string type") { - CHECK_THROWS_AS(json(json::value_t::null).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::object).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::array).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::string).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_integer).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::number_float).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::null).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::object).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::array).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::string).get(), + json::type_error&); + CHECK_THROWS_AS( + json(json::value_t::number_integer).get(), + json::type_error&); + CHECK_THROWS_AS( + json(json::value_t::number_unsigned).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_float).get(), + json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "[json.exception.type_error.302] type must be boolean, but is null"); + CHECK_THROWS_WITH( + json(json::value_t::null).get(), + "[json.exception.type_error.302] type must be boolean, but is null"); CHECK_THROWS_WITH(json(json::value_t::object).get(), - "[json.exception.type_error.302] type must be boolean, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "[json.exception.type_error.302] type must be boolean, but is array"); + "[json.exception.type_error.302] type must be boolean, " + "but is object"); + CHECK_THROWS_WITH( + json(json::value_t::array).get(), + "[json.exception.type_error.302] type must be boolean, but is array"); CHECK_THROWS_WITH(json(json::value_t::string).get(), - "[json.exception.type_error.302] type must be boolean, but is string"); - CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), - "[json.exception.type_error.302] type must be boolean, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), - "[json.exception.type_error.302] type must be boolean, but is number"); - CHECK_THROWS_WITH(json(json::value_t::number_float).get(), - "[json.exception.type_error.302] type must be boolean, but is number"); + "[json.exception.type_error.302] type must be boolean, " + "but is string"); + CHECK_THROWS_WITH( + json(json::value_t::number_integer).get(), + "[json.exception.type_error.302] type must be boolean, but is " + "number"); + CHECK_THROWS_WITH( + json(json::value_t::number_unsigned).get(), + "[json.exception.type_error.302] type must be boolean, but is " + "number"); + CHECK_THROWS_WITH( + json(json::value_t::number_float).get(), + "[json.exception.type_error.302] type must be boolean, but is " + "number"); } } SECTION("get a boolean (implicit)") { - json::boolean_t b_reference {true}; + json::boolean_t b_reference{true}; json j(b_reference); SECTION("boolean_t") @@ -411,9 +496,9 @@ TEST_CASE("value conversion") SECTION("get an integer number (explicit)") { - json::number_integer_t n_reference {42}; + json::number_integer_t n_reference{42}; json j(n_reference); - json::number_unsigned_t n_unsigned_reference {42u}; + json::number_unsigned_t n_unsigned_reference{42u}; json j_unsigned(n_unsigned_reference); SECTION("number_integer_t") @@ -622,33 +707,47 @@ TEST_CASE("value conversion") SECTION("exception in case of a non-number type") { - CHECK_THROWS_AS(json(json::value_t::null).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::object).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::array).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::string).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::null).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::object).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::array).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::string).get(), + json::type_error&); + CHECK_THROWS_AS( + json(json::value_t::boolean).get(), + json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "[json.exception.type_error.302] type must be number, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "[json.exception.type_error.302] type must be number, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "[json.exception.type_error.302] type must be number, but is array"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "[json.exception.type_error.302] type must be number, but is string"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "[json.exception.type_error.302] type must be number, but is boolean"); + CHECK_THROWS_WITH( + json(json::value_t::null).get(), + "[json.exception.type_error.302] type must be number, but is null"); + CHECK_THROWS_WITH( + json(json::value_t::object).get(), + "[json.exception.type_error.302] type must be number, but is object"); + CHECK_THROWS_WITH( + json(json::value_t::array).get(), + "[json.exception.type_error.302] type must be number, but is array"); + CHECK_THROWS_WITH( + json(json::value_t::string).get(), + "[json.exception.type_error.302] type must be number, but is string"); + CHECK_THROWS_WITH( + json(json::value_t::boolean).get(), + "[json.exception.type_error.302] type must be number, but is " + "boolean"); - CHECK_NOTHROW(json(json::value_t::number_float).get()); - CHECK_NOTHROW(json(json::value_t::number_float).get()); + CHECK_NOTHROW( + json(json::value_t::number_float).get()); + CHECK_NOTHROW( + json(json::value_t::number_float).get()); } } SECTION("get an integer number (implicit)") { - json::number_integer_t n_reference {42}; + json::number_integer_t n_reference{42}; json j(n_reference); - json::number_unsigned_t n_unsigned_reference {42u}; + json::number_unsigned_t n_unsigned_reference{42u}; json j_unsigned(n_unsigned_reference); SECTION("number_integer_t") @@ -858,7 +957,7 @@ TEST_CASE("value conversion") SECTION("get a floating-point number (explicit)") { - json::number_float_t n_reference {42.23}; + json::number_float_t n_reference{42.23}; json j(n_reference); SECTION("number_float_t") @@ -881,31 +980,44 @@ TEST_CASE("value conversion") SECTION("exception in case of a non-string type") { - CHECK_THROWS_AS(json(json::value_t::null).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::object).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::array).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::string).get(), json::type_error&); - CHECK_THROWS_AS(json(json::value_t::boolean).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::null).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::object).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::array).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::string).get(), + json::type_error&); + CHECK_THROWS_AS(json(json::value_t::boolean).get(), + json::type_error&); - CHECK_THROWS_WITH(json(json::value_t::null).get(), - "[json.exception.type_error.302] type must be number, but is null"); - CHECK_THROWS_WITH(json(json::value_t::object).get(), - "[json.exception.type_error.302] type must be number, but is object"); - CHECK_THROWS_WITH(json(json::value_t::array).get(), - "[json.exception.type_error.302] type must be number, but is array"); - CHECK_THROWS_WITH(json(json::value_t::string).get(), - "[json.exception.type_error.302] type must be number, but is string"); - CHECK_THROWS_WITH(json(json::value_t::boolean).get(), - "[json.exception.type_error.302] type must be number, but is boolean"); + CHECK_THROWS_WITH( + json(json::value_t::null).get(), + "[json.exception.type_error.302] type must be number, but is null"); + CHECK_THROWS_WITH( + json(json::value_t::object).get(), + "[json.exception.type_error.302] type must be number, but is object"); + CHECK_THROWS_WITH( + json(json::value_t::array).get(), + "[json.exception.type_error.302] type must be number, but is array"); + CHECK_THROWS_WITH( + json(json::value_t::string).get(), + "[json.exception.type_error.302] type must be number, but is string"); + CHECK_THROWS_WITH( + json(json::value_t::boolean).get(), + "[json.exception.type_error.302] type must be number, but is " + "boolean"); - CHECK_NOTHROW(json(json::value_t::number_integer).get()); - CHECK_NOTHROW(json(json::value_t::number_unsigned).get()); + CHECK_NOTHROW( + json(json::value_t::number_integer).get()); + CHECK_NOTHROW( + json(json::value_t::number_unsigned).get()); } } SECTION("get a floating-point number (implicit)") { - json::number_float_t n_reference {42.23}; + json::number_float_t n_reference{42.23}; json j(n_reference); SECTION("number_float_t") @@ -962,7 +1074,7 @@ TEST_CASE("value conversion") j3.get>(); j4.get>(); j5.get>(); - //CHECK(m5["one"] == "eins"); + // CHECK(m5["one"] == "eins"); } SECTION("std::multimap") @@ -972,7 +1084,7 @@ TEST_CASE("value conversion") j3.get>(); j4.get>(); j5.get>(); - //CHECK(m5["one"] == "eins"); + // CHECK(m5["one"] == "eins"); } SECTION("std::unordered_multimap") @@ -982,13 +1094,16 @@ TEST_CASE("value conversion") j3.get>(); j4.get>(); j5.get>(); - //CHECK(m5["one"] == "eins"); + // CHECK(m5["one"] == "eins"); } SECTION("exception in case of a non-object type") { - CHECK_THROWS_AS((json().get>()), json::type_error&); - CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be object, but is null"); + CHECK_THROWS_AS((json().get>()), + json::type_error&); + CHECK_THROWS_WITH( + (json().get>()), + "[json.exception.type_error.302] type must be object, but is null"); } } @@ -1030,7 +1145,8 @@ TEST_CASE("value conversion") { std::array arr6 = {{1, 2, 3, 4, 5, 6}}; CHECK_THROWS_AS(arr6 = j1, json::out_of_range&); - CHECK_THROWS_WITH(arr6 = j1, "[json.exception.out_of_range.401] array index 4 is out of range"); + CHECK_THROWS_WITH(arr6 = j1, "[json.exception.out_of_range.401] " + "array index 4 is out of range"); } SECTION("std::array is smaller than JSON") @@ -1151,12 +1267,24 @@ TEST_CASE("value conversion") // does type really must be an array? or it rather must not be null? // that's what I thought when other test like this one broke - CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); - CHECK_THROWS_WITH((json().get>()), "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH( + (json().get>()), + "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH( + (json().get>()), + "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH( + (json().get>()), + "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH( + (json().get>()), + "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH( + (json().get>()), + "[json.exception.type_error.302] type must be array, but is null"); + CHECK_THROWS_WITH( + (json().get>()), + "[json.exception.type_error.302] type must be array, but is null"); } } } From e7c1638d1179422c0d112c8a61197224973f400a Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Mon, 18 Jun 2018 22:03:46 +0200 Subject: [PATCH 101/156] :lipstick: cleanup --- test/src/unit-alt-string.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index c5e89111..32a784ce 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -82,7 +82,8 @@ class alt_string return str_impl != op; } - bool operator!=(const alt_string& op) const { + bool operator!=(const alt_string& op) const + { return str_impl != op.str_impl; } @@ -166,7 +167,8 @@ using alt_json = nlohmann::basic_json < nlohmann::adl_serializer >; -bool operator<(const char* op1, const alt_string& op2) { +bool operator<(const char* op1, const alt_string& op2) +{ return op1 < op2.str_impl; } From 85f35a1d5968fc556a054cb8be881b3d00aa4f66 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 22 Jun 2018 22:34:42 +0200 Subject: [PATCH 102/156] :memo: documentation fix --- include/nlohmann/json.hpp | 2 +- single_include/nlohmann/json.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index f5b93632..cac7805a 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -4332,7 +4332,7 @@ class basic_json @complexity Constant. - @since version 3.x.x. + @since version 3.1.0. */ iteration_proxy items() noexcept { diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 2921cba8..b5035f19 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -15088,7 +15088,7 @@ class basic_json @complexity Constant. - @since version 3.x.x. + @since version 3.1.0. */ iteration_proxy items() noexcept { From 0460b9097710e536907757bda8cfd7e949a9d82e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 22 Jun 2018 22:35:48 +0200 Subject: [PATCH 103/156] :memo: fix for #1052 #1139 --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 691cd105..9faabf91 100644 --- a/README.md +++ b/README.md @@ -525,6 +525,14 @@ int vi = jn.get(); // etc. ``` +Note that `char` types are not automatically converted to JSON strings, but to integer numbers. A conversion to a string must be specified explicitly: + +```cpp +char ch = 'A'; // ASCII value 65 +json j_default = ch; // stores integer number 65 +json j_string = std::string(1, ch); // stores string "A" +``` + ### Arbitrary types conversions Every type can be serialized in JSON, not just STL containers and scalar types. Usually, you would do something along those lines: From 850922269d6beb627c119e634385afc5083af089 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 23 Jun 2018 10:28:04 +0200 Subject: [PATCH 104/156] :rotating_light: removed compiler warnings --- .../nlohmann/detail/input/binary_reader.hpp | 19 ++++++++++------- include/nlohmann/detail/input/lexer.hpp | 2 +- single_include/nlohmann/json.hpp | 21 +++++++++++-------- test/src/unit-conversions.cpp | 8 ------- test/src/unit-testsuites.cpp | 4 ++-- 5 files changed, 26 insertions(+), 28 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index e20763c4..9f2a53a5 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -35,6 +35,7 @@ class binary_reader { using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; using string_t = typename BasicJsonType::string_t; using json_sax_t = json_sax; @@ -423,19 +424,21 @@ class binary_reader val = (mant == 0) ? std::numeric_limits::infinity() : std::numeric_limits::quiet_NaN(); } - return sax->number_float((half & 0x8000) != 0 ? -val : val, ""); + return sax->number_float((half & 0x8000) != 0 + ? static_cast(-val) + : static_cast(val), ""); } case 0xFA: // Single-Precision Float (four-byte IEEE 754) { float number; - return get_number(number) and sax->number_float(static_cast(number), ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 0xFB: // Double-Precision Float (eight-byte IEEE 754) { double number; - return get_number(number) and sax->number_float(number, ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } default: // anything else (0xFF is handled inside the other types) @@ -676,13 +679,13 @@ class binary_reader case 0xCA: // float 32 { float number; - return get_number(number) and sax->number_float(static_cast(number), ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 0xCB: // float 64 { double number; - return get_number(number) and sax->number_float(number, ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 0xCC: // uint 8 @@ -1464,13 +1467,13 @@ class binary_reader case 'd': { float number; - return get_number(number) and sax->number_float(static_cast(number), ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 'D': { double number; - return get_number(number) and sax->number_float(number, ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 'C': // char @@ -1664,7 +1667,7 @@ class binary_reader std::string get_token_string() const { char cr[3]; - snprintf(cr, 3, "%.2X", current); + snprintf(cr, 3, "%.2hhX", static_cast(current)); return std::string{cr}; } diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 3fb79068..facd6871 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1173,7 +1173,7 @@ scan_number_done: { // escape control characters char cs[9]; - snprintf(cs, 9, "", c); + snprintf(cs, 9, "", c); result += cs; } else diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index b5035f19..4cf28888 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3165,7 +3165,7 @@ scan_number_done: { // escape control characters char cs[9]; - snprintf(cs, 9, "", c); + snprintf(cs, 9, "", c); result += cs; } else @@ -5670,6 +5670,7 @@ class binary_reader { using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; using string_t = typename BasicJsonType::string_t; using json_sax_t = json_sax; @@ -6058,19 +6059,21 @@ class binary_reader val = (mant == 0) ? std::numeric_limits::infinity() : std::numeric_limits::quiet_NaN(); } - return sax->number_float((half & 0x8000) != 0 ? -val : val, ""); + return sax->number_float((half & 0x8000) != 0 + ? static_cast(-val) + : static_cast(val), ""); } case 0xFA: // Single-Precision Float (four-byte IEEE 754) { float number; - return get_number(number) and sax->number_float(static_cast(number), ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 0xFB: // Double-Precision Float (eight-byte IEEE 754) { double number; - return get_number(number) and sax->number_float(number, ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } default: // anything else (0xFF is handled inside the other types) @@ -6311,13 +6314,13 @@ class binary_reader case 0xCA: // float 32 { float number; - return get_number(number) and sax->number_float(static_cast(number), ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 0xCB: // float 64 { double number; - return get_number(number) and sax->number_float(number, ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 0xCC: // uint 8 @@ -7099,13 +7102,13 @@ class binary_reader case 'd': { float number; - return get_number(number) and sax->number_float(static_cast(number), ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 'D': { double number; - return get_number(number) and sax->number_float(number, ""); + return get_number(number) and sax->number_float(static_cast(number), ""); } case 'C': // char @@ -7299,7 +7302,7 @@ class binary_reader std::string get_token_string() const { char cr[3]; - snprintf(cr, 3, "%.2X", current); + snprintf(cr, 3, "%.2hhX", static_cast(current)); return std::string{cr}; } diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 061a2458..df9a6c18 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -40,14 +40,6 @@ using nlohmann::json; #include #include -namespace -{ -template -void map_type_conversion_checks() -{ -} -} - TEST_CASE("value conversion") { SECTION("get an object (explicit)") diff --git a/test/src/unit-testsuites.cpp b/test/src/unit-testsuites.cpp index 24c4195d..51a209f1 100644 --- a/test/src/unit-testsuites.cpp +++ b/test/src/unit-testsuites.cpp @@ -1191,7 +1191,7 @@ TEST_CASE("nst's JSONTestSuite (2)") { CAPTURE(filename); std::ifstream f(filename); - CHECK_THROWS_AS(json::parse(f), json::parse_error); + CHECK_THROWS_AS(json::parse(f), json::parse_error&); std::ifstream f2(filename); CHECK(not json::accept(f2)); } @@ -1306,7 +1306,7 @@ TEST_CASE("nst's JSONTestSuite (2)") { CAPTURE(filename); std::ifstream f(filename); - CHECK_THROWS_AS(json::parse(f), json::exception); // could be parse_error or out_of_range + CHECK_THROWS_AS(json::parse(f), json::exception&); // could be parse_error or out_of_range std::ifstream f2(filename); CHECK(not json::accept(f2)); } From 66dd1a846dbb38a35bc74bd0f8874ed0fe6f67f0 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 23 Jun 2018 10:47:55 +0200 Subject: [PATCH 105/156] :rotating_light: fixed more compiler warnings --- include/nlohmann/detail/conversions/to_json.hpp | 2 +- include/nlohmann/detail/input/json_sax.hpp | 4 +--- include/nlohmann/detail/input/lexer.hpp | 2 +- include/nlohmann/detail/iterators/primitive_iterator.hpp | 4 ++-- single_include/nlohmann/json.hpp | 8 +++----- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp index ce2bc0aa..f8c31661 100644 --- a/include/nlohmann/detail/conversions/to_json.hpp +++ b/include/nlohmann/detail/conversions/to_json.hpp @@ -247,7 +247,7 @@ void to_json(BasicJsonType& j, const CompatibleArrayType& arr) template::value, int> = 0> -void to_json(BasicJsonType& j, std::valarray arr) +void to_json(BasicJsonType& j, const std::valarray& arr) { external_constructor::construct(j, std::move(arr)); } diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 5970afd5..563eac31 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -405,11 +405,9 @@ class json_sax_dom_callback_parser : public json_sax bool end_object() override { - bool keep = true; if (ref_stack.back()) { - keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()); - if (not keep) + if (not callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) { // discard object *ref_stack.back() = discarded; diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index facd6871..9b7c8de1 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1173,7 +1173,7 @@ scan_number_done: { // escape control characters char cs[9]; - snprintf(cs, 9, "", c); + snprintf(cs, 9, "", static_cast(c)); result += cs; } else diff --git a/include/nlohmann/detail/iterators/primitive_iterator.hpp b/include/nlohmann/detail/iterators/primitive_iterator.hpp index db0b1e7c..db3f8975 100644 --- a/include/nlohmann/detail/iterators/primitive_iterator.hpp +++ b/include/nlohmann/detail/iterators/primitive_iterator.hpp @@ -87,7 +87,7 @@ class primitive_iterator_t primitive_iterator_t const operator++(int) noexcept { auto result = *this; - m_it++; + ++m_it; return result; } @@ -100,7 +100,7 @@ class primitive_iterator_t primitive_iterator_t const operator--(int) noexcept { auto result = *this; - m_it--; + --m_it; return result; } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 4cf28888..21c37d7d 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1520,7 +1520,7 @@ void to_json(BasicJsonType& j, const CompatibleArrayType& arr) template::value, int> = 0> -void to_json(BasicJsonType& j, std::valarray arr) +void to_json(BasicJsonType& j, const std::valarray& arr) { external_constructor::construct(j, std::move(arr)); } @@ -3165,7 +3165,7 @@ scan_number_done: { // escape control characters char cs[9]; - snprintf(cs, 9, "", c); + snprintf(cs, 9, "", static_cast(c)); result += cs; } else @@ -3746,11 +3746,9 @@ class json_sax_dom_callback_parser : public json_sax bool end_object() override { - bool keep = true; if (ref_stack.back()) { - keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()); - if (not keep) + if (not callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) { // discard object *ref_stack.back() = discarded; From c02de445bf6f36cca71d24703accc21b942d90e9 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 23 Jun 2018 11:00:42 +0200 Subject: [PATCH 106/156] :rotating_light: fixed more compiler warnings --- include/nlohmann/detail/input/input_adapters.hpp | 2 +- .../detail/iterators/json_reverse_iterator.hpp | 4 ++-- single_include/nlohmann/json.hpp | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index d1c7fea1..01bec749 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -119,7 +119,7 @@ template class wide_string_input_adapter : public input_adapter_protocol { public: - wide_string_input_adapter(const WideStringType& w) : str(w) {} + explicit wide_string_input_adapter(const WideStringType& w) : str(w) {} std::char_traits::int_type get_character() noexcept override { diff --git a/include/nlohmann/detail/iterators/json_reverse_iterator.hpp b/include/nlohmann/detail/iterators/json_reverse_iterator.hpp index 06448191..11f2a30a 100644 --- a/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +++ b/include/nlohmann/detail/iterators/json_reverse_iterator.hpp @@ -41,11 +41,11 @@ class json_reverse_iterator : public std::reverse_iterator using reference = typename Base::reference; /// create reverse iterator from iterator - json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept : base_iterator(it) {} /// create reverse iterator from base class - json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} /// post-increment (it++) json_reverse_iterator const operator++(int) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 21c37d7d..4c9f4cd9 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1733,7 +1733,7 @@ template class wide_string_input_adapter : public input_adapter_protocol { public: - wide_string_input_adapter(const WideStringType& w) : str(w) {} + explicit wide_string_input_adapter(const WideStringType& w) : str(w) {} std::char_traits::int_type get_character() noexcept override { @@ -4593,7 +4593,7 @@ class primitive_iterator_t primitive_iterator_t const operator++(int) noexcept { auto result = *this; - m_it++; + ++m_it; return result; } @@ -4606,7 +4606,7 @@ class primitive_iterator_t primitive_iterator_t const operator--(int) noexcept { auto result = *this; - m_it--; + --m_it; return result; } @@ -5433,11 +5433,11 @@ class json_reverse_iterator : public std::reverse_iterator using reference = typename Base::reference; /// create reverse iterator from iterator - json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept : base_iterator(it) {} /// create reverse iterator from base class - json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} /// post-increment (it++) json_reverse_iterator const operator++(int) From c8bfdfd9613486ac541ef697531adba5ed8ea025 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 23 Jun 2018 11:12:32 +0200 Subject: [PATCH 107/156] :construction_worker: tryping different platforms for AppVeyor --- appveyor.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index da703786..493a678a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,9 @@ version: '{build}' +platform: + - x86 + - x64 + os: - Visual Studio 2015 - Visual Studio 2017 From ed6a0686dfad1f256469171e059ca5f4abab68d5 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 23 Jun 2018 17:05:04 +0200 Subject: [PATCH 108/156] :hammer: small refactoring to improve branch coverage The branch coverage reported by lcov is weird. The code before and after has the same Godbolt assembler, but the code with the lambda has a better branch coverage. --- .../nlohmann/detail/input/binary_reader.hpp | 32 ++++++++++--------- single_include/nlohmann/json.hpp | 32 ++++++++++--------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index 9f2a53a5..726e552d 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -408,22 +408,24 @@ class binary_reader // half-precision floating-point numbers in the C language // is shown in Fig. 3. const int half = (byte1 << 8) + byte2; - const int exp = (half >> 10) & 0x1F; - const int mant = half & 0x3FF; - double val; - if (exp == 0) + const double val = [&half] { - val = std::ldexp(mant, -24); - } - else if (exp != 31) - { - val = std::ldexp(mant + 1024, exp - 25); - } - else - { - val = (mant == 0) ? std::numeric_limits::infinity() - : std::numeric_limits::quiet_NaN(); - } + const int exp = (half >> 10) & 0x1F; + const int mant = half & 0x3FF; + assert(0 <= exp and exp <= 32); + assert(0 <= mant and mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); return sax->number_float((half & 0x8000) != 0 ? static_cast(-val) : static_cast(val), ""); diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 4c9f4cd9..f4fc1fda 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -6041,22 +6041,24 @@ class binary_reader // half-precision floating-point numbers in the C language // is shown in Fig. 3. const int half = (byte1 << 8) + byte2; - const int exp = (half >> 10) & 0x1F; - const int mant = half & 0x3FF; - double val; - if (exp == 0) + const double val = [&half] { - val = std::ldexp(mant, -24); - } - else if (exp != 31) - { - val = std::ldexp(mant + 1024, exp - 25); - } - else - { - val = (mant == 0) ? std::numeric_limits::infinity() - : std::numeric_limits::quiet_NaN(); - } + const int exp = (half >> 10) & 0x1F; + assert(0 <= exp and exp <= 32); + const int mant = half & 0x3FF; + assert(0 <= mant and mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); return sax->number_float((half & 0x8000) != 0 ? static_cast(-val) : static_cast(val), ""); From 7fa4ddf93e4fc51bd6af78a9666e721e3a159828 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 23 Jun 2018 17:27:40 +0200 Subject: [PATCH 109/156] :lipstick: fixed indentation --- .../nlohmann/detail/conversions/to_json.hpp | 18 +++++++++--------- single_include/nlohmann/json.hpp | 2 +- test/src/unit-conversions.cpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp index 64090dcc..be32270b 100644 --- a/include/nlohmann/detail/conversions/to_json.hpp +++ b/include/nlohmann/detail/conversions/to_json.hpp @@ -52,15 +52,15 @@ struct external_constructor j.assert_invariant(); } - template::value, - int> = 0> - static void construct(BasicJsonType& j, const CompatibleStringType& str) - { - j.m_type = value_t::string; - j.m_value.string = j.template create(str); - j.assert_invariant(); - } + template::value, + int> = 0> + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } }; template<> diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index fa60301c..82fada78 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -6091,8 +6091,8 @@ class binary_reader const double val = [&half] { const int exp = (half >> 10) & 0x1F; - assert(0 <= exp and exp <= 32); const int mant = half & 0x3FF; + assert(0 <= exp and exp <= 32); assert(0 <= mant and mant <= 1024); switch (exp) { diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 5b6dea22..548d0d9b 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -48,7 +48,7 @@ using nlohmann::json; #endif #if defined(JSON_HAS_CPP_17) -#include + #include #endif TEST_CASE("value conversion") From 441e5d87e6e214402f5a4ca0df0ad0ffe8981897 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 16:17:06 +0200 Subject: [PATCH 110/156] :construction_worker: experimenting with AppVeyor and MinGW --- appveyor.yml | 68 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 493a678a..afe74a53 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,31 +1,59 @@ version: '{build}' -platform: - - x86 - - x64 - -os: - - Visual Studio 2015 - - Visual Studio 2017 - environment: matrix: - - additional_flags: "" - - additional_flags: "/permissive- /std:c++latest /utf-8" + - os: Visual Studio 2015 + platform: x86 + FLAGS: "" + GENERATOR: Visual Studio 14 2015 -matrix: - exclude: - - additional_flags: "/permissive- /std:c++latest /utf-8" - os: Visual Studio 2015 - -init: [] + - os: Visual Studio 2017 + platform: x86 + FLAGS: "" + GENERATOR: Visual Studio 15 2017 -install: [] + - os: Visual Studio 2017 + platform: x86 + FLAGS: "/permissive- /std:c++latest /utf-8" + GENERATOR: Visual Studio 15 2017 + + - os: Visual Studio 2015 + platform: x64 + FLAGS: "" + GENERATOR: Visual Studio 14 2015 + + - os: Visual Studio 2017 + platform: x64 + FLAGS: "" + GENERATOR: Visual Studio 15 2017 + + - os: Visual Studio 2017 + platform: x64 + FLAGS: "/permissive- /std:c++latest /utf-8" + GENERATOR: Visual Studio 15 2017 + + - COMPILER: mingw + platform: x86 + FLAGS: "" + GENERATOR: MinGW Makefiles + + - COMPILER: mingw + platform: x64 + FLAGS: "" + GENERATOR: MinGW Makefiles + +init: + - cmake --version + - msbuild /version + +install: + - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin;%PATH% + +before_build: + - cmake . -G%GENERATOR% -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_BUILD_TYPE=Release build_script: - - IF "%APPVEYOR_BUILD_WORKER_IMAGE%" == "Visual Studio 2015" ( SET GEN="Visual Studio 14 2015") ELSE (SET GEN="Visual Studio 15 2017") - - cmake . -G%GEN% -DCMAKE_CXX_FLAGS="%additional_flags%" - - cmake --build . --config Release + - cmake --build . test_script: - ctest -C Release -V -j From 7bbc06b487bd375c11221d9da7ff4c9d4f7c8cd8 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 16:18:44 +0200 Subject: [PATCH 111/156] :construction_worker: forgot quotes --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index afe74a53..2ba09bbd 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -50,7 +50,7 @@ install: - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin;%PATH% before_build: - - cmake . -G%GENERATOR% -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_BUILD_TYPE=Release + - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_BUILD_TYPE=Release build_script: - cmake --build . From 067e288289053726b893aa09ea9917a493064157 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 16:29:03 +0200 Subject: [PATCH 112/156] :construction_worker: set build type --- appveyor.yml | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 2ba09bbd..375093f5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,6 +2,16 @@ version: '{build}' environment: matrix: + - COMPILER: mingw + platform: x86 + FLAGS: "" + GENERATOR: MinGW Makefiles + + - COMPILER: mingw + platform: x64 + FLAGS: "" + GENERATOR: MinGW Makefiles + - os: Visual Studio 2015 platform: x86 FLAGS: "" @@ -32,15 +42,8 @@ environment: FLAGS: "/permissive- /std:c++latest /utf-8" GENERATOR: Visual Studio 15 2017 - - COMPILER: mingw - platform: x86 - FLAGS: "" - GENERATOR: MinGW Makefiles - - - COMPILER: mingw - platform: x64 - FLAGS: "" - GENERATOR: MinGW Makefiles +matrix: + fast_finish: true init: - cmake --version @@ -50,10 +53,10 @@ install: - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin;%PATH% before_build: - - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_BUILD_TYPE=Release + - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" build_script: - - cmake --build . + - cmake --build . --config Release test_script: - ctest -C Release -V -j From 989ad9b759686047755d5b7797a56aac59996e93 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 16:35:16 +0200 Subject: [PATCH 113/156] :construction_worker: using help from https://stackoverflow.com/a/48509334/266378 --- appveyor.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 375093f5..17839c57 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,16 +2,12 @@ version: '{build}' environment: matrix: - - COMPILER: mingw + - os: Visual Studio 2015 + COMPILER: mingw platform: x86 FLAGS: "" GENERATOR: MinGW Makefiles - - COMPILER: mingw - platform: x64 - FLAGS: "" - GENERATOR: MinGW Makefiles - - os: Visual Studio 2015 platform: x86 FLAGS: "" @@ -50,10 +46,10 @@ init: - msbuild /version install: - - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin;%PATH% + - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin before_build: - - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" + - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" build_script: - cmake --build . --config Release From 937d68e2e597e6998135116f8038b1cd7ddf3136 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 16:37:02 +0200 Subject: [PATCH 114/156] :construction_worker: forgot old PATH --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 17839c57..06bd954e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -46,7 +46,7 @@ init: - msbuild /version install: - - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin + - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin;%PATH% before_build: - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" From e59b930927add51a37abe761d8380a54b8909827 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 16:40:47 +0200 Subject: [PATCH 115/156] :construction_worker: trying a more recent compiler --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 06bd954e..6e488923 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -46,7 +46,7 @@ init: - msbuild /version install: - - if "%COMPILER%"=="mingw" set PATH=C:\MinGW\bin;%PATH% + - if "%COMPILER%"=="mingw" set PATH=C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;%PATH% before_build: - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" From d8fe13fc83ea60a714b7ba47e5d9f34ab0aa731f Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 16:57:53 +0200 Subject: [PATCH 116/156] :hammer: fixed escaping for MinGW --- test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8509c151..122c9137 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -116,7 +116,7 @@ foreach(file ${files}) set_tests_properties("${testcase}_default" PROPERTIES LABELS "default") add_test(NAME "${testcase}_all" - COMMAND ${testcase} ${CATCH_TEST_FILTER} "*" + COMMAND ${testcase} ${CATCH_TEST_FILTER} "\\*" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) set_tests_properties("${testcase}_all" PROPERTIES LABELS "all") From 1bbc4a0859321cd95a3875af63069851401adb1d Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 17:10:13 +0200 Subject: [PATCH 117/156] :construction_worker: using Ninja to speed up build --- appveyor.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 6e488923..9979844b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,7 @@ environment: COMPILER: mingw platform: x86 FLAGS: "" - GENERATOR: MinGW Makefiles + GENERATOR: Ninja - os: Visual Studio 2015 platform: x86 @@ -46,6 +46,10 @@ init: - msbuild /version install: + - set NINJA_URL="https://github.com/ninja-build/ninja/releases/download/v1.6.0/ninja-win.zip" + - appveyor DownloadFile %NINJA_URL% -FileName ninja.zip + - 7z x ninja.zip -oC:\projects\deps\ninja > nul + - set PATH=C:\projects\deps\ninja;%PATH% - if "%COMPILER%"=="mingw" set PATH=C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;%PATH% before_build: From 09c0df4a21d34008cea3d3073facc507924f58b7 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 17:40:16 +0200 Subject: [PATCH 118/156] :construction_worker: choosing correct image --- appveyor.yml | 25 +++++++++++-------------- test/CMakeLists.txt | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 9979844b..705f53fa 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,55 +2,52 @@ version: '{build}' environment: matrix: - - os: Visual Studio 2015 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 COMPILER: mingw platform: x86 FLAGS: "" GENERATOR: Ninja - - os: Visual Studio 2015 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 platform: x86 FLAGS: "" GENERATOR: Visual Studio 14 2015 - - os: Visual Studio 2017 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 platform: x86 FLAGS: "" GENERATOR: Visual Studio 15 2017 - - os: Visual Studio 2017 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 platform: x86 FLAGS: "/permissive- /std:c++latest /utf-8" GENERATOR: Visual Studio 15 2017 - - os: Visual Studio 2015 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 platform: x64 FLAGS: "" GENERATOR: Visual Studio 14 2015 - - os: Visual Studio 2017 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 platform: x64 FLAGS: "" GENERATOR: Visual Studio 15 2017 - - os: Visual Studio 2017 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 platform: x64 FLAGS: "/permissive- /std:c++latest /utf-8" GENERATOR: Visual Studio 15 2017 -matrix: - fast_finish: true - init: - cmake --version - msbuild /version install: - - set NINJA_URL="https://github.com/ninja-build/ninja/releases/download/v1.6.0/ninja-win.zip" - - appveyor DownloadFile %NINJA_URL% -FileName ninja.zip - - 7z x ninja.zip -oC:\projects\deps\ninja > nul - - set PATH=C:\projects\deps\ninja;%PATH% + - if "%COMPILER%"=="mingw" appveyor DownloadFile https://github.com/ninja-build/ninja/releases/download/v1.6.0/ninja-win.zip -FileName ninja.zip + - if "%COMPILER%"=="mingw" 7z x ninja.zip -oC:\projects\deps\ninja > nul + - if "%COMPILER%"=="mingw" set PATH=C:\projects\deps\ninja;%PATH% - if "%COMPILER%"=="mingw" set PATH=C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;%PATH% + - if "%COMPILER%"=="mingw" g++ --version before_build: - cmake . -G "%GENERATOR%" -DCMAKE_CXX_FLAGS="%FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 122c9137..8509c151 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -116,7 +116,7 @@ foreach(file ${files}) set_tests_properties("${testcase}_default" PROPERTIES LABELS "default") add_test(NAME "${testcase}_all" - COMMAND ${testcase} ${CATCH_TEST_FILTER} "\\*" + COMMAND ${testcase} ${CATCH_TEST_FILTER} "*" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) set_tests_properties("${testcase}_all" PROPERTIES LABELS "all") From 62457729e8f2369b94f62a26d2142c914dbc489e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 24 Jun 2018 18:03:59 +0200 Subject: [PATCH 119/156] :memo: mentioned MinGW in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9faabf91..9a72edf3 100644 --- a/README.md +++ b/README.md @@ -828,6 +828,7 @@ The following compilers are currently used in continuous integration at [Travis] | GCC 5.4.1 | Ubuntu 14.04.5 LTS | g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904 | | GCC 6.3.0 | Ubuntu 14.04.5 LTS | g++-6 (Ubuntu/Linaro 6.3.0-18ubuntu2~14.04) 6.3.0 20170519 | | GCC 7.1.0 | Ubuntu 14.04.5 LTS | g++-7 (Ubuntu 7.1.0-5ubuntu2~14.04) 7.1.0 +| GCC 7.3.0 | Windows Server 2012 R2 (x64) | g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0 | Clang 3.5.0 | Ubuntu 14.04.5 LTS | clang version 3.5.0-4ubuntu2~trusty2 (tags/RELEASE_350/final) | | Clang 3.6.2 | Ubuntu 14.04.5 LTS | clang version 3.6.2-svn240577-1~exp1 (branches/release_36) | | Clang 3.7.1 | Ubuntu 14.04.5 LTS | clang version 3.7.1-svn253571-1~exp1 (branches/release_37) | From 0bb36bb140e0b7cdd9aed8831a431a5da37e5f6f Mon Sep 17 00:00:00 2001 From: Julius Rakow Date: Sat, 23 Jun 2018 20:45:00 +0200 Subject: [PATCH 120/156] meson: fix include directory --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index cdbaad90..a48a1936 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('nlohmann_json', 'cpp') -nlohmann_json_inc = include_directories('single_include/nlohmann') +nlohmann_json_inc = include_directories('single_include') nlohmann_json_dep = declare_dependency( include_directories : nlohmann_json_inc From ec2ebd5ec93e3695e31d43d2b5af52c57b2db60b Mon Sep 17 00:00:00 2001 From: Julius Rakow Date: Sun, 24 Jun 2018 16:53:02 +0200 Subject: [PATCH 121/156] meson: add multiple headers target --- meson.build | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index a48a1936..c79dcd3e 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,9 @@ project('nlohmann_json', 'cpp') -nlohmann_json_inc = include_directories('single_include') - nlohmann_json_dep = declare_dependency( - include_directories : nlohmann_json_inc + include_directories: include_directories('single_include') +) + +nlohmann_json_multiple_headers = declare_dependency( + include_directories: include_directories('include') ) From 9f00db48d91643336ad0901613c4d790171d63d8 Mon Sep 17 00:00:00 2001 From: Julius Rakow Date: Sun, 24 Jun 2018 22:29:33 +0200 Subject: [PATCH 122/156] :memo: link to cppreference via HTTPS --- README.md | 12 +-- .../nlohmann/detail/conversions/to_chars.hpp | 2 +- .../nlohmann/detail/iterators/iter_impl.hpp | 2 +- .../iterators/json_reverse_iterator.hpp | 4 +- include/nlohmann/json.hpp | 68 ++++++++-------- include/nlohmann/json_fwd.hpp | 2 +- single_include/nlohmann/json.hpp | 78 +++++++++---------- test/src/unit-comparison.cpp | 2 +- 8 files changed, 85 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 9a72edf3..f231d0fe 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,7 @@ json j = json::parse(v); ### STL-like access -We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirement. +We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirement. ```cpp // create an array using push_back @@ -611,7 +611,7 @@ Some important things: * Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined). * Those methods **MUST** be available (e.g., properly headers must be included) everywhere you use the implicit conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise. -* When using `get()`, `your_type` **MUST** be [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). (There is a way to bypass this requirement described later.) +* When using `get()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). (There is a way to bypass this requirement described later.) * In function `from_json`, use function [`at()`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a93403e803947b86f4da2d1fb3345cf2c.html#a93403e803947b86f4da2d1fb3345cf2c) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior. * In case your type contains several `operator=` definitions, code like `your_variable = your_json;` [may not compile](https://github.com/nlohmann/json/issues/667). You need to write `your_variable = your_json.get();` instead. * You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these. @@ -623,7 +623,7 @@ Some important things: This requires a bit more advanced technique. But first, let's see how this conversion mechanism works: The library uses **JSON Serializers** to convert types to json. -The default serializer for `nlohmann::json` is `nlohmann::adl_serializer` (ADL means [Argument-Dependent Lookup](http://en.cppreference.com/w/cpp/language/adl)). +The default serializer for `nlohmann::json` is `nlohmann::adl_serializer` (ADL means [Argument-Dependent Lookup](https://en.cppreference.com/w/cpp/language/adl)). It is implemented like this (simplified): @@ -672,7 +672,7 @@ namespace nlohmann { #### How can I use `get()` for non-default constructible/non-copyable types? -There is a way, if your type is [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload: +There is a way, if your type is [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload: ```cpp struct move_only_type { @@ -933,7 +933,7 @@ I deeply appreciate the help of the following people. - [Vladimir Petrigo](https://github.com/vpetrigo) made a SFINAE hack more readable and added Visual Studio 17 to the build matrix. - [Denis Andrejew](https://github.com/seeekr) fixed a grammar issue in the README file. - [Pierre-Antoine Lacaze](https://github.com/palacaze) found a subtle bug in the `dump()` function. -- [TurpentineDistillery](https://github.com/TurpentineDistillery) pointed to [`std::locale::classic()`](http://en.cppreference.com/w/cpp/locale/locale/classic) to avoid too much locale joggling, found some nice performance improvements in the parser, improved the benchmarking code, and realized locale-independent number parsing and printing. +- [TurpentineDistillery](https://github.com/TurpentineDistillery) pointed to [`std::locale::classic()`](https://en.cppreference.com/w/cpp/locale/locale/classic) to avoid too much locale joggling, found some nice performance improvements in the parser, improved the benchmarking code, and realized locale-independent number parsing and printing. - [cgzones](https://github.com/cgzones) had an idea how to fix the Coverity scan. - [Jared Grubb](https://github.com/jaredgrubb) silenced a nasty documentation warning. - [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check. @@ -1037,7 +1037,7 @@ The library is currently used in Apple macOS Sierra and iOS 10. I am not sure wh ## Notes -- The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](http://en.cppreference.com/w/cpp/error/assert). In particular, note [`operator[]`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a2e26bd0b0168abb61f67ad5bcd5b9fa1.html#a2e26bd0b0168abb61f67ad5bcd5b9fa1) implements **unchecked access** for const objects: If the given key is not present, the behavior is undefined (think of a dereferenced null pointer) and yields an [assertion failure](https://github.com/nlohmann/json/issues/289) if assertions are switched on. If you are not sure whether an element in an object exists, use checked access with the [`at()` function](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a674de1ee73e6bf4843fc5dc1351fb726.html#a674de1ee73e6bf4843fc5dc1351fb726). +- The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](https://en.cppreference.com/w/cpp/error/assert). In particular, note [`operator[]`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a2e26bd0b0168abb61f67ad5bcd5b9fa1.html#a2e26bd0b0168abb61f67ad5bcd5b9fa1) implements **unchecked access** for const objects: If the given key is not present, the behavior is undefined (think of a dereferenced null pointer) and yields an [assertion failure](https://github.com/nlohmann/json/issues/289) if assertions are switched on. If you are not sure whether an element in an object exists, use checked access with the [`at()` function](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a674de1ee73e6bf4843fc5dc1351fb726.html#a674de1ee73e6bf4843fc5dc1351fb726). - As the exact type of a number is not defined in the [JSON specification](http://rfc7159.net/rfc7159), this library tries to choose the best fitting C++ number type automatically. As a result, the type `double` may be used to store numbers which may yield [**floating-point exceptions**](https://github.com/nlohmann/json/issues/181) in certain rare situations if floating-point exceptions have been unmasked in the calling code. These exceptions are not caused by the library and need to be fixed in the calling code, such as by re-masking the exceptions prior to calling library functions. - The library supports **Unicode input** as follows: - Only **UTF-8** encoded input is supported which is the default encoding for JSON according to [RFC 7159](http://rfc7159.net/rfc7159#rfc.section.8.1). diff --git a/include/nlohmann/detail/conversions/to_chars.hpp b/include/nlohmann/detail/conversions/to_chars.hpp index 186b62ef..a13d258c 100644 --- a/include/nlohmann/detail/conversions/to_chars.hpp +++ b/include/nlohmann/detail/conversions/to_chars.hpp @@ -887,7 +887,7 @@ void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) // numbers, all float's can be recovered using strtod (and strtof). However, the resulting // decimal representations are not exactly "short". // - // The documentation for 'std::to_chars' (http://en.cppreference.com/w/cpp/utility/to_chars) + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) // says "value is converted to a string as if by std::sprintf in the default ("C") locale" // and since sprintf promotes float's to double's, I think this is exactly what 'std::to_chars' // does. diff --git a/include/nlohmann/detail/iterators/iter_impl.hpp b/include/nlohmann/detail/iterators/iter_impl.hpp index 08108a22..753a2212 100644 --- a/include/nlohmann/detail/iterators/iter_impl.hpp +++ b/include/nlohmann/detail/iterators/iter_impl.hpp @@ -31,7 +31,7 @@ This class implements a both iterators (iterator and const_iterator) for the @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). diff --git a/include/nlohmann/detail/iterators/json_reverse_iterator.hpp b/include/nlohmann/detail/iterators/json_reverse_iterator.hpp index 11f2a30a..e215c168 100644 --- a/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +++ b/include/nlohmann/detail/iterators/json_reverse_iterator.hpp @@ -21,10 +21,10 @@ create @ref const_reverse_iterator). @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). -- [OutputIterator](http://en.cppreference.com/w/cpp/concept/OutputIterator): +- [OutputIterator](https://en.cppreference.com/w/cpp/concept/OutputIterator): It is possible to write to the pointed-to element (only if @a Base is @ref iterator). diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 5cd7c01e..2ca63591 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -101,42 +101,42 @@ and `from_json()` (@ref adl_serializer by default) @requirement The class satisfies the following concept requirements: - Basic - - [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible): + - [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible): JSON values can be default constructed. The result will be a JSON null value. - - [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible): + - [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible): A JSON value can be constructed from an rvalue argument. - - [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible): + - [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible): A JSON value can be copy-constructed from an lvalue expression. - - [MoveAssignable](http://en.cppreference.com/w/cpp/concept/MoveAssignable): + - [MoveAssignable](https://en.cppreference.com/w/cpp/concept/MoveAssignable): A JSON value van be assigned from an rvalue argument. - - [CopyAssignable](http://en.cppreference.com/w/cpp/concept/CopyAssignable): + - [CopyAssignable](https://en.cppreference.com/w/cpp/concept/CopyAssignable): A JSON value can be copy-assigned from an lvalue expression. - - [Destructible](http://en.cppreference.com/w/cpp/concept/Destructible): + - [Destructible](https://en.cppreference.com/w/cpp/concept/Destructible): JSON values can be destructed. - Layout - - [StandardLayoutType](http://en.cppreference.com/w/cpp/concept/StandardLayoutType): + - [StandardLayoutType](https://en.cppreference.com/w/cpp/concept/StandardLayoutType): JSON values have - [standard layout](http://en.cppreference.com/w/cpp/language/data_members#Standard_layout): + [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout): All non-static data members are private and standard layout types, the class has no virtual functions or (virtual) base classes. - Library-wide - - [EqualityComparable](http://en.cppreference.com/w/cpp/concept/EqualityComparable): + - [EqualityComparable](https://en.cppreference.com/w/cpp/concept/EqualityComparable): JSON values can be compared with `==`, see @ref operator==(const_reference,const_reference). - - [LessThanComparable](http://en.cppreference.com/w/cpp/concept/LessThanComparable): + - [LessThanComparable](https://en.cppreference.com/w/cpp/concept/LessThanComparable): JSON values can be compared with `<`, see @ref operator<(const_reference,const_reference). - - [Swappable](http://en.cppreference.com/w/cpp/concept/Swappable): + - [Swappable](https://en.cppreference.com/w/cpp/concept/Swappable): Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of other compatible types, using unqualified function call @ref swap(). - - [NullablePointer](http://en.cppreference.com/w/cpp/concept/NullablePointer): + - [NullablePointer](https://en.cppreference.com/w/cpp/concept/NullablePointer): JSON values can be compared against `std::nullptr_t` objects which are used to model the `null` value. - Container - - [Container](http://en.cppreference.com/w/cpp/concept/Container): + - [Container](https://en.cppreference.com/w/cpp/concept/Container): JSON values can be used like STL containers and provide iterator access. - - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer); + - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer); JSON values can be used like STL containers and provide reverse iterator access. @@ -1595,7 +1595,7 @@ class basic_json @warning A precondition is enforced with a runtime assertion that will result in calling `std::abort` if this precondition is not met. Assertions can be disabled by defining `NDEBUG` at compile time. - See http://en.cppreference.com/w/cpp/error/assert for more + See https://en.cppreference.com/w/cpp/error/assert for more information. @throw invalid_iterator.201 if iterators @a first and @a last are not @@ -1735,7 +1735,7 @@ class basic_json changes to any JSON value. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. - As postcondition, it holds: `other == basic_json(other)`. @@ -1820,7 +1820,7 @@ class basic_json exceptions. @requirement This function helps `basic_json` satisfying the - [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible) + [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible) requirements. @liveexample{The code below shows the move constructor explicitly called @@ -1854,7 +1854,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. @@ -1891,7 +1891,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. - All stored elements are destroyed and all memory is freed. @@ -2522,8 +2522,8 @@ class basic_json @brief get a value (explicit) Explicit type conversion between the JSON value and a compatible value - which is [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) - and [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -2583,8 +2583,8 @@ class basic_json @brief get a value (explicit); special case Explicit type conversion between the JSON value and a compatible value - which is **not** [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) - and **not** [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -3948,7 +3948,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. @@ -3987,7 +3987,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).begin()`. @@ -4019,7 +4019,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. @@ -4058,7 +4058,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).end()`. @@ -4088,7 +4088,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(end())`. @@ -4125,7 +4125,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(begin())`. @@ -4162,7 +4162,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rbegin()`. @@ -4191,7 +4191,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rend()`. @@ -4389,7 +4389,7 @@ class basic_json false in the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `begin() == end()`. @@ -4460,7 +4460,7 @@ class basic_json the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `std::distance(begin(), end())`. @@ -4530,7 +4530,7 @@ class basic_json @exceptionsafety No-throw guarantee: this function never throws exceptions. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of returning `b.size()` where `b` is the largest diff --git a/include/nlohmann/json_fwd.hpp b/include/nlohmann/json_fwd.hpp index 7f003a88..5ff0d753 100644 --- a/include/nlohmann/json_fwd.hpp +++ b/include/nlohmann/json_fwd.hpp @@ -18,7 +18,7 @@ namespace nlohmann @brief default JSONSerializer template argument This serializer ignores the template arguments and uses ADL -([argument-dependent lookup](http://en.cppreference.com/w/cpp/language/adl)) +([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) for serialization. */ template diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 82fada78..aba64955 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -67,7 +67,7 @@ namespace nlohmann @brief default JSONSerializer template argument This serializer ignores the template arguments and uses ADL -([argument-dependent lookup](http://en.cppreference.com/w/cpp/language/adl)) +([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) for serialization. */ template @@ -4740,7 +4740,7 @@ This class implements a both iterators (iterator and const_iterator) for the @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). @@ -5460,10 +5460,10 @@ create @ref const_reverse_iterator). @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). -- [OutputIterator](http://en.cppreference.com/w/cpp/concept/OutputIterator): +- [OutputIterator](https://en.cppreference.com/w/cpp/concept/OutputIterator): It is possible to write to the pointed-to element (only if @a Base is @ref iterator). @@ -9233,7 +9233,7 @@ void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) // numbers, all float's can be recovered using strtod (and strtof). However, the resulting // decimal representations are not exactly "short". // - // The documentation for 'std::to_chars' (http://en.cppreference.com/w/cpp/utility/to_chars) + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) // says "value is converted to a string as if by std::sprintf in the default ("C") locale" // and since sprintf promotes float's to double's, I think this is exactly what 'std::to_chars' // does. @@ -10907,42 +10907,42 @@ and `from_json()` (@ref adl_serializer by default) @requirement The class satisfies the following concept requirements: - Basic - - [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible): + - [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible): JSON values can be default constructed. The result will be a JSON null value. - - [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible): + - [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible): A JSON value can be constructed from an rvalue argument. - - [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible): + - [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible): A JSON value can be copy-constructed from an lvalue expression. - - [MoveAssignable](http://en.cppreference.com/w/cpp/concept/MoveAssignable): + - [MoveAssignable](https://en.cppreference.com/w/cpp/concept/MoveAssignable): A JSON value van be assigned from an rvalue argument. - - [CopyAssignable](http://en.cppreference.com/w/cpp/concept/CopyAssignable): + - [CopyAssignable](https://en.cppreference.com/w/cpp/concept/CopyAssignable): A JSON value can be copy-assigned from an lvalue expression. - - [Destructible](http://en.cppreference.com/w/cpp/concept/Destructible): + - [Destructible](https://en.cppreference.com/w/cpp/concept/Destructible): JSON values can be destructed. - Layout - - [StandardLayoutType](http://en.cppreference.com/w/cpp/concept/StandardLayoutType): + - [StandardLayoutType](https://en.cppreference.com/w/cpp/concept/StandardLayoutType): JSON values have - [standard layout](http://en.cppreference.com/w/cpp/language/data_members#Standard_layout): + [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout): All non-static data members are private and standard layout types, the class has no virtual functions or (virtual) base classes. - Library-wide - - [EqualityComparable](http://en.cppreference.com/w/cpp/concept/EqualityComparable): + - [EqualityComparable](https://en.cppreference.com/w/cpp/concept/EqualityComparable): JSON values can be compared with `==`, see @ref operator==(const_reference,const_reference). - - [LessThanComparable](http://en.cppreference.com/w/cpp/concept/LessThanComparable): + - [LessThanComparable](https://en.cppreference.com/w/cpp/concept/LessThanComparable): JSON values can be compared with `<`, see @ref operator<(const_reference,const_reference). - - [Swappable](http://en.cppreference.com/w/cpp/concept/Swappable): + - [Swappable](https://en.cppreference.com/w/cpp/concept/Swappable): Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of other compatible types, using unqualified function call @ref swap(). - - [NullablePointer](http://en.cppreference.com/w/cpp/concept/NullablePointer): + - [NullablePointer](https://en.cppreference.com/w/cpp/concept/NullablePointer): JSON values can be compared against `std::nullptr_t` objects which are used to model the `null` value. - Container - - [Container](http://en.cppreference.com/w/cpp/concept/Container): + - [Container](https://en.cppreference.com/w/cpp/concept/Container): JSON values can be used like STL containers and provide iterator access. - - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer); + - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer); JSON values can be used like STL containers and provide reverse iterator access. @@ -12401,7 +12401,7 @@ class basic_json @warning A precondition is enforced with a runtime assertion that will result in calling `std::abort` if this precondition is not met. Assertions can be disabled by defining `NDEBUG` at compile time. - See http://en.cppreference.com/w/cpp/error/assert for more + See https://en.cppreference.com/w/cpp/error/assert for more information. @throw invalid_iterator.201 if iterators @a first and @a last are not @@ -12541,7 +12541,7 @@ class basic_json changes to any JSON value. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. - As postcondition, it holds: `other == basic_json(other)`. @@ -12626,7 +12626,7 @@ class basic_json exceptions. @requirement This function helps `basic_json` satisfying the - [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible) + [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible) requirements. @liveexample{The code below shows the move constructor explicitly called @@ -12660,7 +12660,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. @@ -12697,7 +12697,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. - All stored elements are destroyed and all memory is freed. @@ -13328,8 +13328,8 @@ class basic_json @brief get a value (explicit) Explicit type conversion between the JSON value and a compatible value - which is [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) - and [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -13389,8 +13389,8 @@ class basic_json @brief get a value (explicit); special case Explicit type conversion between the JSON value and a compatible value - which is **not** [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) - and **not** [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -14754,7 +14754,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. @@ -14793,7 +14793,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).begin()`. @@ -14825,7 +14825,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. @@ -14864,7 +14864,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).end()`. @@ -14894,7 +14894,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(end())`. @@ -14931,7 +14931,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(begin())`. @@ -14968,7 +14968,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rbegin()`. @@ -14997,7 +14997,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rend()`. @@ -15195,7 +15195,7 @@ class basic_json false in the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `begin() == end()`. @@ -15266,7 +15266,7 @@ class basic_json the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `std::distance(begin(), end())`. @@ -15336,7 +15336,7 @@ class basic_json @exceptionsafety No-throw guarantee: this function never throws exceptions. @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of returning `b.size()` where `b` is the largest diff --git a/test/src/unit-comparison.cpp b/test/src/unit-comparison.cpp index da394407..72a512c1 100644 --- a/test/src/unit-comparison.cpp +++ b/test/src/unit-comparison.cpp @@ -33,7 +33,7 @@ SOFTWARE. using nlohmann::json; // helper function to check std::less -// see http://en.cppreference.com/w/cpp/utility/functional/less +// see https://en.cppreference.com/w/cpp/utility/functional/less template > bool f(A a, B b, U u = U()) { From 963d06a13c5b3b0042c3ac1c05dcc2b03b69133e Mon Sep 17 00:00:00 2001 From: Julius Rakow Date: Sun, 24 Jun 2018 22:30:37 +0200 Subject: [PATCH 123/156] :memo: fix links to cppreference named requirements "Concepts" have been renamed to "named requirements". This is because P0898R3 Standard Library Concepts has been merged into C++20. Cppreference have moved their links accordingly. --- README.md | 6 +- .../nlohmann/detail/iterators/iter_impl.hpp | 2 +- .../iterators/json_reverse_iterator.hpp | 4 +- include/nlohmann/json.hpp | 64 ++++++++--------- single_include/nlohmann/json.hpp | 70 +++++++++---------- 5 files changed, 73 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index f231d0fe..1291f612 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,7 @@ json j = json::parse(v); ### STL-like access -We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirement. +We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirement. ```cpp // create an array using push_back @@ -611,7 +611,7 @@ Some important things: * Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined). * Those methods **MUST** be available (e.g., properly headers must be included) everywhere you use the implicit conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise. -* When using `get()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). (There is a way to bypass this requirement described later.) +* When using `get()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.) * In function `from_json`, use function [`at()`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a93403e803947b86f4da2d1fb3345cf2c.html#a93403e803947b86f4da2d1fb3345cf2c) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior. * In case your type contains several `operator=` definitions, code like `your_variable = your_json;` [may not compile](https://github.com/nlohmann/json/issues/667). You need to write `your_variable = your_json.get();` instead. * You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these. @@ -672,7 +672,7 @@ namespace nlohmann { #### How can I use `get()` for non-default constructible/non-copyable types? -There is a way, if your type is [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload: +There is a way, if your type is [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload: ```cpp struct move_only_type { diff --git a/include/nlohmann/detail/iterators/iter_impl.hpp b/include/nlohmann/detail/iterators/iter_impl.hpp index 753a2212..f34f7a55 100644 --- a/include/nlohmann/detail/iterators/iter_impl.hpp +++ b/include/nlohmann/detail/iterators/iter_impl.hpp @@ -31,7 +31,7 @@ This class implements a both iterators (iterator and const_iterator) for the @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). diff --git a/include/nlohmann/detail/iterators/json_reverse_iterator.hpp b/include/nlohmann/detail/iterators/json_reverse_iterator.hpp index e215c168..2750de4a 100644 --- a/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +++ b/include/nlohmann/detail/iterators/json_reverse_iterator.hpp @@ -21,10 +21,10 @@ create @ref const_reverse_iterator). @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). -- [OutputIterator](https://en.cppreference.com/w/cpp/concept/OutputIterator): +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): It is possible to write to the pointed-to element (only if @a Base is @ref iterator). diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 2ca63591..58b19982 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -101,42 +101,42 @@ and `from_json()` (@ref adl_serializer by default) @requirement The class satisfies the following concept requirements: - Basic - - [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible): + - [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible): JSON values can be default constructed. The result will be a JSON null value. - - [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible): + - [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible): A JSON value can be constructed from an rvalue argument. - - [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible): + - [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible): A JSON value can be copy-constructed from an lvalue expression. - - [MoveAssignable](https://en.cppreference.com/w/cpp/concept/MoveAssignable): + - [MoveAssignable](https://en.cppreference.com/w/cpp/named_req/MoveAssignable): A JSON value van be assigned from an rvalue argument. - - [CopyAssignable](https://en.cppreference.com/w/cpp/concept/CopyAssignable): + - [CopyAssignable](https://en.cppreference.com/w/cpp/named_req/CopyAssignable): A JSON value can be copy-assigned from an lvalue expression. - - [Destructible](https://en.cppreference.com/w/cpp/concept/Destructible): + - [Destructible](https://en.cppreference.com/w/cpp/named_req/Destructible): JSON values can be destructed. - Layout - - [StandardLayoutType](https://en.cppreference.com/w/cpp/concept/StandardLayoutType): + - [StandardLayoutType](https://en.cppreference.com/w/cpp/named_req/StandardLayoutType): JSON values have [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout): All non-static data members are private and standard layout types, the class has no virtual functions or (virtual) base classes. - Library-wide - - [EqualityComparable](https://en.cppreference.com/w/cpp/concept/EqualityComparable): + - [EqualityComparable](https://en.cppreference.com/w/cpp/named_req/EqualityComparable): JSON values can be compared with `==`, see @ref operator==(const_reference,const_reference). - - [LessThanComparable](https://en.cppreference.com/w/cpp/concept/LessThanComparable): + - [LessThanComparable](https://en.cppreference.com/w/cpp/named_req/LessThanComparable): JSON values can be compared with `<`, see @ref operator<(const_reference,const_reference). - - [Swappable](https://en.cppreference.com/w/cpp/concept/Swappable): + - [Swappable](https://en.cppreference.com/w/cpp/named_req/Swappable): Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of other compatible types, using unqualified function call @ref swap(). - - [NullablePointer](https://en.cppreference.com/w/cpp/concept/NullablePointer): + - [NullablePointer](https://en.cppreference.com/w/cpp/named_req/NullablePointer): JSON values can be compared against `std::nullptr_t` objects which are used to model the `null` value. - Container - - [Container](https://en.cppreference.com/w/cpp/concept/Container): + - [Container](https://en.cppreference.com/w/cpp/named_req/Container): JSON values can be used like STL containers and provide iterator access. - - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer); + - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer); JSON values can be used like STL containers and provide reverse iterator access. @@ -1735,7 +1735,7 @@ class basic_json changes to any JSON value. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is linear. - As postcondition, it holds: `other == basic_json(other)`. @@ -1820,7 +1820,7 @@ class basic_json exceptions. @requirement This function helps `basic_json` satisfying the - [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible) + [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible) requirements. @liveexample{The code below shows the move constructor explicitly called @@ -1854,7 +1854,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is linear. @@ -1891,7 +1891,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is linear. - All stored elements are destroyed and all memory is freed. @@ -2522,8 +2522,8 @@ class basic_json @brief get a value (explicit) Explicit type conversion between the JSON value and a compatible value - which is [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) - and [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -2583,8 +2583,8 @@ class basic_json @brief get a value (explicit); special case Explicit type conversion between the JSON value and a compatible value - which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) - and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -3948,7 +3948,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. @@ -3987,7 +3987,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).begin()`. @@ -4019,7 +4019,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. @@ -4058,7 +4058,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).end()`. @@ -4088,7 +4088,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(end())`. @@ -4125,7 +4125,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(begin())`. @@ -4162,7 +4162,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rbegin()`. @@ -4191,7 +4191,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rend()`. @@ -4389,7 +4389,7 @@ class basic_json false in the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `begin() == end()`. @@ -4460,7 +4460,7 @@ class basic_json the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `std::distance(begin(), end())`. @@ -4530,7 +4530,7 @@ class basic_json @exceptionsafety No-throw guarantee: this function never throws exceptions. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of returning `b.size()` where `b` is the largest diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index aba64955..a0a1b893 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -4740,7 +4740,7 @@ This class implements a both iterators (iterator and const_iterator) for the @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). @@ -5460,10 +5460,10 @@ create @ref const_reverse_iterator). @requirement The class satisfies the following concept requirements: - -[BidirectionalIterator](https://en.cppreference.com/w/cpp/concept/BidirectionalIterator): +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). -- [OutputIterator](https://en.cppreference.com/w/cpp/concept/OutputIterator): +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): It is possible to write to the pointed-to element (only if @a Base is @ref iterator). @@ -10907,42 +10907,42 @@ and `from_json()` (@ref adl_serializer by default) @requirement The class satisfies the following concept requirements: - Basic - - [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible): + - [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible): JSON values can be default constructed. The result will be a JSON null value. - - [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible): + - [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible): A JSON value can be constructed from an rvalue argument. - - [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible): + - [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible): A JSON value can be copy-constructed from an lvalue expression. - - [MoveAssignable](https://en.cppreference.com/w/cpp/concept/MoveAssignable): + - [MoveAssignable](https://en.cppreference.com/w/cpp/named_req/MoveAssignable): A JSON value van be assigned from an rvalue argument. - - [CopyAssignable](https://en.cppreference.com/w/cpp/concept/CopyAssignable): + - [CopyAssignable](https://en.cppreference.com/w/cpp/named_req/CopyAssignable): A JSON value can be copy-assigned from an lvalue expression. - - [Destructible](https://en.cppreference.com/w/cpp/concept/Destructible): + - [Destructible](https://en.cppreference.com/w/cpp/named_req/Destructible): JSON values can be destructed. - Layout - - [StandardLayoutType](https://en.cppreference.com/w/cpp/concept/StandardLayoutType): + - [StandardLayoutType](https://en.cppreference.com/w/cpp/named_req/StandardLayoutType): JSON values have [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout): All non-static data members are private and standard layout types, the class has no virtual functions or (virtual) base classes. - Library-wide - - [EqualityComparable](https://en.cppreference.com/w/cpp/concept/EqualityComparable): + - [EqualityComparable](https://en.cppreference.com/w/cpp/named_req/EqualityComparable): JSON values can be compared with `==`, see @ref operator==(const_reference,const_reference). - - [LessThanComparable](https://en.cppreference.com/w/cpp/concept/LessThanComparable): + - [LessThanComparable](https://en.cppreference.com/w/cpp/named_req/LessThanComparable): JSON values can be compared with `<`, see @ref operator<(const_reference,const_reference). - - [Swappable](https://en.cppreference.com/w/cpp/concept/Swappable): + - [Swappable](https://en.cppreference.com/w/cpp/named_req/Swappable): Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of other compatible types, using unqualified function call @ref swap(). - - [NullablePointer](https://en.cppreference.com/w/cpp/concept/NullablePointer): + - [NullablePointer](https://en.cppreference.com/w/cpp/named_req/NullablePointer): JSON values can be compared against `std::nullptr_t` objects which are used to model the `null` value. - Container - - [Container](https://en.cppreference.com/w/cpp/concept/Container): + - [Container](https://en.cppreference.com/w/cpp/named_req/Container): JSON values can be used like STL containers and provide iterator access. - - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer); + - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer); JSON values can be used like STL containers and provide reverse iterator access. @@ -12541,7 +12541,7 @@ class basic_json changes to any JSON value. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is linear. - As postcondition, it holds: `other == basic_json(other)`. @@ -12626,7 +12626,7 @@ class basic_json exceptions. @requirement This function helps `basic_json` satisfying the - [MoveConstructible](https://en.cppreference.com/w/cpp/concept/MoveConstructible) + [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible) requirements. @liveexample{The code below shows the move constructor explicitly called @@ -12660,7 +12660,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is linear. @@ -12697,7 +12697,7 @@ class basic_json @complexity Linear. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is linear. - All stored elements are destroyed and all memory is freed. @@ -13328,8 +13328,8 @@ class basic_json @brief get a value (explicit) Explicit type conversion between the JSON value and a compatible value - which is [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) - and [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -13389,8 +13389,8 @@ class basic_json @brief get a value (explicit); special case Explicit type conversion between the JSON value and a compatible value - which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/concept/CopyConstructible) - and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/concept/DefaultConstructible). + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. @@ -14754,7 +14754,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. @@ -14793,7 +14793,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).begin()`. @@ -14825,7 +14825,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. @@ -14864,7 +14864,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).end()`. @@ -14894,7 +14894,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(end())`. @@ -14931,7 +14931,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(begin())`. @@ -14968,7 +14968,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rbegin()`. @@ -14997,7 +14997,7 @@ class basic_json @complexity Constant. @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/concept/ReversibleContainer) + [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rend()`. @@ -15195,7 +15195,7 @@ class basic_json false in the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `begin() == end()`. @@ -15266,7 +15266,7 @@ class basic_json the case of a string. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of `std::distance(begin(), end())`. @@ -15336,7 +15336,7 @@ class basic_json @exceptionsafety No-throw guarantee: this function never throws exceptions. @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/concept/Container) + [Container](https://en.cppreference.com/w/cpp/named_req/Container) requirements: - The complexity is constant. - Has the semantics of returning `b.size()` where `b` is the largest From 396a914f9e4f5b7711a94353850f1abac3514974 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 26 Jun 2018 22:47:40 +0200 Subject: [PATCH 124/156] :hammer: added macro to disable compiler check #1128 --- README.md | 2 ++ include/nlohmann/detail/macro_scope.hpp | 16 +++++++++------- single_include/nlohmann/json.hpp | 16 +++++++++------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 1291f612..95a58235 100644 --- a/README.md +++ b/README.md @@ -820,6 +820,8 @@ Please note: - For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). +- Unsupported versions of GCC and Clang are rejected by `#error` directives. This can be switched off by defining `JSON_SKIP_UNSUPPORTED_COMPILER_CHECK`. Note that you can expect no support in this case. + The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/nlohmann/json) and [AppVeyor](https://ci.appveyor.com/project/nlohmann/json): | Compiler | Operating System | Version String | diff --git a/include/nlohmann/detail/macro_scope.hpp b/include/nlohmann/detail/macro_scope.hpp index e6752218..ae62fbf4 100644 --- a/include/nlohmann/detail/macro_scope.hpp +++ b/include/nlohmann/detail/macro_scope.hpp @@ -4,13 +4,15 @@ // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them // exclude unsupported compilers -#if defined(__clang__) - #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 - #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" - #endif -#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900 - #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif #endif #endif diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index a0a1b893..880f00e4 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -119,13 +119,15 @@ using json = basic_json<>; // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them // exclude unsupported compilers -#if defined(__clang__) - #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 - #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" - #endif -#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900 - #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif #endif #endif From 39dd775e3877b380ac12d5db926d1c528c025f47 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 28 Jun 2018 21:32:32 +0200 Subject: [PATCH 125/156] :hammer: cleanup after #1134 --- .../nlohmann/detail/conversions/to_json.hpp | 7 +- single_include/nlohmann/json.hpp | 275 +++++++++--------- 2 files changed, 139 insertions(+), 143 deletions(-) diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp index 5c024ebc..07946f55 100644 --- a/include/nlohmann/detail/conversions/to_json.hpp +++ b/include/nlohmann/detail/conversions/to_json.hpp @@ -10,6 +10,7 @@ #include #include +#include namespace nlohmann { @@ -294,14 +295,12 @@ void to_json(BasicJsonType& j, const std::pair& p) j = {p.first, p.second}; } -template class iteration_proxy; // TODO: Forward decl needed, maybe move somewhere else +// for https://github.com/nlohmann/json/pull/1134 template::iteration_proxy_internal>::value, int> = 0> void to_json(BasicJsonType& j, T b) noexcept { - typename BasicJsonType::object_t tmp_obj; - tmp_obj[b.key()] = b.value(); // TODO: maybe there is a better way? - external_constructor::construct(j, std::move(tmp_obj)); + j = {{b.key(), b.value()}}; } template diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 86ac01b8..88e90ad9 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -1322,6 +1322,137 @@ constexpr const auto& from_json = detail::static_const::va // #include +// #include + + +#include // size_t +#include // string, to_string +#include // input_iterator_tag + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// proxy class for the items() function +template class iteration_proxy +{ + private: + /// helper class for iteration + class iteration_proxy_internal + { + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_internal; + using pointer = iteration_proxy_internal*; + using reference = iteration_proxy_internal&; + using iterator_category = std::input_iterator_tag; + + private: + /// the iterator + IteratorType anchor; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; + /// a string representation of the array index + mutable std::string array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + const std::string empty_str = ""; + + public: + explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} + + iteration_proxy_internal(const iteration_proxy_internal&) = default; + iteration_proxy_internal& operator=(const iteration_proxy_internal&) = default; + + /// dereference operator (needed for range-based for) + iteration_proxy_internal& operator*() + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_internal& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_internal& o) const noexcept + { + return anchor == o.anchor; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_internal& o) const noexcept + { + return anchor != o.anchor; + } + + /// return key of the iterator + const std::string& key() const + { + assert(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + { + if (array_index != array_index_last) + { + array_index_str = std::to_string(array_index); + array_index_last = array_index; + } + return array_index_str; + } + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + default: + return empty_str; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } + }; + + /// the container to iterate + typename IteratorType::reference container; + + public: + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) noexcept + : container(cont) {} + + /// return iterator begin (needed for range-based for) + iteration_proxy_internal begin() noexcept + { + return iteration_proxy_internal(container.begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_internal end() noexcept + { + return iteration_proxy_internal(container.end()); + } +}; +} +} + namespace nlohmann { @@ -1606,14 +1737,12 @@ void to_json(BasicJsonType& j, const std::pair& p) j = {p.first, p.second}; } -template class iteration_proxy; // TODO: Forward decl needed, maybe move somewhere else +// for https://github.com/nlohmann/json/pull/1134 template::iteration_proxy_internal>::value, int> = 0> void to_json(BasicJsonType& j, T b) noexcept { - typename BasicJsonType::object_t tmp_obj; - tmp_obj[b.key()] = b.value(); // TODO: maybe there is a better way? - external_constructor::construct(j, std::move(tmp_obj)); + j = {{b.key(), b.value()}}; } template @@ -5336,135 +5465,6 @@ class iter_impl // #include - -#include // size_t -#include // string, to_string -#include // input_iterator_tag - -// #include - - -namespace nlohmann -{ -namespace detail -{ -/// proxy class for the items() function -template class iteration_proxy -{ - private: - /// helper class for iteration - class iteration_proxy_internal - { - public: - using difference_type = std::ptrdiff_t; - using value_type = iteration_proxy_internal; - using pointer = iteration_proxy_internal*; - using reference = iteration_proxy_internal&; - using iterator_category = std::input_iterator_tag; - - private: - /// the iterator - IteratorType anchor; - /// an index for arrays (used to create key names) - std::size_t array_index = 0; - /// last stringified array index - mutable std::size_t array_index_last = 0; - /// a string representation of the array index - mutable std::string array_index_str = "0"; - /// an empty string (to return a reference for primitive values) - const std::string empty_str = ""; - - public: - explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} - - iteration_proxy_internal(const iteration_proxy_internal&) = default; - iteration_proxy_internal& operator=(const iteration_proxy_internal&) = default; - - /// dereference operator (needed for range-based for) - iteration_proxy_internal& operator*() - { - return *this; - } - - /// increment operator (needed for range-based for) - iteration_proxy_internal& operator++() - { - ++anchor; - ++array_index; - - return *this; - } - - /// equality operator (needed for InputIterator) - bool operator==(const iteration_proxy_internal& o) const noexcept - { - return anchor == o.anchor; - } - - /// inequality operator (needed for range-based for) - bool operator!=(const iteration_proxy_internal& o) const noexcept - { - return anchor != o.anchor; - } - - /// return key of the iterator - const std::string& key() const - { - assert(anchor.m_object != nullptr); - - switch (anchor.m_object->type()) - { - // use integer array index as key - case value_t::array: - { - if (array_index != array_index_last) - { - array_index_str = std::to_string(array_index); - array_index_last = array_index; - } - return array_index_str; - } - - // use key from the object - case value_t::object: - return anchor.key(); - - // use an empty key for all primitive types - default: - return empty_str; - } - } - - /// return value of the iterator - typename IteratorType::reference value() const - { - return anchor.value(); - } - }; - - /// the container to iterate - typename IteratorType::reference container; - - public: - /// construct iteration proxy from a container - explicit iteration_proxy(typename IteratorType::reference cont) noexcept - : container(cont) {} - - /// return iterator begin (needed for range-based for) - iteration_proxy_internal begin() noexcept - { - return iteration_proxy_internal(container.begin()); - } - - /// return iterator end (needed for range-based for) - iteration_proxy_internal end() noexcept - { - return iteration_proxy_internal(container.end()); - } -}; -} -} - // #include @@ -8571,7 +8571,7 @@ boundaries compute_boundaries(FloatType value) constexpr int kMinExp = 1 - kBias; constexpr uint64_t kHiddenBit = uint64_t{1} << (kPrecision - 1); // = 2^(p-1) - using bits_type = typename std::conditional::type; + using bits_type = typename std::conditional< kPrecision == 24, uint32_t, uint64_t >::type; const uint64_t bits = reinterpret_bits(value); const uint64_t E = bits >> (kPrecision - 1); @@ -8982,10 +8982,7 @@ inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, // = ((p1 ) * 2^-e + (p2 )) * 2^e // = p1 + p2 * 2^e - const diyfp one(uint64_t - { - 1 - } << -M_plus.e, M_plus.e); + const diyfp one(uint64_t{1} << -M_plus.e, M_plus.e); uint32_t p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e @@ -18505,7 +18502,7 @@ struct hash /// @note: do not remove the space after '<', /// see https://github.com/nlohmann/json/pull/679 template<> -struct less<::nlohmann::detail::value_t> +struct less< ::nlohmann::detail::value_t> { /*! @brief compare two value_t enum values From b8ad3388ecde06c48825c2d338c043b217d11507 Mon Sep 17 00:00:00 2001 From: Sonu Lohani Date: Fri, 29 Jun 2018 09:34:41 +0530 Subject: [PATCH 126/156] Fixed compiler error in VS 2015 for debug mode https://github.com/nlohmann/json/issues/1114 --- test/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8509c151..c0f40728 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -81,6 +81,9 @@ if(MSVC) # Disable warning C4566: character represented by universal-character-name '\uFF01' cannot be represented in the current code page (1252) # Disable warning C4996: 'nlohmann::basic_json::operator <<': was declared deprecated set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4389 /wd4309 /wd4566 /wd4996") + + # https://github.com/nlohmann/json/issues/1114 + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj") endif() ############################################################################# From 7bfc406ded0434c438dd22139a8baa97f2ffa90e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 5 Jul 2018 21:18:46 +0200 Subject: [PATCH 127/156] :memo: added note about CocoaPods #1148 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 95a58235..ebb62106 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,8 @@ If you are using [vcpkg](https://github.com/Microsoft/vcpkg/) on your project fo If you are using [cget](http://cget.readthedocs.io/en/latest/), you can install the latest development version with `cget install nlohmann/json`. A specific version can be installed with `cget install nlohmann/json@v3.1.0`. Also, the multiple header version can be installed by adding the `-DJSON_MultipleHeaders=ON` flag (i.e., `cget install nlohmann/json -DJSON_MultipleHeaders=ON`). +If you are using [CocoaPods](https://cocoapods.org), you can use the library by adding pod `"nlohmann_json", '~>3.1.2'` to your podfile (see [an example](https://bitbucket.org/benman/nlohmann_json-cocoapod/src/master/)). Please file issues [here](https://bitbucket.org/benman/nlohmann_json-cocoapod/issues?status=new&status=open). + ## Examples Beside the examples below, you may want to check the [documentation](https://nlohmann.github.io/json/) where each function contains a separate code example (e.g., check out [`emplace()`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a5338e282d1d02bed389d852dd670d98d.html#a5338e282d1d02bed389d852dd670d98d)). All [example files](https://github.com/nlohmann/json/tree/develop/doc/examples) can be compiled and executed on their own (e.g., file [emplace.cpp](https://github.com/nlohmann/json/blob/develop/doc/examples/emplace.cpp)). From d0e60de433f67705e7c82622a9d021fbc0b96f83 Mon Sep 17 00:00:00 2001 From: Hyeon Kim Date: Thu, 19 Jul 2018 15:43:41 +0900 Subject: [PATCH 128/156] Add new JSON_INTERNAL_CATCH macro function --- include/nlohmann/detail/macro_scope.hpp | 7 +++++++ include/nlohmann/detail/macro_unscope.hpp | 1 + include/nlohmann/json.hpp | 4 ++-- single_include/nlohmann/json.hpp | 12 ++++++++++-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/nlohmann/detail/macro_scope.hpp b/include/nlohmann/detail/macro_scope.hpp index ae62fbf4..a5b6101e 100644 --- a/include/nlohmann/detail/macro_scope.hpp +++ b/include/nlohmann/detail/macro_scope.hpp @@ -42,10 +42,12 @@ #define JSON_THROW(exception) throw exception #define JSON_TRY try #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) #else #define JSON_THROW(exception) std::abort() #define JSON_TRY if(true) #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) #endif // override exception macros @@ -60,6 +62,11 @@ #if defined(JSON_CATCH_USER) #undef JSON_CATCH #define JSON_CATCH JSON_CATCH_USER + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER #endif // manual branch prediction diff --git a/include/nlohmann/detail/macro_unscope.hpp b/include/nlohmann/detail/macro_unscope.hpp index 99a0abdf..032b1218 100644 --- a/include/nlohmann/detail/macro_unscope.hpp +++ b/include/nlohmann/detail/macro_unscope.hpp @@ -9,6 +9,7 @@ #endif // clean up +#undef JSON_INTERNAL_CATCH #undef JSON_CATCH #undef JSON_THROW #undef JSON_TRY diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 58b19982..6756414f 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -3437,7 +3437,7 @@ class basic_json { return ptr.get_checked(this); } - JSON_CATCH (out_of_range&) + JSON_INTERNAL_CATCH (out_of_range&) { return default_value; } @@ -7359,7 +7359,7 @@ class basic_json // the "path" location must exist - use at() success = (result.at(ptr) == get_value("test", "value", false)); } - JSON_CATCH (out_of_range&) + JSON_INTERNAL_CATCH (out_of_range&) { // ignore out of range errors: success remains false } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 88e90ad9..e8bf5de0 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -157,10 +157,12 @@ using json = basic_json<>; #define JSON_THROW(exception) throw exception #define JSON_TRY try #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) #else #define JSON_THROW(exception) std::abort() #define JSON_TRY if(true) #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) #endif // override exception macros @@ -175,6 +177,11 @@ using json = basic_json<>; #if defined(JSON_CATCH_USER) #undef JSON_CATCH #define JSON_CATCH JSON_CATCH_USER + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER #endif // manual branch prediction @@ -14272,7 +14279,7 @@ class basic_json { return ptr.get_checked(this); } - JSON_CATCH (out_of_range&) + JSON_INTERNAL_CATCH (out_of_range&) { return default_value; } @@ -18194,7 +18201,7 @@ class basic_json // the "path" location must exist - use at() success = (result.at(ptr) == get_value("test", "value", false)); } - JSON_CATCH (out_of_range&) + JSON_INTERNAL_CATCH (out_of_range&) { // ignore out of range errors: success remains false } @@ -18565,6 +18572,7 @@ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std #endif // clean up +#undef JSON_INTERNAL_CATCH #undef JSON_CATCH #undef JSON_THROW #undef JSON_TRY From 04372a8c569b8788373d7d4a655b3f40aca454f9 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 19 Jul 2018 17:31:50 +0200 Subject: [PATCH 129/156] :checkered_flag: fix for #1168 --- include/nlohmann/json.hpp | 9 ++++----- single_include/nlohmann/json.hpp | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 58b19982..2d8935f4 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -7637,11 +7637,10 @@ namespace std @since version 1.0.0 */ template<> -inline void swap(nlohmann::json& j1, - nlohmann::json& j2) noexcept( - is_nothrow_move_constructible::value and - is_nothrow_move_assignable::value - ) +inline void swap(nlohmann::json& j1, nlohmann::json& j2) noexcept( + is_nothrow_move_constructible::value and + is_nothrow_move_assignable::value +) { j1.swap(j2); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 88e90ad9..1ee2323c 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -18472,11 +18472,10 @@ namespace std @since version 1.0.0 */ template<> -inline void swap(nlohmann::json& j1, - nlohmann::json& j2) noexcept( - is_nothrow_move_constructible::value and - is_nothrow_move_assignable::value - ) +inline void swap(nlohmann::json& j1, nlohmann::json& j2) noexcept( + is_nothrow_move_constructible::value and + is_nothrow_move_assignable::value +) { j1.swap(j2); } From 347e77bdc16452b73954a663dd3a8002d20a2767 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 21 Jul 2018 10:31:55 +0200 Subject: [PATCH 130/156] :ambulance: fix for #1169 --- .../nlohmann/detail/conversions/from_json.hpp | 10 +++++ single_include/nlohmann/json.hpp | 10 +++++ test/src/unit-conversions.cpp | 42 +++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index cd6bfd17..b092c8cc 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -22,6 +22,16 @@ namespace nlohmann { namespace detail { +template +void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_UNLIKELY(not j.is_null())) + { + JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name()))); + } + n = nullptr; +} + // overloads for basic_json template parameters template::value and diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 1ee2323c..51f16def 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -952,6 +952,16 @@ namespace nlohmann { namespace detail { +template +void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_UNLIKELY(not j.is_null())) + { + JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name()))); + } + n = nullptr; +} + // overloads for basic_json template parameters template::value and diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 548d0d9b..7a502089 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -433,6 +433,48 @@ TEST_CASE("value conversion") #endif } + SECTION("get null (implicit)") + { + std::nullptr_t n; + json j(n); + + std::nullptr_t n2 = j; + CHECK(n2 == n); + } + + SECTION("get null (explicit)") + { + std::nullptr_t n; + json j(n); + + auto n2 = j.get(); + CHECK(n2 == n); + + CHECK_THROWS_AS(json(json::value_t::string).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::object).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::array).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::boolean).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_integer).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_unsigned).get(), json::type_error&); + CHECK_THROWS_AS(json(json::value_t::number_float).get(), json::type_error&); + + CHECK_THROWS_WITH(json(json::value_t::string).get(), + "[json.exception.type_error.302] type must be null, but is string"); + CHECK_THROWS_WITH(json(json::value_t::object).get(), + "[json.exception.type_error.302] type must be null, but is object"); + CHECK_THROWS_WITH(json(json::value_t::array).get(), + "[json.exception.type_error.302] type must be null, but is array"); + CHECK_THROWS_WITH(json(json::value_t::boolean).get(), + "[json.exception.type_error.302] type must be null, but is boolean"); + CHECK_THROWS_WITH(json(json::value_t::number_integer).get(), + "[json.exception.type_error.302] type must be null, but is number"); + CHECK_THROWS_WITH(json(json::value_t::number_unsigned).get(), + "[json.exception.type_error.302] type must be null, but is number"); + CHECK_THROWS_WITH(json(json::value_t::number_float).get(), + "[json.exception.type_error.302] type must be null, but is number"); + + } + SECTION("get a string (implicit)") { json::string_t s_reference{"Hello world"}; From 5b1441166984a68c20d26c730c5486afd7484fda Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 21 Jul 2018 10:59:00 +0200 Subject: [PATCH 131/156] :checkered_flag: trying to fix C2440 error Error in AppVeyor: unit-conversions.cpp(441): error C2440: 'initializing': cannot convert from 'nlohmann::json' to 'std::nullptr_t' (https://ci.appveyor.com/project/nlohmann/json/build/2838/job/wo7im01sq6tvhe9m) --- test/src/unit-conversions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 7a502089..5259acbb 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -438,7 +438,7 @@ TEST_CASE("value conversion") std::nullptr_t n; json j(n); - std::nullptr_t n2 = j; + std::nullptr_t n2 = (std::nullptr_t)j; CHECK(n2 == n); } From 3760a38b7e37c23a944d2c4fdec9028ae5ebde3a Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 21 Jul 2018 11:47:05 +0200 Subject: [PATCH 132/156] :checkered_flag: implicit conversion is not allowed with MSVC --- test/src/unit-conversions.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/test/src/unit-conversions.cpp b/test/src/unit-conversions.cpp index 5259acbb..787897ca 100644 --- a/test/src/unit-conversions.cpp +++ b/test/src/unit-conversions.cpp @@ -433,15 +433,6 @@ TEST_CASE("value conversion") #endif } - SECTION("get null (implicit)") - { - std::nullptr_t n; - json j(n); - - std::nullptr_t n2 = (std::nullptr_t)j; - CHECK(n2 == n); - } - SECTION("get null (explicit)") { std::nullptr_t n; From d5aaeb4cce173a108a81c247c98de1714e02b833 Mon Sep 17 00:00:00 2001 From: Michael Gmelin Date: Sun, 29 Jul 2018 01:29:50 +0200 Subject: [PATCH 133/156] Make section names unique in loops, as catch doesn't support duplicate sections, see also https://github.com/catchorg/Catch2/issues/816#issuecomment-278268122 As a result, when built with gcc, loop iterations were skipped. When built with clang, the test aborted with an assertion in catch.hpp line 6222. This also addresses the issues discussed here: https://github.com/nlohmann/json/issues/1032#issuecomment-378707696 and here: https://github.com/catchorg/Catch2/issues/1241 Please note that this introduces new problems, as some of the unit tests fail now - the library stores keys in lexographical order, while the cbor/msgpack/ubjson examples store them in original order. --- test/src/unit-cbor.cpp | 10 +++++----- test/src/unit-msgpack.cpp | 10 +++++----- test/src/unit-ubjson.cpp | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index 21235b0d..291f893a 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -1815,7 +1815,7 @@ TEST_CASE("CBOR roundtrips", "[hide]") std::ifstream f_json(filename); json j1 = json::parse(f_json); - SECTION("std::vector") + SECTION(filename + ": std::vector") { // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); @@ -1829,7 +1829,7 @@ TEST_CASE("CBOR roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("std::ifstream") + SECTION(filename + ": std::ifstream") { // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); @@ -1840,7 +1840,7 @@ TEST_CASE("CBOR roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("uint8_t* and size") + SECTION(filename + ": uint8_t* and size") { // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); @@ -1854,7 +1854,7 @@ TEST_CASE("CBOR roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("output to output adapters") + SECTION(filename + ": output to output adapters") { // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); @@ -1862,7 +1862,7 @@ TEST_CASE("CBOR roundtrips", "[hide]") (std::istreambuf_iterator(f_cbor)), std::istreambuf_iterator()); - SECTION("std::vector") + SECTION(filename + ": output adapters: std::vector") { std::vector vec; json::to_cbor(j1, vec); diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index b10afbf4..37e30664 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -1504,7 +1504,7 @@ TEST_CASE("MessagePack roundtrips", "[hide]") std::ifstream f_json(filename); json j1 = json::parse(f_json); - SECTION("std::vector") + SECTION(filename + ": std::vector") { // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); @@ -1518,7 +1518,7 @@ TEST_CASE("MessagePack roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("std::ifstream") + SECTION(filename + ": std::ifstream") { // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); @@ -1529,7 +1529,7 @@ TEST_CASE("MessagePack roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("uint8_t* and size") + SECTION(filename + ": uint8_t* and size") { // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); @@ -1543,7 +1543,7 @@ TEST_CASE("MessagePack roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("output to output adapters") + SECTION(filename + ": output to output adapters") { // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); @@ -1551,7 +1551,7 @@ TEST_CASE("MessagePack roundtrips", "[hide]") (std::istreambuf_iterator(f_msgpack)), std::istreambuf_iterator()); - SECTION("std::vector") + SECTION(filename + ": output adapters: std::vector") { std::vector vec; json::to_msgpack(j1, vec); diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 0e15c164..0c3f4559 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -2203,7 +2203,7 @@ TEST_CASE("UBJSON roundtrips", "[hide]") std::ifstream f_json(filename); json j1 = json::parse(f_json); - SECTION("std::vector") + SECTION(filename + ": std::vector") { // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); @@ -2217,7 +2217,7 @@ TEST_CASE("UBJSON roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("std::ifstream") + SECTION(filename + ": std::ifstream") { // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); @@ -2228,7 +2228,7 @@ TEST_CASE("UBJSON roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("uint8_t* and size") + SECTION(filename + ": uint8_t* and size") { // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); @@ -2242,7 +2242,7 @@ TEST_CASE("UBJSON roundtrips", "[hide]") CHECK(j1 == j2); } - SECTION("output to output adapters") + SECTION(filename + ": output to output adapters") { // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); @@ -2250,7 +2250,7 @@ TEST_CASE("UBJSON roundtrips", "[hide]") (std::istreambuf_iterator(f_ubjson)), std::istreambuf_iterator()); - SECTION("std::vector") + SECTION(filename + ": output adapters: std::vector") { std::vector vec; json::to_ubjson(j1, vec); From 05b27e83b788b1921251d1b84c17ef5392634411 Mon Sep 17 00:00:00 2001 From: Michael Gmelin Date: Sun, 29 Jul 2018 11:57:56 +0200 Subject: [PATCH 134/156] Exclude bytewise comparison in certain tests. These tests never worked - they weren't run before d5aaeb4. Note that these tests would fail because of this library ordering dictionary keys (which is legal). So changing the input files (or modifying stored cbor/msgpack/ubjson files) would make the tests work and they could get removed from "exclude_packaged". Also move parsing of files in these unit tests to within the inner sections, so that they're only parsed number_of_files * number_of_sections instead of number_of_files * number_of_files * number_of_sections (so, instead of close to 100k parses about 700). --- test/src/unit-cbor.cpp | 46 +++++++++++++++++++++++++++++------- test/src/unit-msgpack.cpp | 49 ++++++++++++++++++++++++++++++++------- test/src/unit-ubjson.cpp | 20 ++++++++++++---- 3 files changed, 95 insertions(+), 20 deletions(-) diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index 291f893a..b8ba0690 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -1660,6 +1660,21 @@ TEST_CASE("CBOR roundtrips", "[hide]") { SECTION("input from flynn") { + // most of these are exluded due to differences in key order (not a real problem) + auto exclude_packed = std::set{ + "test/data/json.org/1.json", + "test/data/json.org/2.json", + "test/data/json.org/3.json", + "test/data/json.org/4.json", + "test/data/json.org/5.json", + "test/data/json_testsuite/sample.json", // kills AppVeyor + "test/data/json_tests/pass1.json", + "test/data/regression/working_file.json", + "test/data/nst_json_testsuite/test_parsing/y_object.json", + "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json", + "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json", + }; + for (std::string filename : { "test/data/json_nlohmann_tests/all_unicode.json", @@ -1811,12 +1826,12 @@ TEST_CASE("CBOR roundtrips", "[hide]") { CAPTURE(filename); - // parse JSON file - std::ifstream f_json(filename); - json j1 = json::parse(f_json); - SECTION(filename + ": std::vector") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); std::vector packed( @@ -1831,6 +1846,10 @@ TEST_CASE("CBOR roundtrips", "[hide]") SECTION(filename + ": std::ifstream") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); json j2; @@ -1842,6 +1861,10 @@ TEST_CASE("CBOR roundtrips", "[hide]") SECTION(filename + ": uint8_t* and size") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); std::vector packed( @@ -1856,17 +1879,24 @@ TEST_CASE("CBOR roundtrips", "[hide]") SECTION(filename + ": output to output adapters") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse CBOR file std::ifstream f_cbor(filename + ".cbor", std::ios::binary); std::vector packed( (std::istreambuf_iterator(f_cbor)), std::istreambuf_iterator()); - SECTION(filename + ": output adapters: std::vector") + if (!exclude_packed.count(filename)) { - std::vector vec; - json::to_cbor(j1, vec); - CHECK(vec == packed); + SECTION(filename + ": output adapters: std::vector") + { + std::vector vec; + json::to_cbor(j1, vec); + CHECK(vec == packed); + } } } } diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index 37e30664..f0c4a38c 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -1349,6 +1349,24 @@ TEST_CASE("MessagePack roundtrips", "[hide]") { SECTION("input from msgpack-python") { + // most of these are exluded due to differences in key order (not a real problem) + auto exclude_packed = std::set{ + "test/data/json.org/1.json", + "test/data/json.org/2.json", + "test/data/json.org/3.json", + "test/data/json.org/4.json", + "test/data/json.org/5.json", + "test/data/json_testsuite/sample.json", // kills AppVeyor + "test/data/json_tests/pass1.json", + "test/data/regression/working_file.json", + "test/data/nst_json_testsuite/test_parsing/y_object.json", + "test/data/nst_json_testsuite/test_parsing/y_object_basic.json", + "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json", + "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json", + "test/data/nst_json_testsuite/test_parsing/y_object_simple.json", + "test/data/nst_json_testsuite/test_parsing/y_object_string_unicode.json", + }; + for (std::string filename : { "test/data/json_nlohmann_tests/all_unicode.json", @@ -1500,12 +1518,12 @@ TEST_CASE("MessagePack roundtrips", "[hide]") { CAPTURE(filename); - // parse JSON file - std::ifstream f_json(filename); - json j1 = json::parse(f_json); - SECTION(filename + ": std::vector") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); std::vector packed( @@ -1520,6 +1538,10 @@ TEST_CASE("MessagePack roundtrips", "[hide]") SECTION(filename + ": std::ifstream") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); json j2; @@ -1531,6 +1553,10 @@ TEST_CASE("MessagePack roundtrips", "[hide]") SECTION(filename + ": uint8_t* and size") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); std::vector packed( @@ -1545,17 +1571,24 @@ TEST_CASE("MessagePack roundtrips", "[hide]") SECTION(filename + ": output to output adapters") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary); std::vector packed( (std::istreambuf_iterator(f_msgpack)), std::istreambuf_iterator()); - SECTION(filename + ": output adapters: std::vector") + if (!exclude_packed.count(filename)) { - std::vector vec; - json::to_msgpack(j1, vec); - CHECK(vec == packed); + SECTION(filename + ": output adapters: std::vector") + { + std::vector vec; + json::to_msgpack(j1, vec); + CHECK(vec == packed); + } } } } diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 0c3f4559..73a91868 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -2199,12 +2199,12 @@ TEST_CASE("UBJSON roundtrips", "[hide]") { CAPTURE(filename); - // parse JSON file - std::ifstream f_json(filename); - json j1 = json::parse(f_json); - SECTION(filename + ": std::vector") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); std::vector packed( @@ -2219,6 +2219,10 @@ TEST_CASE("UBJSON roundtrips", "[hide]") SECTION(filename + ": std::ifstream") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); json j2; @@ -2230,6 +2234,10 @@ TEST_CASE("UBJSON roundtrips", "[hide]") SECTION(filename + ": uint8_t* and size") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); std::vector packed( @@ -2244,6 +2252,10 @@ TEST_CASE("UBJSON roundtrips", "[hide]") SECTION(filename + ": output to output adapters") { + // parse JSON file + std::ifstream f_json(filename); + json j1 = json::parse(f_json); + // parse MessagePack file std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary); std::vector packed( From 043eff5ba8592e7a884403d605b74ef2026d725a Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 31 Jul 2018 21:18:33 +0200 Subject: [PATCH 135/156] :construction_worker: added more CI workers --- .travis.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ecc8c362..eda8ab72 100644 --- a/.travis.yml +++ b/.travis.yml @@ -158,6 +158,9 @@ matrix: - os: osx osx_image: xcode9.3 + - os: osx + osx_image: xcode9.4 + # Linux / GCC - os: linux @@ -192,15 +195,23 @@ matrix: sources: ['ubuntu-toolchain-r-test'] packages: ['g++-7', 'ninja-build'] + - os: linux + compiler: gcc + env: COMPILER=g++-8 + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-8', 'ninja-build'] + - os: linux compiler: gcc env: - - COMPILER=g++-7 + - COMPILER=g++-8 - CXXFLAGS=-std=c++17 addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-7', 'ninja-build'] + packages: ['g++-8', 'ninja-build'] # Linux / Clang From ba4a19d4afea56e01f908e37b2647ce078323a16 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 1 Aug 2018 20:59:58 +0200 Subject: [PATCH 136/156] :construction_worker: added more CI workers --- .travis.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index eda8ab72..e5f08353 100644 --- a/.travis.yml +++ b/.travis.yml @@ -271,15 +271,23 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-5.0'] packages: ['g++-6', 'clang-5.0', 'ninja-build'] + - os: linux + compiler: clang + env: COMPILER=clang++-6.0 + addons: + apt: + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-6.0'] + packages: ['g++-6', 'clang-6.0', 'ninja-build'] + - os: linux compiler: clang env: - - COMPILER=clang++-5.0 + - COMPILER=clang++-6.0 - CXXFLAGS=-std=c++1z addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-5.0'] - packages: ['g++-6', 'clang-5.0', 'ninja-build'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-6.0'] + packages: ['g++-6', 'clang-6.0', 'ninja-build'] ################ # build script # From 3ce43253504de88d427fb488e07bce26dec8a1ce Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 1 Aug 2018 22:31:51 +0200 Subject: [PATCH 137/156] :memo: updated documentation of used compilers --- README.md | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index ebb62106..f775360d 100644 --- a/README.md +++ b/README.md @@ -828,30 +828,32 @@ The following compilers are currently used in continuous integration at [Travis] | Compiler | Operating System | Version String | |-----------------|------------------------------|----------------| -| GCC 4.9.4 | Ubuntu 14.04.5 LTS | g++-4.9 (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4 | -| GCC 5.4.1 | Ubuntu 14.04.5 LTS | g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904 | -| GCC 6.3.0 | Ubuntu 14.04.5 LTS | g++-6 (Ubuntu/Linaro 6.3.0-18ubuntu2~14.04) 6.3.0 20170519 | -| GCC 7.1.0 | Ubuntu 14.04.5 LTS | g++-7 (Ubuntu 7.1.0-5ubuntu2~14.04) 7.1.0 -| GCC 7.3.0 | Windows Server 2012 R2 (x64) | g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0 -| Clang 3.5.0 | Ubuntu 14.04.5 LTS | clang version 3.5.0-4ubuntu2~trusty2 (tags/RELEASE_350/final) | -| Clang 3.6.2 | Ubuntu 14.04.5 LTS | clang version 3.6.2-svn240577-1~exp1 (branches/release_36) | -| Clang 3.7.1 | Ubuntu 14.04.5 LTS | clang version 3.7.1-svn253571-1~exp1 (branches/release_37) | -| Clang 3.8.0 | Ubuntu 14.04.5 LTS | clang version 3.8.0-2ubuntu3~trusty5 (tags/RELEASE_380/final) | -| Clang 3.9.1 | Ubuntu 14.04.5 LTS | clang version 3.9.1-4ubuntu3~14.04.2 (tags/RELEASE_391/rc2) | -| Clang 4.0.1 | Ubuntu 14.04.5 LTS | clang version 4.0.1-svn305264-1~exp1 (branches/release_40) | -| Clang 5.0.0 | Ubuntu 14.04.5 LTS | clang version 5.0.0-svn310902-1~exp1 (branches/release_50) | -| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | -| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | -| Clang Xcode 8.0 | Darwin Kernel Version 15.6.0 | Apple LLVM version 8.0.0 (clang-800.0.38) | -| Clang Xcode 8.1 | Darwin Kernel Version 16.1.0 (macOS 10.12.1) | Apple LLVM version 8.0.0 (clang-800.0.42.1) | -| Clang Xcode 8.2 | Darwin Kernel Version 16.1.0 (macOS 10.12.1) | Apple LLVM version 8.0.0 (clang-800.0.42.1) | -| Clang Xcode 8.3 | Darwin Kernel Version 16.5.0 (macOS 10.12.4) | Apple LLVM version 8.1.0 (clang-802.0.38) | -| Clang Xcode 9.0 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.37) | -| Clang Xcode 9.1 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.38) | -| Clang Xcode 9.2 | Darwin Kernel Version 16.7.0 (macOS 10.12.6) | Apple LLVM version 9.0.0 (clang-900.0.39.2) | -| Clang Xcode 9.3 | Darwin Kernel Version 17.4.0 (macOS 10.13.0) | Apple LLVM version 9.1.0 (clang-902.0.39.1) +| GCC 4.9.4 | Ubuntu 14.04.1 LTS | g++-4.9 (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4 | +| GCC 5.5.0 | Ubuntu 14.04.1 LTS | g++-5 (Ubuntu 5.5.0-12ubuntu1~14.04) 5.5.0 20171010 | +| GCC 6.4.0 | Ubuntu 14.04.1 LTS | g++-6 (Ubuntu 6.4.0-17ubuntu1~14.04) 6.4.0 20180424 | +| GCC 7.3.0 | Ubuntu 14.04.1 LTS | g++-7 (Ubuntu 7.3.0-21ubuntu1~14.04) 7.3.0 | +| GCC 7.3.0 | Windows Server 2012 R2 (x64) | g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0 | +| GCC 8.1.0 | Ubuntu 14.04.1 LTS | g++-8 (Ubuntu 8.1.0-5ubuntu1~14.04) 8.1.0 | +| Clang 3.5.0 | Ubuntu 14.04.1 LTS | clang version 3.5.0-4ubuntu2~trusty2 (tags/RELEASE_350/final) (based on LLVM 3.5.0) | +| Clang 3.6.2 | Ubuntu 14.04.1 LTS | clang version 3.6.2-svn240577-1~exp1 (branches/release_36) (based on LLVM 3.6.2) | +| Clang 3.7.1 | Ubuntu 14.04.1 LTS | clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | +| Clang 3.8.0 | Ubuntu 14.04.1 LTS | clang version 3.8.0-2ubuntu3~trusty5 (tags/RELEASE_380/final) | +| Clang 3.9.1 | Ubuntu 14.04.1 LTS | clang version 3.9.1-4ubuntu3~14.04.3 (tags/RELEASE_391/rc2) | +| Clang 4.0.1 | Ubuntu 14.04.1 LTS | clang version 4.0.1-svn305264-1~exp1 (branches/release_40) | +| Clang 5.0.2 | Ubuntu 14.04.1 LTS | clang version 5.0.2-svn328729-1~exp1~20180509123505.100 (branches/release_50) | +| Clang 6.0.1 | Ubuntu 14.04.1 LTS | clang version 6.0.1-svn334776-1~exp1~20180726133705.85 (branches/release_60) | +| Clang Xcode 6.4 | OSX 10.10.5 | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.3 | OSX 10.11.6 | Apple LLVM version 7.3.0 (clang-703.0.31) | +| Clang Xcode 8.0 | OSX 10.11.6 | Apple LLVM version 8.0.0 (clang-800.0.38) | +| Clang Xcode 8.1 | OSX 10.12.6 | Apple LLVM version 8.0.0 (clang-800.0.42.1) | +| Clang Xcode 8.2 | OSX 10.12.6 | Apple LLVM version 8.0.0 (clang-800.0.42.1) | +| Clang Xcode 8.3 | OSX 10.11.6 | Apple LLVM version 8.1.0 (clang-802.0.38) | +| Clang Xcode 9.0 | OSX 10.12.6 | Apple LLVM version 9.0.0 (clang-900.0.37) | +| Clang Xcode 9.1 | OSX 10.12.6 | Apple LLVM version 9.0.0 (clang-900.0.38) | +| Clang Xcode 9.2 | OSX 10.13.3 | Apple LLVM version 9.1.0 (clang-902.0.39.1) | +| Clang Xcode 9.3 | OSX 10.13.3 | Apple LLVM version 9.1.0 (clang-902.0.39.2) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25420.1, MSVC 19.0.24215.1 | -| Visual Studio 2017 | Windows Server 2016 | Microsoft (R) Build Engine version 15.5.180.51428, MSVC 19.12.25830.2 | +| Visual Studio 2017 | Windows Server 2016 | Microsoft (R) Build Engine version 15.7.180.61344, MSVC 19.14.26433.0 | ## License From fed70f6bff5951daae54e8702522019b48c9192f Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 14 Aug 2018 22:11:08 +0200 Subject: [PATCH 138/156] :art: reindented code --- test/src/unit-cbor.cpp | 25 +++++++++++++------------ test/src/unit-msgpack.cpp | 31 ++++++++++++++++--------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index b8ba0690..9ad5997c 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -1661,18 +1661,19 @@ TEST_CASE("CBOR roundtrips", "[hide]") SECTION("input from flynn") { // most of these are exluded due to differences in key order (not a real problem) - auto exclude_packed = std::set{ - "test/data/json.org/1.json", - "test/data/json.org/2.json", - "test/data/json.org/3.json", - "test/data/json.org/4.json", - "test/data/json.org/5.json", - "test/data/json_testsuite/sample.json", // kills AppVeyor - "test/data/json_tests/pass1.json", - "test/data/regression/working_file.json", - "test/data/nst_json_testsuite/test_parsing/y_object.json", - "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json", - "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json", + auto exclude_packed = std::set + { + "test/data/json.org/1.json", + "test/data/json.org/2.json", + "test/data/json.org/3.json", + "test/data/json.org/4.json", + "test/data/json.org/5.json", + "test/data/json_testsuite/sample.json", // kills AppVeyor + "test/data/json_tests/pass1.json", + "test/data/regression/working_file.json", + "test/data/nst_json_testsuite/test_parsing/y_object.json", + "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json", + "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json", }; for (std::string filename : diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index f0c4a38c..e3672d1f 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -1350,21 +1350,22 @@ TEST_CASE("MessagePack roundtrips", "[hide]") SECTION("input from msgpack-python") { // most of these are exluded due to differences in key order (not a real problem) - auto exclude_packed = std::set{ - "test/data/json.org/1.json", - "test/data/json.org/2.json", - "test/data/json.org/3.json", - "test/data/json.org/4.json", - "test/data/json.org/5.json", - "test/data/json_testsuite/sample.json", // kills AppVeyor - "test/data/json_tests/pass1.json", - "test/data/regression/working_file.json", - "test/data/nst_json_testsuite/test_parsing/y_object.json", - "test/data/nst_json_testsuite/test_parsing/y_object_basic.json", - "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json", - "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json", - "test/data/nst_json_testsuite/test_parsing/y_object_simple.json", - "test/data/nst_json_testsuite/test_parsing/y_object_string_unicode.json", + auto exclude_packed = std::set + { + "test/data/json.org/1.json", + "test/data/json.org/2.json", + "test/data/json.org/3.json", + "test/data/json.org/4.json", + "test/data/json.org/5.json", + "test/data/json_testsuite/sample.json", // kills AppVeyor + "test/data/json_tests/pass1.json", + "test/data/regression/working_file.json", + "test/data/nst_json_testsuite/test_parsing/y_object.json", + "test/data/nst_json_testsuite/test_parsing/y_object_basic.json", + "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json", + "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json", + "test/data/nst_json_testsuite/test_parsing/y_object_simple.json", + "test/data/nst_json_testsuite/test_parsing/y_object_string_unicode.json", }; for (std::string filename : From be2065dce9160f5d5b226abd056c76c2ffb5708e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 14 Aug 2018 22:11:47 +0200 Subject: [PATCH 139/156] :rotating_light: fixing a MinGW warning #1192 --- include/nlohmann/detail/input/lexer.hpp | 2 +- single_include/nlohmann/json.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 9b7c8de1..09afa60b 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1173,7 +1173,7 @@ scan_number_done: { // escape control characters char cs[9]; - snprintf(cs, 9, "", static_cast(c)); + snprintf(cs, 9, "", static_cast(c)); result += cs; } else diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 0f6b8c22..d640e891 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3370,7 +3370,7 @@ scan_number_done: { // escape control characters char cs[9]; - snprintf(cs, 9, "", static_cast(c)); + snprintf(cs, 9, "", static_cast(c)); result += cs; } else From 3ac2d81a958a78d0cf08475d73f7453aa7041c7e Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 14 Aug 2018 22:13:56 +0200 Subject: [PATCH 140/156] :hammer: fixed a MinGW error #1193 --- include/nlohmann/json.hpp | 2 +- single_include/nlohmann/json.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index d7280752..85868f63 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -2829,7 +2829,7 @@ class basic_json not detail::is_basic_json::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value -#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1914 +#if defined(JSON_HAS_CPP_17) && defined(_MSC_VER) and _MSC_VER <= 1914 and not std::is_same::value #endif #endif diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index d640e891..d0c1f02f 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -13681,7 +13681,7 @@ class basic_json not detail::is_basic_json::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value -#if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1914 +#if defined(JSON_HAS_CPP_17) && defined(_MSC_VER) and _MSC_VER <= 1914 and not std::is_same::value #endif #endif From f6febbe359f0936c411fac9788985118aa82fdef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= Date: Tue, 24 Jul 2018 13:22:44 +0200 Subject: [PATCH 141/156] split meta.hpp, add detected_t (used to define concepts) --- Makefile | 5 +- .../nlohmann/detail/conversions/from_json.hpp | 3 +- .../nlohmann/detail/conversions/to_json.hpp | 3 +- .../nlohmann/detail/iterators/iter_impl.hpp | 2 +- include/nlohmann/detail/meta/cpp_future.hpp | 83 ++++++++++++++++ include/nlohmann/detail/meta/detected.hpp | 56 +++++++++++ .../detail/{meta.hpp => meta/type_traits.hpp} | 76 +-------------- include/nlohmann/detail/meta/void_t.hpp | 10 ++ include/nlohmann/detail/output/serializer.hpp | 2 +- include/nlohmann/json.hpp | 3 +- single_include/nlohmann/json.hpp | 96 +++++++++++-------- test/src/unit-inspection.cpp | 4 +- 12 files changed, 222 insertions(+), 121 deletions(-) create mode 100644 include/nlohmann/detail/meta/cpp_future.hpp create mode 100644 include/nlohmann/detail/meta/detected.hpp rename include/nlohmann/detail/{meta.hpp => meta/type_traits.hpp} (74%) create mode 100644 include/nlohmann/detail/meta/void_t.hpp diff --git a/Makefile b/Makefile index 1e121788..36b01450 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,10 @@ SRCS = include/nlohmann/json.hpp \ include/nlohmann/detail/json_ref.hpp \ include/nlohmann/detail/macro_scope.hpp \ include/nlohmann/detail/macro_unscope.hpp \ - include/nlohmann/detail/meta.hpp \ + include/nlohmann/detail/meta/cpp_future.hpp \ + include/nlohmann/detail/meta/detected.hpp \ + include/nlohmann/detail/meta/type_traits.hpp \ + include/nlohmann/detail/meta/void_t.hpp \ include/nlohmann/detail/output/binary_writer.hpp \ include/nlohmann/detail/output/output_adapters.hpp \ include/nlohmann/detail/output/serializer.hpp \ diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index b092c8cc..5956352f 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -15,7 +15,8 @@ #include #include -#include +#include +#include #include namespace nlohmann diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp index 07946f55..35be5de4 100644 --- a/include/nlohmann/detail/conversions/to_json.hpp +++ b/include/nlohmann/detail/conversions/to_json.hpp @@ -8,7 +8,8 @@ #include // valarray #include // vector -#include +#include +#include #include #include diff --git a/include/nlohmann/detail/iterators/iter_impl.hpp b/include/nlohmann/detail/iterators/iter_impl.hpp index f34f7a55..adcd8a37 100644 --- a/include/nlohmann/detail/iterators/iter_impl.hpp +++ b/include/nlohmann/detail/iterators/iter_impl.hpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include namespace nlohmann diff --git a/include/nlohmann/detail/meta/cpp_future.hpp b/include/nlohmann/detail/meta/cpp_future.hpp new file mode 100644 index 00000000..d12d6bdb --- /dev/null +++ b/include/nlohmann/detail/meta/cpp_future.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include // not +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type + +namespace nlohmann +{ +namespace detail +{ +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +template +using uncvref_t = typename std::remove_cv::type>::type; + +// implementation of C++14 index_sequence and affiliates +// source: https://stackoverflow.com/a/32223343 +template +struct index_sequence +{ + using type = index_sequence; + using value_type = std::size_t; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +template +struct merge_and_renumber; + +template +struct merge_and_renumber, index_sequence> + : index_sequence < I1..., (sizeof...(I1) + I2)... > {}; + +template +struct make_index_sequence + : merge_and_renumber < typename make_index_sequence < N / 2 >::type, + typename make_index_sequence < N - N / 2 >::type > {}; + +template<> struct make_index_sequence<0> : index_sequence<> {}; +template<> struct make_index_sequence<1> : index_sequence<0> {}; + +template +using index_sequence_for = make_index_sequence; + +/* +Implementation of two C++17 constructs: conjunction, negation. This is needed +to avoid evaluating all the traits in a condition + +For example: not std::is_same::value and has_value_type::value +will not compile when T = void (on MSVC at least). Whereas +conjunction>, has_value_type>::value will +stop evaluating if negation<...>::value == false + +Please note that those constructs must be used with caution, since symbols can +become very long quickly (which can slow down compilation and cause MSVC +internal compiler errors). Only use it when you have to (see example ahead). +*/ +template struct conjunction : std::true_type {}; +template struct conjunction : B1 {}; +template +struct conjunction : std::conditional, B1>::type {}; + +template struct negation : std::integral_constant {}; + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static constexpr T value{}; +}; + +template +constexpr T static_const::value; +} +} diff --git a/include/nlohmann/detail/meta/detected.hpp b/include/nlohmann/detail/meta/detected.hpp new file mode 100644 index 00000000..ed1d6ac7 --- /dev/null +++ b/include/nlohmann/detail/meta/detected.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include + +// http://en.cppreference.com/w/cpp/experimental/is_detected +namespace nlohmann +{ +namespace detail +{ +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + void operator=(nonesuch const&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template