Seldaek / jsonlint

JSON Lint for PHP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Massive performance problems with bigger JSON files

spaceemotion opened this issue · comments

Hey, we've just run into a major issue with jsonlint regarding performance today. Our requests were all timing out and stopped at the lexer. Here's a Sentry screenshot:

image

We've investigated the JSON that it tried to parse and while it was a bit bigger than usual, the parsing times were a LOT higher.

So I've done some digging. The following numbers are for formatted JSON files:

Lines (approx.) execution time
10k 1.89s user 0.03s system 96% cpu 1.989 total
25k 6.29s user 0.05s system 98% cpu 6.419 total
40k 25.82s user 13.47s system 99% cpu 39.521 total
50k 58.24s user 43.51s system 99% cpu 1:42.27 total

image
(lines to time ratio)


As it turns out, the library is actually waiting for the system to do its thing.

A blackfire run with 3 samples on the 50k lines JSON shows that substr seems to be the culprit:

image

Due to privacy concerns I can't share the JSON file, but there should be random JSON generators out there that can create files for you.

Many thanks in advance!

@spaceemotion can you try my PR (#65) on your JSON file ?
Also, can you give more information about the structure of your JSON file (is it big due to having lots of properties, a big depths or big string literals ?) ?

When doing my own profiling with a big random JSON file, I did not saw Lexer::lex accounting for 86% of the time, but rather 50% for one of them and 18% for a bigger one (but bigger by the number of sibling properties). So I'm interested to see the impact on your input.

@stof Thanks for looking into this! I'll try to test the file against your changes soon.

It's essentially just a BIG list of objects up to 7 layers deep (with each object taking up to 1k lines each).

I can indeed confirm that the changes really did something. For my test files, here're the results:

approx. lines results
50k - before: 26.80s user 14.65s system 99% cpu 41.646 total
- after: 5.31s user 0.03s system 99% cpu 5.356 total
100k - before: 365.36s user 321.47s system 99% cpu 11:29.88 total
- after: 13.30s user 0.07s system 99% cpu 13.495 total

Here's an anonymized JSON object which repeats like 200 times:

{
    "XXXXXYXXX": [],
    "XXXXXXXXXYXXXXXX": 1,
    "XXXXXYXXXXXXX": [
        {
            "XXXX": "XXXXXXXXXX XXXXXXXXXXXXXXXXX",
            "XXXXX": "XXXXXXXXXX XXXXXXXXXXXXXXXXX",
            "XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXX1111XXXXXXXXXXXXXXXX11X1111.XXX"
        },
        {
            "XXXX": "XXXXXXXXXXX",
            "XXXXX": "XXXXXXXXXXX",
            "XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXX1111X11X1111X11XXXXXXXXXXXXXXXXXXXXXXXX.XXX"
        },
        {
            "XXXX": "XXXXXXXX XXX XXXXXXXXXXX",
            "XXXXX": "XXXXXXXX XXX XXXXXXXXXXX",
            "XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1X1111X11.XXX"
        },
        {
            "XXXX": "XXXXXXXXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXX",
            "XXXXX": "XXXXXXXXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXX",
            "XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXX1111X111111.XXX"
        }
    ],
    "XXXXXXXXXXXXXXXXXX": {
        "XXXXXXXXXXXXX": "11.111.111",
        "XXXXXXXX": "1",
        "XXXXXXXXXXYXX": ""
    },
    "XXXXYXXXXX": "1111",
    "XXXX": "XXXXXXX",
    "XXXXXXXXXXXX": {
        "XXXXXXXXXX": "111",
        "XXXXX": "1111",
        "XXXX": "XXXXXX",
        "XXYXX": "11111",
        "XXXXXXX": {
            "XXXXXXX": "XXXXXXXXXXX",
            "XXXX": {
                "XXXXXXXXXXXXXXXX": [
                    "XXXXXXXXXXX"
                ]
            },
            "XXXXXX": [
                {
                    "XYXXX": "XXXXXXXXXXX",
                    "XXXYX": "XXXXXXXXXXX"
                }
            ]
        },
        "XXXXXXXXXXX": 1
    },
    "XXXXXXXXXXXYXXXXXXXX": {
        "XXXYXX": "1111-11-11",
        "XXXXXXX": {
            "XXXXXXXXX": 1,
            "XXXXXX": 11.11
        },
        "XXXXXX": "1111-11-11"
    },
    "XXXXXXXXXXXXXXXXX": false,
    "XXXXXXX": "",
    "XXXXXXXXXXXXX": "111111111111111",
    "XXXXXXXXXXXXXXX": {
        "XXXX": 111,
        "XXX": "XXXXX:XXXXXXXXXXXXXXXX.XXXX-XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1111XXXXXXXXXXXXXXX111111111111111XXXXXXX1X1XXX1111X11111XX1X1111X1X1111X1XX1XX1XXXXXXXXXXX1",
        "XXXXXXXX": {
            "XXXXXXXX": [
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXXXXXXXXX XX XXXXXXXX XXX XX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX, XXXX XXXXX XXXXXX XXX XXXXX11XXXXXXXX, XXXX XXXX XXXXX XX XXXX XXXXXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XX-XXXX, XXXXXXXXXXXXXX11XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXXXXX XX XXXXXXXX XXXX XXXXXXXXXXXXXX11X1XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX, XXXXXXXXXXXXX XXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXX11X1XXXX XXXXXX XXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XXXXXXXXX XX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XX XXXXXXXX XXXXXXX11X1XXXXXX XXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXX XXXXXX, XXXX XXXXXXX11X1XXXX, XXX XXX XXXXXXXXX11XX XXX XXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXX- XXX XXXXXXXXXXXXXXXXXXX XXX11XXX 1 XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXX- XXX XXXXXXXXXXXXXXXXXXX XXX11XXX 1 XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX11X1XXXXX XXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXXXX XXX XXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXXXX XXXXXXXXXX-XXXXXXXX XX XXXXXXXXXXXXXXX XXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXXXX XXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XXX XXXXXXXXXX XXXXXXXX XXXXXXXXX XXX XX XXXXX XXXXXXXXXXXXXXXXXXXX XXX 11.111 XXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXXXXXXXX XXXXXXX11X1XXX XXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXX XXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXX11XXXXXXXXXXXX XXXXXXXXX XXX XXXXXXXXX XXX11X1XXXXX XXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXX XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXX XXXX false, XXXXXX XXXXX XXXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX XXXXXXXXXXXXXXX XXX XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXX XXX 1 XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXX XX11XXXXX 1 false, XXX XXX XXX XXXXX XX11X1XXXXXXXXXXX XXXXX XXX XXXX11X1XXXX XXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXX 11 XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXX-XXXXX11X1XX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXX-XXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXX XXX11X1XXXXXXXXX XX XXXXXX XXXXXXXX XXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXX11XXXXX XXXXXXX XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX XXXXXXX XXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXX XXX11X1XXXXXXX XXX XXXXXXXXXXXXX-XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXXXXX XXX11X1XXXXXXX XXX XXXXXXXXXXXXX-XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXX XX XXXXXXXXXXXXXXX XXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX. XXXXXXXXXX: XXXXXXXXXXXXXXX XXX XXXXX11X1XXX XX XXXXXXXXXX11X1XXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX XXXXX XXX11X1XXXXXXX XXXXX11X1XXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX11X1XXXXXXXXXXXXXXX11X1XXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXXX XXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXXX XXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX-XXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXX11X1XXXXXXXXXXXXXX11X1XXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX XX XXXXXXXX XXX XXXXXXXXXXXX XXX XXXXXXXXX11X1XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXX11XXXXX XXX XXXXXXXXXXXXXXXXXXXXXXX11X1XXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXX11X1XXX XX XXXXXXX XXXXXXXXXX, XXXXXXXXXX XXXXXX ",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXX, XXXXXXX XXXXXX11XXXXXX ",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX XXXXX XXXXXXX- XXXX XXXXXXXXXXXXX XXXXXX11XXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXX, XXXXXXX XXXX-X XXXXXX11XXXXXX XXXXX XXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX11X1XXXXXXXXX11X1XXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXX11X1XX11XXXX XXXXX XXX XXXX. XXXXXXXXXXXXXXXXXXXXXXX XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX, 1-XXXX XXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXX11XXXXX XXXXX XXXXX11X1XXX XXX XXXXXX11X1XXXXXXXXXX- XXXX XXXXXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXX XXXXXXX11XXXXX XXX-XXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XX"
                }
            ],
            "XXXXXXXXXXXXX": [
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXX XXXX false, XXXX XXXXX XXXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXX XXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXX11X1XXXXXXX XX XXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXX XXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXXX, XXXXXXXX, XXXXX11X1XXXXXXX, XXXXXXXXXXXXXXXXXX X. XXX.",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXX XXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX XXXXX XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXX XXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXX XXX XXXXXXXXXXXX11X1XXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXX XXXXXXXXXX"
                }
            ],
            "XXXXXXXXXXXXXXXXX": [
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXXXX XXX11XXX XXXXXX XXXX XXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXX XXX 1 XXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXXXX XXX11XXX XXXXXX XXXX XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXX XXX 1 XXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXX XXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXX XX XXXXXXXX XXXXXXX XXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXXX XXXX XX XXXXXXXX XXX XX XXXXXXX XXXXXXXXXXXXXXX11X1XXXX XXX XXXXXXX XXXXXXXXXXX11XXXXXXXX XXXXXXXX XXXXX. XXXXXXXXXX 1X"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXXXXX XXX 111.111 XXX, XXX XXXXXXXXXXXX XXX XX XXXXX XXXXXXXX 111.111 XXX XXX11XXX XXXXXXXX XXXXXXXXXXX XXX. XXXX XXXXXXXXXX XX XXXXXXXXXXXXXXX XXXX "
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "1 XXXXXXXXXX XXXXXXXXX11XXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX 11.111 XX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXX XXXXXXXXXXXXX XXXX XXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX 1 XXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX XXXXXXXXX XXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XXX XXXXXXXXXX XXXXX XXX- XXXX XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXXXXXXX XXXX XXXXX XXXXXXXXXXXXX XXXXX XXX XXXXXXXXX XXX11X1XXXX XX XXXXXXXXXXXX XXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXX XXX11XXX XXXXXXXXXXXXXX XXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXXXXXXX: XX, XXXXXXXX, XXXXXXX, XXXXXX, XXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXX XXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXX XXXXXXXXXXXX, XXXXXXXXXXXXXXX XXXXXXXXXXX XXX 11 XX XXXXXXXXXX XXX XXXXXXXXXXX XXXXXXXXXXX XXX 1 XX XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX XXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX 11 XX XXXXXXXXX11X1XXX, XXXX XXX XXXXX- XXXX XXXX11XXXXXXXXXXXXXXX XXX 11 XXXX11 XX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX XXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX 11 XXXX11 XX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX11XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX 1 XXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXX XXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXX XXXXXXXXXXXX, XXXXXXXXXXXXXXX XXXXXXXXXXX XXX 11 XX XXXXXXXXXX XXX XXXXXXXXXXX XXXXXXXXXXX XXX 1 XX XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XX- XXX XXXXXXXXXXXX11X1XXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 11.111 XXX, 1-XXXX XXXXXXXXX"
                },
                {
                    "XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXX11XXXXXXXXXXX XXX XXXXXXXXXX XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX XXX XXX XXXX XXX XXX XXX11XXXXXXXXXXX XXX XXX-XXXXXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXX11X1XXX XXX XXXXXX 1 XXXXX"
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX11X1XXXXX XXXXXXXX11X1XXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXXXXXXXXXXXXXXX XXX 11.111 XXX XXXX X.X. XXXXXXXXX XXX XXXXX-XXXXXXXXXXXXXXXXXXXXX, XXXXXXXXXXXXXXXXXX, XXXXXXXXXXXXXXXX X.XX11X1."
                },
                {
                    "XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXX XX XXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX XXX XXXXXXXXX XX XXXXXXXXXXXXXXXX XXX XXXXX11XXXXX XXX. XXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXX-XXXXXXXXXXXXXX: XXX XXXXXXX-XXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXX11X1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX 111 XXXXX XX XXXXXXXXXXXXX, XXX. 1.111 XXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXXXXXXX: XXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXX11X1XXX XXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXX11X1XXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": true,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXX XXXXXX11XXXXXX XXX XXXXXXXX, XXXXXX11X1XXXX XXX.",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXXX XXXXXX- XXX XXXXXXXX11XXXXXXXXXXXX11XXXXXX, XXXXX XXXXXXXXXX XXX XXXXXX11XXXXXXX XX XXX11X1XXXX XXX XXXXXXXXX XXXXXXXXXXX XXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXXXXX XXXXXX11XXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX XXX11XXX XXXXXXXX- , XXXX- XXX XXXXXX11X1XXXXXXXXX11X1XXX, XXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXX11X1XXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXX11X1XXX XXXXX XXXXXXXXXXX11X1XXXX XXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXX11X1XXX XXX XXXXXXXXXXXX XXXX XXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 11.111 XXX"
                },
                {
                    "XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXX11X1XXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXX 11 XXXXXX, XXX. 1.111 XXX, XXXXX XXXXXXXXXX XXX XXXXX11X1XXX X.X. XX XXXXXXXXXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXX XXX11XXX XX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXX XXXXXXXX XXX11XXX XXXXXX XXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXX XXXXXXXX XXX11XXX XXXXXX XXXXXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXXXX XXX 11 XXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XX11X1XXXXXXXXX-XXXXXXXXXX XXXXXXX11XXXXX XXXX XXX XXXXXXXXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 1.111.111 XXX, 1-XXXX XXXXXXXXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXX11X1XXX",
                    "XX": "XXXXXX1XXXXXXXXXXX1",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "XXX 111.111 XXX"
                },
                {
                    "XXXXX": "XXXXXXXXX",
                    "XXXXXXXXXXXX": "XXX11X1XXXXXX XXXXXXXXXXXXXX",
                    "XX": "XXXXXX1XXXXXXXXXXX11",
                    "XXXXXXXXX": false,
                    "XXXXXXX": "11.111.111 XXX XXXX 11.111.111 XXX XXXXX, XX XXXXXXX11X1XXXXX XXXXXX XXX. 11.111.111 XXX"
                }
            ]
        }
    },
    "XXXXXXXXXXXXXXXXXXXX": "XXXXX:XXXXXXXXXXXXXXXX.XXXX-XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1111XXXXXXX111XXXXXXXXXXXXXXX111111111111111XXXXXXX1X1XXX1111X11111XX1X1111X1X1111X1XX1XX1",
    "XXXXXXXXXX": "",
    "XXXXXXXXX": "11111XX"
}

This is I guess mostly fixed by #65 so closing, but please note that using this library to parse json is pretty awful as there is no way it can be as fast as json_decode().

The better way IMO is to parse with json_decode, and if that returns null you parse again with jsonlint to get a proper error message out, something like we do in Composer:

https://github.com/composer/composer/blob/56edd53046fd697d32b2fd2fbaf45af5d7951671/src/Composer/Json/JsonFile.php#L283-L318