private void informSubstrings(ParserRuleContext ctx, String name, boolean fakeChild, Splitter splitter) {
        String text = getSourceText(ctx);
        String path = inform(ctx, name, text, fakeChild);
        Set<Range> ranges = analyzer.getRequiredInformRanges(path);

        if (ranges.size() > 4) { // Benchmarks showed this to be the breakeven point. (see below)
            List<Pair<Integer, Integer>> splitList = splitter.createSplitList(text);
            for (Range range : ranges) {
                String value = splitter.getSplitRange(text, splitList, range);
                if (value != null) {
                    inform(ctx, ctx, name + range, value, true);
                }
            }
        } else {
            for (Range range : ranges) {
                String value = splitter.getSplitRange(text, range);
                if (value != null) {
                    inform(ctx, ctx, name + range, value, true);
                }
            }
        }
    }
Parse the useragent and return every part that was found.

@param userAgent The useragent instance that needs to be parsed
@return If the parse was valid (i.e. were there any parser errors: true=valid; false=has errors
analyzer/src/main/java/nl/basjes/parse/useragent/parse/UserAgentTreeFlattener.java