_ZN4args14ArgumentParserC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
 3412|  6.80k|            {
 3413|  6.80k|                Description(description_);
 3414|  6.80k|                Epilog(epilog_);
 3415|  6.80k|                LongPrefix("--");
 3416|  6.80k|                ShortPrefix("-");
 3417|  6.80k|                LongSeparator("=");
 3418|  6.80k|                Terminator("--");
 3419|  6.80k|                SetArgumentSeparations(true, true, true, true);
 3420|  6.80k|                matched = true;
 3421|  6.80k|            }
_ZN4args7CommandC2Ev:
 2231|  6.80k|            Command() = default;
_ZN4args5Group10Validators8DontCareERKS0_:
 1700|  2.67k|                {
 1701|  2.67k|                    return true;
 1702|  2.67k|                }
_ZN4args5GroupC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS1_8functionIFbRKS0_EEENS_7OptionsE:
 1715|  6.80k|            Group(const std::string &help_ = std::string(), const std::function<bool(const Group &)> &validator_ = Validators::DontCare, Options options_ = {}) : Base(help_, options_), validator(validator_)
 1716|  6.80k|            {
 1717|  6.80k|                parent = nullptr;
 1718|  6.80k|            }
_ZN4args4BaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_7OptionsE:
 1024|  88.4k|            Base(const std::string &help_, Options options_ = {}) : options(options_), help(help_) {}
_ZNK4args4Base7MatchedEv:
 1038|   155k|            {
 1039|   155k|                return matched;
 1040|   155k|            }
_ZN4args4Base11GetCommandsEv:
 1060|  74.8k|            {
 1061|  74.8k|                return {};
 1062|  74.8k|            }
_ZNK4args4Base7IsGroupEv:
 1065|  43.4k|            {
 1066|  43.4k|                return false;
 1067|  43.4k|            }
_ZN4args4Base5MatchERKNS_10EitherFlagE:
 1075|  2.02k|            {
 1076|  2.02k|                return nullptr;
 1077|  2.02k|            }
_ZN4args4Base17GetNextPositionalEv:
 1080|  60.0k|            {
 1081|  60.0k|                return nullptr;
 1082|  60.0k|            }
_ZNK4args4Base13HasPositionalEv:
 1095|   183k|            {
 1096|   183k|                return false;
 1097|   183k|            }
_ZNK4args4Base10HasCommandEv:
 1100|   112k|            {
 1101|   112k|                return false;
 1102|   112k|            }
_ZN4args4Base5ResetEv:
 1129|  74.8k|            {
 1130|  74.8k|                matched = false;
 1131|       |#ifdef ARGS_NOEXCEPT
 1132|       |                error = Error::None;
 1133|       |                errorMsg.clear();
 1134|       |#endif
 1135|  74.8k|            }
_ZN4args4BaseD2Ev:
 1025|  88.4k|            virtual ~Base() {}
_ZNK4args5Group7MatchedEv:
 1888|  5.18k|            {
 1889|  5.18k|                return validator(*this);
 1890|  5.18k|            }
_ZNK4args5Group8ValidateERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
 1791|  3.61k|            {
 1792|  3.61k|                for (Base *child: Children())
  ------------------
  |  Branch (1792:33): [True: 7.22k, False: 3.61k]
  ------------------
 1793|  7.22k|                {
 1794|  7.22k|                    child->Validate(shortPrefix, longPrefix);
 1795|  7.22k|                }
 1796|  3.61k|            }
_ZNK4args5Group8ChildrenEv:
 1758|   465k|            {
 1759|   465k|                return children;
 1760|   465k|            }
_ZNK4args5Group14GetDescriptionERKNS_10HelpParamsEj:
 1902|  27.2k|            {
 1903|  27.2k|                std::vector<std::tuple<std::string, std::string, unsigned int>> descriptions;
 1904|       |
 1905|       |                // Push that group description on the back if not empty
 1906|  27.2k|                unsigned addindent = 0;
 1907|  27.2k|                if (!help.empty())
  ------------------
  |  Branch (1907:21): [True: 1.12k, False: 26.0k]
  ------------------
 1908|  1.12k|                {
 1909|  1.12k|                    descriptions.emplace_back(help, "", indent);
 1910|  1.12k|                    addindent = 1;
 1911|  1.12k|                }
 1912|       |
 1913|  27.2k|                for (Base *child: Children())
  ------------------
  |  Branch (1913:33): [True: 54.4k, False: 27.2k]
  ------------------
 1914|  54.4k|                {
 1915|  54.4k|                    if ((child->GetOptions() & Options::HiddenFromDescription) != Options::None)
  ------------------
  |  Branch (1915:25): [True: 0, False: 54.4k]
  ------------------
 1916|      0|                    {
 1917|      0|                        continue;
 1918|      0|                    }
 1919|       |
 1920|  54.4k|                    auto groupDescriptions = child->GetDescription(params, indent + addindent);
 1921|  54.4k|                    descriptions.insert(
 1922|  54.4k|                        std::end(descriptions),
 1923|  54.4k|                        std::make_move_iterator(std::begin(groupDescriptions)),
 1924|  54.4k|                        std::make_move_iterator(std::end(groupDescriptions)));
 1925|  54.4k|                }
 1926|  27.2k|                return descriptions;
 1927|  27.2k|            }
_ZN4argsanENS_7OptionsES0_:
  809|   849k|    {
  810|   849k|        return static_cast<Options>(static_cast<int>(lhs) & static_cast<int>(rhs));
  811|   849k|    }
_ZNK4args4Base10GetOptionsEv:
 1028|   839k|            {
 1029|   839k|                return options;
 1030|   839k|            }
_ZN4args5Group11GetCommandsEv:
 1951|  13.6k|            {
 1952|  13.6k|                std::vector<Command*> res;
 1953|  13.6k|                for (const auto &child : Children())
  ------------------
  |  Branch (1953:40): [True: 81.6k, False: 13.6k]
  ------------------
 1954|  81.6k|                {
 1955|  81.6k|                    auto subparsers = child->GetCommands();
 1956|  81.6k|                    res.insert(std::end(res), std::begin(subparsers), std::end(subparsers));
 1957|  81.6k|                }
 1958|  13.6k|                return res;
 1959|  13.6k|            }
_ZNK4args5Group7IsGroupEv:
 1962|  18.7k|            {
 1963|  18.7k|                return true;
 1964|  18.7k|            }
_ZN4args5Group5MatchERKNS_10EitherFlagE:
 1768|  8.25k|            {
 1769|  8.25k|                for (Base *child: Children())
  ------------------
  |  Branch (1769:33): [True: 38.7k, False: 2.02k]
  ------------------
 1770|  38.7k|                {
 1771|  38.7k|                    if (FlagBase *match = child->Match(flag))
  ------------------
  |  Branch (1771:35): [True: 6.23k, False: 32.5k]
  ------------------
 1772|  6.23k|                    {
 1773|  6.23k|                        return match;
 1774|  6.23k|                    }
 1775|  38.7k|                }
 1776|  2.02k|                return nullptr;
 1777|  8.25k|            }
_ZN4args5Group17GetNextPositionalEv:
 1803|  13.3k|            {
 1804|  13.3k|                for (Base *child: Children())
  ------------------
  |  Branch (1804:33): [True: 78.3k, False: 6.67k]
  ------------------
 1805|  78.3k|                {
 1806|  78.3k|                    if (auto next = child->GetNextPositional())
  ------------------
  |  Branch (1806:30): [True: 6.67k, False: 71.6k]
  ------------------
 1807|  6.67k|                    {
 1808|  6.67k|                        return next;
 1809|  6.67k|                    }
 1810|  78.3k|                }
 1811|  6.67k|                return nullptr;
 1812|  13.3k|            }
_ZNK4args5Group7HasFlagEv:
 1819|  47.6k|            {
 1820|  47.6k|                return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasFlag(); });
 1821|  47.6k|            }
_ZZNK4args5Group7HasFlagEvENKUlPNS_4BaseEE_clES2_:
 1820|  47.6k|                return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasFlag(); });
_ZNK4args5Group13HasPositionalEv:
 1828|  40.8k|            {
 1829|  40.8k|                return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasPositional(); });
 1830|  40.8k|            }
_ZZNK4args5Group13HasPositionalEvENKUlPNS_4BaseEE_clES2_:
 1829|   224k|                return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasPositional(); });
_ZNK4args5Group10HasCommandEv:
 1837|  20.4k|            {
 1838|  20.4k|                return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasCommand(); });
 1839|  20.4k|            }
_ZZNK4args5Group10HasCommandEvENKUlPNS_4BaseEE_clES2_:
 1838|   122k|                return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasCommand(); });
_ZNK4args5Group14GetProgramLineERKNS_10HelpParamsE:
 1932|  54.4k|            {
 1933|  54.4k|                std::vector <std::string> names;
 1934|  54.4k|                for (Base *child: Children())
  ------------------
  |  Branch (1934:33): [True: 326k, False: 54.4k]
  ------------------
 1935|   326k|                {
 1936|   326k|                    if ((child->GetOptions() & Options::HiddenFromUsage) != Options::None)
  ------------------
  |  Branch (1936:25): [True: 19.9k, False: 306k]
  ------------------
 1937|  19.9k|                    {
 1938|  19.9k|                        continue;
 1939|  19.9k|                    }
 1940|       |
 1941|   306k|                    auto groupNames = child->GetProgramLine(params);
 1942|   306k|                    names.insert(
 1943|   306k|                        std::end(names),
 1944|   306k|                        std::make_move_iterator(std::begin(groupNames)),
 1945|   306k|                        std::make_move_iterator(std::end(groupNames)));
 1946|   306k|                }
 1947|  54.4k|                return names;
 1948|  54.4k|            }
_ZN4args5Group5ResetEv:
 1967|  13.6k|            {
 1968|  13.6k|                Base::Reset();
 1969|       |
 1970|  13.6k|                for (auto &child: Children())
  ------------------
  |  Branch (1970:33): [True: 81.6k, False: 13.6k]
  ------------------
 1971|  81.6k|                {
 1972|  81.6k|                    child->Reset();
 1973|  81.6k|                }
 1974|       |#ifdef ARGS_NOEXCEPT
 1975|       |                error = Error::None;
 1976|       |                errorMsg.clear();
 1977|       |#endif
 1978|  13.6k|            }
_ZN4args7Command5ResetEv:
 2683|  6.80k|            {
 2684|  6.80k|                Group::Reset();
 2685|  6.80k|                selectedCommand = nullptr;
 2686|  6.80k|                subparserProgramLine.clear();
 2687|  6.80k|                subparserDescription.clear();
 2688|  6.80k|                subparserHasFlag = false;
 2689|  6.80k|                subparserHasPositional = false;
 2690|  6.80k|                subparserHasCommand = false;
 2691|       |#ifdef ARGS_NOEXCEPT
 2692|       |                subparserError = Error::None;
 2693|       |#endif
 2694|  6.80k|            }
_ZN4args7Command11DescriptionERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 2304|  6.80k|            { this->description = description_; }
_ZN4args7Command6EpilogERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 2314|  6.80k|            { this->epilog = epilog_; }
_ZN4args14ArgumentParser22SetArgumentSeparationsEbbbb:
 3526|  6.80k|            {
 3527|  6.80k|                this->allowJoinedShortValue = allowJoinedShortValue_;
 3528|  6.80k|                this->allowJoinedLongValue = allowJoinedLongValue_;
 3529|  6.80k|                this->allowSeparateShortValue = allowSeparateShortValue_;
 3530|  6.80k|                this->allowSeparateLongValue = allowSeparateLongValue_;
 3531|       |
 3532|  6.80k|                this->helpParams.longSeparator = allowJoinedLongValue ? longseparator : " ";
  ------------------
  |  Branch (3532:50): [True: 6.80k, False: 0]
  ------------------
 3533|  6.80k|                this->helpParams.shortSeparator = allowJoinedShortValue ? "" : " ";
  ------------------
  |  Branch (3533:51): [True: 6.80k, False: 0]
  ------------------
 3534|  6.80k|            }
_ZN4args5GroupD2Ev:
 1725|  13.6k|            virtual ~Group() {}
_ZNK4args7Command7MatchedEv:
 2337|  97.5k|            { return Base::Matched(); }
_ZNK4args7Command8ValidateERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
 2632|  5.18k|            {
 2633|  5.18k|                if (!Matched())
  ------------------
  |  Branch (2633:21): [True: 0, False: 5.18k]
  ------------------
 2634|      0|                {
 2635|      0|                    return;
 2636|      0|                }
 2637|       |
 2638|  5.18k|                auto onValidationError = [&]
 2639|  5.18k|                {
 2640|  5.18k|                    std::ostringstream problem;
 2641|  5.18k|                    problem << "Group validation failed somewhere!";
 2642|       |#ifdef ARGS_NOEXCEPT
 2643|       |                    error = Error::Validation;
 2644|       |                    errorMsg = problem.str();
 2645|       |#else
 2646|  5.18k|                    throw ValidationError(problem.str());
 2647|  5.18k|#endif
 2648|  5.18k|                };
 2649|       |
 2650|  5.18k|                for (Base *child: Children())
  ------------------
  |  Branch (2650:33): [True: 48.6k, False: 5.18k]
  ------------------
 2651|  48.6k|                {
 2652|  48.6k|                    if (child->IsGroup() && !child->Matched())
  ------------------
  |  Branch (2652:25): [True: 5.18k, False: 43.4k]
  |  Branch (2652:45): [True: 1.57k, False: 3.61k]
  ------------------
 2653|  1.57k|                    {
 2654|  1.57k|                        onValidationError();
 2655|  1.57k|                    }
 2656|       |
 2657|  48.6k|                    child->Validate(shortprefix, longprefix);
 2658|  48.6k|                }
 2659|       |
 2660|  5.18k|                if (subparser != nullptr)
  ------------------
  |  Branch (2660:21): [True: 0, False: 5.18k]
  ------------------
 2661|      0|                {
 2662|      0|                    subparser->Validate(shortprefix, longprefix);
 2663|      0|                    if (!subparser->Matched())
  ------------------
  |  Branch (2663:25): [True: 0, False: 0]
  ------------------
 2664|      0|                    {
 2665|      0|                        onValidationError();
 2666|      0|                    }
 2667|      0|                }
 2668|       |
 2669|  5.18k|                if (selectedCommand == nullptr && commandIsRequired && (Group::HasCommand() || subparserHasCommand))
  ------------------
  |  Branch (2669:21): [True: 3.61k, False: 1.57k]
  |  Branch (2669:51): [True: 3.61k, False: 0]
  |  Branch (2669:73): [True: 0, False: 3.61k]
  |  Branch (2669:96): [True: 0, False: 3.61k]
  ------------------
 2670|      0|                {
 2671|      0|                    std::ostringstream problem;
 2672|      0|                    problem << "Command is required";
 2673|       |#ifdef ARGS_NOEXCEPT
 2674|       |                    error = Error::Validation;
 2675|       |                    errorMsg = problem.str();
 2676|       |#else
 2677|      0|                    throw ValidationError(problem.str());
 2678|      0|#endif
 2679|      0|                }
 2680|  5.18k|            }
_ZZNK4args7Command8ValidateERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ENKUlvE_clEv:
 2639|  1.57k|                {
 2640|  1.57k|                    std::ostringstream problem;
 2641|  1.57k|                    problem << "Group validation failed somewhere!";
 2642|       |#ifdef ARGS_NOEXCEPT
 2643|       |                    error = Error::Validation;
 2644|       |                    errorMsg = problem.str();
 2645|       |#else
 2646|  1.57k|                    throw ValidationError(problem.str());
 2647|  1.57k|#endif
 2648|  1.57k|                };
_ZN4args15ValidationErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  507|  1.57k|            ValidationError(const std::string &problem) : Error(problem) {}
_ZN4args5ErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  480|  3.19k|            Error(const std::string &problem) : std::runtime_error(problem) {}
_ZN4args7Command11GetCommandsEv:
 2535|  6.80k|            {
 2536|  6.80k|                if (selectedCommand != nullptr)
  ------------------
  |  Branch (2536:21): [True: 0, False: 6.80k]
  ------------------
 2537|      0|                {
 2538|      0|                    return selectedCommand->GetCommands();
 2539|      0|                }
 2540|       |
 2541|  6.80k|                if (Matched())
  ------------------
  |  Branch (2541:21): [True: 6.80k, False: 0]
  ------------------
 2542|  6.80k|                {
 2543|  6.80k|                    return Group::GetCommands();
 2544|  6.80k|                }
 2545|       |
 2546|      0|                return { this };
 2547|  6.80k|            }
_ZNK4args4Base6IsFlagEv:
 1070|  20.4k|            {
 1071|  20.4k|                return false;
 1072|  20.4k|            }
_ZN4args7Command5MatchERKNS_10EitherFlagE:
 2356|  5.69k|            {
 2357|  5.69k|                if (selectedCommand != nullptr)
  ------------------
  |  Branch (2357:21): [True: 0, False: 5.69k]
  ------------------
 2358|      0|                {
 2359|      0|                    if (auto *res = selectedCommand->Match(flag))
  ------------------
  |  Branch (2359:31): [True: 0, False: 0]
  ------------------
 2360|      0|                    {
 2361|      0|                        return res;
 2362|      0|                    }
 2363|       |
 2364|      0|                    for (auto *child: Children())
  ------------------
  |  Branch (2364:37): [True: 0, False: 0]
  ------------------
 2365|      0|                    {
 2366|      0|                        if ((child->GetOptions() & Options::Global) != Options::None)
  ------------------
  |  Branch (2366:29): [True: 0, False: 0]
  ------------------
 2367|      0|                        {
 2368|      0|                            if (auto *res = child->Match(flag))
  ------------------
  |  Branch (2368:39): [True: 0, False: 0]
  ------------------
 2369|      0|                            {
 2370|      0|                                return res;
 2371|      0|                            }
 2372|      0|                        }
 2373|      0|                    }
 2374|       |
 2375|      0|                    return nullptr;
 2376|      0|                }
 2377|       |
 2378|  5.69k|                if (subparser != nullptr)
  ------------------
  |  Branch (2378:21): [True: 0, False: 5.69k]
  ------------------
 2379|      0|                {
 2380|      0|                    return subparser->Match(flag);
 2381|      0|                }
 2382|       |
 2383|  5.69k|                return Matched() ? Group::Match(flag) : nullptr;
  ------------------
  |  Branch (2383:24): [True: 5.69k, False: 0]
  ------------------
 2384|  5.69k|            }
_ZN4args7Command17GetNextPositionalEv:
 2420|  6.67k|            {
 2421|  6.67k|                if (selectedCommand != nullptr)
  ------------------
  |  Branch (2421:21): [True: 0, False: 6.67k]
  ------------------
 2422|      0|                {
 2423|      0|                    if (auto *res = selectedCommand->GetNextPositional())
  ------------------
  |  Branch (2423:31): [True: 0, False: 0]
  ------------------
 2424|      0|                    {
 2425|      0|                        return res;
 2426|      0|                    }
 2427|       |
 2428|      0|                    for (auto *child: Children())
  ------------------
  |  Branch (2428:37): [True: 0, False: 0]
  ------------------
 2429|      0|                    {
 2430|      0|                        if ((child->GetOptions() & Options::Global) != Options::None)
  ------------------
  |  Branch (2430:29): [True: 0, False: 0]
  ------------------
 2431|      0|                        {
 2432|      0|                            if (auto *res = child->GetNextPositional())
  ------------------
  |  Branch (2432:39): [True: 0, False: 0]
  ------------------
 2433|      0|                            {
 2434|      0|                                return res;
 2435|      0|                            }
 2436|      0|                        }
 2437|      0|                    }
 2438|       |
 2439|      0|                    return nullptr;
 2440|      0|                }
 2441|       |
 2442|  6.67k|                if (subparser != nullptr)
  ------------------
  |  Branch (2442:21): [True: 0, False: 6.67k]
  ------------------
 2443|      0|                {
 2444|      0|                    return subparser->GetNextPositional();
 2445|      0|                }
 2446|       |
 2447|  6.67k|                return Matched() ? Group::GetNextPositional() : nullptr;
  ------------------
  |  Branch (2447:24): [True: 6.67k, False: 0]
  ------------------
 2448|  6.67k|            }
_ZNK4args7Command7HasFlagEv:
 2451|  20.4k|            {
 2452|  20.4k|                return subparserHasFlag || Group::HasFlag();
  ------------------
  |  Branch (2452:24): [True: 0, False: 20.4k]
  |  Branch (2452:44): [True: 20.4k, False: 0]
  ------------------
 2453|  20.4k|            }
_ZNK4args7Command13HasPositionalEv:
 2456|  20.4k|            {
 2457|  20.4k|                return subparserHasPositional || Group::HasPositional();
  ------------------
  |  Branch (2457:24): [True: 0, False: 20.4k]
  |  Branch (2457:50): [True: 20.4k, False: 0]
  ------------------
 2458|  20.4k|            }
_ZN4args14ArgumentParser5ResetEv:
 3664|  6.80k|            {
 3665|  6.80k|                Command::Reset();
 3666|  6.80k|                matched = true;
 3667|  6.80k|                readCompletion = false;
 3668|  6.80k|            }
_ZN4args14ArgumentParser10LongPrefixERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 3448|  13.6k|            {
 3449|  13.6k|                this->longprefix = longprefix_;
 3450|  13.6k|                this->helpParams.longPrefix = longprefix_;
 3451|  13.6k|            }
_ZN4args14ArgumentParser11ShortPrefixERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 3460|  13.6k|            {
 3461|  13.6k|                this->shortprefix = shortprefix_;
 3462|  13.6k|                this->helpParams.shortPrefix = shortprefix_;
 3463|  13.6k|            }
_ZN4args14ArgumentParser13LongSeparatorERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 3472|  13.6k|            {
 3473|  13.6k|                if (longseparator_.empty())
  ------------------
  |  Branch (3473:21): [True: 0, False: 13.6k]
  ------------------
 3474|      0|                {
 3475|      0|                    const std::string errorMessage("longseparator can not be set to empty");
 3476|       |#ifdef ARGS_NOEXCEPT
 3477|       |                    error = Error::Usage;
 3478|       |                    errorMsg = errorMessage;
 3479|       |#else
 3480|      0|                    throw UsageError(errorMessage);
 3481|      0|#endif
 3482|      0|                } else
 3483|  13.6k|                {
 3484|  13.6k|                    this->longseparator = longseparator_;
 3485|  13.6k|                    this->helpParams.longSeparator = allowJoinedLongValue ? longseparator : " ";
  ------------------
  |  Branch (3485:54): [True: 13.6k, False: 0]
  ------------------
 3486|  13.6k|                }
 3487|  13.6k|            }
_ZN4args14ArgumentParser10TerminatorERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 3496|  13.6k|            { this->terminator = terminator_; }
_ZN4args10EitherFlagC2Ec:
  575|   575k|        EitherFlag(const char flag) : isShort(true), shortFlag(flag), longFlag() {}
_ZN4args10EitherFlagC2EPKc:
  574|  54.4k|        EitherFlag(const char *flag) : isShort(false), shortFlag(), longFlag(flag) {}
_ZN4args7MatcherC2ESt16initializer_listINS_10EitherFlagEE:
  680|  61.2k|                Matcher(EitherFlag::GetShort(in), EitherFlag::GetLong(in)) {}
_ZN4args10EitherFlag8GetShortESt16initializer_listIS0_E:
  595|  61.2k|        {
  596|  61.2k|            std::unordered_set<char>  shortFlags;
  597|  61.2k|            for (const EitherFlag &flag: flags)
  ------------------
  |  Branch (597:40): [True: 108k, False: 61.2k]
  ------------------
  598|   108k|            {
  599|   108k|                if (flag.isShort)
  ------------------
  |  Branch (599:21): [True: 54.4k, False: 54.4k]
  ------------------
  600|  54.4k|                {
  601|  54.4k|                    shortFlags.insert(flag.shortFlag);
  602|  54.4k|                }
  603|   108k|            }
  604|  61.2k|            return shortFlags;
  605|  61.2k|        }
_ZN4args10EitherFlag7GetLongESt16initializer_listIS0_E:
  580|  61.2k|        {
  581|  61.2k|            std::unordered_set<std::string>  longFlags;
  582|  61.2k|            for (const EitherFlag &flag: flags)
  ------------------
  |  Branch (582:40): [True: 108k, False: 61.2k]
  ------------------
  583|   108k|            {
  584|   108k|                if (!flag.isShort)
  ------------------
  |  Branch (584:21): [True: 54.4k, False: 54.4k]
  ------------------
  585|  54.4k|                {
  586|  54.4k|                    longFlags.insert(flag.longFlag);
  587|  54.4k|                }
  588|   108k|            }
  589|  61.2k|            return longFlags;
  590|  61.2k|        }
_ZN4args7MatcherC2INSt3__113unordered_setIcNS2_4hashIcEENS2_8equal_toIcEENS2_9allocatorIcEEEENS3_INS2_12basic_stringIcNS2_11char_traitsIcEES9_EENS4_ISE_EENS6_ISE_EENS8_ISE_EEEEEEOT_OT0_:
  664|  61.2k|                Matcher(std::begin(shortIn), std::end(shortIn), std::begin(longIn), std::end(longIn))
  665|  61.2k|            {}
_ZN4args7MatcherC2INSt3__121__hash_const_iteratorIPNS2_11__hash_nodeIcPvEEEENS3_IPNS4_INS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES5_EEEEEET_SI_T0_SJ_:
  639|  61.2k|                shortFlags(shortFlagsStart, shortFlagsEnd),
  640|  61.2k|                longFlags(longFlagsStart, longFlagsEnd)
  641|  61.2k|            {
  642|  61.2k|                if (shortFlags.empty() && longFlags.empty())
  ------------------
  |  Branch (642:21): [True: 6.80k, False: 54.4k]
  |  Branch (642:43): [True: 0, False: 6.80k]
  ------------------
  643|      0|                {
  644|      0|#ifndef ARGS_NOEXCEPT
  645|      0|                    throw UsageError("empty Matcher");
  646|      0|#endif
  647|      0|                }
  648|  61.2k|            }
_ZN4args8HelpFlagC2ERNS_5GroupERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_ONS_7MatcherENS_7OptionsE:
 3816|  6.80k|            HelpFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_ = {}): Flag(group_, name_, help_, std::move(matcher_), options_) {}
_ZN4args4FlagC2ERNS_5GroupERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_ONS_7MatcherENS_7OptionsE:
 3781|  27.2k|            Flag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_): FlagBase(name_, help_, std::move(matcher_), options_)
 3782|  27.2k|            {
 3783|  27.2k|                group_.Add(*this);
 3784|  27.2k|            }
_ZN4args8FlagBaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ONS_7MatcherENS_7OptionsE:
 1352|  61.2k|            FlagBase(const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_) : NamedBase(name_, help_, options_), matcher(std::move(matcher_)) {}
_ZN4args9NamedBaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_NS_7OptionsE:
 1185|  74.8k|            NamedBase(const std::string &name_, const std::string &help_, Options options_ = {}) : Base(help_, options_), name(name_) {}
_ZN4args9NamedBaseD2Ev:
 1186|  74.8k|            virtual ~NamedBase() {}
_ZNK4args9NamedBase13GetNameStringERKNS_10HelpParamsE:
 1168|  54.4k|            virtual std::string GetNameString(const HelpParams&) const { return Name(); }
_ZN4args7MatcherC2EOS0_:
  682|  61.2k|            Matcher(Matcher &&other) noexcept : shortFlags(std::move(other.shortFlags)), longFlags(std::move(other.longFlags))
  683|  61.2k|            {}
_ZN4args5Group3AddERNS_4BaseE:
 1730|  81.6k|            {
 1731|  81.6k|                children.emplace_back(&child);
 1732|       |
 1733|  81.6k|                if(child.IsFlag()) {
  ------------------
  |  Branch (1733:20): [True: 61.2k, False: 20.4k]
  ------------------
 1734|  61.2k|#ifndef ARGS_NOEXCEPT
 1735|       |                    // Detection runs from the child's own constructor, so a
 1736|       |                    // duplicate throws before that constructor completes and the
 1737|       |                    // child's storage is released while the stack unwinds. Undo
 1738|       |                    // the registration first, or a caller that catches the error
 1739|       |                    // leaves this group holding a pointer to a dead object.
 1740|  61.2k|                    try
 1741|  61.2k|                    {
 1742|  61.2k|                        SignalDetectDuplicates();
 1743|  61.2k|                    }
 1744|  61.2k|                    catch (...)
 1745|  61.2k|                    {
 1746|      0|                        children.pop_back();
 1747|      0|                        throw;
 1748|      0|                    }
 1749|       |#else
 1750|       |                    SignalDetectDuplicates();
 1751|       |#endif
 1752|  61.2k|                }
 1753|  81.6k|            }
_ZN4args5Group22SignalDetectDuplicatesEv:
 1984|  74.8k|            {
 1985|  74.8k|                if(parent != nullptr) parent->SignalDetectDuplicates();
  ------------------
  |  Branch (1985:20): [True: 13.6k, False: 61.2k]
  ------------------
 1986|  61.2k|                else DetectDuplicateFlags();
 1987|  74.8k|            }
_ZN4args5Group20DetectDuplicateFlagsEv:
 1994|  61.2k|            {
 1995|  61.2k|                std::unordered_set<char> usedShortFlags;
 1996|  61.2k|                std::unordered_set<std::string> usedLongFlags;
 1997|  61.2k|                DetectDuplicateFlags(usedShortFlags, usedLongFlags);
 1998|  61.2k|            }
_ZN4args5Group20DetectDuplicateFlagsERNSt3__113unordered_setIcNS1_4hashIcEENS1_8equal_toIcEENS1_9allocatorIcEEEERNS2_INS1_12basic_stringIcNS1_11char_traitsIcEES8_EENS3_ISE_EENS5_ISE_EENS7_ISE_EEEE:
 2003|  74.8k|            {
 2004|  74.8k|                for (Base *child: Children())
  ------------------
  |  Branch (2004:33): [True: 319k, False: 74.8k]
  ------------------
 2005|   319k|                {
 2006|   319k|                    if(auto flag = dynamic_cast<FlagBase*>(child))
  ------------------
  |  Branch (2006:29): [True: 306k, False: 13.6k]
  ------------------
 2007|   306k|                    {
 2008|       |                        // Check for duplicate flags, setting a usage error on the
 2009|       |                        // flag if a duplicate is detected.
 2010|   306k|                        for(EitherFlag flagString: flag->GetMatcher().GetFlagStrings())
  ------------------
  |  Branch (2010:50): [True: 571k, False: 306k]
  ------------------
 2011|   571k|                        {
 2012|   571k|                            if(flagString.isShort)
  ------------------
  |  Branch (2012:32): [True: 272k, False: 299k]
  ------------------
 2013|   272k|                            {
 2014|   272k|                                if(usedShortFlags.count(flagString.shortFlag))
  ------------------
  |  Branch (2014:36): [True: 0, False: 272k]
  ------------------
 2015|      0|                                {
 2016|       |#ifdef ARGS_NOEXCEPT
 2017|       |                                    flag->SetUsageError();
 2018|       |#else
 2019|      0|                                    throw ParseError("duplicate short flag detected");
 2020|      0|#endif
 2021|      0|                                }
 2022|   272k|                                else
 2023|   272k|                                {
 2024|   272k|                                    usedShortFlags.insert(flagString.shortFlag);
 2025|   272k|                                }
 2026|   272k|                            }
 2027|   299k|                            else
 2028|   299k|                            {
 2029|   299k|                                if(usedLongFlags.count(flagString.longFlag))
  ------------------
  |  Branch (2029:36): [True: 0, False: 299k]
  ------------------
 2030|      0|                                {
 2031|       |#ifdef ARGS_NOEXCEPT
 2032|       |                                    flag->SetUsageError();
 2033|       |#else
 2034|      0|                                    throw ParseError("duplicate long flag detected");
 2035|      0|#endif
 2036|      0|                                }
 2037|   299k|                                else
 2038|   299k|                                {
 2039|   299k|                                    usedLongFlags.insert(flagString.longFlag);
 2040|   299k|                                }
 2041|   299k|                            }
 2042|   571k|                        }
 2043|   306k|                    }
 2044|  13.6k|                    else if(auto group = dynamic_cast<Group*>(child))
  ------------------
  |  Branch (2044:34): [True: 13.6k, False: 0]
  ------------------
 2045|  13.6k|                    {
 2046|       |                        // A command opens its own flag namespace and runs its
 2047|       |                        // own duplicate detection as a separate root, so a flag
 2048|       |                        // reused either side of a command boundary is not a
 2049|       |                        // genuine duplicate. Only descend into plain groups
 2050|       |                        // here; IsGroup() is false for a Command.
 2051|  13.6k|                        if(group->IsGroup())
  ------------------
  |  Branch (2051:28): [True: 13.6k, False: 0]
  ------------------
 2052|  13.6k|                        {
 2053|  13.6k|                            group->DetectDuplicateFlags(usedShortFlags, usedLongFlags);
 2054|  13.6k|                        }
 2055|  13.6k|                    }
 2056|   319k|                }
 2057|  74.8k|            }
_ZNK4args8FlagBase10GetMatcherEv:
 1388|   306k|            {
 1389|   306k|                return matcher;
 1390|   306k|            }
_ZNK4args7Matcher14GetFlagStringsEv:
  711|   531k|            {
  712|   531k|                std::vector<EitherFlag> flagStrings;
  713|   531k|                flagStrings.reserve(shortFlags.size() + longFlags.size());
  714|   531k|                for (const char flag: shortFlags)
  ------------------
  |  Branch (714:37): [True: 470k, False: 531k]
  ------------------
  715|   470k|                {
  716|   470k|                    flagStrings.emplace_back(flag);
  717|   470k|                }
  718|   531k|                for (const std::string &flag: longFlags)
  ------------------
  |  Branch (718:45): [True: 497k, False: 531k]
  ------------------
  719|   497k|                {
  720|   497k|                    flagStrings.emplace_back(flag);
  721|   497k|                }
  722|   531k|                return flagStrings;
  723|   531k|            }
_ZN4args10EitherFlagC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  573|   529k|        EitherFlag(const std::string &flag) : isShort(false), shortFlag(), longFlag(flag) {}
_ZN4args10ParseErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  498|  1.49k|            ParseError(const std::string &problem) : Error(problem) {}
_ZN4args8FlagBaseD2Ev:
 1354|  61.2k|            virtual ~FlagBase() {}
_ZN4args4Flag10ParseValueERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE:
 3805|  3.28k|            {
 3806|  3.28k|            }
_ZNK4args8FlagBase8ValidateERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
 1393|  43.4k|            {
 1394|  43.4k|                if (!Matched() && IsRequired())
  ------------------
  |  Branch (1394:21): [True: 43.0k, False: 496]
  |  Branch (1394:35): [True: 0, False: 43.0k]
  ------------------
 1395|      0|                {
 1396|      0|                        std::ostringstream problem;
 1397|      0|                        problem << "Flag '" << matcher.GetLongOrAny().str(shortPrefix, longPrefix) << "' is required";
 1398|       |#ifdef ARGS_NOEXCEPT
 1399|       |                        error = Error::Required;
 1400|       |                        errorMsg = problem.str();
 1401|       |#else
 1402|      0|                        throw RequiredError(problem.str());
 1403|      0|#endif
 1404|      0|                }
 1405|  43.4k|            }
_ZNK4args4Base10IsRequiredEv:
 1033|   181k|            {
 1034|   181k|                return (GetOptions() & Options::Required) != Options::None;
 1035|   181k|            }
_ZNK4args7Matcher12GetLongOrAnyEv:
  728|  28.9k|            {
  729|  28.9k|                if (!longFlags.empty())
  ------------------
  |  Branch (729:21): [True: 25.4k, False: 3.52k]
  ------------------
  730|  25.4k|                {
  731|  25.4k|                    return *longFlags.begin();
  732|  25.4k|                }
  733|       |
  734|  3.52k|                if (!shortFlags.empty())
  ------------------
  |  Branch (734:21): [True: 3.52k, False: 0]
  ------------------
  735|  3.52k|                {
  736|  3.52k|                    return *shortFlags.begin();
  737|  3.52k|                }
  738|       |
  739|       |                // should be unreachable
  740|      0|                return ' ';
  741|  3.52k|            }
_ZNK4args10EitherFlag3strERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  613|  76.6k|        {
  614|  76.6k|            return isShort ? shortPrefix + std::string(1, shortFlag) : longPrefix + longFlag;
  ------------------
  |  Branch (614:20): [True: 45.3k, False: 31.2k]
  ------------------
  615|  76.6k|        }
_ZNK4args9NamedBase14GetDescriptionERKNS_10HelpParamsEj:
 1221|   279k|            {
 1222|   279k|                std::tuple<std::string, std::string, unsigned> description;
 1223|   279k|                std::get<0>(description) = GetNameString(params);
 1224|   279k|                std::get<1>(description) = help;
 1225|   279k|                std::get<2>(description) = indentLevel;
 1226|       |
 1227|   279k|                AddDescriptionPostfix(std::get<1>(description), choicesStringManual, detail::Join(choicesStrings, ", "), params.addChoices, detail::Join(GetChoicesStrings(params), ", "), params.choiceString);
 1228|   279k|                AddDescriptionPostfix(std::get<1>(description), defaultStringManual, defaultString, params.addDefault, GetDefaultString(params), params.defaultString);
 1229|       |
 1230|   279k|                return { std::move(description) };
 1231|   279k|            }
_ZNK4args9NamedBase21AddDescriptionPostfixERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEbRKS7_bSA_SA_:
 1171|   559k|            {
 1172|   559k|                if (isManual && !manual.empty())
  ------------------
  |  Branch (1172:21): [True: 0, False: 559k]
  |  Branch (1172:33): [True: 0, False: 0]
  ------------------
 1173|      0|                {
 1174|      0|                    dest += str;
 1175|      0|                    dest += manual;
 1176|      0|                }
 1177|   559k|                else if (!isManual && isGenerated && !generated.empty())
  ------------------
  |  Branch (1177:26): [True: 559k, False: 0]
  |  Branch (1177:39): [True: 222k, False: 336k]
  |  Branch (1177:54): [True: 33.0k, False: 189k]
  ------------------
 1178|  33.0k|                {
 1179|  33.0k|                    dest += str;
 1180|  33.0k|                    dest += generated;
 1181|  33.0k|                }
 1182|   559k|            }
_ZN4args6detail4JoinINSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEEEES9_RKT_RKS9_:
  367|   559k|        {
  368|   559k|            std::string res;
  369|       |            
  370|       |            // Safely compute reservation size to avoid unbounded reallocations
  371|   559k|            using size_type = std::string::size_type;
  372|   559k|            size_type total = 0;
  373|   559k|            size_type count = 0;
  374|   559k|            const size_type delim_size = static_cast<size_type>(delimiter.size());
  375|   559k|            bool can_reserve = true;
  376|       |            
  377|   559k|            for (const auto &element : array)
  ------------------
  |  Branch (377:38): [True: 81.6k, False: 559k]
  ------------------
  378|  81.6k|            {
  379|  81.6k|                const size_type elem_size = static_cast<size_type>(element.size());
  380|  81.6k|                if (!SafeAdd<size_type>(total, elem_size, total))
  ------------------
  |  Branch (380:21): [True: 0, False: 81.6k]
  ------------------
  381|      0|                {
  382|      0|                    can_reserve = false;
  383|      0|                    break;
  384|      0|                }
  385|  81.6k|                ++count;
  386|  81.6k|            }
  387|       |            
  388|   559k|            if (can_reserve && count > 1)
  ------------------
  |  Branch (388:17): [True: 559k, False: 0]
  |  Branch (388:32): [True: 27.2k, False: 532k]
  ------------------
  389|  27.2k|            {
  390|  27.2k|                size_type delim_count = count - 1;
  391|  27.2k|                size_type delim_total = 0;
  392|  27.2k|                if (!SafeMultiply<size_type>(delim_count, delim_size, delim_total) ||
  ------------------
  |  Branch (392:21): [True: 0, False: 27.2k]
  ------------------
  393|  27.2k|                    !SafeAdd<size_type>(total, delim_total, total))
  ------------------
  |  Branch (393:21): [True: 0, False: 27.2k]
  ------------------
  394|      0|                {
  395|      0|                    can_reserve = false;
  396|      0|                }
  397|  27.2k|            }
  398|       |            
  399|   559k|            if (can_reserve && total > 0)
  ------------------
  |  Branch (399:17): [True: 559k, False: 0]
  |  Branch (399:32): [True: 27.2k, False: 532k]
  ------------------
  400|  27.2k|            {
  401|  27.2k|                res.reserve(total);
  402|  27.2k|            }
  403|       |            
  404|   559k|            bool first = true;
  405|   559k|            for (const auto &element : array)
  ------------------
  |  Branch (405:38): [True: 81.6k, False: 559k]
  ------------------
  406|  81.6k|            {
  407|  81.6k|                if (!first)
  ------------------
  |  Branch (407:21): [True: 54.4k, False: 27.2k]
  ------------------
  408|  54.4k|                {
  409|  54.4k|                    res += delimiter;
  410|  54.4k|                }
  411|  81.6k|                res += element;
  412|  81.6k|                first = false;
  413|  81.6k|            }
  414|       |            
  415|   559k|            return res;
  416|   559k|        }
_ZN4args7SafeAddImEEbT_S1_RS1_:
  109|   606k|    {
  110|   606k|        static_assert(std::is_integral<T>::value, "SafeAdd requires integral types.");
  111|   606k|        if (std::is_unsigned<T>::value)
  ------------------
  |  Branch (111:13): [True: 606k, Folded]
  ------------------
  112|   606k|        {
  113|   606k|            using U = typename std::make_unsigned<T>::type;
  114|   606k|            const U ua = static_cast<U>(a);
  115|   606k|            const U ub = static_cast<U>(b);
  116|   606k|            const U maxv = std::numeric_limits<U>::max();
  117|   606k|            if (ua > maxv - ub)
  ------------------
  |  Branch (117:17): [True: 0, False: 606k]
  ------------------
  118|      0|            {
  119|      0|                return false;
  120|      0|            }
  121|   606k|            out = static_cast<T>(ua + ub);
  122|   606k|            return true;
  123|   606k|        }
  124|      0|        else
  125|      0|        {
  126|      0|#if defined(__clang__) || defined(__GNUC__)
  127|      0|            return !__builtin_add_overflow(a, b, &out);
  128|       |#else
  129|       |            // Fallback bounds check
  130|       |            if (b > 0 && a > std::numeric_limits<T>::max() - b)
  131|       |            {
  132|       |                return false;
  133|       |            }
  134|       |            if (b < 0 && a < std::numeric_limits<T>::min() - b)
  135|       |            {
  136|       |                return false;
  137|       |            }
  138|       |            out = a + b;
  139|       |            return true;
  140|       |#endif
  141|      0|        }
  142|   606k|    }
_ZN4args12SafeMultiplyImEEbT_S1_RS1_:
  149|  27.2k|    {
  150|  27.2k|        static_assert(std::is_integral<T>::value, "SafeMultiply requires integral types.");
  151|       |
  152|  27.2k|        if (a == 0 || b == 0)
  ------------------
  |  Branch (152:13): [True: 0, False: 27.2k]
  |  Branch (152:23): [True: 0, False: 27.2k]
  ------------------
  153|      0|        {
  154|      0|            out = 0;
  155|      0|            return true;
  156|      0|        }
  157|       |
  158|  27.2k|        if (std::is_unsigned<T>::value)
  ------------------
  |  Branch (158:13): [True: 27.2k, Folded]
  ------------------
  159|  27.2k|        {
  160|  27.2k|            using U = typename std::make_unsigned<T>::type;
  161|  27.2k|            const U ua = static_cast<U>(a);
  162|  27.2k|            const U ub = static_cast<U>(b);
  163|  27.2k|            const U maxv = std::numeric_limits<U>::max();
  164|  27.2k|            if (ub > maxv / ua)
  ------------------
  |  Branch (164:17): [True: 0, False: 27.2k]
  ------------------
  165|      0|            {
  166|      0|                return false;
  167|      0|            }
  168|  27.2k|            out = static_cast<T>(ua * ub);
  169|  27.2k|            return true;
  170|  27.2k|        }
  171|      0|        else
  172|      0|        {
  173|      0|#if defined(__clang__) || defined(__GNUC__)
  174|      0|            return !__builtin_mul_overflow(a, b, &out);
  175|       |#else
  176|       |            // Fallback bounds check
  177|       |            if (a == -1 && b == std::numeric_limits<T>::min())
  178|       |            {
  179|       |                return false;
  180|       |            }
  181|       |            if (b == -1 && a == std::numeric_limits<T>::min())
  182|       |            {
  183|       |                return false;
  184|       |            }
  185|       |            if ((a > 0 && b > 0 && a > std::numeric_limits<T>::max() / b) ||
  186|       |                (a > 0 && b < 0 && b < std::numeric_limits<T>::min() / a) ||
  187|       |                (a < 0 && b > 0 && a < std::numeric_limits<T>::min() / b) ||
  188|       |                (a < 0 && b < 0 && a < std::numeric_limits<T>::max() / b))
  189|       |            {
  190|       |                return false;
  191|       |            }
  192|       |            out = a * b;
  193|       |            return true;
  194|       |#endif
  195|      0|        }
  196|  27.2k|    }
_ZNK4args8FlagBase6IsFlagEv:
 1357|  61.2k|            {
 1358|  61.2k|                return true;
 1359|  61.2k|            }
_ZN4args8FlagBase5MatchERKNS_10EitherFlagE:
 1362|  34.1k|            {
 1363|  34.1k|                if (matcher.Match(flag))
  ------------------
  |  Branch (1363:21): [True: 4.68k, False: 29.4k]
  ------------------
 1364|  4.68k|                {
 1365|  4.68k|                    if ((GetOptions() & Options::Single) != Options::None && matched)
  ------------------
  |  Branch (1365:25): [True: 0, False: 4.68k]
  |  Branch (1365:78): [True: 0, False: 0]
  ------------------
 1366|      0|                    {
 1367|      0|                        std::ostringstream problem;
 1368|      0|                        problem << "Flag '" << flag.str() << "' was passed multiple times, but is only allowed to be passed once";
 1369|       |#ifdef ARGS_NOEXCEPT
 1370|       |                        error = Error::Extra;
 1371|       |                        errorMsg = problem.str();
 1372|       |#else
 1373|      0|                        throw ExtraError(problem.str());
 1374|      0|#endif
 1375|      0|                    }
 1376|  4.68k|                    matched = true;
 1377|  4.68k|                    return this;
 1378|  4.68k|                }
 1379|  29.4k|                return nullptr;
 1380|  34.1k|            }
_ZNK4args7Matcher5MatchERKNS_10EitherFlagE:
  704|  34.1k|            {
  705|  34.1k|                return flag.isShort ? Match(flag.shortFlag) : Match(flag.longFlag);
  ------------------
  |  Branch (705:24): [True: 30.6k, False: 3.48k]
  ------------------
  706|  34.1k|            }
_ZNK4args7Matcher5MatchEc:
  690|  30.6k|            {
  691|  30.6k|                return shortFlags.find(flag) != shortFlags.end();
  692|  30.6k|            }
_ZNK4args7Matcher5MatchERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  697|  3.48k|            {
  698|  3.48k|                return longFlags.find(flag) != longFlags.end();
  699|  3.48k|            }
_ZNK4args10EitherFlag3strEv:
  608|   396k|        {
  609|   396k|            return isShort ? std::string(1, shortFlag) : longFlag;
  ------------------
  |  Branch (609:20): [True: 198k, False: 198k]
  ------------------
  610|   396k|        }
_ZNK4args8FlagBase7HasFlagEv:
 1427|  47.6k|            {
 1428|  47.6k|                return true;
 1429|  47.6k|            }
_ZNK4args8FlagBase14GetProgramLineERKNS_10HelpParamsE:
 1408|   224k|            {
 1409|   224k|                if (!params.proglineShowFlags)
  ------------------
  |  Branch (1409:21): [True: 148k, False: 76.6k]
  ------------------
 1410|   148k|                {
 1411|   148k|                    return {};
 1412|   148k|                }
 1413|       |
 1414|  76.6k|                const std::string postfix = NumberOfArguments() == 0 ? std::string() : Name();
  ------------------
  |  Branch (1414:45): [True: 30.1k, False: 46.4k]
  ------------------
 1415|  76.6k|                const EitherFlag flag = params.proglinePreferShortFlags ? matcher.GetShortOrAny() : matcher.GetLongOrAny();
  ------------------
  |  Branch (1415:41): [True: 47.6k, False: 28.9k]
  ------------------
 1416|  76.6k|                std::string res = flag.str(params.shortPrefix, params.longPrefix);
 1417|  76.6k|                if (!postfix.empty())
  ------------------
  |  Branch (1417:21): [True: 46.4k, False: 30.1k]
  ------------------
 1418|  46.4k|                {
 1419|  46.4k|                    res += params.proglineValueOpen + postfix + params.proglineValueClose;
 1420|  46.4k|                }
 1421|       |
 1422|  76.6k|                return { IsRequired() ? params.proglineRequiredOpen + res + params.proglineRequiredClose
  ------------------
  |  Branch (1422:26): [True: 0, False: 76.6k]
  ------------------
 1423|  76.6k|                                      : params.proglineNonrequiredOpen + res + params.proglineNonrequiredClose };
 1424|   224k|            }
_ZN4argseqERKNS_5NargsES2_:
  997|   152k|        {
  998|   152k|            return lhs.min == rhs.min && lhs.max == rhs.max;
  ------------------
  |  Branch (998:20): [True: 58.9k, False: 93.6k]
  |  Branch (998:42): [True: 58.9k, False: 0]
  ------------------
  999|   152k|        }
_ZN4args5NargsC2Em:
  992|   309k|        Nargs(size_t num_) : min{num_}, max{num_}
  993|   309k|        {
  994|   309k|        }
_ZNK4args7Matcher13GetShortOrAnyEv:
  746|  47.6k|            {
  747|  47.6k|                if (!shortFlags.empty())
  ------------------
  |  Branch (747:21): [True: 41.8k, False: 5.77k]
  ------------------
  748|  41.8k|                {
  749|  41.8k|                    return *shortFlags.begin();
  750|  41.8k|                }
  751|       |
  752|  5.77k|                if (!longFlags.empty())
  ------------------
  |  Branch (752:21): [True: 5.77k, False: 0]
  ------------------
  753|  5.77k|                {
  754|  5.77k|                    return *longFlags.begin();
  755|  5.77k|                }
  756|       |
  757|       |                // should be unreachable
  758|      0|                return ' ';
  759|  5.77k|            }
_ZNK4args9NamedBase16GetDefaultStringERKNS_10HelpParamsE:
 1164|   198k|            virtual std::string GetDefaultString(const HelpParams&) const { return {}; }
_ZNK4args9NamedBase17GetChoicesStringsERKNS_10HelpParamsE:
 1166|   252k|            virtual std::vector<std::string> GetChoicesStrings(const HelpParams&) const { return {}; }
_ZNK4args8FlagBase13GetNameStringERKNS_10HelpParamsE:
 1323|   225k|            {
 1324|   225k|                const std::string postfix = !params.showValueName || NumberOfArguments() == 0 ? std::string() : Name();
  ------------------
  |  Branch (1324:45): [True: 149k, False: 75.9k]
  |  Branch (1324:70): [True: 28.7k, False: 47.1k]
  ------------------
 1325|   225k|                std::string flags;
 1326|   225k|                const auto flagStrings = matcher.GetFlagStrings();
 1327|   225k|                const bool useValueNameOnce = flagStrings.size() == 1 ? false : params.useValueNameOnce;
  ------------------
  |  Branch (1327:47): [True: 54.4k, False: 170k]
  ------------------
 1328|   621k|                for (auto it = flagStrings.begin(); it != flagStrings.end(); ++it)
  ------------------
  |  Branch (1328:53): [True: 396k, False: 225k]
  ------------------
 1329|   396k|                {
 1330|   396k|                    auto &flag = *it;
 1331|   396k|                    if (it != flagStrings.begin())
  ------------------
  |  Branch (1331:25): [True: 170k, False: 225k]
  ------------------
 1332|   170k|                    {
 1333|   170k|                        flags += ", ";
 1334|   170k|                    }
 1335|       |
 1336|   396k|                    flags += flag.isShort ? params.shortPrefix : params.longPrefix;
  ------------------
  |  Branch (1336:30): [True: 198k, False: 198k]
  ------------------
 1337|   396k|                    flags += flag.str();
 1338|       |
 1339|   396k|                    if (!postfix.empty() && (!useValueNameOnce || it + 1 == flagStrings.end()))
  ------------------
  |  Branch (1339:25): [True: 84.8k, False: 311k]
  |  Branch (1339:25): [True: 62.8k, False: 333k]
  |  Branch (1339:46): [True: 40.8k, False: 43.9k]
  |  Branch (1339:67): [True: 21.9k, False: 21.9k]
  ------------------
 1340|  62.8k|                    {
 1341|  62.8k|                        flags += flag.isShort ? params.shortSeparator : params.longSeparator;
  ------------------
  |  Branch (1341:34): [True: 15.7k, False: 47.1k]
  ------------------
 1342|  62.8k|                        flags += params.valueOpen + postfix + params.valueClose;
 1343|  62.8k|                    }
 1344|   396k|                }
 1345|       |
 1346|   225k|                return flags;
 1347|   225k|            }
_ZNK4args9NamedBase4NameEv:
 1234|   129k|            {
 1235|   129k|                return name;
 1236|   129k|            }
_ZNK4args4Flag17NumberOfArgumentsEv:
 3800|  62.3k|            {
 3801|  62.3k|                return 0;
 3802|  62.3k|            }
_ZN4args8HelpFlag10ParseValueERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE:
 3821|    129|            {
 3822|       |#ifdef ARGS_NOEXCEPT
 3823|       |                    error = Error::Help;
 3824|       |                    errorMsg = Name();
 3825|       |#else
 3826|    129|                    throw Help(Name());
 3827|    129|#endif
 3828|    129|            }
_ZN4args4HelpC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  543|    129|            Help(const std::string &flag) : Error(flag) {}
_ZN4args7MatcherD2Ev:
  685|   122k|            ~Matcher() {}
_ZN4args11CounterFlagC2ERNS_5GroupERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_ONS_7MatcherEiNS_7OptionsE:
 3848|  6.80k|                Flag(group_, name_, help_, std::move(matcher_), options_), startcount(startcount_), count(startcount_) {}
_ZN4args11CounterFlag5MatchERKNS_10EitherFlagE:
 3853|  4.90k|            {
 3854|  4.90k|                auto me = FlagBase::Match(arg);
 3855|  4.90k|                if (me)
  ------------------
  |  Branch (3855:21): [True: 1.25k, False: 3.64k]
  ------------------
 3856|  1.25k|                {
 3857|       |#ifdef ARGS_NOEXCEPT
 3858|       |                    // Suppress increment when FlagBase::Match recorded an
 3859|       |                    // error on this same call (e.g. Options::Single violated).
 3860|       |                    // In non-noexcept mode that path would have thrown before
 3861|       |                    // reaching here and the count would not have advanced.
 3862|       |                    if (GetError() != Error::None)
 3863|       |                    {
 3864|       |                        return me;
 3865|       |                    }
 3866|       |#endif
 3867|  1.25k|                    ++count;
 3868|  1.25k|                }
 3869|  4.90k|                return me;
 3870|  4.90k|            }
_ZN4args11CounterFlag5ResetEv:
 3888|  6.80k|            {
 3889|  6.80k|                FlagBase::Reset();
 3890|  6.80k|                count = startcount;
 3891|  6.80k|            }
_ZN4args5Group10Validators9AtMostOneERKS0_:
 1678|    426|                {
 1679|    426|                    return group.MatchedChildren() <= 1;
 1680|    426|                }
_ZNK4args5Group15MatchedChildrenEv:
 1844|  3.00k|            {
 1845|       |                // Cast to avoid warnings from -Wsign-conversion
 1846|  3.00k|                return static_cast<std::vector<Base *>::size_type>(
 1847|  3.00k|                        std::count_if(std::begin(Children()), std::end(Children()), [](const Base *child){return child->Matched();}));
 1848|  3.00k|            }
_ZZNK4args5Group15MatchedChildrenEvENKUlPKNS_4BaseEE_clES3_:
 1847|  6.01k|                        std::count_if(std::begin(Children()), std::end(Children()), [](const Base *child){return child->Matched();}));
_ZN4args5Group10Validators10AtLeastOneERKS0_:
 1673|  1.05k|                {
 1674|  1.05k|                    return group.MatchedChildren() >= 1;
 1675|  1.05k|                }
_ZN4args5Group10Validators3XorERKS0_:
 1668|    527|                {
 1669|    527|                    return group.MatchedChildren() == 1;
 1670|    527|                }
_ZN4args5Group10Validators9AllOrNoneERKS0_:
 1688|    497|                {
 1689|    497|                    return (All(group) || None(group));
  ------------------
  |  Branch (1689:29): [True: 1, False: 496]
  |  Branch (1689:43): [True: 481, False: 15]
  ------------------
 1690|    497|                }
_ZN4args5Group10Validators3AllERKS0_:
 1683|    497|                {
 1684|    497|                    return group.Children().size() == group.MatchedChildren();
 1685|    497|                }
_ZN4args5Group10Validators4NoneERKS0_:
 1710|    496|                {
 1711|    496|                    return group.MatchedChildren() == 0;
 1712|    496|                }
_ZN4args5GroupC2ERS0_RKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_8functionIFbRKS0_EEENS_7OptionsE:
 1720|  6.80k|            Group(Group &group_, const std::string &help_ = std::string(), const std::function<bool(const Group &)> &validator_ = Validators::DontCare, Options options_ = {}) : Base(help_, options_), validator(validator_)
 1721|  6.80k|            {
 1722|  6.80k|                group_.Add(*this);
 1723|  6.80k|                parent = &group_;
 1724|  6.80k|            }
_ZN4args4FlagC2ERNS_5GroupERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_ONS_7MatcherEb:
 3786|  6.80k|            Flag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const bool extraError_ = false): Flag(group_, name_, help_, std::move(matcher_), extraError_ ? Options::Single : Options::None)
  ------------------
  |  Branch (3786:186): [True: 0, False: 6.80k]
  ------------------
 3787|  6.80k|            {
 3788|  6.80k|            }
_ZNK4args14ArgumentParser4HelpEv:
 3657|  13.6k|            {
 3658|  13.6k|                std::ostringstream help_;
 3659|  13.6k|                Help(help_);
 3660|  13.6k|                return help_.str();
 3661|  13.6k|            }
_ZNK4args14ArgumentParser4HelpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE:
 3539|  20.4k|            {
 3540|  20.4k|                auto &command = SelectedCommand();
 3541|  20.4k|                const auto &commandDescription = command.Description().empty() ? command.Help() : command.Description();
  ------------------
  |  Branch (3541:50): [True: 18.6k, False: 1.72k]
  ------------------
 3542|  20.4k|                const auto desc_indent = helpParams.descriptionindent;
 3543|  20.4k|                const auto effective_desc_width = (helpParams.width > desc_indent) ? helpParams.width - desc_indent : 0;
  ------------------
  |  Branch (3543:51): [True: 14.6k, False: 5.74k]
  ------------------
 3544|  20.4k|                const auto description_text = Wrap(commandDescription, effective_desc_width);
 3545|  20.4k|                const auto epilog_text = Wrap(command.Epilog(), effective_desc_width);
 3546|       |
 3547|  20.4k|                const bool hasoptions = command.HasFlag();
 3548|  20.4k|                const bool hasarguments = command.HasPositional();
 3549|       |
 3550|  20.4k|                std::vector<std::string> prognameline;
 3551|  20.4k|                prognameline.push_back(helpParams.usageString);
 3552|  20.4k|                prognameline.push_back(Prog());
 3553|  20.4k|                auto commandProgLine = command.GetProgramLine(helpParams);
 3554|  20.4k|                prognameline.insert(prognameline.end(), commandProgLine.begin(), commandProgLine.end());
 3555|       |
 3556|  20.4k|                const auto prog_sum = helpParams.progindent + helpParams.progtailindent;
 3557|  20.4k|                const auto effective_prog_width = (helpParams.width > prog_sum) ? helpParams.width - prog_sum : 0;
  ------------------
  |  Branch (3557:51): [True: 14.4k, False: 6.00k]
  ------------------
 3558|  20.4k|                const auto effective_prog_first = (helpParams.width > helpParams.progindent) ? helpParams.width - helpParams.progindent : 0;
  ------------------
  |  Branch (3558:51): [True: 14.7k, False: 5.70k]
  ------------------
 3559|  20.4k|                const auto proglines = Wrap(prognameline.begin(), prognameline.end(),
 3560|  20.4k|                                            effective_prog_width,
 3561|  20.4k|                                            effective_prog_first);
 3562|  20.4k|                auto progit = std::begin(proglines);
 3563|  20.4k|                if (progit != std::end(proglines))
  ------------------
  |  Branch (3563:21): [True: 20.4k, False: 0]
  ------------------
 3564|  20.4k|                {
 3565|  20.4k|                    help_ << std::string(helpParams.progindent, ' ') << *progit << '\n';
 3566|  20.4k|                    ++progit;
 3567|  20.4k|                }
 3568|  41.5k|                for (; progit != std::end(proglines); ++progit)
  ------------------
  |  Branch (3568:24): [True: 21.1k, False: 20.4k]
  ------------------
 3569|  21.1k|                {
 3570|  21.1k|                    help_ << std::string(helpParams.progtailindent, ' ') << *progit << '\n';
 3571|  21.1k|                }
 3572|       |
 3573|  20.4k|                help_ << '\n';
 3574|       |
 3575|  20.4k|                if (!description_text.empty())
  ------------------
  |  Branch (3575:21): [True: 1.34k, False: 19.0k]
  ------------------
 3576|  1.34k|                {
 3577|  1.34k|                    for (const auto &line: description_text)
  ------------------
  |  Branch (3577:42): [True: 5.09k, False: 1.34k]
  ------------------
 3578|  5.09k|                    {
 3579|  5.09k|                        help_ << std::string(helpParams.descriptionindent, ' ') << line << "\n";
 3580|  5.09k|                    }
 3581|  1.34k|                    help_ << "\n";
 3582|  1.34k|                }
 3583|       |
 3584|  20.4k|                bool lastDescriptionIsNewline = false;
 3585|       |
 3586|  20.4k|                if (!helpParams.optionsString.empty())
  ------------------
  |  Branch (3586:21): [True: 1.27k, False: 19.1k]
  ------------------
 3587|  1.27k|                {
 3588|  1.27k|                    help_ << std::string(helpParams.progindent, ' ') << helpParams.optionsString << "\n\n";
 3589|  1.27k|                }
 3590|       |
 3591|  20.4k|                for (const auto &desc: command.GetDescription(helpParams, 0))
  ------------------
  |  Branch (3591:38): [True: 210k, False: 20.4k]
  ------------------
 3592|   210k|                {
 3593|   210k|                    lastDescriptionIsNewline = std::get<0>(desc).empty() && std::get<1>(desc).empty();
  ------------------
  |  Branch (3593:48): [True: 0, False: 210k]
  |  Branch (3593:77): [True: 0, False: 0]
  ------------------
 3594|   210k|                    const auto groupindent = std::get<2>(desc) * helpParams.eachgroupindent;
 3595|   210k|                    const auto flag_sum = helpParams.flagindent + helpParams.helpindent + helpParams.gutter;
 3596|   210k|                    const auto effective_flag_width = (helpParams.width > flag_sum) ? helpParams.width - flag_sum : 0;
  ------------------
  |  Branch (3596:55): [True: 129k, False: 81.2k]
  ------------------
 3597|   210k|                    const auto flags = Wrap(std::get<0>(desc), effective_flag_width);
 3598|   210k|                    const auto info_sum = helpParams.helpindent + groupindent;
 3599|   210k|                    const auto effective_info_width = (helpParams.width > info_sum) ? helpParams.width - info_sum : 0;
  ------------------
  |  Branch (3599:55): [True: 134k, False: 75.8k]
  ------------------
 3600|   210k|                    const auto info = Wrap(std::get<1>(desc), effective_info_width);
 3601|       |
 3602|   210k|                    std::string::size_type flagssize = 0;
 3603|   501k|                    for (auto flagsit = std::begin(flags); flagsit != std::end(flags); ++flagsit)
  ------------------
  |  Branch (3603:60): [True: 291k, False: 210k]
  ------------------
 3604|   291k|                    {
 3605|   291k|                        if (flagsit != std::begin(flags))
  ------------------
  |  Branch (3605:29): [True: 80.3k, False: 210k]
  ------------------
 3606|  80.3k|                        {
 3607|  80.3k|                            help_ << '\n';
 3608|  80.3k|                        }
 3609|   291k|                        help_ << std::string(groupindent + helpParams.flagindent, ' ') << *flagsit;
 3610|   291k|                        flagssize = Glyphs(*flagsit);
 3611|   291k|                    }
 3612|       |
 3613|   210k|                    auto infoit = std::begin(info);
 3614|       |                    // groupindent is on both sides of this inequality, and therefore can be removed
 3615|   210k|                    if ((helpParams.flagindent + flagssize + helpParams.gutter) > helpParams.helpindent || infoit == std::end(info) || helpParams.addNewlineBeforeDescription)
  ------------------
  |  Branch (3615:25): [True: 107k, False: 103k]
  |  Branch (3615:25): [True: 199k, False: 11.3k]
  |  Branch (3615:108): [True: 77.1k, False: 26.2k]
  |  Branch (3615:136): [True: 14.8k, False: 11.3k]
  ------------------
 3616|   199k|                    {
 3617|   199k|                        help_ << '\n';
 3618|   199k|                    } else
 3619|  11.3k|                    {
 3620|       |                        // groupindent is on both sides of the minus sign, and therefore doesn't actually need to be in here
 3621|  11.3k|                        const auto indent_sum = helpParams.flagindent + flagssize;
 3622|  11.3k|                        const auto effective_space = (helpParams.helpindent > indent_sum) ? helpParams.helpindent - indent_sum : 0;
  ------------------
  |  Branch (3622:54): [True: 11.3k, False: 66]
  ------------------
 3623|  11.3k|                        help_ << std::string(effective_space, ' ') << *infoit << '\n';
 3624|  11.3k|                        ++infoit;
 3625|  11.3k|                    }
 3626|   293k|                    for (; infoit != std::end(info); ++infoit)
  ------------------
  |  Branch (3626:28): [True: 82.8k, False: 210k]
  ------------------
 3627|  82.8k|                    {
 3628|  82.8k|                        help_ << std::string(groupindent + helpParams.helpindent, ' ') << *infoit << '\n';
 3629|  82.8k|                    }
 3630|   210k|                }
 3631|  20.4k|                if (hasoptions && hasarguments && helpParams.showTerminator)
  ------------------
  |  Branch (3631:21): [True: 20.4k, False: 0]
  |  Branch (3631:35): [True: 20.4k, False: 0]
  |  Branch (3631:51): [True: 6.84k, False: 13.5k]
  ------------------
 3632|  6.84k|                {
 3633|  6.84k|                    lastDescriptionIsNewline = false;
 3634|  6.84k|                    const auto effective_term_width = (helpParams.width > helpParams.flagindent) ? helpParams.width - helpParams.flagindent : 0;
  ------------------
  |  Branch (3634:55): [True: 5.92k, False: 921]
  ------------------
 3635|  6.84k|                    for (const auto &item: Wrap(std::string("\"") + terminator + "\" can be used to terminate flag options and force all following arguments to be treated as positional options", effective_term_width))
  ------------------
  |  Branch (3635:42): [True: 30.3k, False: 6.84k]
  ------------------
 3636|  30.3k|                    {
 3637|  30.3k|                        help_ << std::string(helpParams.flagindent, ' ') << item << '\n';
 3638|  30.3k|                    }
 3639|  6.84k|                }
 3640|       |
 3641|  20.4k|                if (!lastDescriptionIsNewline)
  ------------------
  |  Branch (3641:21): [True: 20.4k, False: 0]
  ------------------
 3642|  20.4k|                {
 3643|  20.4k|                    help_ << "\n";
 3644|  20.4k|                }
 3645|       |
 3646|  20.4k|                for (const auto &line: epilog_text)
  ------------------
  |  Branch (3646:38): [True: 1.79k, False: 20.4k]
  ------------------
 3647|  1.79k|                {
 3648|  1.79k|                    help_ << std::string(helpParams.descriptionindent, ' ') << line << "\n";
 3649|  1.79k|                }
 3650|  20.4k|            }
_ZNK4args7Command15SelectedCommandEv:
 2250|  20.4k|            {
 2251|  20.4k|                const Command *res = this;
 2252|  20.4k|                while (res->selectedCommand != nullptr)
  ------------------
  |  Branch (2252:24): [True: 0, False: 20.4k]
  ------------------
 2253|      0|                {
 2254|      0|                    res = res->selectedCommand;
 2255|      0|                }
 2256|       |
 2257|  20.4k|                return *res;
 2258|  20.4k|            }
_ZNK4args7Command11DescriptionEv:
 2299|  22.1k|            { return description; }
_ZNK4args7Command4HelpEv:
 2324|  18.6k|            { return help; }
_ZN4args4WrapERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEmm:
  429|   574k|    {
  430|       |        // Preserve existing line breaks
  431|   574k|        const auto newlineloc = in.find('\n');
  432|   574k|        if (newlineloc != in.npos)
  ------------------
  |  Branch (432:13): [True: 52.5k, False: 521k]
  ------------------
  433|  52.5k|        {
  434|  52.5k|            auto first = Wrap(std::string(in, 0, newlineloc), width);
  435|  52.5k|            auto second = Wrap(std::string(in, newlineloc + 1), width);
  436|  52.5k|            first.insert(
  437|  52.5k|                std::end(first),
  438|  52.5k|                std::make_move_iterator(std::begin(second)),
  439|  52.5k|                std::make_move_iterator(std::end(second)));
  440|  52.5k|            return first;
  441|  52.5k|        }
  442|       |
  443|   521k|        std::istringstream stream(in);
  444|   521k|        std::string::size_type indent = 0;
  445|       |
  446|   521k|        for (auto c : in)
  ------------------
  |  Branch (446:21): [True: 304k, False: 224k]
  ------------------
  447|   304k|        {
  448|   304k|            if (!std::isspace(static_cast<unsigned char>(c)))
  ------------------
  |  Branch (448:17): [True: 297k, False: 7.01k]
  ------------------
  449|   297k|            {
  450|   297k|                break;
  451|   297k|            }
  452|  7.01k|            ++indent;
  453|  7.01k|        }
  454|       |
  455|   521k|        return Wrap(std::istream_iterator<std::string>(stream), std::istream_iterator<std::string>(),
  456|   521k|                    width, firstlinewidth, indent);
  457|   574k|    }
_ZN4args4WrapINSt3__116istream_iteratorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEcS5_lEEEENS1_6vectorIS8_NS6_IS8_EEEET_SD_mmm:
  282|   521k|    {
  283|   521k|        std::vector<std::string> output;
  284|   521k|        std::string line(firstlineindent, ' ');
  285|   521k|        bool empty = true;
  286|       |
  287|   521k|        if (firstlinewidth == 0)
  ------------------
  |  Branch (287:13): [True: 521k, False: 0]
  ------------------
  288|   521k|        {
  289|   521k|            firstlinewidth = width;
  290|   521k|        }
  291|       |
  292|   521k|        auto currentwidth = firstlinewidth;
  293|       |
  294|  1.18M|        for (auto it = begin; it != end; ++it)
  ------------------
  |  Branch (294:31): [True: 658k, False: 521k]
  ------------------
  295|   658k|        {
  296|   658k|            if (it->empty())
  ------------------
  |  Branch (296:17): [True: 0, False: 658k]
  ------------------
  297|      0|            {
  298|      0|                continue;
  299|      0|            }
  300|       |
  301|   658k|            if (*it == "\n")
  ------------------
  |  Branch (301:17): [True: 0, False: 658k]
  ------------------
  302|      0|            {
  303|      0|                if (!empty)
  ------------------
  |  Branch (303:21): [True: 0, False: 0]
  ------------------
  304|      0|                {
  305|      0|                    output.push_back(line);
  306|      0|                    line.clear();
  307|      0|                    empty = true;
  308|      0|                    currentwidth = width;
  309|      0|                }
  310|       |
  311|      0|                continue;
  312|      0|            }
  313|       |
  314|   658k|            auto itemsize = Glyphs(*it);
  315|       |            
  316|       |            // Refactored to prevent integer overflow
  317|   658k|            bool needsWrap = false;
  318|   658k|            if (itemsize >= currentwidth)
  ------------------
  |  Branch (318:17): [True: 238k, False: 419k]
  ------------------
  319|   238k|            {
  320|   238k|                needsWrap = true;
  321|   238k|            }
  322|   419k|            else
  323|   419k|            {
  324|   419k|                size_t remainingWidth = (currentwidth > itemsize) ? (currentwidth - itemsize) : 0;
  ------------------
  |  Branch (324:41): [True: 419k, False: 0]
  ------------------
  325|   419k|                size_t nextLength = 0;
  326|   419k|                if (!SafeAdd<std::string::size_type>(line.length(), static_cast<std::string::size_type>(1), nextLength) || nextLength > remainingWidth)
  ------------------
  |  Branch (326:21): [True: 0, False: 419k]
  |  Branch (326:124): [True: 10.1k, False: 409k]
  ------------------
  327|  10.1k|                {
  328|  10.1k|                    needsWrap = true;
  329|  10.1k|                }
  330|   419k|            }
  331|       |            
  332|   658k|            if (needsWrap)
  ------------------
  |  Branch (332:17): [True: 248k, False: 409k]
  ------------------
  333|   248k|            {
  334|   248k|                if (!empty)
  ------------------
  |  Branch (334:21): [True: 126k, False: 121k]
  ------------------
  335|   126k|                {
  336|   126k|                    output.push_back(line);
  337|   126k|                    line.clear();
  338|   126k|                    empty = true;
  339|   126k|                    currentwidth = width;
  340|   126k|                }
  341|   248k|            }
  342|       |
  343|   658k|            if (itemsize > 0)
  ------------------
  |  Branch (343:17): [True: 656k, False: 1.79k]
  ------------------
  344|   656k|            {
  345|   656k|                if (!empty)
  ------------------
  |  Branch (345:21): [True: 234k, False: 422k]
  ------------------
  346|   234k|                {
  347|   234k|                    line += ' ';
  348|   234k|                }
  349|       |
  350|   656k|                line += *it;
  351|   656k|                empty = false;
  352|   656k|            }
  353|   658k|        }
  354|       |
  355|   521k|        if (!empty)
  ------------------
  |  Branch (355:13): [True: 295k, False: 225k]
  ------------------
  356|   295k|        {
  357|   295k|            output.push_back(line);
  358|   295k|        }
  359|       |
  360|   521k|        return output;
  361|   521k|    }
_ZNK4args7Command6EpilogEv:
 2309|  20.4k|            { return epilog; }
_ZNK4args14ArgumentParser4ProgEv:
 3435|  20.4k|            { return helpParams.programName; }
_ZN4args4WrapINSt3__111__wrap_iterIPNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEEENS1_6vectorIS8_NS6_IS8_EEEET_SE_mmm:
  282|  20.4k|    {
  283|  20.4k|        std::vector<std::string> output;
  284|  20.4k|        std::string line(firstlineindent, ' ');
  285|  20.4k|        bool empty = true;
  286|       |
  287|  20.4k|        if (firstlinewidth == 0)
  ------------------
  |  Branch (287:13): [True: 5.70k, False: 14.7k]
  ------------------
  288|  5.70k|        {
  289|  5.70k|            firstlinewidth = width;
  290|  5.70k|        }
  291|       |
  292|  20.4k|        auto currentwidth = firstlinewidth;
  293|       |
  294|   162k|        for (auto it = begin; it != end; ++it)
  ------------------
  |  Branch (294:31): [True: 141k, False: 20.4k]
  ------------------
  295|   141k|        {
  296|   141k|            if (it->empty())
  ------------------
  |  Branch (296:17): [True: 40.6k, False: 100k]
  ------------------
  297|  40.6k|            {
  298|  40.6k|                continue;
  299|  40.6k|            }
  300|       |
  301|   100k|            if (*it == "\n")
  ------------------
  |  Branch (301:17): [True: 141, False: 100k]
  ------------------
  302|    141|            {
  303|    141|                if (!empty)
  ------------------
  |  Branch (303:21): [True: 6, False: 135]
  ------------------
  304|      6|                {
  305|      6|                    output.push_back(line);
  306|      6|                    line.clear();
  307|      6|                    empty = true;
  308|      6|                    currentwidth = width;
  309|      6|                }
  310|       |
  311|    141|                continue;
  312|    141|            }
  313|       |
  314|   100k|            auto itemsize = Glyphs(*it);
  315|       |            
  316|       |            // Refactored to prevent integer overflow
  317|   100k|            bool needsWrap = false;
  318|   100k|            if (itemsize >= currentwidth)
  ------------------
  |  Branch (318:17): [True: 23.5k, False: 77.2k]
  ------------------
  319|  23.5k|            {
  320|  23.5k|                needsWrap = true;
  321|  23.5k|            }
  322|  77.2k|            else
  323|  77.2k|            {
  324|  77.2k|                size_t remainingWidth = (currentwidth > itemsize) ? (currentwidth - itemsize) : 0;
  ------------------
  |  Branch (324:41): [True: 77.2k, False: 0]
  ------------------
  325|  77.2k|                size_t nextLength = 0;
  326|  77.2k|                if (!SafeAdd<std::string::size_type>(line.length(), static_cast<std::string::size_type>(1), nextLength) || nextLength > remainingWidth)
  ------------------
  |  Branch (326:21): [True: 0, False: 77.2k]
  |  Branch (326:124): [True: 3.89k, False: 73.3k]
  ------------------
  327|  3.89k|                {
  328|  3.89k|                    needsWrap = true;
  329|  3.89k|                }
  330|  77.2k|            }
  331|       |            
  332|   100k|            if (needsWrap)
  ------------------
  |  Branch (332:17): [True: 27.4k, False: 73.3k]
  ------------------
  333|  27.4k|            {
  334|  27.4k|                if (!empty)
  ------------------
  |  Branch (334:21): [True: 21.1k, False: 6.26k]
  ------------------
  335|  21.1k|                {
  336|  21.1k|                    output.push_back(line);
  337|  21.1k|                    line.clear();
  338|  21.1k|                    empty = true;
  339|  21.1k|                    currentwidth = width;
  340|  21.1k|                }
  341|  27.4k|            }
  342|       |
  343|   100k|            if (itemsize > 0)
  ------------------
  |  Branch (343:17): [True: 100k, False: 207]
  ------------------
  344|   100k|            {
  345|   100k|                if (!empty)
  ------------------
  |  Branch (345:21): [True: 59.0k, False: 41.5k]
  ------------------
  346|  59.0k|                {
  347|  59.0k|                    line += ' ';
  348|  59.0k|                }
  349|       |
  350|   100k|                line += *it;
  351|   100k|                empty = false;
  352|   100k|            }
  353|   100k|        }
  354|       |
  355|  20.4k|        if (!empty)
  ------------------
  |  Branch (355:13): [True: 20.4k, False: 0]
  ------------------
  356|  20.4k|        {
  357|  20.4k|            output.push_back(line);
  358|  20.4k|        }
  359|       |
  360|  20.4k|        return output;
  361|  20.4k|    }
_ZN4args6GlyphsERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
   92|  1.05M|    {
   93|  1.05M|        std::string::size_type length = 0;
   94|  1.05M|        for (const char c: string_)
  ------------------
  |  Branch (94:26): [True: 7.04M, False: 1.05M]
  ------------------
   95|  7.04M|        {
   96|  7.04M|            if ((c & 0xc0) != 0x80)
  ------------------
  |  Branch (96:17): [True: 6.97M, False: 68.0k]
  ------------------
   97|  6.97M|            {
   98|  6.97M|                ++length;
   99|  6.97M|            }
  100|  7.04M|        }
  101|  1.05M|        return length;
  102|  1.05M|    }
_ZN4argslsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_14ArgumentParserE:
 3771|  6.80k|    {
 3772|  6.80k|        parser.Help(os);
 3773|  6.80k|        return os;
 3774|  6.80k|    }
_ZNK4args7Command14GetDescriptionERKNS_10HelpParamsEj:
 2550|  27.2k|            {
 2551|  27.2k|                std::vector<std::tuple<std::string, std::string, unsigned>> descriptions;
 2552|  27.2k|                unsigned addindent = 0;
 2553|       |
 2554|  27.2k|                UpdateSubparserHelp(params);
 2555|       |
 2556|  27.2k|                if (!Matched())
  ------------------
  |  Branch (2556:21): [True: 0, False: 27.2k]
  ------------------
 2557|      0|                {
 2558|      0|                    if (params.showCommandFullHelp)
  ------------------
  |  Branch (2558:25): [True: 0, False: 0]
  ------------------
 2559|      0|                    {
 2560|      0|                        std::ostringstream s;
 2561|      0|                        bool empty = true;
 2562|      0|                        for (const auto &progline: GetCommandProgramLine(params))
  ------------------
  |  Branch (2562:50): [True: 0, False: 0]
  ------------------
 2563|      0|                        {
 2564|      0|                            if (!empty)
  ------------------
  |  Branch (2564:33): [True: 0, False: 0]
  ------------------
 2565|      0|                            {
 2566|      0|                                s << ' ';
 2567|      0|                            }
 2568|      0|                            else
 2569|      0|                            {
 2570|      0|                                empty = false;
 2571|      0|                            }
 2572|       |
 2573|      0|                            s << progline;
 2574|      0|                        }
 2575|       |
 2576|      0|                        descriptions.emplace_back(s.str(), "", indent);
 2577|      0|                    }
 2578|      0|                    else
 2579|      0|                    {
 2580|      0|                        descriptions.emplace_back(Name(), help, indent);
 2581|      0|                    }
 2582|       |
 2583|      0|                    if (!params.showCommandChildren && !params.showCommandFullHelp)
  ------------------
  |  Branch (2583:25): [True: 0, False: 0]
  |  Branch (2583:56): [True: 0, False: 0]
  ------------------
 2584|      0|                    {
 2585|      0|                        return descriptions;
 2586|      0|                    }
 2587|       |
 2588|      0|                    addindent = 1;
 2589|      0|                }
 2590|       |
 2591|  27.2k|                if (params.showCommandFullHelp && !Matched())
  ------------------
  |  Branch (2591:21): [True: 9.37k, False: 17.8k]
  |  Branch (2591:51): [True: 0, False: 9.37k]
  ------------------
 2592|      0|                {
 2593|      0|                    descriptions.emplace_back("", "", indent + addindent);
 2594|      0|                    descriptions.emplace_back(Description().empty() ? Help() : Description(), "", indent + addindent);
  ------------------
  |  Branch (2594:47): [True: 0, False: 0]
  ------------------
 2595|      0|                    descriptions.emplace_back("", "", indent + addindent);
 2596|      0|                }
 2597|       |
 2598|  27.2k|                for (Base *child: Children())
  ------------------
  |  Branch (2598:33): [True: 272k, False: 27.2k]
  ------------------
 2599|   272k|                {
 2600|   272k|                    if ((child->GetOptions() & Options::HiddenFromDescription) != Options::None)
  ------------------
  |  Branch (2600:25): [True: 19.5k, False: 252k]
  ------------------
 2601|  19.5k|                    {
 2602|  19.5k|                        continue;
 2603|  19.5k|                    }
 2604|       |
 2605|   252k|                    auto groupDescriptions = child->GetDescription(params, indent + addindent);
 2606|   252k|                    descriptions.insert(
 2607|   252k|                                        std::end(descriptions),
 2608|   252k|                                        std::make_move_iterator(std::begin(groupDescriptions)),
 2609|   252k|                                        std::make_move_iterator(std::end(groupDescriptions)));
 2610|   252k|                }
 2611|       |
 2612|  27.2k|                for (auto childDescription: subparserDescription)
  ------------------
  |  Branch (2612:43): [True: 0, False: 27.2k]
  ------------------
 2613|      0|                {
 2614|      0|                    std::get<2>(childDescription) += indent + addindent;
 2615|      0|                    descriptions.push_back(std::move(childDescription));
 2616|      0|                }
 2617|       |
 2618|  27.2k|                if (params.showCommandFullHelp && !Matched())
  ------------------
  |  Branch (2618:21): [True: 9.37k, False: 17.8k]
  |  Branch (2618:51): [True: 0, False: 9.37k]
  ------------------
 2619|      0|                {
 2620|      0|                    descriptions.emplace_back("", "", indent + addindent);
 2621|      0|                    if (!Epilog().empty())
  ------------------
  |  Branch (2621:25): [True: 0, False: 0]
  ------------------
 2622|      0|                    {
 2623|      0|                        descriptions.emplace_back(Epilog(), "", indent + addindent);
 2624|      0|                        descriptions.emplace_back("", "", indent + addindent);
 2625|      0|                    }
 2626|      0|                }
 2627|       |
 2628|  27.2k|                return descriptions;
 2629|  27.2k|            }
_ZNK4args7Command19UpdateSubparserHelpERKNS_10HelpParamsE:
 2261|  54.4k|            {
 2262|  54.4k|                if (parserCoroutine)
  ------------------
  |  Branch (2262:21): [True: 0, False: 54.4k]
  ------------------
 2263|      0|                {
 2264|      0|                    RaiiSubparser coro(*this, params);
 2265|      0|#ifndef ARGS_NOEXCEPT
 2266|      0|                    try
 2267|      0|                    {
 2268|      0|                        parserCoroutine(coro.Parser());
 2269|      0|                    }
 2270|      0|                    catch (args::SubparserError&)
 2271|      0|                    {
 2272|      0|                    }
 2273|       |#else
 2274|       |                    parserCoroutine(coro.Parser());
 2275|       |#endif
 2276|      0|                }
 2277|  54.4k|            }
_ZNK4args7Command21GetCommandProgramLineERKNS_10HelpParamsE:
 2466|  27.2k|            {
 2467|  27.2k|                UpdateSubparserHelp(params);
 2468|       |
 2469|  27.2k|                std::vector<std::string> res;
 2470|       |
 2471|  27.2k|                if ((subparserHasFlag || Group::HasFlag()) && params.showProglineOptions && !params.proglineShowFlags)
  ------------------
  |  Branch (2471:22): [True: 0, False: 27.2k]
  |  Branch (2471:42): [True: 27.2k, False: 0]
  |  Branch (2471:63): [True: 8.85k, False: 18.3k]
  |  Branch (2471:93): [True: 3.38k, False: 5.47k]
  ------------------
 2472|  3.38k|                {
 2473|  3.38k|                    res.push_back(params.proglineOptions);
 2474|  3.38k|                }
 2475|       |
 2476|  27.2k|                auto group_res = Group::GetProgramLine(params);
 2477|  27.2k|                std::move(std::move(group_res).begin(), std::move(group_res).end(), std::back_inserter(res));
 2478|       |
 2479|  27.2k|                res.insert(res.end(), subparserProgramLine.begin(), subparserProgramLine.end());
 2480|       |
 2481|  27.2k|                if (!params.proglineCommand.empty() && (Group::HasCommand() || subparserHasCommand))
  ------------------
  |  Branch (2481:21): [True: 6.62k, False: 20.5k]
  |  Branch (2481:57): [True: 0, False: 6.62k]
  |  Branch (2481:80): [True: 0, False: 6.62k]
  ------------------
 2482|      0|                {
 2483|      0|                    res.insert(res.begin(), commandIsRequired ? params.proglineCommand : "[" + params.proglineCommand + "]");
  ------------------
  |  Branch (2483:45): [True: 0, False: 0]
  ------------------
 2484|      0|                }
 2485|       |
 2486|  27.2k|                if (!Name().empty())
  ------------------
  |  Branch (2486:21): [True: 0, False: 27.2k]
  ------------------
 2487|      0|                {
 2488|      0|                    res.insert(res.begin(), Name());
 2489|      0|                }
 2490|       |
 2491|  27.2k|                if (!ProglinePostfix().empty())
  ------------------
  |  Branch (2491:21): [True: 0, False: 27.2k]
  ------------------
 2492|      0|                {
 2493|      0|                    std::string line;
 2494|      0|                    for (auto c : ProglinePostfix())
  ------------------
  |  Branch (2494:33): [True: 0, False: 0]
  ------------------
 2495|      0|                    {
 2496|      0|                        if (std::isspace(static_cast<unsigned char>(c)))
  ------------------
  |  Branch (2496:29): [True: 0, False: 0]
  ------------------
 2497|      0|                        {
 2498|      0|                            if (!line.empty())
  ------------------
  |  Branch (2498:33): [True: 0, False: 0]
  ------------------
 2499|      0|                            {
 2500|      0|                                res.push_back(line);
 2501|      0|                                line.clear();
 2502|      0|                            }
 2503|       |
 2504|      0|                            if (c == '\n')
  ------------------
  |  Branch (2504:33): [True: 0, False: 0]
  ------------------
 2505|      0|                            {
 2506|      0|                                res.push_back("\n");
 2507|      0|                            }
 2508|      0|                        }
 2509|      0|                        else
 2510|      0|                        {
 2511|      0|                            line += c;
 2512|      0|                        }
 2513|      0|                    }
 2514|       |
 2515|      0|                    if (!line.empty())
  ------------------
  |  Branch (2515:25): [True: 0, False: 0]
  ------------------
 2516|      0|                    {
 2517|      0|                        res.push_back(line);
 2518|      0|                    }
 2519|      0|                }
 2520|       |
 2521|  27.2k|                return res;
 2522|  27.2k|            }
_ZNK4args7Command15ProglinePostfixEv:
 2289|  27.2k|            { return proglinePostfix; }
_ZNK4args7Command4NameEv:
 2319|  27.2k|            { return name; }
_ZNK4args7Command14GetProgramLineERKNS_10HelpParamsE:
 2525|  27.2k|            {
 2526|  27.2k|                if (!Matched())
  ------------------
  |  Branch (2526:21): [True: 0, False: 27.2k]
  ------------------
 2527|      0|                {
 2528|      0|                    return {};
 2529|      0|                }
 2530|       |
 2531|  27.2k|                return GetCommandProgramLine(params);
 2532|  27.2k|            }
_ZN4args14ArgumentParser9ParseArgsINSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEEEEDTclsr3stdE5beginfp_EERKT_:
 3698|  6.80k|            {
 3699|  6.80k|                return ParseArgs(std::begin(args), std::end(args));
 3700|  6.80k|            }
_ZN4args14ArgumentParser9ParseArgsINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEET_SD_SD_:
 3678|  6.80k|            {
 3679|       |                // Reset all Matched statuses and errors
 3680|  6.80k|                Reset();
 3681|       |#ifdef ARGS_NOEXCEPT
 3682|       |                error = GetError();
 3683|       |                if (error != Error::None)
 3684|       |                {
 3685|       |                    return end;
 3686|       |                }
 3687|       |#endif
 3688|  6.80k|                return Parse(begin, end);
 3689|  6.80k|            }
_ZN4args14ArgumentParser5ParseINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEET_SD_SD_:
 3198|  6.80k|            {
 3199|  6.80k|                bool terminated = false;
 3200|  6.80k|                std::vector<Command *> commands = GetCommands();
 3201|       |
 3202|       |                // Check all arg chunks
 3203|  16.5k|                for (auto it = begin; it != end; ++it)
  ------------------
  |  Branch (3203:39): [True: 9.78k, False: 6.80k]
  ------------------
 3204|  9.78k|                {
 3205|  9.78k|                    if (Complete(it, end, terminated))
  ------------------
  |  Branch (3205:25): [True: 0, False: 9.78k]
  ------------------
 3206|      0|                    {
 3207|      0|                        return end;
 3208|      0|                    }
 3209|       |
 3210|  9.78k|                    const auto &chunk = *it;
 3211|       |
 3212|  9.78k|                    if (!terminated && chunk == terminator)
  ------------------
  |  Branch (3212:25): [True: 8.90k, False: 879]
  |  Branch (3212:40): [True: 285, False: 8.62k]
  ------------------
 3213|    285|                    {
 3214|    285|                        terminated = true;
 3215|  9.50k|                    } else if (!terminated && ParseOption(chunk) == OptionType::LongFlag)
  ------------------
  |  Branch (3215:32): [True: 8.62k, False: 879]
  |  Branch (3215:47): [True: 529, False: 8.09k]
  ------------------
 3216|    529|                    {
 3217|    529|                        if (!ParseLong(it, end))
  ------------------
  |  Branch (3217:29): [True: 0, False: 529]
  ------------------
 3218|      0|                        {
 3219|      0|                            return it;
 3220|      0|                        }
 3221|  8.97k|                    } else if (!terminated && ParseOption(chunk) == OptionType::ShortFlag)
  ------------------
  |  Branch (3221:32): [True: 8.09k, False: 879]
  |  Branch (3221:47): [True: 2.30k, False: 5.79k]
  ------------------
 3222|  2.30k|                    {
 3223|  2.30k|                        if (!ParseShort(it, end))
  ------------------
  |  Branch (3223:29): [True: 0, False: 2.30k]
  ------------------
 3224|      0|                        {
 3225|      0|                            return it;
 3226|      0|                        }
 3227|  6.67k|                    } else if (!terminated && !commands.empty())
  ------------------
  |  Branch (3227:32): [True: 5.79k, False: 879]
  |  Branch (3227:47): [True: 0, False: 5.79k]
  ------------------
 3228|      0|                    {
 3229|      0|                        auto itCommand = std::find_if(commands.begin(), commands.end(), [&chunk](Command *c) { return c->Name() == chunk; });
 3230|      0|                        if (itCommand == commands.end())
  ------------------
  |  Branch (3230:29): [True: 0, False: 0]
  ------------------
 3231|      0|                        {
 3232|      0|                            const std::string errorMessage("Unknown command: " + chunk);
 3233|      0|#ifndef ARGS_NOEXCEPT
 3234|      0|                            throw ParseError(errorMessage);
 3235|       |#else
 3236|       |                            error = Error::Parse;
 3237|       |                            errorMsg = errorMessage;
 3238|       |                            return it;
 3239|       |#endif
 3240|      0|                        }
 3241|       |
 3242|      0|                        SelectCommand(*itCommand);
 3243|       |
 3244|      0|                        if (const auto &coroutine = GetCoroutine())
  ------------------
  |  Branch (3244:41): [True: 0, False: 0]
  ------------------
 3245|      0|                        {
 3246|      0|                            ++it;
 3247|      0|                            RaiiSubparser coro(*this, std::vector<std::string>(it, end));
 3248|      0|                            coroutine(coro.Parser());
 3249|       |#ifdef ARGS_NOEXCEPT
 3250|       |                            error = GetError();
 3251|       |                            if (error != Error::None)
 3252|       |                            {
 3253|       |                                return end;
 3254|       |                            }
 3255|       |
 3256|       |                            if (!coro.Parser().IsParsed())
 3257|       |                            {
 3258|       |                                error = Error::Usage;
 3259|       |                                return end;
 3260|       |                            }
 3261|       |#else
 3262|      0|                            if (!coro.Parser().IsParsed())
  ------------------
  |  Branch (3262:33): [True: 0, False: 0]
  ------------------
 3263|      0|                            {
 3264|      0|                                throw UsageError("Subparser::Parse was not called");
 3265|      0|                            }
 3266|      0|#endif
 3267|       |
 3268|      0|                            break;
 3269|      0|                        }
 3270|       |
 3271|      0|                        commands = GetCommands();
 3272|      0|                    } else
 3273|  6.67k|                    {
 3274|  6.67k|                        auto pos = GetNextPositional();
 3275|  6.67k|                        if (pos)
  ------------------
  |  Branch (3275:29): [True: 6.67k, False: 0]
  ------------------
 3276|  6.67k|                        {
 3277|  6.67k|                            pos->ParseValue(chunk);
 3278|       |#ifdef ARGS_NOEXCEPT
 3279|       |                            if (pos->GetError() != Error::None)
 3280|       |                            {
 3281|       |                                return it;
 3282|       |                            }
 3283|       |#endif
 3284|       |
 3285|  6.67k|                            if (pos->KickOut())
  ------------------
  |  Branch (3285:33): [True: 0, False: 6.67k]
  ------------------
 3286|      0|                            {
 3287|      0|                                return ++it;
 3288|      0|                            }
 3289|  6.67k|                        } else
 3290|      0|                        {
 3291|      0|                            const std::string errorMessage("Passed in argument, but no positional arguments were ready to receive it: " + chunk);
 3292|      0|#ifndef ARGS_NOEXCEPT
 3293|      0|                            throw ParseError(errorMessage);
 3294|       |#else
 3295|       |                            error = Error::Parse;
 3296|       |                            errorMsg = errorMessage;
 3297|       |                            return it;
 3298|       |#endif
 3299|      0|                        }
 3300|  6.67k|                    }
 3301|       |
 3302|  9.78k|                    if (!readCompletion && completion != nullptr && completion->Matched())
  ------------------
  |  Branch (3302:25): [True: 8.16k, False: 1.62k]
  |  Branch (3302:44): [True: 0, False: 8.16k]
  |  Branch (3302:69): [True: 0, False: 0]
  ------------------
 3303|      0|                    {
 3304|       |#ifdef ARGS_NOEXCEPT
 3305|       |                        if (completion->GetError() != Error::None)
 3306|       |                        {
 3307|       |                            error = completion->GetError();
 3308|       |                            if (errorMsg.empty())
 3309|       |                            {
 3310|       |                                errorMsg = completion->GetErrorMsg();
 3311|       |                            }
 3312|       |                            return it;
 3313|       |                        }
 3314|       |
 3315|       |                        error = Error::Completion;
 3316|       |#endif
 3317|      0|                        readCompletion = true;
 3318|      0|                        ++it;
 3319|      0|                        const auto argsLeft = static_cast<size_t>(std::distance(it, end));
 3320|      0|                        if (completion->cword == 0 || argsLeft <= 1 || completion->cword >= argsLeft)
  ------------------
  |  Branch (3320:29): [True: 0, False: 0]
  |  Branch (3320:55): [True: 0, False: 0]
  |  Branch (3320:72): [True: 0, False: 0]
  ------------------
 3321|      0|                        {
 3322|      0|#ifndef ARGS_NOEXCEPT
 3323|      0|                            throw Completion("");
 3324|       |#else
 3325|       |                            return end;
 3326|       |#endif
 3327|      0|                        }
 3328|       |
 3329|      0|                        ++it;
 3330|      0|                        std::vector<std::string> curArgs;
 3331|      0|                        curArgs.reserve(completion->cword);
 3332|      0|                        auto curIt = it;
 3333|      0|                        for (size_t idx = 0; idx < completion->cword && curIt != end; ++idx, ++curIt)
  ------------------
  |  Branch (3333:46): [True: 0, False: 0]
  |  Branch (3333:73): [True: 0, False: 0]
  ------------------
 3334|      0|                        {
 3335|      0|                            curArgs.push_back(*curIt);
 3336|      0|                        }
 3337|       |
 3338|      0|                        if (completion->syntax == "bash")
  ------------------
  |  Branch (3338:29): [True: 0, False: 0]
  ------------------
 3339|      0|                        {
 3340|       |                            // bash tokenizes --flag=value as --flag=value
 3341|       |                            // Security fix: Use size_t arithmetic throughout to avoid conversion issues
 3342|      0|                            for (size_t idx = 0; idx < curArgs.size(); )
  ------------------
  |  Branch (3342:50): [True: 0, False: 0]
  ------------------
 3343|      0|                            {
 3344|      0|                                if (idx > 0 && curArgs[idx] == "=")
  ------------------
  |  Branch (3344:37): [True: 0, False: 0]
  |  Branch (3344:48): [True: 0, False: 0]
  ------------------
 3345|      0|                                {
 3346|      0|                                    size_t prev_idx = idx - 1;  // Safe since we checked idx > 0
 3347|      0|                                    curArgs[prev_idx] += "=";
 3348|      0|                                    size_t next_idx = 0;
 3349|      0|                                    if (SafeAdd<size_t>(idx, static_cast<size_t>(1), next_idx) && next_idx < curArgs.size())
  ------------------
  |  Branch (3349:41): [True: 0, False: 0]
  |  Branch (3349:99): [True: 0, False: 0]
  ------------------
 3350|      0|                                    {
 3351|      0|                                        curArgs[prev_idx] += curArgs[next_idx];
 3352|       |                                        // Erase the '=' token and the following value token.
 3353|      0|                                        size_t erase_end = 0;
 3354|      0|                                        if (SafeAdd<size_t>(next_idx, static_cast<size_t>(1), erase_end))
  ------------------
  |  Branch (3354:45): [True: 0, False: 0]
  ------------------
 3355|      0|                                        {
 3356|      0|                                            typedef std::vector<std::string>::difference_type diff_t;
 3357|      0|                                            curArgs.erase(curArgs.begin() + static_cast<diff_t>(idx),
 3358|      0|                                                         curArgs.begin() + static_cast<diff_t>(erase_end));
 3359|      0|                                        }
 3360|      0|                                    } else
 3361|      0|                                    {
 3362|       |                                        // Safe erase of single '=' token at the end
 3363|      0|                                        typedef std::vector<std::string>::difference_type diff_t;
 3364|      0|                                        curArgs.erase(curArgs.begin() + static_cast<diff_t>(idx));
 3365|      0|                                    }
 3366|       |                                    // Do not increment idx - next element slides into current position
 3367|      0|                                } else
 3368|      0|                                {
 3369|      0|                                    ++idx;
 3370|      0|                                }
 3371|      0|                            }
 3372|       |
 3373|      0|                        }
 3374|      0|#ifndef ARGS_NOEXCEPT
 3375|      0|                        try
 3376|      0|                        {
 3377|      0|                            Parse(curArgs.begin(), curArgs.end());
 3378|      0|                            throw Completion("");
 3379|      0|                        }
 3380|      0|                        catch (Completion &)
 3381|      0|                        {
 3382|      0|                            throw;
 3383|      0|                        }
 3384|      0|                        catch (args::Error&)
 3385|      0|                        {
 3386|      0|                            throw Completion("");
 3387|      0|                        }
 3388|       |#else
 3389|       |                        // Discard the nested Parse's return value: it points
 3390|       |                        // into the local curArgs vector, which is destroyed
 3391|       |                        // when this function returns, leaving the caller with
 3392|       |                        // a dangling iterator that would be compared against
 3393|       |                        // the outer `end` in ParseCLI. Return the outer
 3394|       |                        // `end` instead so the iterator stays in the caller's
 3395|       |                        // container.
 3396|       |                        Parse(curArgs.begin(), curArgs.end());
 3397|       |                        error = Error::Completion;
 3398|       |                        errorMsg.clear();
 3399|       |                        return end;
 3400|       |#endif
 3401|      0|                    }
 3402|  9.78k|                }
 3403|       |
 3404|  6.80k|                Validate(shortprefix, longprefix);
 3405|  6.80k|                return end;
 3406|  6.80k|            }
_ZN4args14ArgumentParser8CompleteINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEEbT_SD_b:
 3070|  9.78k|            {
 3071|  9.78k|                auto nextIt = it;
 3072|  9.78k|                if (!readCompletion || (++nextIt != end))
  ------------------
  |  Branch (3072:21): [True: 9.78k, False: 0]
  |  Branch (3072:40): [True: 0, False: 0]
  ------------------
 3073|  9.78k|                {
 3074|  9.78k|                    return false;
 3075|  9.78k|                }
 3076|       |
 3077|      0|                const auto &chunk = *it;
 3078|      0|                auto pos = GetNextPositional();
 3079|      0|                std::vector<Command *> commands = GetCommands();
 3080|      0|                const auto optionType = ParseOption(chunk, true);
 3081|       |
 3082|       |                // Once the terminator has been seen the parser treats every
 3083|       |                // following chunk as positional, so only positional choices are
 3084|       |                // valid completions here. Suggesting flags or commands past the
 3085|       |                // terminator offers candidates the parser would then reject.
 3086|      0|                if (!terminated && !commands.empty() && (chunk.empty() || optionType == OptionType::Positional))
  ------------------
  |  Branch (3086:21): [True: 0, False: 0]
  |  Branch (3086:36): [True: 0, False: 0]
  |  Branch (3086:58): [True: 0, False: 0]
  |  Branch (3086:75): [True: 0, False: 0]
  ------------------
 3087|      0|                {
 3088|      0|                    for (auto &cmd : commands)
  ------------------
  |  Branch (3088:36): [True: 0, False: 0]
  ------------------
 3089|      0|                    {
 3090|      0|                        if ((cmd->GetOptions() & Options::HiddenFromCompletion) == Options::None)
  ------------------
  |  Branch (3090:29): [True: 0, False: 0]
  ------------------
 3091|      0|                        {
 3092|      0|                            AddCompletionReply(chunk, cmd->Name());
 3093|      0|                        }
 3094|      0|                    }
 3095|      0|                } else
 3096|      0|                {
 3097|      0|                    bool hasPositionalCompletion = true;
 3098|       |
 3099|      0|                    if (!terminated && !commands.empty())
  ------------------
  |  Branch (3099:25): [True: 0, False: 0]
  |  Branch (3099:40): [True: 0, False: 0]
  ------------------
 3100|      0|                    {
 3101|      0|                        for (auto &cmd : commands)
  ------------------
  |  Branch (3101:40): [True: 0, False: 0]
  ------------------
 3102|      0|                        {
 3103|      0|                            if ((cmd->GetOptions() & Options::HiddenFromCompletion) == Options::None)
  ------------------
  |  Branch (3103:33): [True: 0, False: 0]
  ------------------
 3104|      0|                            {
 3105|      0|                                AddCompletionReply(chunk, cmd->Name());
 3106|      0|                            }
 3107|      0|                        }
 3108|      0|                    } else if (pos)
  ------------------
  |  Branch (3108:32): [True: 0, False: 0]
  ------------------
 3109|      0|                    {
 3110|      0|                        if ((pos->GetOptions() & Options::HiddenFromCompletion) == Options::None)
  ------------------
  |  Branch (3110:29): [True: 0, False: 0]
  ------------------
 3111|      0|                        {
 3112|      0|                            auto choices = pos->HelpChoices(helpParams);
 3113|      0|                            hasPositionalCompletion = !choices.empty() || optionType != OptionType::Positional;
  ------------------
  |  Branch (3113:55): [True: 0, False: 0]
  |  Branch (3113:75): [True: 0, False: 0]
  ------------------
 3114|      0|                            for (auto &choice : choices)
  ------------------
  |  Branch (3114:47): [True: 0, False: 0]
  ------------------
 3115|      0|                            {
 3116|      0|                                AddCompletionReply(chunk, choice);
 3117|      0|                            }
 3118|      0|                        }
 3119|      0|                    }
 3120|       |
 3121|      0|                    if (!terminated && hasPositionalCompletion)
  ------------------
  |  Branch (3121:25): [True: 0, False: 0]
  |  Branch (3121:40): [True: 0, False: 0]
  ------------------
 3122|      0|                    {
 3123|      0|                        auto flags = GetAllFlags();
 3124|      0|                        for (auto flag : flags)
  ------------------
  |  Branch (3124:40): [True: 0, False: 0]
  ------------------
 3125|      0|                        {
 3126|      0|                            if ((flag->GetOptions() & Options::HiddenFromCompletion) != Options::None)
  ------------------
  |  Branch (3126:33): [True: 0, False: 0]
  ------------------
 3127|      0|                            {
 3128|      0|                                continue;
 3129|      0|                            }
 3130|       |
 3131|      0|                            auto &matcher = flag->GetMatcher();
 3132|      0|                            if (!AddCompletionReply(chunk, matcher.GetShortOrAny().str(shortprefix, longprefix)))
  ------------------
  |  Branch (3132:33): [True: 0, False: 0]
  ------------------
 3133|      0|                            {
 3134|      0|                                for (auto &flagName : matcher.GetFlagStrings())
  ------------------
  |  Branch (3134:53): [True: 0, False: 0]
  ------------------
 3135|      0|                                {
 3136|      0|                                    if (AddCompletionReply(chunk, flagName.str(shortprefix, longprefix)))
  ------------------
  |  Branch (3136:41): [True: 0, False: 0]
  ------------------
 3137|      0|                                    {
 3138|      0|                                        break;
 3139|      0|                                    }
 3140|      0|                                }
 3141|      0|                            }
 3142|      0|                        }
 3143|       |
 3144|      0|                        if (optionType == OptionType::LongFlag && allowJoinedLongValue)
  ------------------
  |  Branch (3144:29): [True: 0, False: 0]
  |  Branch (3144:67): [True: 0, False: 0]
  ------------------
 3145|      0|                        {
 3146|      0|                            const auto separator = longseparator.empty() ? chunk.npos : chunk.find(longseparator);
  ------------------
  |  Branch (3146:52): [True: 0, False: 0]
  ------------------
 3147|       |                            // Only attempt joined-value completion when the
 3148|       |                            // separator lies at or past the long prefix, so
 3149|       |                            // there is a (possibly empty) flag name between
 3150|       |                            // them. With a custom longseparator that overlaps
 3151|       |                            // the prefix (e.g. LongSeparator("-") under the
 3152|       |                            // default "--" prefix), an attacker-controlled
 3153|       |                            // completion word like "--x" puts the separator
 3154|       |                            // inside the prefix, making `arg` shorter than
 3155|       |                            // longprefix. arg.substr(longprefix.size()) would
 3156|       |                            // then throw std::out_of_range, which escapes the
 3157|       |                            // parser as a non-args exception (bypassing the
 3158|       |                            // documented catch(args::Error) idiom) and is
 3159|       |                            // thrown even under ARGS_NOEXCEPT.
 3160|      0|                            if (separator != chunk.npos && separator >= longprefix.size())
  ------------------
  |  Branch (3160:33): [True: 0, False: 0]
  |  Branch (3160:60): [True: 0, False: 0]
  ------------------
 3161|      0|                            {
 3162|      0|                                std::string arg(chunk, 0, separator);
 3163|      0|                                if (auto flag = this->Match(arg.substr(longprefix.size())))
  ------------------
  |  Branch (3163:42): [True: 0, False: 0]
  ------------------
 3164|      0|                                {
 3165|      0|                                    for (auto &choice : flag->HelpChoices(helpParams))
  ------------------
  |  Branch (3165:55): [True: 0, False: 0]
  ------------------
 3166|      0|                                    {
 3167|      0|                                        AddCompletionReply(chunk, arg + longseparator + choice);
 3168|      0|                                    }
 3169|      0|                                }
 3170|      0|                            }
 3171|      0|                        } else if (optionType == OptionType::ShortFlag && allowJoinedShortValue)
  ------------------
  |  Branch (3171:36): [True: 0, False: 0]
  |  Branch (3171:75): [True: 0, False: 0]
  ------------------
 3172|      0|                        {
 3173|      0|                            if (chunk.size() > shortprefix.size() + 1)
  ------------------
  |  Branch (3173:33): [True: 0, False: 0]
  ------------------
 3174|      0|                            {
 3175|      0|                                auto arg = chunk.at(shortprefix.size());
 3176|       |                                //TODO: support -abcVALUE where a and b take no value
 3177|      0|                                if (auto flag = this->Match(arg))
  ------------------
  |  Branch (3177:42): [True: 0, False: 0]
  ------------------
 3178|      0|                                {
 3179|      0|                                    for (auto &choice : flag->HelpChoices(helpParams))
  ------------------
  |  Branch (3179:55): [True: 0, False: 0]
  ------------------
 3180|      0|                                    {
 3181|      0|                                        AddCompletionReply(chunk, shortprefix + arg + choice);
 3182|      0|                                    }
 3183|      0|                                }
 3184|      0|                            }
 3185|      0|                        }
 3186|      0|                    }
 3187|      0|                }
 3188|       |
 3189|      0|#ifndef ARGS_NOEXCEPT
 3190|      0|                throw Completion(completion->Get());
 3191|       |#else
 3192|       |                return true;
 3193|       |#endif
 3194|  9.78k|            }
_ZN4args14ArgumentParser11ParseOptionERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
 2751|  16.7k|            {
 2752|  16.7k|                const bool matchesLong = s.find(longprefix) == 0 && (allowEmpty || s.length() > longprefix.length());
  ------------------
  |  Branch (2752:42): [True: 583, False: 16.1k]
  |  Branch (2752:70): [True: 0, False: 583]
  |  Branch (2752:84): [True: 529, False: 54]
  ------------------
 2753|  16.7k|                const bool matchesShort = s.find(shortprefix) == 0 && (allowEmpty || s.length() > shortprefix.length());
  ------------------
  |  Branch (2753:43): [True: 5.89k, False: 10.8k]
  |  Branch (2753:72): [True: 0, False: 5.89k]
  |  Branch (2753:86): [True: 4.96k, False: 932]
  ------------------
 2754|       |
 2755|       |                // A chunk can start with both prefixes when one is a prefix of
 2756|       |                // the other, or when the long prefix is empty (every string
 2757|       |                // starts with it). Resolve to the longer, more specific prefix:
 2758|       |                // this keeps the default "--"/"-" preference for long flags
 2759|       |                // while letting a short flag be recognised under an empty long
 2760|       |                // prefix instead of being swallowed as a nameless long flag.
 2761|  16.7k|                if (matchesLong && matchesShort)
  ------------------
  |  Branch (2761:21): [True: 529, False: 16.1k]
  |  Branch (2761:36): [True: 362, False: 167]
  ------------------
 2762|    362|                {
 2763|    362|                    return longprefix.length() >= shortprefix.length() ? OptionType::LongFlag : OptionType::ShortFlag;
  ------------------
  |  Branch (2763:28): [True: 362, False: 0]
  ------------------
 2764|    362|                }
 2765|       |
 2766|  16.3k|                if (matchesLong)
  ------------------
  |  Branch (2766:21): [True: 167, False: 16.1k]
  ------------------
 2767|    167|                {
 2768|    167|                    return OptionType::LongFlag;
 2769|    167|                }
 2770|       |
 2771|  16.1k|                if (matchesShort)
  ------------------
  |  Branch (2771:21): [True: 4.60k, False: 11.5k]
  ------------------
 2772|  4.60k|                {
 2773|  4.60k|                    return OptionType::ShortFlag;
 2774|  4.60k|                }
 2775|       |
 2776|  11.5k|                return OptionType::Positional;
 2777|  16.1k|            }
_ZN4args14ArgumentParser9ParseLongINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEEbRT_SD_:
 2898|    529|            {
 2899|    529|                const auto &chunk = *it;
 2900|    529|                const auto argchunk = chunk.substr(longprefix.size());
 2901|       |                // Try to separate it, in case of a separator:
 2902|    529|                const auto separator = longseparator.empty() ? argchunk.npos : argchunk.find(longseparator);
  ------------------
  |  Branch (2902:40): [True: 0, False: 529]
  ------------------
 2903|       |                // If the separator is in the argument, separate it.
 2904|    529|                const auto arg = (separator != argchunk.npos ?
  ------------------
  |  Branch (2904:35): [True: 212, False: 317]
  ------------------
 2905|    212|                    std::string(argchunk, 0, separator)
 2906|    529|                    : argchunk);
 2907|    529|                const auto joined = (separator != argchunk.npos ?
  ------------------
  |  Branch (2907:38): [True: 212, False: 317]
  ------------------
 2908|    212|                    argchunk.substr(separator + longseparator.size())
 2909|    529|                    : std::string());
 2910|       |
 2911|    529|                if (auto flag = Match(arg))
  ------------------
  |  Branch (2911:26): [True: 296, False: 233]
  ------------------
 2912|    296|                {
 2913|       |#ifdef ARGS_NOEXCEPT
 2914|       |                    // Match() may set the flag's error (e.g. Error::Extra when
 2915|       |                    // Options::Single is violated). In non-noexcept mode that
 2916|       |                    // path throws and parsing stops before the value is read;
 2917|       |                    // in noexcept mode we must mirror that and skip the value
 2918|       |                    // parsing so the previously-stored value is preserved.
 2919|       |                    if (flag->GetError() != Error::None)
 2920|       |                    {
 2921|       |                        return false;
 2922|       |                    }
 2923|       |#endif
 2924|    296|                    std::vector<std::string> values;
 2925|    296|                    const std::string errorMessage = ParseArgsValues(*flag, arg, it, end, allowSeparateLongValue, allowJoinedLongValue,
 2926|    296|                                                                     separator != argchunk.npos, joined, false, values);
 2927|    296|                    if (!errorMessage.empty())
  ------------------
  |  Branch (2927:25): [True: 0, False: 296]
  ------------------
 2928|      0|                    {
 2929|      0|#ifndef ARGS_NOEXCEPT
 2930|      0|                        throw ParseError(errorMessage);
 2931|       |#else
 2932|       |                        error = Error::Parse;
 2933|       |                        errorMsg = errorMessage;
 2934|       |                        return false;
 2935|       |#endif
 2936|      0|                    }
 2937|       |
 2938|    296|                    if (!readCompletion)
  ------------------
  |  Branch (2938:25): [True: 296, False: 0]
  ------------------
 2939|    296|                    {
 2940|    296|                        flag->ParseValue(values);
 2941|       |#ifdef ARGS_NOEXCEPT
 2942|       |                        // Non-noexcept ParseValue paths throw on Help, reader
 2943|       |                        // failure, or Map miss, which halts parsing. Mirror
 2944|       |                        // that here so a later parser-level error (e.g. an
 2945|       |                        // unknown flag) cannot shadow the flag's error in
 2946|       |                        // ArgumentParser::GetError().
 2947|       |                        if (flag->GetError() != Error::None)
 2948|       |                        {
 2949|       |                            return false;
 2950|       |                        }
 2951|       |#endif
 2952|    296|                    }
 2953|       |
 2954|    296|                    if (flag->KickOut())
  ------------------
  |  Branch (2954:25): [True: 0, False: 296]
  ------------------
 2955|      0|                    {
 2956|      0|                        ++it;
 2957|      0|                        return false;
 2958|      0|                    }
 2959|    296|                } else
 2960|    233|                {
 2961|    233|                    const std::string errorMessage("Flag could not be matched: " + arg);
 2962|    233|#ifndef ARGS_NOEXCEPT
 2963|    233|                    throw ParseError(errorMessage);
 2964|       |#else
 2965|       |                    error = Error::Parse;
 2966|       |                    errorMsg = errorMessage;
 2967|       |                    return false;
 2968|       |#endif
 2969|    233|                }
 2970|       |
 2971|    296|                return true;
 2972|    529|            }
_ZN4args14ArgumentParser15ParseArgsValuesINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEES9_RNS_8FlagBaseERSA_RT_SG_bbbSF_bRNS2_6vectorIS9_NS7_IS9_EEEE:
 2815|  4.68k|            {
 2816|  4.68k|                values.clear();
 2817|       |
 2818|  4.68k|                Nargs nargs = flag.NumberOfArguments();
 2819|       |
 2820|  4.68k|                if (hasJoined && !allowJoined && (nargs.min != 0 || !canDiscardJoined))
  ------------------
  |  Branch (2820:21): [True: 3.49k, False: 1.18k]
  |  Branch (2820:34): [True: 0, False: 3.49k]
  |  Branch (2820:51): [True: 0, False: 0]
  |  Branch (2820:69): [True: 0, False: 0]
  ------------------
 2821|      0|                {
 2822|      0|                    return "Flag '" + arg + "' was passed a joined argument, but these are disallowed";
 2823|      0|                }
 2824|       |
 2825|  4.68k|                if (hasJoined)
  ------------------
  |  Branch (2825:21): [True: 3.49k, False: 1.18k]
  ------------------
 2826|  3.49k|                {
 2827|  3.49k|                    if (!canDiscardJoined || (allowJoined && nargs.max != 0))
  ------------------
  |  Branch (2827:25): [True: 187, False: 3.30k]
  |  Branch (2827:47): [True: 3.30k, False: 0]
  |  Branch (2827:62): [True: 445, False: 2.86k]
  ------------------
 2828|    632|                    {
 2829|    632|                        values.push_back(joinedArg);
 2830|    632|                    }
 2831|  3.49k|                } else if (!allowSeparate)
  ------------------
  |  Branch (2831:28): [True: 0, False: 1.18k]
  ------------------
 2832|      0|                {
 2833|      0|                    if (nargs.min != 0)
  ------------------
  |  Branch (2833:25): [True: 0, False: 0]
  ------------------
 2834|      0|                    {
 2835|      0|                        return "Flag '" + arg + "' was passed a separate argument, but these are disallowed";
 2836|      0|                    }
 2837|  1.18k|                } else if (allowSeparate && (!hasJoined || !values.empty())) {
  ------------------
  |  Branch (2837:28): [True: 1.18k, False: 0]
  |  Branch (2837:46): [True: 1.18k, False: 0]
  |  Branch (2837:60): [True: 0, False: 0]
  ------------------
 2838|       |                    // Only gather separate values when they are allowed. A joined
 2839|       |                    // value that was discarded rather than taken (short chunks such
 2840|       |                    // as -nf when joined short values are off) means this flag isn't
 2841|       |                    // taking an argument here, so the rest of the chunk is flags.
 2842|  1.18k|                    auto valueIt = it;
 2843|  1.18k|                    ++valueIt;
 2844|       |
 2845|  1.67k|                    while (valueIt != end &&
  ------------------
  |  Branch (2845:28): [True: 1.38k, False: 291]
  ------------------
 2846|  1.38k|                           *valueIt != terminator &&
  ------------------
  |  Branch (2846:28): [True: 1.32k, False: 61]
  ------------------
 2847|  1.32k|                           values.size() < nargs.max &&
  ------------------
  |  Branch (2847:28): [True: 485, False: 835]
  ------------------
 2848|    485|                           (values.size() < nargs.min || ParseOption(*valueIt) == OptionType::Positional))
  ------------------
  |  Branch (2848:29): [True: 485, False: 0]
  |  Branch (2848:58): [True: 0, False: 0]
  ------------------
 2849|    485|                    {
 2850|    485|                        if (Complete(flag, valueIt, end))
  ------------------
  |  Branch (2850:29): [True: 0, False: 485]
  ------------------
 2851|      0|                        {
 2852|       |                            // Park `it` on the completion position rather than
 2853|       |                            // `end`. In ARGS_NOEXCEPT mode Complete returns
 2854|       |                            // true (no throw), so the caller's for-loop will
 2855|       |                            // run its ++it after we return; advancing an
 2856|       |                            // already-end iterator is undefined behavior and
 2857|       |                            // causes a subsequent out-of-bounds read of the
 2858|       |                            // arg vector. Since Complete only fires when
 2859|       |                            // ++nextIt == end, valueIt is the last element,
 2860|       |                            // and ++(it=valueIt) safely lands on end.
 2861|      0|                            it = valueIt;
 2862|      0|                            return "";
 2863|      0|                        }
 2864|       |
 2865|    485|                        values.push_back(*valueIt);
 2866|    485|                        ++it;
 2867|    485|                        ++valueIt;
 2868|    485|                    }
 2869|  1.18k|                }
 2870|       |
 2871|  4.68k|                if (values.size() > nargs.max)
  ------------------
  |  Branch (2871:21): [True: 0, False: 4.68k]
  ------------------
 2872|      0|                {
 2873|      0|                    return "Passed an argument into a non-argument flag: " + arg;
 2874|  4.68k|                } else if (values.size() < nargs.min)
  ------------------
  |  Branch (2874:28): [True: 153, False: 4.53k]
  ------------------
 2875|    153|                {
 2876|    153|                    if (nargs.min == 1 && nargs.max == 1)
  ------------------
  |  Branch (2876:25): [True: 153, False: 0]
  |  Branch (2876:43): [True: 153, False: 0]
  ------------------
 2877|    153|                    {
 2878|    153|                        return "Flag '" + arg + "' requires an argument but received none";
 2879|    153|                    } else if (nargs.min == 1)
  ------------------
  |  Branch (2879:32): [True: 0, False: 0]
  ------------------
 2880|      0|                    {
 2881|      0|                        return "Flag '" + arg + "' requires at least one argument but received none";
 2882|      0|                    } else if (nargs.min != nargs.max)
  ------------------
  |  Branch (2882:32): [True: 0, False: 0]
  ------------------
 2883|      0|                    {
 2884|      0|                        return "Flag '" + arg + "' requires at least " + std::to_string(nargs.min) +
 2885|      0|                               " arguments but received " + std::to_string(values.size());
 2886|      0|                    } else
 2887|      0|                    {
 2888|      0|                        return "Flag '" + arg + "' requires " + std::to_string(nargs.min) +
 2889|      0|                               " arguments but received " + std::to_string(values.size());
 2890|      0|                    }
 2891|    153|                }
 2892|       |
 2893|  4.53k|                return {};
 2894|  4.68k|            }
_ZN4args14ArgumentParser8CompleteINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEEbRNS_8FlagBaseET_SF_:
 2781|    485|            {
 2782|    485|                auto nextIt = it;
 2783|    485|                if (!readCompletion || (++nextIt != end))
  ------------------
  |  Branch (2783:21): [True: 485, False: 0]
  |  Branch (2783:40): [True: 0, False: 0]
  ------------------
 2784|    485|                {
 2785|    485|                    return false;
 2786|    485|                }
 2787|       |
 2788|      0|                const auto &chunk = *it;
 2789|      0|                for (auto &choice : flag.HelpChoices(helpParams))
  ------------------
  |  Branch (2789:35): [True: 0, False: 0]
  ------------------
 2790|      0|                {
 2791|      0|                    AddCompletionReply(chunk, choice);
 2792|      0|                }
 2793|       |
 2794|      0|#ifndef ARGS_NOEXCEPT
 2795|      0|                throw Completion(completion->Get());
 2796|       |#else
 2797|       |                return true;
 2798|       |#endif
 2799|    485|            }
_ZN4args14ArgumentParser10ParseShortINSt3__111__wrap_iterIPKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEEEbRT_SD_:
 2976|  2.30k|            {
 2977|  2.30k|                const auto &chunk = *it;
 2978|  2.30k|                const auto argchunk = chunk.substr(shortprefix.size());
 2979|  5.90k|                for (auto argit = std::begin(argchunk); argit != std::end(argchunk); ++argit)
  ------------------
  |  Branch (2979:57): [True: 5.16k, False: 737]
  ------------------
 2980|  5.16k|                {
 2981|  5.16k|                    const auto arg = *argit;
 2982|       |
 2983|  5.16k|                    if (auto flag = Match(arg))
  ------------------
  |  Branch (2983:30): [True: 4.38k, False: 778]
  ------------------
 2984|  4.38k|                    {
 2985|       |#ifdef ARGS_NOEXCEPT
 2986|       |                        // See ParseLong: if Match recorded an error
 2987|       |                        // (e.g. Options::Single violation), bail before the
 2988|       |                        // value is parsed so the prior value is preserved.
 2989|       |                        if (flag->GetError() != Error::None)
 2990|       |                        {
 2991|       |                            return false;
 2992|       |                        }
 2993|       |#endif
 2994|  4.38k|                        const std::string value(argit + 1, std::end(argchunk));
 2995|  4.38k|                        std::vector<std::string> values;
 2996|  4.38k|                        const std::string errorMessage = ParseArgsValues(*flag, std::string(1, arg), it, end,
 2997|  4.38k|                                                                         allowSeparateShortValue, allowJoinedShortValue,
 2998|  4.38k|                                                                         !value.empty(), value, !value.empty(), values);
 2999|       |
 3000|  4.38k|                        if (!errorMessage.empty())
  ------------------
  |  Branch (3000:29): [True: 153, False: 4.23k]
  ------------------
 3001|    153|                        {
 3002|    153|#ifndef ARGS_NOEXCEPT
 3003|    153|                            throw ParseError(errorMessage);
 3004|       |#else
 3005|       |                            error = Error::Parse;
 3006|       |                            errorMsg = errorMessage;
 3007|       |                            return false;
 3008|       |#endif
 3009|    153|                        }
 3010|       |
 3011|  4.23k|                        if (!readCompletion)
  ------------------
  |  Branch (3011:29): [True: 4.23k, False: 0]
  ------------------
 3012|  4.23k|                        {
 3013|  4.23k|                            flag->ParseValue(values);
 3014|       |#ifdef ARGS_NOEXCEPT
 3015|       |                            // See ParseLong: ensure a flag-level error from
 3016|       |                            // ParseValue (Help, Parse, Map) halts parsing so
 3017|       |                            // it cannot be shadowed by a later parser error.
 3018|       |                            if (flag->GetError() != Error::None)
 3019|       |                            {
 3020|       |                                return false;
 3021|       |                            }
 3022|       |#endif
 3023|  4.23k|                        }
 3024|       |
 3025|  4.23k|                        if (flag->KickOut())
  ------------------
  |  Branch (3025:29): [True: 0, False: 4.23k]
  ------------------
 3026|      0|                        {
 3027|      0|                            ++it;
 3028|      0|                            return false;
 3029|      0|                        }
 3030|       |
 3031|  4.23k|                        if (!values.empty())
  ------------------
  |  Branch (3031:29): [True: 633, False: 3.60k]
  ------------------
 3032|    633|                        {
 3033|    633|                            break;
 3034|    633|                        }
 3035|  4.23k|                    } else
 3036|    778|                    {
 3037|    778|                        const std::string errorMessage("Flag could not be matched: '" + std::string(1, arg) + "'");
 3038|    778|#ifndef ARGS_NOEXCEPT
 3039|    778|                        throw ParseError(errorMessage);
 3040|       |#else
 3041|       |                        error = Error::Parse;
 3042|       |                        errorMsg = errorMessage;
 3043|       |                        return false;
 3044|       |#endif
 3045|    778|                    }
 3046|  5.16k|                }
 3047|       |
 3048|  1.37k|                return true;
 3049|  2.30k|            }
_ZNK4args4Base7KickOutEv:
 1124|  10.7k|            {
 1125|  10.7k|                return (options & Options::KickOut) != Options::None;
 1126|  10.7k|            }
_ZN4args9ValueFlagIiNS_11ValueReaderEEC2ERNS_5GroupERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESD_ONS_7MatcherERKib:
 4139|  6.80k|            ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_ = T(), const bool extraError_ = false): ValueFlag(group_, name_, help_, std::move(matcher_), defaultValue_, extraError_ ? Options::Single : Options::None)
  ------------------
  |  Branch (4139:241): [True: 0, False: 6.80k]
  ------------------
 4140|  6.80k|            {
 4141|  6.80k|            }
_ZN4args9ValueFlagIiNS_11ValueReaderEEC2ERNS_5GroupERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESD_ONS_7MatcherERKiNS_7OptionsE:
 4134|  6.80k|            ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), value(defaultValue_), defaultValue(defaultValue_)
 4135|  6.80k|            {
 4136|  6.80k|                group_.Add(*this);
 4137|  6.80k|            }
_ZN4args13ValueFlagBaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_ONS_7MatcherENS_7OptionsE:
 1483|  34.0k|            ValueFlagBase(const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_) : FlagBase(name_, help_, std::move(matcher_), options_) {}
_ZN4args9ValueFlagIiNS_11ValueReaderEE5ResetEv:
 4164|  6.80k|            {
 4165|  6.80k|                ValueFlagBase::Reset();
 4166|  6.80k|                value = defaultValue;
 4167|  6.80k|            }
_ZNK4args9ValueFlagIiNS_11ValueReaderEE16GetDefaultStringERKNS_10HelpParamsE:
 4125|  27.2k|            {
 4126|  27.2k|                return detail::ToString(defaultValue);
 4127|  27.2k|            }
_ZN4args6detail8ToStringIiEENSt3__19enable_ifIXsr21IsConvertableToStringIT_EE5valueENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE4typeERKS4_:
 1268|  27.2k|        {
 1269|  27.2k|            std::ostringstream s;
 1270|  27.2k|            s << value;
 1271|  27.2k|            return s.str();
 1272|  27.2k|        }
_ZNK4args13ValueFlagBase17NumberOfArgumentsEv:
 1487|  94.8k|            {
 1488|  94.8k|                return 1;
 1489|  94.8k|            }
_ZN4args9ValueFlagIiNS_11ValueReaderEE10ParseValueERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEE:
 4150|    318|            {
 4151|    318|                const std::string &value_ = values_.at(0);
 4152|       |
 4153|       |#ifdef ARGS_NOEXCEPT
 4154|       |                if (!reader(name, value_, this->value))
 4155|       |                {
 4156|       |                    error = Error::Parse;
 4157|       |                }
 4158|       |#else
 4159|    318|                reader(name, value_, this->value);
 4160|    318|#endif
 4161|    318|            }
_ZN4args11ValueReaderclIiEENSt3__19enable_ifIXntsr3std13is_assignableIT_NS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE5valueEbE4typeERKSA_SE_RS4_:
 4085|    318|        {
 4086|    318|            const bool success = ParseNumericValue(value, destination);
 4087|    318|            if (!success)
  ------------------
  |  Branch (4087:17): [True: 118, False: 200]
  ------------------
 4088|    118|            {
 4089|       |#ifdef ARGS_NOEXCEPT
 4090|       |                (void)name;
 4091|       |                return false;
 4092|       |#else
 4093|    118|                std::ostringstream problem;
 4094|    118|                problem << "Argument '" << name << "' received invalid value type '" << value << "'";
 4095|    118|                throw ParseError(problem.str());
 4096|    118|#endif
 4097|    118|            }
 4098|    200|            return true;
 4099|    318|        }
_ZN4args11ValueReader17ParseNumericValueIiEENSt3__19enable_ifIXaaaaaaaasr3std11is_integralIT_EE5valuentsr3std7is_sameIS4_bEE5valuentsr3std7is_sameIS4_cEE5valuentsr3std7is_sameIS4_aEE5valuentsr3std7is_sameIS4_hEE5valueEbE4typeERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERS4_:
 3968|    318|        {
 3969|    318|            if (HasUnsignedNegativeSign<T>(value))
  ------------------
  |  Branch (3969:17): [True: 0, False: 318]
  ------------------
 3970|      0|            {
 3971|      0|                return false;
 3972|      0|            }
 3973|       |
 3974|    318|            const char *begin = value.c_str();
 3975|       |            // The true end of the value, derived from its length rather than
 3976|       |            // from the first NUL. strtoull/strtoll treat the buffer as a C
 3977|       |            // string and stop at an embedded '\0', so checking `*end == '\0'`
 3978|       |            // for "no trailing data" is defeated by a value like "12\0junk":
 3979|       |            // end lands on the embedded NUL and the junk after it is silently
 3980|       |            // accepted. Comparing against `stop` validates the whole string
 3981|       |            // and matches the istringstream-based reader used for other types.
 3982|    318|            const char *const stop = begin + value.size();
 3983|       |
 3984|       |            // C++11-compatible: use strtoull/strtoll. Hardening retained from
 3985|       |            // the original from_chars draft (errno save/restore, ERANGE check,
 3986|       |            // narrowing range check, trailing-whitespace tolerance). No
 3987|       |            // unconditional dependency on <charconv> / C++17.
 3988|    318|            const int saved_errno = errno;
 3989|    318|            errno = 0;
 3990|       |
 3991|    318|            char *end = nullptr;
 3992|       |
 3993|    318|            if (std::is_unsigned<T>::value)
  ------------------
  |  Branch (3993:17): [Folded, False: 318]
  ------------------
 3994|      0|            {
 3995|      0|                const unsigned long long parsed = std::strtoull(begin, &end, 0);
 3996|      0|                if (end == begin)
  ------------------
  |  Branch (3996:21): [True: 0, False: 0]
  ------------------
 3997|      0|                {
 3998|      0|                    errno = saved_errno;
 3999|      0|                    return false;
 4000|      0|                }
 4001|      0|                while (end != stop && std::isspace(static_cast<unsigned char>(*end)))
  ------------------
  |  Branch (4001:24): [True: 0, False: 0]
  |  Branch (4001:39): [True: 0, False: 0]
  ------------------
 4002|      0|                {
 4003|      0|                    ++end;
 4004|      0|                }
 4005|      0|                if (end != stop || errno == ERANGE ||
  ------------------
  |  Branch (4005:21): [True: 0, False: 0]
  |  Branch (4005:36): [True: 0, False: 0]
  ------------------
 4006|      0|                    parsed > static_cast<unsigned long long>(std::numeric_limits<T>::max()))
  ------------------
  |  Branch (4006:21): [True: 0, False: 0]
  ------------------
 4007|      0|                {
 4008|      0|                    errno = saved_errno;
 4009|      0|                    return false;
 4010|      0|                }
 4011|       |
 4012|      0|                destination = static_cast<T>(parsed);
 4013|      0|            }
 4014|    318|            else
 4015|    318|            {
 4016|    318|                const long long parsed = std::strtoll(begin, &end, 0);
 4017|    318|                if (end == begin)
  ------------------
  |  Branch (4017:21): [True: 32, False: 286]
  ------------------
 4018|     32|                {
 4019|     32|                    errno = saved_errno;
 4020|     32|                    return false;
 4021|     32|                }
 4022|    477|                while (end != stop && std::isspace(static_cast<unsigned char>(*end)))
  ------------------
  |  Branch (4022:24): [True: 219, False: 258]
  |  Branch (4022:39): [True: 191, False: 28]
  ------------------
 4023|    191|                {
 4024|    191|                    ++end;
 4025|    191|                }
 4026|    286|                if (end != stop || errno == ERANGE ||
  ------------------
  |  Branch (4026:21): [True: 28, False: 258]
  |  Branch (4026:36): [True: 0, False: 258]
  ------------------
 4027|    258|                    parsed < static_cast<long long>(std::numeric_limits<T>::min()) ||
  ------------------
  |  Branch (4027:21): [True: 52, False: 206]
  ------------------
 4028|    206|                    parsed > static_cast<long long>(std::numeric_limits<T>::max()))
  ------------------
  |  Branch (4028:21): [True: 6, False: 200]
  ------------------
 4029|     86|                {
 4030|     86|                    errno = saved_errno;
 4031|     86|                    return false;
 4032|     86|                }
 4033|       |
 4034|    200|                destination = static_cast<T>(parsed);
 4035|    200|            }
 4036|       |
 4037|    318|            errno = saved_errno;
 4038|    200|            return true;
 4039|    318|        }
_ZN4args11ValueReader23HasUnsignedNegativeSignIiEENSt3__19enable_ifIXoontsr3std11is_integralIT_EE5valuentsr3std11is_unsignedIS4_EE5valueEbE4typeERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 3954|    318|        {
 3955|    318|            return false;
 3956|    318|        }
_ZN4args9ValueFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEEC2ERNS_5GroupERKS7_SD_ONS_7MatcherESD_b:
 4139|  6.80k|            ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_ = T(), const bool extraError_ = false): ValueFlag(group_, name_, help_, std::move(matcher_), defaultValue_, extraError_ ? Options::Single : Options::None)
  ------------------
  |  Branch (4139:241): [True: 0, False: 6.80k]
  ------------------
 4140|  6.80k|            {
 4141|  6.80k|            }
_ZN4args9ValueFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEEC2ERNS_5GroupERKS7_SD_ONS_7MatcherESD_NS_7OptionsE:
 4134|  6.80k|            ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), value(defaultValue_), defaultValue(defaultValue_)
 4135|  6.80k|            {
 4136|  6.80k|                group_.Add(*this);
 4137|  6.80k|            }
_ZN4args9ValueFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEE5ResetEv:
 4164|  6.80k|            {
 4165|  6.80k|                ValueFlagBase::Reset();
 4166|  6.80k|                value = defaultValue;
 4167|  6.80k|            }
_ZNK4args9ValueFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEE16GetDefaultStringERKNS_10HelpParamsE:
 4125|  27.2k|            {
 4126|  27.2k|                return detail::ToString(defaultValue);
 4127|  27.2k|            }
_ZN4args6detail8ToStringINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEENS2_9enable_ifIXsr21IsConvertableToStringIT_EE5valueES8_E4typeERKSA_:
 1268|   108k|        {
 1269|   108k|            std::ostringstream s;
 1270|   108k|            s << value;
 1271|   108k|            return s.str();
 1272|   108k|        }
_ZN4args11ValueReaderclINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEENS2_9enable_ifIXsr3std13is_assignableIT_S8_EE5valueEbE4typeERKS8_SE_RSA_:
 4104|  7.28k|        {
 4105|  7.28k|            destination = value;
 4106|  7.28k|            return true;
 4107|  7.28k|        }
_ZN4args9ValueFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEED2Ev:
 4147|  6.80k|            virtual ~ValueFlag() {}
_ZN4args13ValueFlagListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEEC2ERNS_5GroupERKS7_SF_ONS_7MatcherERKNS1_6vectorIS7_NS5_IS7_EEEENS_7OptionsE:
 4481|  6.80k|                ValueFlagBase(name_, help_, std::move(matcher_), options_), values(defaultValues_), defaultValues(defaultValues_)
 4482|  6.80k|            {
 4483|  6.80k|                group_.Add(*this);
 4484|  6.80k|            }
_ZN4args13ValueFlagListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE5MatchERKNS_10EitherFlagE:
 4552|  3.32k|            {
 4553|  3.32k|                const bool wasMatched = Matched();
 4554|  3.32k|                auto me = FlagBase::Match(arg);
 4555|  3.32k|                if (me && !wasMatched)
  ------------------
  |  Branch (4555:21): [True: 567, False: 2.76k]
  |  Branch (4555:27): [True: 330, False: 237]
  ------------------
 4556|    330|                {
 4557|    330|                    values.clear();
 4558|    330|                }
 4559|  3.32k|                return me;
 4560|  3.32k|            }
_ZN4args13ValueFlagListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE5ResetEv:
 4546|  6.80k|            {
 4547|  6.80k|                ValueFlagBase::Reset();
 4548|  6.80k|                values = defaultValues;
 4549|  6.80k|            }
_ZNK4args13ValueFlagListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE4NameEv:
 4541|  18.7k|            {
 4542|  18.7k|                return name + std::string("...");
 4543|  18.7k|            }
_ZN4args13ValueFlagListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE10ParseValueERKNS1_6vectorIS7_NS5_IS7_EEEE:
 4489|    421|            {
 4490|    421|                const std::string &value_ = values_.at(0);
 4491|       |
 4492|    421|                T v{};
 4493|       |#ifdef ARGS_NOEXCEPT
 4494|       |                if (!reader(name, value_, v))
 4495|       |                {
 4496|       |                    error = Error::Parse;
 4497|       |                    return;
 4498|       |                }
 4499|       |#else
 4500|    421|                reader(name, value_, v);
 4501|    421|#endif
 4502|    421|                values.insert(std::end(values), v);
 4503|    421|            }
_ZN4args13ValueFlagListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEED2Ev:
 4486|  6.80k|            virtual ~ValueFlagList() {}
_ZN4args7MapFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiNS_11ValueReaderENS_6detail13unordered_mapEEC2ERNS_5GroupERKS7_SF_ONS_7MatcherERKNS1_13unordered_mapIS7_iNS1_4hashIS7_EENS1_8equal_toIS7_EENS5_INS1_4pairISE_iEEEEEERKib:
 4626|  6.80k|            MapFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map<K, T> &map_, const T &defaultValue_ = T(), const bool extraError_ = false): MapFlag(group_, name_, help_, std::move(matcher_), map_, defaultValue_, extraError_ ? Options::Single : Options::None)
  ------------------
  |  Branch (4626:266): [True: 0, False: 6.80k]
  ------------------
 4627|  6.80k|            {
 4628|  6.80k|            }
_ZN4args7MapFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiNS_11ValueReaderENS_6detail13unordered_mapEEC2ERNS_5GroupERKS7_SF_ONS_7MatcherERKNS1_13unordered_mapIS7_iNS1_4hashIS7_EENS1_8equal_toIS7_EENS5_INS1_4pairISE_iEEEEEERKiNS_7OptionsE:
 4621|  6.80k|            MapFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map<K, T> &map_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), map(map_), value(defaultValue_), defaultValue(defaultValue_)
 4622|  6.80k|            {
 4623|  6.80k|                group_.Add(*this);
 4624|  6.80k|            }
_ZN4args7MapFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiNS_11ValueReaderENS_6detail13unordered_mapEE5ResetEv:
 4703|  6.80k|            {
 4704|  6.80k|                ValueFlagBase::Reset();
 4705|  6.80k|                value = defaultValue;
 4706|  6.80k|            }
_ZNK4args7MapFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiNS_11ValueReaderENS_6detail13unordered_mapEE17GetChoicesStringsERKNS_10HelpParamsE:
 4615|  27.2k|            {
 4616|  27.2k|                return detail::MapKeysToStrings(map);
 4617|  27.2k|            }
_ZN4args6detail16MapKeysToStringsINSt3__113unordered_mapINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiNS2_4hashIS9_EENS2_8equal_toIS9_EENS7_INS2_4pairIKS9_iEEEEEEEENS2_6vectorIS9_NS7_IS9_EEEERKT_:
 1299|  27.2k|        {
 1300|  27.2k|            std::vector<std::string> res;
 1301|  27.2k|            using K = typename std::decay<decltype(std::begin(map)->first)>::type;
 1302|  27.2k|            if (IsConvertableToString<K>::value)
  ------------------
  |  Branch (1302:17): [True: 27.2k, Folded]
  ------------------
 1303|  27.2k|            {
 1304|  27.2k|                for (const auto &p : map)
  ------------------
  |  Branch (1304:36): [True: 81.6k, False: 27.2k]
  ------------------
 1305|  81.6k|                {
 1306|  81.6k|                    res.push_back(detail::ToString(p.first));
 1307|  81.6k|                }
 1308|       |
 1309|  27.2k|                std::sort(res.begin(), res.end());
 1310|  27.2k|            }
 1311|  27.2k|            return res;
 1312|  27.2k|        }
_ZN4args7MapFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiNS_11ValueReaderENS_6detail13unordered_mapEE10ParseValueERKNS1_6vectorIS7_NS5_IS7_EEEE:
 4637|    192|            {
 4638|    192|                const std::string &value_ = values_.at(0);
 4639|       |
 4640|    192|                K key{};
 4641|       |#ifdef ARGS_NOEXCEPT
 4642|       |                if (!reader(name, value_, key))
 4643|       |                {
 4644|       |                    error = Error::Parse;
 4645|       |                    return;
 4646|       |                }
 4647|       |#else
 4648|    192|                reader(name, value_, key);
 4649|    192|#endif
 4650|    192|                auto it = map.find(key);
 4651|    192|                if (it == std::end(map))
  ------------------
  |  Branch (4651:21): [True: 162, False: 30]
  ------------------
 4652|    162|                {
 4653|    162|                    std::ostringstream problem;
 4654|    162|                    problem << "Could not find key '" << key << "' in map for arg '" << name << "'";
 4655|       |#ifdef ARGS_NOEXCEPT
 4656|       |                    error = Error::Map;
 4657|       |                    errorMsg = problem.str();
 4658|       |#else
 4659|    162|                    throw MapError(problem.str());
 4660|    162|#endif
 4661|    162|                } else
 4662|     30|                {
 4663|     30|                    this->value = it->second;
 4664|     30|                }
 4665|    192|            }
_ZN4args8MapErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  525|    162|            MapError(const std::string &problem) : ParseError(problem) {}
_ZN4args7MapFlagINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiNS_11ValueReaderENS_6detail13unordered_mapEED2Ev:
 4634|  6.80k|            virtual ~MapFlag() {}
_ZN4args9ValueFlagIdNS_11ValueReaderEEC2ERNS_5GroupERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESD_ONS_7MatcherERKdb:
 4139|  6.80k|            ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_ = T(), const bool extraError_ = false): ValueFlag(group_, name_, help_, std::move(matcher_), defaultValue_, extraError_ ? Options::Single : Options::None)
  ------------------
  |  Branch (4139:241): [True: 0, False: 6.80k]
  ------------------
 4140|  6.80k|            {
 4141|  6.80k|            }
_ZN4args9ValueFlagIdNS_11ValueReaderEEC2ERNS_5GroupERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESD_ONS_7MatcherERKdNS_7OptionsE:
 4134|  6.80k|            ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), value(defaultValue_), defaultValue(defaultValue_)
 4135|  6.80k|            {
 4136|  6.80k|                group_.Add(*this);
 4137|  6.80k|            }
_ZN4args9ValueFlagIdNS_11ValueReaderEE5ResetEv:
 4164|  6.80k|            {
 4165|  6.80k|                ValueFlagBase::Reset();
 4166|  6.80k|                value = defaultValue;
 4167|  6.80k|            }
_ZNK4args9ValueFlagIdNS_11ValueReaderEE16GetDefaultStringERKNS_10HelpParamsE:
 4125|  27.2k|            {
 4126|  27.2k|                return detail::ToString(defaultValue);
 4127|  27.2k|            }
_ZN4args6detail8ToStringIdEENSt3__19enable_ifIXsr21IsConvertableToStringIT_EE5valueENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE4typeERKS4_:
 1268|  27.2k|        {
 1269|  27.2k|            std::ostringstream s;
 1270|  27.2k|            s << value;
 1271|  27.2k|            return s.str();
 1272|  27.2k|        }
_ZN4args9ValueFlagIdNS_11ValueReaderEE10ParseValueERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEE:
 4150|    186|            {
 4151|    186|                const std::string &value_ = values_.at(0);
 4152|       |
 4153|       |#ifdef ARGS_NOEXCEPT
 4154|       |                if (!reader(name, value_, this->value))
 4155|       |                {
 4156|       |                    error = Error::Parse;
 4157|       |                }
 4158|       |#else
 4159|    186|                reader(name, value_, this->value);
 4160|    186|#endif
 4161|    186|            }
_ZN4args11ValueReaderclIdEENSt3__19enable_ifIXntsr3std13is_assignableIT_NS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEE5valueEbE4typeERKSA_SE_RS4_:
 4085|    186|        {
 4086|    186|            const bool success = ParseNumericValue(value, destination);
 4087|    186|            if (!success)
  ------------------
  |  Branch (4087:17): [True: 48, False: 138]
  ------------------
 4088|     48|            {
 4089|       |#ifdef ARGS_NOEXCEPT
 4090|       |                (void)name;
 4091|       |                return false;
 4092|       |#else
 4093|     48|                std::ostringstream problem;
 4094|     48|                problem << "Argument '" << name << "' received invalid value type '" << value << "'";
 4095|     48|                throw ParseError(problem.str());
 4096|     48|#endif
 4097|     48|            }
 4098|    138|            return true;
 4099|    186|        }
_ZN4args11ValueReader17ParseNumericValueIdEENSt3__19enable_ifIXoooooooontsr3std11is_integralIT_EE5valuesr3std7is_sameIS4_bEE5valuesr3std7is_sameIS4_cEE5valuesr3std7is_sameIS4_aEE5valuesr3std7is_sameIS4_hEE5valueEbE4typeERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERS4_:
 4050|    186|        {
 4051|    186|            std::istringstream ss(value);
 4052|       |            // Pin parsing to the C locale so that the decimal separator and
 4053|       |            // thousands grouping behavior do not silently depend on whatever
 4054|       |            // std::locale::global was last set to elsewhere in the process.
 4055|       |            // Without this, e.g. "3.14" parses as 3 (with ".14" trailing) in
 4056|       |            // any locale whose numpunct facet treats ',' as the decimal point.
 4057|    186|            ss.imbue(std::locale::classic());
 4058|    186|            ss >> destination;
 4059|    186|            if (ss.fail())
  ------------------
  |  Branch (4059:17): [True: 20, False: 166]
  ------------------
 4060|     20|            {
 4061|     20|                return false;
 4062|     20|            }
 4063|       |
 4064|       |            // Check for trailing garbage by attempting to extract any remaining characters.
 4065|       |            // Do not use 'ss >> std::ws' followed by peek(), as std::ws can set failbit
 4066|       |            // on EOF, causing false rejection of valid input.
 4067|    166|            char extra = '\0';
 4068|    166|            ss >> std::ws >> extra;
 4069|       |            // If extraction succeeded, there's trailing garbage (return false).
 4070|       |            // If extraction failed due to EOF only (goodbit after ws extraction), it's valid (return true).
 4071|       |            // If extraction failed for other reasons, it's invalid (return false).
 4072|    166|            if (ss.fail())
  ------------------
  |  Branch (4072:17): [True: 138, False: 28]
  ------------------
 4073|    138|            {
 4074|       |                // Clear the failbit to check if EOF is the only issue
 4075|    138|                ss.clear(ss.rdstate() & ~std::ios::failbit);
 4076|    138|                return ss.eof();
 4077|    138|            }
 4078|       |            // Extraction succeeded, meaning there's trailing garbage
 4079|     28|            return false;
 4080|    166|        }
_ZN4args10PositionalINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEEC2ERNS_5GroupERKS7_SD_SD_NS_7OptionsE:
 4894|  6.80k|            Positional(Group &group_, const std::string &name_, const std::string &help_, const T &defaultValue_ = T(), Options options_ = {}): PositionalBase(name_, help_, options_), value(defaultValue_), defaultValue(defaultValue_)
 4895|  6.80k|            {
 4896|  6.80k|                group_.Add(*this);
 4897|  6.80k|            }
_ZN4args14PositionalBaseC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_NS_7OptionsE:
 1601|  13.6k|            PositionalBase(const std::string &name_, const std::string &help_, Options options_ = {}) : NamedBase(name_, help_, options_), ready(true) {}
_ZN4args14PositionalBase5ResetEv:
 1612|  13.6k|            {
 1613|  13.6k|                matched = false;
 1614|  13.6k|                ready = true;
 1615|       |#ifdef ARGS_NOEXCEPT
 1616|       |                error = Error::None;
 1617|       |                errorMsg.clear();
 1618|       |#endif
 1619|  13.6k|            }
_ZNK4args14PositionalBase8ValidateERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
 1638|  7.22k|            {
 1639|  7.22k|                if (IsRequired() && !Matched())
  ------------------
  |  Branch (1639:21): [True: 0, False: 7.22k]
  |  Branch (1639:37): [True: 0, False: 0]
  ------------------
 1640|      0|                {
 1641|      0|                    std::ostringstream problem;
 1642|      0|                    problem << "Option '" << Name() << "' is required";
 1643|       |#ifdef ARGS_NOEXCEPT
 1644|       |                    error = Error::Required;
 1645|       |                    errorMsg = problem.str();
 1646|       |#else
 1647|      0|                    throw RequiredError(problem.str());
 1648|      0|#endif
 1649|      0|                }
 1650|  7.22k|            }
_ZN4args14PositionalBase17GetNextPositionalEv:
 1622|  11.6k|            {
 1623|  11.6k|                return Ready() ? this : nullptr;
  ------------------
  |  Branch (1623:24): [True: 6.67k, False: 4.95k]
  ------------------
 1624|  11.6k|            }
_ZN4args14PositionalBase5ReadyEv:
 1605|  11.6k|            {
 1606|  11.6k|                return ready;
 1607|  11.6k|            }
_ZNK4args14PositionalBase13HasPositionalEv:
 1627|  20.4k|            {
 1628|  20.4k|                return true;
 1629|  20.4k|            }
_ZNK4args14PositionalBase14GetProgramLineERKNS_10HelpParamsE:
 1632|  54.4k|            {
 1633|  54.4k|                return { IsRequired() ? params.proglineRequiredOpen + Name() + params.proglineRequiredClose
  ------------------
  |  Branch (1633:26): [True: 0, False: 54.4k]
  ------------------
 1634|  54.4k|                                      : params.proglineNonrequiredOpen + Name() + params.proglineNonrequiredClose };
 1635|  54.4k|            }
_ZN4args10PositionalINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEE5ResetEv:
 4956|  6.80k|            {
 4957|  6.80k|                PositionalBase::Reset();
 4958|  6.80k|                value = defaultValue;
 4959|  6.80k|            }
_ZN4args10PositionalINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEE10ParseValueERKS7_:
 4906|  1.71k|            {
 4907|       |#ifdef ARGS_NOEXCEPT
 4908|       |                if (!reader(name, value_, this->value))
 4909|       |                {
 4910|       |                    error = Error::Parse;
 4911|       |                    return;
 4912|       |                }
 4913|       |#else
 4914|  1.71k|                reader(name, value_, this->value);
 4915|  1.71k|#endif
 4916|  1.71k|                ready = false;
 4917|  1.71k|                matched = true;
 4918|  1.71k|            }
_ZN4args10PositionalINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11ValueReaderEED2Ev:
 4903|  6.80k|            virtual ~Positional() {}
_ZN4args14PositionalListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEEC2ERNS_5GroupERKS7_SF_RKNS1_6vectorIS7_NS5_IS7_EEEENS_7OptionsE:
 4994|  6.80k|            PositionalList(Group &group_, const std::string &name_, const std::string &help_, const Container &defaultValues_ = Container(), Options options_ = {}): PositionalBase(name_, help_, options_), values(defaultValues_), defaultValues(defaultValues_)
 4995|  6.80k|            {
 4996|  6.80k|                group_.Add(*this);
 4997|  6.80k|            }
_ZN4args14PositionalListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE17GetNextPositionalEv:
 5068|  4.95k|            {
 5069|  4.95k|                const bool wasMatched = Matched();
 5070|  4.95k|                auto me = PositionalBase::GetNextPositional();
 5071|  4.95k|                if (me && !wasMatched)
  ------------------
  |  Branch (5071:21): [True: 4.95k, False: 0]
  |  Branch (5071:27): [True: 1.35k, False: 3.60k]
  ------------------
 5072|  1.35k|                {
 5073|  1.35k|                    values.clear();
 5074|  1.35k|                }
 5075|  4.95k|                return me;
 5076|  4.95k|            }
_ZN4args14PositionalListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE5ResetEv:
 5062|  6.80k|            {
 5063|  6.80k|                PositionalBase::Reset();
 5064|  6.80k|                values = defaultValues;
 5065|  6.80k|            }
_ZNK4args14PositionalListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE4NameEv:
 5022|  54.4k|            {
 5023|  54.4k|                return name + std::string("...");
 5024|  54.4k|            }
_ZN4args14PositionalListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEE10ParseValueERKS7_:
 5006|  4.95k|            {
 5007|  4.95k|                T v{};
 5008|       |#ifdef ARGS_NOEXCEPT
 5009|       |                if (!reader(name, value_, v))
 5010|       |                {
 5011|       |                    error = Error::Parse;
 5012|       |                    return;
 5013|       |                }
 5014|       |#else
 5015|  4.95k|                reader(name, value_, v);
 5016|  4.95k|#endif
 5017|  4.95k|                values.insert(std::end(values), v);
 5018|  4.95k|                matched = true;
 5019|  4.95k|            }
_ZN4args14PositionalListINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_6detail6vectorENS_11ValueReaderEED2Ev:
 5003|  6.80k|            virtual ~PositionalList() {}

LLVMFuzzerTestOneInput:
   70|  6.80k|{
   71|  6.80k|    FuzzedDataProvider fdp(data, size);
   72|       |
   73|       |    // -- Schema, with fuzzer-varied text --------------------------------------
   74|  6.80k|    args::ArgumentParser parser(fdp.ConsumeRandomLengthString(64),
   75|  6.80k|                                fdp.ConsumeRandomLengthString(64));
   76|       |
   77|  6.80k|    try
   78|  6.80k|    {
   79|  6.80k|        parser.LongPrefix(kLongPrefixes[fdp.ConsumeIntegralInRange<size_t>(0, ArraySize(kLongPrefixes) - 1)]);
   80|  6.80k|        parser.ShortPrefix(kShortPrefixes[fdp.ConsumeIntegralInRange<size_t>(0, ArraySize(kShortPrefixes) - 1)]);
   81|  6.80k|        parser.LongSeparator(kLongSeparators[fdp.ConsumeIntegralInRange<size_t>(0, ArraySize(kLongSeparators) - 1)]);
   82|  6.80k|        parser.Terminator(kTerminators[fdp.ConsumeIntegralInRange<size_t>(0, ArraySize(kTerminators) - 1)]);
   83|  6.80k|    }
   84|  6.80k|    catch (...)
   85|  6.80k|    {
   86|      0|    }
   87|       |
   88|  6.80k|    args::HelpFlag help(parser, "help", "Displays this help menu", {'h', "help"});
   89|       |
   90|  6.80k|    args::Options flagOptions = args::Options::None;
   91|  6.80k|    switch (fdp.ConsumeIntegralInRange<unsigned>(0, 3))
   92|  6.80k|    {
   93|  1.04k|        case 1:
  ------------------
  |  Branch (93:9): [True: 1.04k, False: 5.75k]
  ------------------
   94|  1.04k|            flagOptions = args::Options::HiddenFromDescription;
   95|  1.04k|            break;
   96|  1.09k|        case 2:
  ------------------
  |  Branch (96:9): [True: 1.09k, False: 5.70k]
  ------------------
   97|  1.09k|            flagOptions = args::Options::HiddenFromUsage;
   98|  1.09k|            break;
   99|  1.39k|        case 3:
  ------------------
  |  Branch (99:9): [True: 1.39k, False: 5.40k]
  ------------------
  100|  1.39k|            flagOptions = args::Options::Hidden;
  101|  1.39k|            break;
  102|  3.26k|        default:
  ------------------
  |  Branch (102:9): [True: 3.26k, False: 3.53k]
  ------------------
  103|  3.26k|            break;
  104|  6.80k|    }
  105|       |
  106|  6.80k|    args::Flag alpha(parser, "alpha", fdp.ConsumeRandomLengthString(64), {'a', "alpha"}, flagOptions);
  107|  6.80k|    args::CounterFlag beta(parser, "beta", fdp.ConsumeRandomLengthString(64), {'b', "beta"}, 0, flagOptions);
  108|  6.80k|    args::ValueFlag<int> number(parser, "number", fdp.ConsumeRandomLengthString(64), {'n', "number"}, fdp.ConsumeIntegral<int>());
  109|  6.80k|    args::ValueFlag<std::string> text(parser, "text", fdp.ConsumeRandomLengthString(64), {"text"}, fdp.ConsumeRandomLengthString(24));
  110|  6.80k|    args::ValueFlagList<std::string> words(parser, "words", fdp.ConsumeRandomLengthString(64), {'w', "words"});
  111|       |
  112|       |    // Must be std::unordered_map: MapFlag's Map template parameter defaults
  113|       |    // to args::detail::unordered_map and std::map does not convert.
  114|  6.80k|    const std::unordered_map<std::string, int> choices{{"red", 1}, {"green", 2}, {"blue", 3}};
  115|  6.80k|    args::MapFlag<std::string, int> colour(parser, "colour", fdp.ConsumeRandomLengthString(64), {'c', "colour"}, choices);
  116|       |
  117|  6.80k|    args::Group group(parser, fdp.ConsumeRandomLengthString(32),
  118|  6.80k|                      kGroupValidators[fdp.ConsumeIntegralInRange<size_t>(0, ArraySize(kGroupValidators) - 1)]);
  119|  6.80k|    args::ValueFlag<double> gamma(group, "gamma", fdp.ConsumeRandomLengthString(64), {'g', "gamma"}, 0.5);
  120|  6.80k|    args::Flag delta(group, "delta", fdp.ConsumeRandomLengthString(64), {'d'});
  121|       |
  122|  6.80k|    args::Positional<std::string> source(parser, "source", fdp.ConsumeRandomLengthString(64));
  123|  6.80k|    args::PositionalList<std::string> extra(parser, "extra", fdp.ConsumeRandomLengthString(64));
  124|       |
  125|       |    // -- Every HelpParams field, including pathological narrow widths ---------
  126|  6.80k|    parser.helpParams.width = fdp.ConsumeIntegralInRange<unsigned>(0, 300);
  127|  6.80k|    parser.helpParams.progindent = fdp.ConsumeIntegralInRange<unsigned>(0, 16);
  128|  6.80k|    parser.helpParams.progtailindent = fdp.ConsumeIntegralInRange<unsigned>(0, 16);
  129|  6.80k|    parser.helpParams.descriptionindent = fdp.ConsumeIntegralInRange<unsigned>(0, 16);
  130|  6.80k|    parser.helpParams.flagindent = fdp.ConsumeIntegralInRange<unsigned>(0, 24);
  131|  6.80k|    parser.helpParams.helpindent = fdp.ConsumeIntegralInRange<unsigned>(0, 96);
  132|  6.80k|    parser.helpParams.eachgroupindent = fdp.ConsumeIntegralInRange<unsigned>(0, 8);
  133|  6.80k|    parser.helpParams.gutter = fdp.ConsumeIntegralInRange<unsigned>(0, 8);
  134|  6.80k|    parser.helpParams.showTerminator = fdp.ConsumeBool();
  135|  6.80k|    parser.helpParams.showProglineOptions = fdp.ConsumeBool();
  136|  6.80k|    parser.helpParams.showProglinePositionals = fdp.ConsumeBool();
  137|  6.80k|    parser.helpParams.showCommandChildren = fdp.ConsumeBool();
  138|  6.80k|    parser.helpParams.showCommandFullHelp = fdp.ConsumeBool();
  139|  6.80k|    parser.helpParams.proglineShowFlags = fdp.ConsumeBool();
  140|  6.80k|    parser.helpParams.proglinePreferShortFlags = fdp.ConsumeBool();
  141|  6.80k|    parser.helpParams.useValueNameOnce = fdp.ConsumeBool();
  142|  6.80k|    parser.helpParams.showValueName = fdp.ConsumeBool();
  143|  6.80k|    parser.helpParams.addNewlineBeforeDescription = fdp.ConsumeBool();
  144|  6.80k|    parser.helpParams.addChoices = fdp.ConsumeBool();
  145|  6.80k|    parser.helpParams.addDefault = fdp.ConsumeBool();
  146|  6.80k|    parser.helpParams.programName = fdp.ConsumeRandomLengthString(24);
  147|  6.80k|    parser.helpParams.usageString = fdp.ConsumeRandomLengthString(24);
  148|  6.80k|    parser.helpParams.optionsString = fdp.ConsumeRandomLengthString(24);
  149|  6.80k|    parser.helpParams.proglineOptions = fdp.ConsumeRandomLengthString(16);
  150|  6.80k|    parser.helpParams.proglineCommand = fdp.ConsumeRandomLengthString(16);
  151|  6.80k|    parser.helpParams.valueOpen = fdp.ConsumeRandomLengthString(8);
  152|  6.80k|    parser.helpParams.valueClose = fdp.ConsumeRandomLengthString(8);
  153|  6.80k|    parser.helpParams.choiceString = fdp.ConsumeRandomLengthString(16);
  154|  6.80k|    parser.helpParams.defaultString = fdp.ConsumeRandomLengthString(16);
  155|       |
  156|       |    // -- Parse a token mix so rendering runs against varied matched state -----
  157|  6.80k|    const size_t tokenCount = fdp.ConsumeIntegralInRange<size_t>(0, 8);
  158|  6.80k|    std::vector<std::string> argv;
  159|  6.80k|    argv.reserve(tokenCount);
  160|  21.1k|    for (size_t i = 0; i < tokenCount; ++i)
  ------------------
  |  Branch (160:24): [True: 14.3k, False: 6.80k]
  ------------------
  161|  14.3k|    {
  162|  14.3k|        if (fdp.ConsumeBool())
  ------------------
  |  Branch (162:13): [True: 4.43k, False: 9.91k]
  ------------------
  163|  4.43k|        {
  164|  4.43k|            argv.emplace_back(kTokens[fdp.ConsumeIntegralInRange<size_t>(0, ArraySize(kTokens) - 1)]);
  165|  4.43k|        }
  166|  9.91k|        else
  167|  9.91k|        {
  168|  9.91k|            argv.emplace_back(fdp.ConsumeRandomLengthString(16));
  169|  9.91k|        }
  170|  14.3k|    }
  171|       |
  172|  6.80k|    try
  173|  6.80k|    {
  174|  6.80k|        parser.ParseArgs(argv);
  175|  6.80k|    }
  176|  6.80k|    catch (...)
  177|  6.80k|    {
  178|  3.19k|    }
  179|       |
  180|       |    // -- Render through every help path ----------------------------------------
  181|  6.80k|    g_sink += parser.Help().size();
  182|       |
  183|  6.80k|    std::ostringstream stream;
  184|  6.80k|    stream << parser;
  185|  6.80k|    g_sink += stream.str().size();
  186|       |
  187|  6.80k|    g_sink += parser.GetDescription(parser.helpParams, 0).size();
  188|  6.80k|    g_sink += parser.GetProgramLine(parser.helpParams).size();
  189|       |
  190|       |    // Re-render with flipped boolean toggles to hit the alternate branches.
  191|  6.80k|    parser.helpParams.addChoices = !parser.helpParams.addChoices;
  192|  6.80k|    parser.helpParams.addDefault = !parser.helpParams.addDefault;
  193|  6.80k|    parser.helpParams.addNewlineBeforeDescription = !parser.helpParams.addNewlineBeforeDescription;
  194|  6.80k|    g_sink += parser.Help().size();
  195|       |
  196|  6.80k|    return 0;
  197|  6.80k|}
help_render_fuzzer.cpp:_ZN12_GLOBAL__N_19ArraySizeIKPKcLm4EEEmRAT0__T_:
   63|  13.6k|{
   64|  13.6k|    return N;
   65|  13.6k|}
help_render_fuzzer.cpp:_ZN12_GLOBAL__N_19ArraySizeIKPKcLm3EEEmRAT0__T_:
   63|  13.6k|{
   64|  13.6k|    return N;
   65|  13.6k|}
help_render_fuzzer.cpp:_ZN12_GLOBAL__N_19ArraySizeIKPFbRKN4args5GroupEELm5EEEmRAT0__T_:
   63|  6.80k|{
   64|  6.80k|    return N;
   65|  6.80k|}
help_render_fuzzer.cpp:_ZN12_GLOBAL__N_19ArraySizeIKPKcLm27EEEmRAT0__T_:
   63|  4.43k|{
   64|  4.43k|    return N;
   65|  4.43k|}

