





<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

  

  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-6448649c7147.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-42fc7e3b06b7.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-d17b946fc2c5.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-1b924088c83a.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-6448649c7147.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-42fc7e3b06b7.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-44cfaf0c8f7b.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-979217efd93e.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-4d5383026bfa.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-ff6ff8532348.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-d17b946fc2c5.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-1b924088c83a.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-654786382462.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-ecca008c6f6e.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-fff376053989.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-49adf52571e5.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-66d97c13c98a.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-c58f1d0432b9.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-dc7ca6859caf.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-f96b923db733.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-241f81e44892.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-086c1af66525.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-5d735668c600.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["alternate_user_config_repo","api_insights_show_missing_data_banner","attestations_filtering","attestations_sorting","billing_fixed_amount_metered_configured_discounts","billing_use_current_discounts_list_dialog_v2","client_version_header","codespaces_prebuild_region_target_update","contact_requests_implicit_opt_in","contact_sales_locale_utm_medium","contentful_lp_enterprise","contentful_lp_footnotes","copilot_agent_cli_public_preview","copilot_agent_tasks_btn_code_nav","copilot_agent_tasks_btn_code_view","copilot_agent_tasks_btn_code_view_lines","copilot_agent_tasks_btn_file_reference","copilot_api_agentic_issue_marshal_yaml","copilot_api_draft_issue_code_search","copilot_chat_attach_multiple_images","copilot_chat_file_redirect","copilot_chat_multi_file_picker_attachment","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_skip_thread_create","copilot_coding_agent_diff_stats","copilot_coding_agent_ga","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_deprecation_notice","copilot_features_raycast_logo","copilot_free_to_paid_telem","copilot_ftp_hyperspace_upgrade_prompt","copilot_ftp_settings_upgrade","copilot_ftp_upgrade_to_pro_from_models","copilot_ftp_your_copilot_settings","copilot_global_overlay_v2","copilot_immersive_agent_branch_selection","copilot_immersive_structured_model_picker","copilot_loops_share_button","copilot_no_floating_button","copilot_read_shared_conversation","copilot_show_copilot_sub_issues_button_on_issues_page","copilot_spaces_ga","copilot_spark_allow_empty_commit","copilot_spark_loading_webgl","copilot_spark_progressive_error_handling","copilot_spark_read_iteration_history_from_git_v2","copilot_spark_single_user_iteration","copilot_spark_use_billing_headers","copilot_spark_write_iteration_history_to_git","copilot_stable_conversation_view","copilot_workbench_agent_seed_tool","copilot_workbench_cache","copilot_workbench_connection_reload_banner","copilot_workbench_preview_analytics","copilot_workbench_ratelimit_fallback","copilot_workbench_refresh_on_wsod","copilot_workbench_synthetic_generation","dashboard_public_preview","direct_to_salesforce","dotcom_chat_client_side_skills","failbot_report_error_react_apps_on_page","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","global_search_multi_orgs","hpc_improve_dom_insertion_observer","hyperspace_diff_view","inp_reduced_threshold","insert_before_patch","issue_fields_report_usage","issues_copilot_cross_repo_assign","issues_react_blur_item_picker_on_close","issues_react_bots_timeline_pagination","issues_react_prohibit_title_fallback","issues_react_remove_placeholders","issues_sticky_sidebar","lifecycle_label_name_updates","link_contact_sales_swp_marketo","marketing_pages_search_explore_provider","mcp_registry_install","memex_mwl_filter_field_delimiter","migrate_toasts_to_banners_web_notifications","new_traffic_page_banner","override_pulse_legacy_url","primer_react_segmented_control_tooltip","primer_react_unified_portal_root","record_sso_banner_metrics","releases_update_ref_selector","remove_child_patch","repos_insights_remove_new_url","sample_network_conn_type","scheduled_reminders_updated_limits","show_edit_on_default_option","site_homepage_collaborate_video","site_homepage_contentful","site_msbuild_webgl_hero","spark_commit_on_default_branch","spark_show_data_access_on_publish","spark_sync_repository_after_iteration","viewscreen_sandbox","webp_support","workbench_default_sonnet4","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"}</script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/high-contrast-cookie-f3788027bd8d.js"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-05fab4483803.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-468bf7cab607.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_stacktrace-parser_dist_stack-trace-parser_esm_js-node_modules_github_bro-2f4e04-280c10ec004d.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-c8eeba-690858154b11.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/environment-e36acb721009.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-7e8c9c5d642d.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-c98257dc79a7.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-7e4d99c9171d.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-0d7d60-b5d92aad9108.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-754f5b5e9e7e.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-fd008e5636c7.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_markdown-toolbar-element_dist_index_js-d41270eb61be.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-c63e9a-b1f4633cac7f.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-e1b8d79d7efc.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-14ed8f0f364a.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_hydro-analytics-c-2a6094-2f3b5bfd7e3b.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-bb80ec-4e90f1d1076c.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-06c8637a6071.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_morphdom_dist_morphdom-esm_js-node_modules_swc_helpers_esm__define_property_js-5c587dccb470.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-8eb9b2209bcd.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-cd5d89ebdb50.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-590a09-91fdc8802bfa.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_document-metadata_document-metadata_ts-packages_failbot_failbot_ts-b8e9eefcce78.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_updatable-content_updatable-content_ts-a743e72edcf2.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_details-6493f1-b7112815a1fc.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_throttled-input_ts-047775-82bfe789bb2f.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-6bc7a8849328.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-6206313cbfca.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-ef6d0f-60422ea0562f.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-f5c28dea1388.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-68db5c96d18f.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-core-f6571bc10d64.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-17ccbc80f53b.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-0f0d82031c98.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-1fff13-a67dacb6db80.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_mutation_js-node_modules_tanstack_query-9bf7e4-a1bacdef8ef2.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-node_modules_tanstack_re-d87a32-ae1d44ebdc99.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_es_mjs-0294cfa498e7.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-362960c8d059.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_date-fns_format_mjs-f7e5dd4e3ebd.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_date-fns_addWeeks_mjs-node_modules_date-fns_addYears_mjs-node_modules_da-827f4f-6af178f555c7.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_focus-visible_dist_focus-visible_js-node_modules_lodash-es__isIterateeCa-89abd9-7de41e04a69d.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lodash-es__Stack_js-node_modules_lodash-es__Uint8Array_js-node_modules_l-4faaa6-95511fe13c4b.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_hotkey_dist_index_js-node_modules_date-fns_getDaysInMonth_mjs-nod-70c11b-a672e4dfe08c.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dnd-kit_modifiers_dist_modifiers_esm_js-node_modules_dnd-kit_sortable_di-72228e-99b95b9fca56.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_swc_helpers_esm__define_property_js-node_modules_lodash-es__getAllKeys_j-86c8c2-f6bac8d2298f.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-labs_react_index_js-node_modules_primer_styled-react_dist_index_js-n-bd78aa-c3a39023be55.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_react-virtual_dist_esm_index_js-4f7c027617ef.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_react-relay_index_js-065619a68bd6.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_devlop_lib_default_js-node_modules_mdast-util-from-markdown_lib_index_js-cf17bf-18805d9f38c0.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_mdast-util-gfm_lib_index_js-node_modules_micromark-extension-gfm_index_js-f82ed5454897.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_react-query_build_modern_useQuery_js-node_modules_diff_lib_index_mjs-1bcf85319d2e.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_codemirror_language_dist_index_js-25bc92f8b249.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_codemirror_commands_dist_index_js-fc88b7eb887d.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_accname_dist_access-a25db5-11cb217a85c0.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_g-emoji-element_dist_index_js-node_modules_github_paste-markdown_-822ce0-d860c7606caa.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_catalyst_lib_index_js-node_modules_tanstack_react-query_build_mod-d1dec4-35875fa03af6.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_react-relay_hooks_js-n-b61e95-eacf4d2d0856.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_paths_index_ts-d081d9ba79fa.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_ui-commands_ui-commands_ts-b249d617ed70.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_date-picker_components_DatePicker_tsx-7f759ec8feaf.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_drag-and-drop_drag-and-drop_ts-packages_hydro-analytics_hydro-analytics_ts-0828fc3feb11.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_list-view_src_hooks_use-next-header-tag_ts-packages_list-view_src_ListItem_ListItem_-055669-e6bf905bdc94.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_filter_utils_index_ts-packages_fuzzy-score_fuzzy-score_ts-packages_use-analytics_use-efa20b-5d1703faff8e.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_ref-selector_RefSelector_tsx-bff3ae3032b3.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_filter_Filter_tsx-2bac6951647f.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_filter_providers_index_ts-f80cbf6dd3dd.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_copilot-chat_utils_copilot-local-storage_ts-eea6f3967556.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_copilot-chat_components_tracing_TraceProvider_tsx-3726f2487f8a.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_copilot-chat_utils_CopilotChatContext_tsx-packages_safe-html_VerifiedHTML_tsx-41abf46cfa56.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_item-picker_components_RepositoryPicker_tsx-d3f5cc6a8cfd.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_history_history_ts-packages_relay-environment_relay-environment_ts-packages_soft-nav-319348-c9c2aaef2f33.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_use-client-value_use-client-value_ts-packages_issue-create_dialog_CreateIssueDialogE-b1118b-860f13ff3f37.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_commenting_constants_values_ts-packages_document-metadata_document-metadata_ts-packa-c2a275-38f331739eb4.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_query-builder-element_query-builder-element_ts-90f5f83e2407.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_app-uuid_app-uuid_ts-packages_signed-commit-badge_index_ts-9d3ba26bd176.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_markdown-viewer_NewMarkdownViewer_tsx-85d8ca0a38f6.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_issue-viewer_components_IssueViewer_tsx-packages_issue-viewer_contexts_IssueViewerCo-d82ffd-21a88e5fca01.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/issues-react-42fce8258e57.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.ad9424369aeb6fec9e91.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/packages_use-client-value_use-client-value_ts-packages_issue-create_dialog_CreateIssueDialogE-b1118b.d4dce839d5be6a06a629.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/packages_issue-viewer_components_IssueViewer_tsx-packages_issue-viewer_contexts_IssueViewerCo-d82ffd.25a2356115e75c2ea92c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/issues-react.2518c0f34c6486b8a47c.module.css" />
  
  <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-labs_react_index_js-node_modules_primer_styled-react_dist_index_js-n-6066db-b92ee15c1e46.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/packages_notifications-subscriptions-menu_entry_ts-packages_promise-with-resolvers-polyfill_p-df0233-37157a955eee.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-113a2e7708e8.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.44a4ce5e60cfd5c27b1a.module.css" />


  <title>Grammar railroad diagram · Issue #6742 · cplusplus/draft · GitHub</title>



  <meta name="route-pattern" content="/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)" data-turbo-transient>
  <meta name="route-controller" content="voltron_issues_fragments" data-turbo-transient>
  <meta name="route-action" content="issue_layout" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:98b5d273-0292-f42e-0a79-a021c09deed5">

    
  <meta name="current-catalog-service-hash" content="81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114">


  <meta name="request-id" content="A76C:34994D:587886:6F5C52:68D9E60B" data-pjax-transient="true"/><meta name="html-safe-nonce" content="e94e3466346ef71e08e36f80174cbdb2803d13b63ca4513264115ae6d46ff5a0" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBNzZDOjM0OTk0RDo1ODc4ODY6NkY1QzUyOjY4RDlFNjBCIiwidmlzaXRvcl9pZCI6IjUxNjkxNzY2MTA2MTMwOTM4OTkiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="784541c4167fcb60a3c695e0bc71bbdcc0ac438c6237479df2d743a4e8c91529" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="issue:2054070525" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,issues,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_issues" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />

  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/voltron/issues_fragments/issue_layout" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="Using https://github.com/mingodad/squilu to extract the {bnf} sections from all *.tex files and convert then to an EBNF understood by https://www.bottlecaps.de/rr/ui we can have a nice navigable railroad diagram (see bellow the resulting...">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/cplusplus/draft/6742/issue_layout" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/4b61d2ed011c43bc8d06b7de7d73b07e7ec8479a2d115eb445733c3b30ebab86/cplusplus/draft/issues/6742" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Grammar railroad diagram · Issue #6742 · cplusplus/draft" /><meta name="twitter:description" content="Using https://github.com/mingodad/squilu to extract the {bnf} sections from all *.tex files and convert then to an EBNF understood by https://www.bottlecaps.de/rr/ui we can have a nice navigable ra..." />
  <meta property="og:image" content="https://opengraph.githubassets.com/4b61d2ed011c43bc8d06b7de7d73b07e7ec8479a2d115eb445733c3b30ebab86/cplusplus/draft/issues/6742" /><meta property="og:image:alt" content="Using https://github.com/mingodad/squilu to extract the {bnf} sections from all *.tex files and convert then to an EBNF understood by https://www.bottlecaps.de/rr/ui we can have a nice navigable ra..." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="Grammar railroad diagram · Issue #6742 · cplusplus/draft" /><meta property="og:url" content="https://github.com/cplusplus/draft/issues/6742" /><meta property="og:description" content="Using https://github.com/mingodad/squilu to extract the {bnf} sections from all *.tex files and convert then to an EBNF understood by https://www.bottlecaps.de/rr/ui we can have a nice navigable ra..." /><meta property="og:author:username" content="mingodad" />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="dd202cb24f90d89deaf3e8e69642cdff0d2e68574fad1096fbc499fa8a21ec5e" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="c922ef32c4ab94f8b870c62883f3e41755ec705db76ec4efb0d343458f1e28c7" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="52346ecdf234263f0a160a1d59dfd68544fb261b3a40e29f8f2743954a4f97b7" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="d5cda63bc195379679efe760b7e522dbde89536cddd557090ecf546cfc73bcae" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="voltron-timing" value="576">
    <script type="application/ld+json">{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Grammar railroad diagram","articleBody":"Using https://github.com/mingodad/squilu to extract the `{bnf}` sections from all `*.tex` files and convert then to an `EBNF` understood by https://www.bottlecaps.de/rr/ui we can have a nice navigable railroad diagram (see bellow the resulting `EBNF` and instructions to visualize the railroad diagram).\r\n\r\n```\r\n//\r\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\r\n//\r\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\r\n// then click the 'View Diagram' tab.\r\n//\r\n\r\n//\r\n//To facilitate start navigating\r\n//\r\n\r\ncplusplus ::=\r\n\tpreprocessing-file? translation-unit\r\n\r\n//== lex.tex\r\n\r\nn-char ::=\r\n     \"{any member of the translation character set except the \\unicode{007d}{right curly bracket} or new-line character}\"\r\n\r\nn-char-sequence ::=\r\n    n-char\r\n  | n-char-sequence n-char\r\n\r\nnamed-universal-character ::=\r\n    \"\\N{\" n-char-sequence \"}\"\r\n\r\nhex-quad ::=\r\n    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit\r\n\r\nsimple-hexadecimal-digit-sequence ::=\r\n    hexadecimal-digit\r\n  | simple-hexadecimal-digit-sequence hexadecimal-digit\r\n\r\nuniversal-character-name ::=\r\n    \"\\u\" hex-quad\r\n  | \"\\U\" hex-quad hex-quad\r\n  | \"\\u{\" simple-hexadecimal-digit-sequence \"}\"\r\n  | named-universal-character\r\n\r\npreprocessing-token ::=\r\n    header-name\r\n  | \"import\"\r\n  | \"module\"\r\n  | \"export\"\r\n  | identifier\r\n  | pp-number\r\n  | character-literal\r\n  | user-defined-character-literal\r\n  | string-literal\r\n  | user-defined-string-literal\r\n  | preprocessing-op-or-punc\r\n  | \"{each non-whitespace character that cannot be one of the above}\"\r\n\r\n//token ::=\r\n//    identifier\r\n//  | keyword\r\n//  | literal\r\n//  | operator-or-punctuator\r\n\r\nheader-name ::=\r\n    \"\u003c\" h-char-sequence \"\u003e\"\r\n  | '\"' q-char-sequence '\"'\r\n\r\nh-char-sequence ::=\r\n    h-char\r\n  | h-char-sequence h-char\r\n\r\nh-char ::=\r\n    \"{any member of the translation character set except new-line and \\unicode{003e}{greater-than sign}}\"\r\n\r\nq-char-sequence ::=\r\n    q-char\r\n  | q-char-sequence q-char\r\n\r\nq-char ::=\r\n    \"{any member of the translation character set except new-line and \\unicode{0022}{quotation mark}}\"\r\n\r\npp-number ::=\r\n    digit\r\n  | \".\" digit\r\n  | pp-number identifier-continue\r\n  | pp-number \"'\" digit\r\n  | pp-number \"'\" nondigit\r\n  | pp-number \"e\" sign\r\n  | pp-number \"E\" sign\r\n  | pp-number \"p\" sign\r\n  | pp-number \"P\" sign\r\n  | pp-number \".\"\r\n\r\nidentifier ::=\r\n    identifier-start\r\n  | identifier identifier-continue\r\n\r\nidentifier-start ::=\r\n    nondigit\r\n  | \"{an element of the translation character set with the Unicode property XID_Start}\"\r\n\r\nidentifier-continue ::=\r\n    digit\r\n  | nondigit\r\n  | \"{an element of the translation character set with the Unicode property XID_Continue}\"\r\n\r\nnondigit ::=\r\n    \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\" | \"g\" | \"h\" | \"i\" | \"j\" | \"k\" | \"l\" | \"m\"\r\n  | \"n\" | \"o\" | \"p\" | \"q\" | \"r\" | \"s\" | \"t\" | \"u\" | \"v\" | \"w\" | \"x\" | \"y\" | \"z\"\r\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\" | \"G\" | \"H\" | \"I\" | \"J\" | \"K\" | \"L\" | \"M\"\r\n  | \"N\" | \"O\" | \"P\" | \"Q\" | \"R\" | \"S\" | \"T\" | \"U\" | \"V\" | \"W\" | \"X\" | \"Y\" | \"Z\" | \"_\"\r\n\r\ndigit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n\r\nkeyword ::=\r\n    \"{any identifier listed in lex.key}\"\r\n  | \"import\"\r\n  | \"module\"\r\n  | \"export\"\r\n\r\npreprocessing-op-or-punc ::=\r\n    preprocessing-operator\r\n  | operator-or-punctuator\r\n\r\npreprocessing-operator ::=\r\n    \"#\" | \"##\" | \"%:\" | \"%:%:\"\r\n\r\noperator-or-punctuator ::=\r\n    \"{\" | \"}\" | \"[\" | \"]\" | \"(\" | \")\"\r\n  | \"\u003c:\" | \":\u003e\" | \"\u003c%\" | \"%\u003e\" | \";\" | \":\" | \"...\"\r\n  | \"?\" | \"::\" | \".\" | \".*\" | \"-\u003e\" | \"-\u003e*\" | \"~\"\r\n  | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\" | \"|\"\r\n  | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\" | \"|=\"\r\n  | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u003c=\u003e\" | \"\u0026\u0026\" | \"||\"\r\n  | \"\u003c\u003c\" | \"\u003e\u003e\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"++\" | \"--\" | \",\"\r\n  | \"and\" | \"or\" | \"xor\" | \"not\" | \"bitand\" | \"bitor\" | \"compl\"\r\n  | \"and_eq\" | \"or_eq\" | \"xor_eq\" | \"not_eq\"\r\n\r\nliteral ::=\r\n    integer-literal\r\n  | character-literal\r\n  | floating-point-literal\r\n  | string-literal\r\n  | boolean-literal\r\n  | pointer-literal\r\n  | user-defined-literal\r\n\r\ninteger-literal ::=\r\n    binary-literal integer-suffix?\r\n  | octal-literal integer-suffix?\r\n  | decimal-literal integer-suffix?\r\n  | hexadecimal-literal integer-suffix?\r\n\r\nbinary-literal ::=\r\n    \"0b\" binary-digit\r\n  | \"0B\" binary-digit\r\n  | binary-literal \"'\"? binary-digit\r\n\r\noctal-literal ::=\r\n    \"0\"\r\n  | octal-literal \"'\"? octal-digit\r\n\r\ndecimal-literal ::=\r\n    nonzero-digit\r\n  | decimal-literal \"'\"? digit\r\n\r\nhexadecimal-literal ::=\r\n    hexadecimal-prefix hexadecimal-digit-sequence\r\n\r\nbinary-digit ::=\r\n    \"0\" | \"1\"\r\n\r\noctal-digit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\"\r\n\r\nnonzero-digit ::=\r\n    \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n\r\nhexadecimal-prefix ::=\r\n    \"0x\" | \"0X\"\r\n\r\nhexadecimal-digit-sequence ::=\r\n    hexadecimal-digit\r\n  | hexadecimal-digit-sequence \"'\"? hexadecimal-digit\r\n\r\nhexadecimal-digit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n  | \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\"\r\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\"\r\n\r\ninteger-suffix ::=\r\n    unsigned-suffix long-suffix?\r\n  | unsigned-suffix long-long-suffix?\r\n  | unsigned-suffix size-suffix?\r\n  | long-suffix unsigned-suffix?\r\n  | long-long-suffix unsigned-suffix?\r\n  | size-suffix unsigned-suffix?\r\n\r\nunsigned-suffix ::=\r\n    \"u\" | \"U\"\r\n\r\nlong-suffix ::=\r\n    \"l\" | \"L\"\r\n\r\nlong-long-suffix ::=\r\n    \"ll\" | \"LL\"\r\n\r\nsize-suffix ::=\r\n   \"z\" | \"Z\"\r\n\r\ncharacter-literal ::=\r\n    encoding-prefix? \"'\" c-char-sequence \"'\"\r\n\r\nencoding-prefix ::=\r\n    \"u8\" | \"u\" | \"U\" | \"L\"\r\n\r\nc-char-sequence ::=\r\n    c-char\r\n  | c-char-sequence c-char\r\n\r\nc-char ::=\r\n    basic-c-char\r\n  | escape-sequence\r\n  | universal-character-name\r\n\r\nbasic-c-char ::=\r\n    \"{any member of the translation character set except the \\unicode{0027}{apostrophe},}\"\r\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\r\n\r\nescape-sequence ::=\r\n    simple-escape-sequence\r\n  | numeric-escape-sequence\r\n  | conditional-escape-sequence\r\n\r\nsimple-escape-sequence ::=\r\n    \"\\\" simple-escape-sequence-char\r\n\r\nsimple-escape-sequence-char ::=\r\n    \"'\" | '\"' | \"?\" | \"\\\" | \"a\" | \"b\" | \"f\" | \"n\" | \"r\" | \"t\" | \"v\"\r\n\r\nnumeric-escape-sequence ::=\r\n    octal-escape-sequence\r\n  | hexadecimal-escape-sequence\r\n\r\nsimple-octal-digit-sequence ::=\r\n    octal-digit\r\n  | simple-octal-digit-sequence octal-digit\r\n\r\noctal-escape-sequence ::=\r\n    \"\\\" octal-digit\r\n  | \"\\\" octal-digit octal-digit\r\n  | \"\\\" octal-digit octal-digit octal-digit\r\n  | \"\\o{\" simple-octal-digit-sequence \"}\"\r\n\r\nhexadecimal-escape-sequence ::=\r\n    \"\\x\" simple-hexadecimal-digit-sequence\r\n  | \"\\x{\" simple-hexadecimal-digit-sequence \"}\"\r\n\r\nconditional-escape-sequence ::=\r\n    \"\\\" conditional-escape-sequence-char\r\n\r\nconditional-escape-sequence-char ::=\r\n    '{any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the characters \"N\", \"o\", \"u\", \"U\", or \"x\"}'\r\n\r\nfloating-point-literal ::=\r\n    decimal-floating-point-literal\r\n  | hexadecimal-floating-point-literal\r\n\r\ndecimal-floating-point-literal ::=\r\n    fractional-constant exponent-part? floating-point-suffix?\r\n  | digit-sequence exponent-part floating-point-suffix?\r\n\r\nhexadecimal-floating-point-literal ::=\r\n    hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-point-suffix?\r\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-point-suffix?\r\n\r\nfractional-constant ::=\r\n    digit-sequence? \".\" digit-sequence\r\n  | digit-sequence \".\"\r\n\r\nhexadecimal-fractional-constant ::=\r\n    hexadecimal-digit-sequence? \".\" hexadecimal-digit-sequence\r\n  | hexadecimal-digit-sequence \".\"\r\n\r\nexponent-part ::=\r\n    \"e\" sign? digit-sequence\r\n  | \"E\" sign? digit-sequence\r\n\r\nbinary-exponent-part ::=\r\n    \"p\" sign? digit-sequence\r\n  | \"P\" sign? digit-sequence\r\n\r\nsign ::=\r\n    \"+\" | \"-\"\r\n\r\ndigit-sequence ::=\r\n    digit\r\n  | digit-sequence \"'\"? digit\r\n\r\nfloating-point-suffix ::=\r\n    \"f\" | \"l\" | \"f16\" | \"f32\" | \"f64\" | \"f128\" | \"bf16\" | \"F\" | \"L\" | \"F16\" | \"F32\" | \"F64\" | \"F128\" | \"BF16\"\r\n\r\nstring-literal ::=\r\n    encoding-prefix? '\"' s-char-sequence? '\"'\r\n  | encoding-prefix? \"R\" raw-string\r\n\r\ns-char-sequence ::=\r\n    s-char\r\n  | s-char-sequence s-char\r\n\r\ns-char ::=\r\n    basic-s-char\r\n  | escape-sequence\r\n  | universal-character-name\r\n\r\nbasic-s-char ::=\r\n    \"{any member of the translation character set except the \\unicode{0022}{quotation mark},}\"\r\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\r\n\r\nraw-string ::=\r\n    '\"' d-char-sequence? \"(\" r-char-sequence? \")\" d-char-sequence? '\"'\r\n\r\nr-char-sequence ::=\r\n    r-char\r\n  | r-char-sequence r-char\r\n\r\nr-char ::=\r\n    \"{any member of the translation character set, except a \\unicode{0029}{right parenthesis} followed by}\"\r\n        \"{the initial d-char-sequence (which may be empty) followed by a \\unicode{0022}{quotation mark}}\"\r\n\r\nd-char-sequence ::=\r\n    d-char\r\n  | d-char-sequence d-char\r\n\r\nd-char ::=\r\n    \"{any member of the basic character set except:}\"\r\n        \"{\\unicode{0020}{space}, \\unicode{0028}{left parenthesis}, \\unicode{0029}{right parenthesis}, \\unicode{005c}{reverse solidus},}\"\r\n        \"{\\unicode{0009}{character tabulation}, \\unicode{000b}{line tabulation}, \\unicode{000c}{form feed}, and new-line}\"\r\n\r\nunevaluated-string ::=\r\n    string-literal\r\n\r\nboolean-literal ::=\r\n    \"false\"\r\n  | \"true\"\r\n\r\npointer-literal ::=\r\n    \"nullptr\"\r\n\r\nuser-defined-literal ::=\r\n    user-defined-integer-literal\r\n  | user-defined-floating-point-literal\r\n  | user-defined-string-literal\r\n  | user-defined-character-literal\r\n\r\nuser-defined-integer-literal ::=\r\n    decimal-literal ud-suffix\r\n  | octal-literal ud-suffix\r\n  | hexadecimal-literal ud-suffix\r\n  | binary-literal ud-suffix\r\n\r\nuser-defined-floating-point-literal ::=\r\n    fractional-constant exponent-part? ud-suffix\r\n  | digit-sequence exponent-part ud-suffix\r\n  | hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix\r\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix\r\n\r\nuser-defined-string-literal ::=\r\n    string-literal ud-suffix\r\n\r\nuser-defined-character-literal ::=\r\n    character-literal ud-suffix\r\n\r\nud-suffix ::=\r\n    identifier\r\n\r\n//== basic.tex\r\n\r\ntranslation-unit ::=\r\n    declaration-seq?\r\n  | global-module-fragment? module-declaration declaration-seq? private-module-fragment?\r\n\r\n//== expressions.tex\r\n\r\nprimary-expression ::=\r\n    literal\r\n  | \"this\"\r\n  | \"(\" expression \")\"\r\n  | id-expression\r\n  | lambda-expression\r\n  | fold-expression\r\n  | requires-expression\r\n\r\nid-expression ::=\r\n    unqualified-id\r\n  | qualified-id\r\n  | pack-index-expression\r\n\r\nunqualified-id ::=\r\n    identifier\r\n  | operator-function-id\r\n  | conversion-function-id\r\n  | literal-operator-id\r\n  | \"~\" type-name\r\n  | \"~\" computed-type-specifier\r\n  | template-id\r\n\r\nqualified-id ::=\r\n    nested-name-specifier \"template\"? unqualified-id\r\n\r\nnested-name-specifier ::=\r\n    \"::\"\r\n  | type-name \"::\"\r\n  | namespace-name \"::\"\r\n  | computed-type-specifier \"::\"\r\n  | nested-name-specifier identifier \"::\"\r\n  | nested-name-specifier \"template\"? simple-template-id \"::\"\r\n\r\npack-index-expression ::=\r\n    id-expression \"...\" \"[\" constant-expression \"]\"\r\n\r\nlambda-expression ::=\r\n    lambda-introducer attribute-specifier-seq? lambda-declarator compound-statement\r\n  | lambda-introducer \"\u003c\" template-parameter-list \"\u003e\" requires-clause? attribute-specifier-seq?\r\n         lambda-declarator compound-statement\r\n\r\nlambda-introducer ::=\r\n    \"[\" lambda-capture? \"]\"\r\n\r\nlambda-declarator ::=\r\n    lambda-specifier-seq noexcept-specifier? attribute-specifier-seq? trailing-return-type?\r\n  | noexcept-specifier attribute-specifier-seq? trailing-return-type?\r\n  | trailing-return-type?\r\n  | \"(\" parameter-declaration-clause \")\" lambda-specifier-seq? noexcept-specifier? attribute-specifier-seq?\r\n         trailing-return-type? requires-clause?\r\n\r\nlambda-specifier ::=\r\n    \"consteval\"\r\n  | \"constexpr\"\r\n  | \"mutable\"\r\n  | \"static\"\r\n\r\nlambda-specifier-seq ::=\r\n    lambda-specifier\r\n  | lambda-specifier lambda-specifier-seq\r\n\r\nlambda-capture ::=\r\n    capture-default\r\n  | capture-list\r\n  | capture-default \",\" capture-list\r\n\r\ncapture-default ::=\r\n    \"\u0026\"\r\n  | \"=\"\r\n\r\ncapture-list ::=\r\n    capture\r\n  | capture-list \",\" capture\r\n\r\ncapture ::=\r\n    simple-capture\r\n  | init-capture\r\n\r\nsimple-capture ::=\r\n    identifier \"...\"?\r\n  | \"\u0026\" identifier \"...\"?\r\n  | \"this\"\r\n  | \"*\" \"this\"\r\n\r\ninit-capture ::=\r\n    \"...\"? identifier initializer\r\n  | \"\u0026\" \"...\"? identifier initializer\r\n\r\nfold-expression ::=\r\n    \"(\" cast-expression fold-operator \"...\" \")\"\r\n  | \"(\" \"...\" fold-operator cast-expression \")\"\r\n  | \"(\" cast-expression fold-operator \"...\" fold-operator cast-expression \")\"\r\n\r\nfold-operator ::=\r\n    \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\" | \"|\" | \"\u003c\u003c\" | \"\u003e\u003e\"\r\n  | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\" | \"|=\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"=\"\r\n  | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u0026\u0026\" | \"||\" | \",\" | \".*\" | \"-\u003e*\"\r\n\r\nrequires-expression ::=\r\n    \"requires\" requirement-parameter-list? requirement-body\r\n\r\nrequirement-parameter-list ::=\r\n    \"(\" parameter-declaration-clause \")\"\r\n\r\nrequirement-body ::=\r\n    \"{\" requirement-seq \"}\"\r\n\r\nrequirement-seq ::=\r\n    requirement\r\n  | requirement requirement-seq\r\n\r\nrequirement ::=\r\n    simple-requirement\r\n  | type-requirement\r\n  | compound-requirement\r\n  | nested-requirement\r\n\r\nsimple-requirement ::=\r\n    expression \";\"\r\n\r\ntype-requirement ::=\r\n    \"typename\" nested-name-specifier? type-name \";\"\r\n\r\ncompound-requirement ::=\r\n    \"{\" expression \"}\" \"noexcept\"? return-type-requirement? \";\"\r\n\r\nreturn-type-requirement ::=\r\n    \"-\u003e\" type-constraint\r\n\r\nnested-requirement ::=\r\n    \"requires\" constraint-expression \";\"\r\n\r\npostfix-expression ::=\r\n    primary-expression\r\n  | postfix-expression \"[\" expression-list? \"]\"\r\n  | postfix-expression \"(\" expression-list? \")\"\r\n  | simple-type-specifier \"(\" expression-list? \")\"\r\n  | typename-specifier \"(\" expression-list? \")\"\r\n  | simple-type-specifier braced-init-list\r\n  | typename-specifier braced-init-list\r\n  | postfix-expression \".\" \"template\"? id-expression\r\n  | postfix-expression \"-\u003e\" \"template\"? id-expression\r\n  | postfix-expression \"++\"\r\n  | postfix-expression \"--\"\r\n  | \"dynamic_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"static_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"reinterpret_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"const_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"typeid\" \"(\" expression \")\"\r\n  | \"typeid\" \"(\" type-id \")\"\r\n\r\nexpression-list ::=\r\n    initializer-list\r\n\r\nunary-expression ::=\r\n    postfix-expression\r\n  | unary-operator cast-expression\r\n  | \"++\" cast-expression\r\n  | \"--\" cast-expression\r\n  | await-expression\r\n  | \"sizeof\" unary-expression\r\n  | \"sizeof\" \"(\" type-id \")\"\r\n  | \"sizeof\" \"...\" \"(\" identifier \")\"\r\n  | \"alignof\" \"(\" type-id \")\"\r\n  | noexcept-expression\r\n  | new-expression\r\n  | delete-expression\r\n\r\nunary-operator ::=\r\n    \"*\" | \"\u0026\" | \"+\" | \"-\" | \"!\" | \"~\"\r\n\r\nawait-expression ::=\r\n    \"co_await\" cast-expression\r\n\r\nnoexcept-expression ::=\r\n  \"noexcept\" \"(\" expression \")\"\r\n\r\nnew-expression ::=\r\n    \"::\"? \"new\" new-placement? new-type-id new-initializer?\r\n  | \"::\"? \"new\" new-placement? \"(\" type-id \")\" new-initializer?\r\n\r\nnew-placement ::=\r\n    \"(\" expression-list \")\"\r\n\r\nnew-type-id ::=\r\n    type-specifier-seq new-declarator?\r\n\r\nnew-declarator ::=\r\n    ptr-operator new-declarator?\r\n  | noptr-new-declarator\r\n\r\nnoptr-new-declarator ::=\r\n    \"[\" expression? \"]\" attribute-specifier-seq?\r\n  | noptr-new-declarator \"[\" constant-expression \"]\" attribute-specifier-seq?\r\n\r\nnew-initializer ::=\r\n    \"(\" expression-list? \")\"\r\n  | braced-init-list\r\n\r\ndelete-expression ::=\r\n    \"::\"? \"delete\" cast-expression\r\n  | \"::\"? \"delete\" \"[\" \"]\" cast-expression\r\n\r\ncast-expression ::=\r\n    unary-expression\r\n  | \"(\" type-id \")\" cast-expression\r\n\r\npm-expression ::=\r\n    cast-expression\r\n  | pm-expression \".*\" cast-expression\r\n  | pm-expression \"-\u003e*\" cast-expression\r\n\r\nmultiplicative-expression ::=\r\n    pm-expression\r\n  | multiplicative-expression \"*\" pm-expression\r\n  | multiplicative-expression \"/\" pm-expression\r\n  | multiplicative-expression \"%\" pm-expression\r\n\r\nadditive-expression ::=\r\n    multiplicative-expression\r\n  | additive-expression \"+\" multiplicative-expression\r\n  | additive-expression \"-\" multiplicative-expression\r\n\r\nshift-expression ::=\r\n    additive-expression\r\n  | shift-expression \"\u003c\u003c\" additive-expression\r\n  | shift-expression \"\u003e\u003e\" additive-expression\r\n\r\ncompare-expression ::=\r\n    shift-expression\r\n  | compare-expression \"\u003c=\u003e\" shift-expression\r\n\r\nrelational-expression ::=\r\n    compare-expression\r\n  | relational-expression \"\u003c\" compare-expression\r\n  | relational-expression \"\u003e\" compare-expression\r\n  | relational-expression \"\u003c=\" compare-expression\r\n  | relational-expression \"\u003e=\" compare-expression\r\n\r\nequality-expression ::=\r\n    relational-expression\r\n  | equality-expression \"==\" relational-expression\r\n  | equality-expression \"!=\" relational-expression\r\n\r\nand-expression ::=\r\n    equality-expression\r\n  | and-expression \"\u0026\" equality-expression\r\n\r\nexclusive-or-expression ::=\r\n    and-expression\r\n  | exclusive-or-expression \"^\" and-expression\r\n\r\ninclusive-or-expression ::=\r\n    exclusive-or-expression\r\n  | inclusive-or-expression \"|\" exclusive-or-expression\r\n\r\nlogical-and-expression ::=\r\n    inclusive-or-expression\r\n  | logical-and-expression \"\u0026\u0026\" inclusive-or-expression\r\n\r\nlogical-or-expression ::=\r\n    logical-and-expression\r\n  | logical-or-expression \"||\" logical-and-expression\r\n\r\nconditional-expression ::=\r\n    logical-or-expression\r\n  | logical-or-expression \"?\" expression \":\" assignment-expression\r\n\r\n  yield-expression ::=\r\n  \"co_yield\" assignment-expression\r\n  | \"co_yield\" braced-init-list\r\n\r\nthrow-expression ::=\r\n    \"throw\"  assignment-expression?\r\n\r\nassignment-expression ::=\r\n    conditional-expression\r\n  | yield-expression\r\n  | throw-expression\r\n  | logical-or-expression assignment-operator initializer-clause\r\n\r\nassignment-operator ::=\r\n    \"=\" | \"*=\" | \"/=\" | \"%=\" | \"+=\" | \"-=\" | \"\u003e\u003e=\" | \"\u003c\u003c=\" | \"\u0026=\" | \"^=\" | \"|=\"\r\n\r\nexpression ::=\r\n    assignment-expression\r\n  | expression \",\" assignment-expression\r\n\r\nconstant-expression ::=\r\n    conditional-expression\r\n\r\n//== statements.tex\r\n\r\nstatement ::=\r\n    labeled-statement\r\n  | attribute-specifier-seq? expression-statement\r\n  | attribute-specifier-seq? compound-statement\r\n  | attribute-specifier-seq? selection-statement\r\n  | attribute-specifier-seq? iteration-statement\r\n  | attribute-specifier-seq? jump-statement\r\n  | declaration-statement\r\n  | attribute-specifier-seq? try-block\r\n\r\ninit-statement ::=\r\n    expression-statement\r\n  | simple-declaration\r\n  | alias-declaration\r\n\r\ncondition ::=\r\n    expression\r\n  | attribute-specifier-seq? decl-specifier-seq declarator brace-or-equal-initializer\r\n\r\nlabel ::=\r\n    attribute-specifier-seq? identifier \":\"\r\n  | attribute-specifier-seq? \"case\" constant-expression \":\"\r\n  | attribute-specifier-seq? \"default\" \":\"\r\n\r\nlabeled-statement ::=\r\n    label statement\r\n\r\nexpression-statement ::=\r\n    expression? \";\"\r\n\r\ncompound-statement ::=\r\n    \"{\" statement-seq? label-seq? \"}\"\r\n\r\nstatement-seq ::=\r\n    statement\r\n  | statement-seq statement\r\n\r\nlabel-seq ::=\r\n    label\r\n  | label-seq label\r\n\r\nselection-statement ::=\r\n    \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement\r\n  | \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement \"else\" statement\r\n  | \"if\" \"!\"? \"consteval\" compound-statement\r\n  | \"if\" \"!\"? \"consteval\" compound-statement \"else\" statement\r\n  | \"switch\" \"(\" init-statement? condition \")\" statement\r\n\r\niteration-statement ::=\r\n    \"while\" \"(\" condition \")\" statement\r\n  | \"do\" statement \"while\" \"(\" expression \")\" \";\"\r\n  | \"for\" \"(\" init-statement condition? \";\" expression? \")\" statement\r\n  | \"for\" \"(\" init-statement? for-range-declaration \":\" for-range-initializer \")\" statement\r\n\r\nfor-range-declaration ::=\r\n    attribute-specifier-seq? decl-specifier-seq declarator\r\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\"\r\n\r\nfor-range-initializer ::=\r\n    expr-or-braced-init-list\r\n\r\njump-statement ::=\r\n    \"break\" \";\"\r\n  | \"continue\" \";\"\r\n  | \"return\" expr-or-braced-init-list? \";\"\r\n  | coroutine-return-statement\r\n  | \"goto\" identifier \";\"\r\n\r\ncoroutine-return-statement ::=\r\n    \"co_return\" expr-or-braced-init-list? \";\"\r\n\r\ndeclaration-statement ::=\r\n    block-declaration\r\n\r\n//== declarations.tex\r\n\r\ndeclaration-seq ::=\r\n    declaration\r\n  | declaration-seq declaration\r\n\r\ndeclaration ::=\r\n    name-declaration\r\n  | special-declaration\r\n\r\nname-declaration ::=\r\n    block-declaration\r\n  | nodeclspec-function-declaration\r\n  | function-definition\r\n  | template-declaration\r\n  | deduction-guide\r\n  | linkage-specification\r\n  | namespace-definition\r\n  | empty-declaration\r\n  | attribute-declaration\r\n  | module-import-declaration\r\n\r\nspecial-declaration ::=\r\n    explicit-instantiation\r\n  | explicit-specialization\r\n  | export-declaration\r\n\r\nblock-declaration ::=\r\n    simple-declaration\r\n  | asm-declaration\r\n  | namespace-alias-definition\r\n  | using-declaration\r\n  | using-enum-declaration\r\n  | using-directive\r\n  | static_assert-declaration\r\n  | alias-declaration\r\n  | opaque-enum-declaration\r\n\r\nnodeclspec-function-declaration ::=\r\n    attribute-specifier-seq? declarator \";\"\r\n\r\nalias-declaration ::=\r\n    \"using\" identifier attribute-specifier-seq? \"=\" defining-type-id \";\"\r\n\r\nsimple-declaration ::=\r\n    decl-specifier-seq init-declarator-list? \";\"\r\n  | attribute-specifier-seq decl-specifier-seq init-declarator-list \";\"\r\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\" initializer \";\"\r\n\r\nstatic_assert-message ::=\r\n  unevaluated-string\r\n  | constant-expression\r\n\r\nstatic_assert-declaration ::=\r\n  \"static_assert\" \"(\" constant-expression \")\" \";\"\r\n  | \"static_assert\" \"(\" constant-expression \",\" static_assert-message \")\" \";\"\r\n\r\nempty-declaration ::=\r\n    \";\"\r\n\r\nattribute-declaration ::=\r\n    attribute-specifier-seq \";\"\r\n\r\ndecl-specifier ::=\r\n    storage-class-specifier\r\n  | defining-type-specifier\r\n  | function-specifier\r\n  | \"friend\"\r\n  | \"typedef\"\r\n  | \"constexpr\"\r\n  | \"consteval\"\r\n  | \"constinit\"\r\n  | \"inline\"\r\n\r\ndecl-specifier-seq ::=\r\n    decl-specifier attribute-specifier-seq?\r\n  | decl-specifier decl-specifier-seq\r\n\r\nstorage-class-specifier ::=\r\n    \"static\"\r\n  | \"thread_local\"\r\n  | \"extern\"\r\n  | \"mutable\"\r\n\r\nfunction-specifier ::=\r\n    \"virtual\"\r\n  | explicit-specifier\r\n\r\nexplicit-specifier ::=\r\n    \"explicit\" \"(\" constant-expression \")\"\r\n  | \"explicit\"\r\n\r\ntypedef-name ::=\r\n    identifier\r\n  | simple-template-id\r\n\r\ntype-specifier ::=\r\n  simple-type-specifier\r\n  | elaborated-type-specifier\r\n  | typename-specifier\r\n  | cv-qualifier\r\n\r\ntype-specifier-seq ::=\r\n    type-specifier attribute-specifier-seq?\r\n  | type-specifier type-specifier-seq\r\n\r\ndefining-type-specifier ::=\r\n    type-specifier\r\n  | class-specifier\r\n  | enum-specifier\r\n\r\ndefining-type-specifier-seq ::=\r\n  defining-type-specifier attribute-specifier-seq?\r\n  | defining-type-specifier defining-type-specifier-seq\r\n\r\nsimple-type-specifier ::=\r\n    nested-name-specifier? type-name\r\n  | nested-name-specifier \"template\" simple-template-id\r\n  | computed-type-specifier\r\n  | placeholder-type-specifier\r\n  | nested-name-specifier? template-name\r\n  | \"char\"\r\n  | \"char8_t\"\r\n  | \"char16_t\"\r\n  | \"char32_t\"\r\n  | \"wchar_t\"\r\n  | \"bool\"\r\n  | \"short\"\r\n  | \"int\"\r\n  | \"long\"\r\n  | \"signed\"\r\n  | \"unsigned\"\r\n  | \"float\"\r\n  | \"double\"\r\n  | \"void\"\r\n\r\ntype-name ::=\r\n    class-name\r\n  | enum-name\r\n  | typedef-name\r\n\r\ncomputed-type-specifier ::=\r\n    decltype-specifier\r\n  | pack-index-specifier\r\n\r\npack-index-specifier ::=\r\n    typedef-name \"...\" \"[\" constant-expression \"]\"\r\n\r\nelaborated-type-specifier ::=\r\n    class-key attribute-specifier-seq? nested-name-specifier? identifier\r\n  | class-key simple-template-id\r\n  | class-key nested-name-specifier \"template\"? simple-template-id\r\n  | \"enum\" nested-name-specifier? identifier\r\n\r\ndecltype-specifier ::=\r\n  \"decltype\" \"(\" expression \")\"\r\n\r\nplaceholder-type-specifier ::=\r\n  type-constraint? \"auto\"\r\n  | type-constraint? \"decltype\" \"(\" \"auto\" \")\"\r\n\r\ninit-declarator-list ::=\r\n    init-declarator\r\n  | init-declarator-list \",\" init-declarator\r\n\r\ninit-declarator ::=\r\n    declarator initializer?\r\n  | declarator requires-clause\r\n\r\ndeclarator ::=\r\n    ptr-declarator\r\n  | noptr-declarator parameters-and-qualifiers trailing-return-type\r\n\r\nptr-declarator ::=\r\n    noptr-declarator\r\n  | ptr-operator ptr-declarator\r\n\r\nnoptr-declarator ::=\r\n    declarator-id attribute-specifier-seq?\r\n  | noptr-declarator parameters-and-qualifiers\r\n  | noptr-declarator \"[\" constant-expression? \"]\" attribute-specifier-seq?\r\n  | \"(\" ptr-declarator \")\"\r\n\r\nparameters-and-qualifiers ::=\r\n    \"(\" parameter-declaration-clause \")\" cv-qualifier-seq?\r\n        ref-qualifier? noexcept-specifier? attribute-specifier-seq?\r\n\r\ntrailing-return-type ::=\r\n    \"-\u003e\" type-id\r\n\r\nptr-operator ::=\r\n    \"*\" attribute-specifier-seq? cv-qualifier-seq?\r\n  | \"\u0026\" attribute-specifier-seq?\r\n  | \"\u0026\u0026\" attribute-specifier-seq?\r\n  | nested-name-specifier \"*\" attribute-specifier-seq? cv-qualifier-seq?\r\n\r\ncv-qualifier-seq ::=\r\n    cv-qualifier cv-qualifier-seq?\r\n\r\ncv-qualifier ::=\r\n    \"const\"\r\n  | \"volatile\"\r\n\r\nref-qualifier ::=\r\n    \"\u0026\"\r\n  | \"\u0026\u0026\"\r\n\r\ndeclarator-id ::=\r\n    \"...\"? id-expression\r\n\r\ntype-id ::=\r\n    type-specifier-seq abstract-declarator?\r\n\r\ndefining-type-id ::=\r\n    defining-type-specifier-seq abstract-declarator?\r\n\r\nabstract-declarator ::=\r\n    ptr-abstract-declarator\r\n  | noptr-abstract-declarator? parameters-and-qualifiers trailing-return-type\r\n  | abstract-pack-declarator\r\n\r\nptr-abstract-declarator ::=\r\n    noptr-abstract-declarator\r\n  | ptr-operator ptr-abstract-declarator?\r\n\r\nnoptr-abstract-declarator ::=\r\n    noptr-abstract-declarator? parameters-and-qualifiers\r\n  | noptr-abstract-declarator? \"[\" constant-expression? \"]\" attribute-specifier-seq?\r\n  | \"(\" ptr-abstract-declarator \")\"\r\n\r\nabstract-pack-declarator ::=\r\n    noptr-abstract-pack-declarator\r\n  | ptr-operator abstract-pack-declarator\r\n\r\nnoptr-abstract-pack-declarator ::=\r\n    noptr-abstract-pack-declarator parameters-and-qualifiers\r\n  | \"...\"\r\n\r\nparameter-declaration-clause ::=\r\n    parameter-declaration-list? \"...\"?\r\n  | parameter-declaration-list \",\" \"...\"\r\n\r\nparameter-declaration-list ::=\r\n    parameter-declaration\r\n  | parameter-declaration-list \",\" parameter-declaration\r\n\r\nparameter-declaration ::=\r\n    attribute-specifier-seq? \"this\"? decl-specifier-seq declarator\r\n  | attribute-specifier-seq? decl-specifier-seq declarator \"=\" initializer-clause\r\n  | attribute-specifier-seq? \"this\"? decl-specifier-seq abstract-declarator?\r\n  | attribute-specifier-seq? decl-specifier-seq abstract-declarator? \"=\" initializer-clause\r\n\r\ninitializer ::=\r\n    brace-or-equal-initializer\r\n  | \"(\" expression-list \")\"\r\n\r\nbrace-or-equal-initializer ::=\r\n    \"=\" initializer-clause\r\n  | braced-init-list\r\n\r\ninitializer-clause ::=\r\n    assignment-expression\r\n  | braced-init-list\r\n\r\nbraced-init-list ::=\r\n    \"{\" initializer-list \",\"? \"}\"\r\n  | \"{\" designated-initializer-list \",\"? \"}\"\r\n  | \"{\" \"}\"\r\n\r\ninitializer-list ::=\r\n    initializer-clause \"...\"?\r\n  | initializer-list \",\" initializer-clause \"...\"?\r\n\r\ndesignated-initializer-list ::=\r\n    designated-initializer-clause\r\n  | designated-initializer-list \",\" designated-initializer-clause\r\n\r\ndesignated-initializer-clause ::=\r\n    designator brace-or-equal-initializer\r\n\r\ndesignator ::=\r\n    \".\" identifier\r\n\r\nexpr-or-braced-init-list ::=\r\n    expression\r\n  | braced-init-list\r\n\r\nfunction-definition ::=\r\n    attribute-specifier-seq? decl-specifier-seq? declarator virt-specifier-seq? function-body\r\n  | attribute-specifier-seq? decl-specifier-seq? declarator requires-clause function-body\r\n\r\nfunction-body ::=\r\n    ctor-initializer? compound-statement\r\n  | function-try-block\r\n  | \"=\" \"default\" \";\"\r\n  | \"=\" \"delete\" \";\"\r\n\r\nenum-name ::=\r\n    identifier\r\n\r\nenum-specifier ::=\r\n    enum-head \"{\" enumerator-list? \"}\"\r\n  | enum-head \"{\" enumerator-list \",\" \"}\"\r\n\r\nenum-head ::=\r\n    enum-key attribute-specifier-seq? enum-head-name? enum-base?\r\n\r\nenum-head-name ::=\r\n    nested-name-specifier? identifier\r\n\r\nopaque-enum-declaration ::=\r\n    enum-key attribute-specifier-seq? enum-head-name enum-base? \";\"\r\n\r\nenum-key ::=\r\n    \"enum\"\r\n  | \"enum\" \"class\"\r\n  | \"enum\" \"struct\"\r\n\r\nenum-base ::=\r\n    \":\" type-specifier-seq\r\n\r\nenumerator-list ::=\r\n    enumerator-definition\r\n  | enumerator-list \",\" enumerator-definition\r\n\r\nenumerator-definition ::=\r\n    enumerator\r\n  | enumerator \"=\" constant-expression\r\n\r\nenumerator ::=\r\n    identifier attribute-specifier-seq?\r\n\r\nusing-enum-declaration ::=\r\n    \"using\" \"enum\" using-enum-declarator \";\"\r\n\r\nusing-enum-declarator ::=\r\n    nested-name-specifier? identifier\r\n  | nested-name-specifier? simple-template-id\r\n\r\nnamespace-name ::=\r\n        identifier\r\n  | namespace-alias\r\n\r\nnamespace-definition ::=\r\n        named-namespace-definition\r\n  | unnamed-namespace-definition\r\n  | nested-namespace-definition\r\n\r\nnamed-namespace-definition ::=\r\n        \"inline\"? \"namespace\" attribute-specifier-seq? identifier \"{\" namespace-body \"}\"\r\n\r\nunnamed-namespace-definition ::=\r\n        \"inline\"? \"namespace\" attribute-specifier-seq? \"{\" namespace-body \"}\"\r\n\r\nnested-namespace-definition ::=\r\n        \"namespace\" enclosing-namespace-specifier \"::\" \"inline\"? identifier \"{\" namespace-body \"}\"\r\n\r\nenclosing-namespace-specifier ::=\r\n        identifier\r\n  | enclosing-namespace-specifier \"::\" \"inline\"? identifier\r\n\r\nnamespace-body ::=\r\n        declaration-seq?\r\n\r\nnamespace-alias ::=\r\n        identifier\r\n\r\nnamespace-alias-definition ::=\r\n        \"namespace\" identifier \"=\" qualified-namespace-specifier \";\"\r\n\r\nqualified-namespace-specifier ::=\r\n    nested-name-specifier? namespace-name\r\n\r\nusing-directive ::=\r\n    attribute-specifier-seq? \"using\" \"namespace\" nested-name-specifier? namespace-name \";\"\r\n\r\nusing-declaration ::=\r\n    \"using\" using-declarator-list \";\"\r\n\r\nusing-declarator-list ::=\r\n    using-declarator \"...\"?\r\n  | using-declarator-list \",\" using-declarator \"...\"?\r\n\r\nusing-declarator ::=\r\n    \"typename\"? nested-name-specifier unqualified-id\r\n\r\nasm-declaration ::=\r\n    attribute-specifier-seq? \"asm\" \"(\" balanced-token-seq \")\" \";\"\r\n\r\nlinkage-specification ::=\r\n    \"extern\" unevaluated-string \"{\" declaration-seq? \"}\"\r\n  | \"extern\" unevaluated-string name-declaration\r\n\r\nattribute-specifier-seq ::=\r\n  attribute-specifier-seq? attribute-specifier\r\n\r\nattribute-specifier ::=\r\n  \"[\" \"[\" attribute-using-prefix? attribute-list \"]\" \"]\"\r\n  | alignment-specifier\r\n\r\nalignment-specifier ::=\r\n  \"alignas\" \"(\" type-id \"...\"? \")\"\r\n  | \"alignas\" \"(\" constant-expression \"...\"? \")\"\r\n\r\nattribute-using-prefix ::=\r\n  \"using\" attribute-namespace \":\"\r\n\r\nattribute-list ::=\r\n  attribute?\r\n  | attribute-list \",\" attribute?\r\n  | attribute \"...\"\r\n  | attribute-list \",\" attribute \"...\"\r\n\r\nattribute ::=\r\n    attribute-token attribute-argument-clause?\r\n\r\nattribute-token ::=\r\n    identifier\r\n  | attribute-scoped-token\r\n\r\nattribute-scoped-token ::=\r\n    attribute-namespace \"::\" identifier\r\n\r\nattribute-namespace ::=\r\n    identifier\r\n\r\nattribute-argument-clause ::=\r\n    \"(\" balanced-token-seq? \")\"\r\n\r\nbalanced-token-seq ::=\r\n    balanced-token\r\n  | balanced-token-seq balanced-token\r\n\r\nbalanced-token ::=\r\n    \"(\" balanced-token-seq? \")\"\r\n  | \"[\" balanced-token-seq? \"]\"\r\n  | \"{\" balanced-token-seq? \"}\"\r\n  | \"{any token other than a parenthesis, a bracket, or a brace}\"\r\n\r\n//== modules.tex\r\n\r\nmodule-declaration ::=\r\n    \"export\"? \"module\" module-name module-partition? attribute-specifier-seq? \";\"\r\n\r\nmodule-name ::=\r\n    module-name-qualifier? identifier\r\n\r\nmodule-partition ::=\r\n    \":\" module-name-qualifier? identifier\r\n\r\nmodule-name-qualifier ::=\r\n    identifier \".\"\r\n  | module-name-qualifier identifier \".\"\r\n\r\nexport-declaration ::=\r\n    \"export\" name-declaration\r\n  | \"export\" \"{\" declaration-seq? \"}\"\r\n  | \"export\" module-import-declaration\r\n\r\nmodule-import-declaration ::=\r\n    \"import\" module-name attribute-specifier-seq? \";\"\r\n  | \"import\" module-partition attribute-specifier-seq? \";\"\r\n  | \"import\" header-name attribute-specifier-seq? \";\"\r\n\r\nglobal-module-fragment ::=\r\n    \"module\" \";\" declaration-seq?\r\n\r\nprivate-module-fragment ::=\r\n    \"module\" \":\" \"private\" \";\" declaration-seq?\r\n\r\n//== classes.tex\r\n\r\nclass-name ::=\r\n    identifier\r\n  | simple-template-id\r\n\r\nclass-specifier ::=\r\n    class-head \"{\" member-specification? \"}\"\r\n\r\nclass-head ::=\r\n    class-key attribute-specifier-seq? class-head-name class-virt-specifier? base-clause?\r\n  | class-key attribute-specifier-seq? base-clause?\r\n\r\nclass-head-name ::=\r\n    nested-name-specifier? class-name\r\n\r\nclass-virt-specifier ::=\r\n    \"final\"\r\n\r\nclass-key ::=\r\n    \"class\"\r\n  | \"struct\"\r\n  | \"union\"\r\n\r\nmember-specification ::=\r\n    member-declaration member-specification?\r\n  | access-specifier \":\" member-specification?\r\n\r\nmember-declaration ::=\r\n    attribute-specifier-seq? decl-specifier-seq? member-declarator-list? \";\"\r\n  | function-definition\r\n  | using-declaration\r\n  | using-enum-declaration\r\n  | static_assert-declaration\r\n  | template-declaration\r\n  | explicit-specialization\r\n  | deduction-guide\r\n  | alias-declaration\r\n  | opaque-enum-declaration\r\n  | empty-declaration\r\n\r\nmember-declarator-list ::=\r\n    member-declarator\r\n  | member-declarator-list \",\" member-declarator\r\n\r\nmember-declarator ::=\r\n    declarator virt-specifier-seq? pure-specifier?\r\n  | declarator requires-clause\r\n  | declarator brace-or-equal-initializer?\r\n  | identifier? attribute-specifier-seq? \":\" constant-expression brace-or-equal-initializer?\r\n\r\nvirt-specifier-seq ::=\r\n    virt-specifier\r\n  | virt-specifier-seq virt-specifier\r\n\r\nvirt-specifier ::=\r\n    \"override\"\r\n  | \"final\"\r\n\r\npure-specifier ::=\r\n    \"=\" \"0\"\r\n\r\nconversion-function-id ::=\r\n    \"operator\" conversion-type-id\r\n\r\nconversion-type-id ::=\r\n    type-specifier-seq conversion-declarator?\r\n\r\nconversion-declarator ::=\r\n    ptr-operator conversion-declarator?\r\n\r\nbase-clause ::=\r\n    \":\" base-specifier-list\r\n\r\nbase-specifier-list ::=\r\n    base-specifier \"...\"?\r\n  | base-specifier-list \",\" base-specifier \"...\"?\r\n\r\nbase-specifier ::=\r\n    attribute-specifier-seq? class-or-decltype\r\n  | attribute-specifier-seq? \"virtual\" access-specifier? class-or-decltype\r\n  | attribute-specifier-seq? access-specifier \"virtual\"? class-or-decltype\r\n\r\nclass-or-decltype ::=\r\n    nested-name-specifier? type-name\r\n  | nested-name-specifier \"template\" simple-template-id\r\n  | decltype-specifier\r\n\r\naccess-specifier ::=\r\n    \"private\"\r\n  | \"protected\"\r\n  | \"public\"\r\n\r\nctor-initializer ::=\r\n    \":\" mem-initializer-list\r\n\r\nmem-initializer-list ::=\r\n    mem-initializer \"...\"?\r\n  | mem-initializer-list \",\" mem-initializer \"...\"?\r\n\r\nmem-initializer ::=\r\n    mem-initializer-id \"(\" expression-list? \")\"\r\n  | mem-initializer-id braced-init-list\r\n\r\nmem-initializer-id ::=\r\n    class-or-decltype\r\n  | identifier\r\n\r\n//== overloading.tex\r\n\r\noperator-function-id ::=\r\n    \"operator\" operator\r\n\r\noperator ::=\r\n    \"new\" | \"delete\" | \"new[]\" | \"delete[]\" | \"co_await\" | \"()\" | \"[]\" | \"-\u003e\" | \"-\u003e*\"\r\n  | \"~\" | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\"\r\n  | \"|\" | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\"\r\n  | \"|=\" | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u003c=\u003e\" | \"\u0026\u0026\"\r\n  | \"||\" | \"\u003c\u003c\" | \"\u003e\u003e\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"++\" | \"--\" | \",\"\r\n\r\nliteral-operator-id ::=\r\n    \"operator\" unevaluated-string identifier\r\n  | \"operator\" user-defined-string-literal\r\n\r\n//== templates.tex\r\n\r\ntemplate-declaration ::=\r\n  template-head declaration\r\n  | template-head concept-definition\r\n\r\ntemplate-head ::=\r\n  \"template\" \"\u003c\" template-parameter-list \"\u003e\" requires-clause?\r\n\r\ntemplate-parameter-list ::=\r\n  template-parameter\r\n  | template-parameter-list \",\" template-parameter\r\n\r\nrequires-clause ::=\r\n  \"requires\" constraint-logical-or-expression\r\n\r\nconstraint-logical-or-expression ::=\r\n  constraint-logical-and-expression\r\n  | constraint-logical-or-expression \"||\" constraint-logical-and-expression\r\n\r\nconstraint-logical-and-expression ::=\r\n  primary-expression\r\n  | constraint-logical-and-expression \"\u0026\u0026\" primary-expression\r\n\r\ntemplate-parameter ::=\r\n  type-parameter\r\n  | parameter-declaration\r\n\r\ntype-parameter ::=\r\n  type-parameter-key \"...\"? identifier?\r\n  | type-parameter-key identifier? \"=\" type-id\r\n  | type-constraint \"...\"? identifier?\r\n  | type-constraint identifier? \"=\" type-id\r\n  | template-head type-parameter-key \"...\"? identifier?\r\n  | template-head type-parameter-key identifier? \"=\" id-expression\r\n\r\ntype-parameter-key ::=\r\n  \"class\"\r\n  | \"typename\"\r\n\r\ntype-constraint ::=\r\n  nested-name-specifier? concept-name\r\n  | nested-name-specifier? concept-name \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\nsimple-template-id ::=\r\n  template-name \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\ntemplate-id ::=\r\n  simple-template-id\r\n  | operator-function-id \"\u003c\" template-argument-list? \"\u003e\"\r\n  | literal-operator-id \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\ntemplate-name ::=\r\n  identifier\r\n\r\ntemplate-argument-list ::=\r\n  template-argument \"...\"?\r\n  | template-argument-list \",\" template-argument \"...\"?\r\n\r\ntemplate-argument ::=\r\n  constant-expression\r\n  | type-id\r\n  | id-expression\r\n  | braced-init-list\r\n\r\nconstraint-expression ::=\r\n    logical-or-expression\r\n\r\ndeduction-guide ::=\r\n    explicit-specifier? template-name \"(\" parameter-declaration-clause \")\" \"-\u003e\" simple-template-id \";\"\r\n\r\nconcept-definition ::=\r\n  \"concept\" concept-name attribute-specifier-seq? \"=\" constraint-expression \";\"\r\n\r\nconcept-name ::=\r\n  identifier\r\n\r\ntypename-specifier ::=\r\n  \"typename\" nested-name-specifier identifier\r\n  | \"typename\" nested-name-specifier \"template\"? simple-template-id\r\n\r\nexplicit-instantiation ::=\r\n  \"extern\"? \"template\" declaration\r\n\r\nexplicit-specialization ::=\r\n  \"template\" \"\u003c\" \"\u003e\" declaration\r\n\r\n//== exceptions.tex\r\n\r\ntry-block ::=\r\n    \"try\" compound-statement handler-seq\r\n\r\nfunction-try-block ::=\r\n    \"try\" ctor-initializer? compound-statement handler-seq\r\n\r\nhandler-seq ::=\r\n    handler handler-seq?\r\n\r\nhandler ::=\r\n    \"catch\" \"(\" exception-declaration \")\" compound-statement\r\n\r\nexception-declaration ::=\r\n    attribute-specifier-seq? type-specifier-seq declarator\r\n  | attribute-specifier-seq? type-specifier-seq abstract-declarator?\r\n  | \"...\"\r\n\r\nnoexcept-specifier ::=\r\n    \"noexcept\" \"(\" constant-expression \")\"\r\n  | \"noexcept\"\r\n\r\n//== preprocessor.tex\r\n\r\npreprocessing-file ::=\r\n    group?\r\n  | module-file\r\n\r\nmodule-file ::=\r\n    pp-global-module-fragment? pp-module group? pp-private-module-fragment?\r\n\r\npp-global-module-fragment ::=\r\n    \"module\" \";\" new-line group?\r\n\r\npp-private-module-fragment ::=\r\n    \"module\" \":\" \"private\" \";\" new-line group?\r\n\r\ngroup ::=\r\n    group-part\r\n  | group group-part\r\n\r\ngroup-part ::=\r\n    control-line\r\n  | if-section\r\n  | text-line\r\n  | \"#\" conditionally-supported-directive\r\n\r\ncontrol-line ::=\r\n    \"#\" \"include\" pp-tokens new-line\r\n  | pp-import\r\n  | \"#\" \"define\" identifier replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen identifier-list? \")\" replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen \"...\" \")\" replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen identifier-list \",\" \"...\" \")\" replacement-list new-line\r\n  | \"#\" \"undef\" identifier new-line\r\n  | \"#\" \"line\" pp-tokens new-line\r\n  | \"#\" \"error\" pp-tokens? new-line\r\n  | \"#\" \"warning\" pp-tokens? new-line\r\n  | \"#\" \"pragma\" pp-tokens? new-line\r\n  | \"#\" new-line\r\n\r\nif-section ::=\r\n    if-group elif-groups? else-group? endif-line\r\n\r\nif-group ::=\r\n    \"#\" \"if\" constant-expression new-line group?\r\n  | \"#\" \"ifdef\" identifier new-line group?\r\n  | \"#\" \"ifndef\" identifier new-line group?\r\n\r\nelif-groups ::=\r\n    elif-group\r\n  | elif-groups elif-group\r\n\r\nelif-group ::=\r\n    \"#\" \"elif\" constant-expression new-line group?\r\n  | \"#\" \"elifdef\" identifier new-line group?\r\n  | \"#\" \"elifndef\" identifier new-line group?\r\n\r\nelse-group ::=\r\n    \"#\" \"else\" new-line group?\r\n\r\nendif-line ::=\r\n    \"#\" \"endif\" new-line\r\n\r\ntext-line ::=\r\n    pp-tokens? new-line\r\n\r\nconditionally-supported-directive ::=\r\n    pp-tokens new-line\r\n\r\nlparen ::=\r\n    '{a \"(\" character not immediately preceded by whitespace}'\r\n\r\nidentifier-list ::=\r\n    identifier\r\n  | identifier-list \",\" identifier\r\n\r\nreplacement-list ::=\r\n    pp-tokens?\r\n\r\npp-tokens ::=\r\n    preprocessing-token\r\n  | pp-tokens preprocessing-token\r\n\r\nnew-line ::=\r\n    \"{the new-line character}\"\r\n\r\ndefined-macro-expression ::=\r\n    \"defined\" identifier\r\n  | \"defined\" \"(\" identifier \")\"\r\n\r\nh-preprocessing-token ::=\r\n    '{any preprocessing-token other than \"\u003e\"}'\r\n\r\nh-pp-tokens ::=\r\n    h-preprocessing-token\r\n  | h-pp-tokens h-preprocessing-token\r\n\r\nheader-name-tokens ::=\r\n    string-literal\r\n  | \"\u003c\" h-pp-tokens \"\u003e\"\r\n\r\nhas-include-expression ::=\r\n    \"has_include\" \"(\" header-name \")\"\r\n  | \"has_include\" \"(\" header-name-tokens \")\"\r\n\r\nhas-attribute-expression ::=\r\n    \"has_cpp_attribute\" \"(\" pp-tokens \")\"\r\n\r\npp-module ::=\r\n    \"export\"? \"module\" pp-tokens? \";\" new-line\r\n\r\npp-import ::=\r\n    \"export\"? \"import\" header-name pp-tokens? \";\" new-line\r\n  | \"export\"? \"import\" header-name-tokens pp-tokens? \";\" new-line\r\n  | \"export\"? \"import\" pp-tokens \";\" new-line\r\n\r\nva-opt-replacement ::=\r\n    \"VA_OPT\" \"(\" pp-tokens? \")\"\r\n```\r\n","author":{"url":"https://github.com/mingodad","@type":"Person","name":"mingodad"},"datePublished":"2023-12-22T15:21:46.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/6742/draft/issues/6742"}</script> 
  <meta name="go-import" content="github.com/cplusplus/draft git https://github.com/cplusplus/draft.git">

  <meta name="octolytics-dimension-user_id" content="59276" /><meta name="octolytics-dimension-user_login" content="cplusplus" /><meta name="octolytics-dimension-repository_id" content="2216249" /><meta name="octolytics-dimension-repository_nwo" content="cplusplus/draft" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="2216249" /><meta name="octolytics-dimension-repository_network_root_nwo" content="cplusplus/draft" />



      <link rel="canonical" href="https://github.com/cplusplus/draft/issues/6742" data-turbo-transient>


    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">

  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

  <meta name="release" content="feb42f792443b16c2f9b78b110220b31b014e9c0">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;">
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;">
      



    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      
      <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.2de9c7d6456a311fce49.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          

              
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_gsap_index_js-23c9606618ce.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-04dd9f3c4754.js" defer="defer"></script>
<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/sessions-ac148cb2a2f3.js" defer="defer"></script>

<header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark>
  <h2 class="sr-only">Navigation Menu</h2>

  <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation">
    <span class="d-none">Toggle navigation</span>
  </button>

  <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1">
    <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto">
      <div class="flex-1">
        <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1">  <span class="Button-content">
    <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div>
            <div class="HeaderMenu-toggle-bar rounded my-1"></div>
            <div class="HeaderMenu-toggle-bar rounded my-1"></div></span>
  </span>
</button>
      </div>

      <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav"
        href="/"
        aria-label="Homepage"
        data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Logomark;ref_loc:Header&quot;}">
        <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"></path>
</svg>
      </a>

      <div class="d-flex flex-1 flex-order-2 text-right d-lg-none gap-2 flex-justify-end">
          <a
            href="/login?return_to=https%3A%2F%2Fgithub.com%2Fcplusplus%2Fdraft%2Fissues%2F6742"
            class="HeaderMenu-link HeaderMenu-button d-inline-flex f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav"
            data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/cplusplus/draft/issues/6742&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="836e17b284ff6f0df04dad8214303d6e0d260e31c94d6636b58dc71fe4607528"
            data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to Sign in&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}"
          >
            Sign in
          </a>
              <div class="AppHeader-appearanceSettings">
    <react-partial-anchor>
      <button data-target="react-partial-anchor.anchor" id="icon-button-797c17fd-8007-4b8c-8158-582c54dab412" aria-labelledby="tooltip-5ab36726-0f39-481f-9814-8a8b7fca6edd" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait">  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual">
    <path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path>
</svg>
</button><tool-tip id="tooltip-5ab36726-0f39-481f-9814-8a8b7fca6edd" for="icon-button-797c17fd-8007-4b8c-8158-582c54dab412" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip>

      <template data-target="react-partial-anchor.template">
        <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.6c63a6de228d6520804d.module.css" />

<react-partial
  partial-name="appearance-settings"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


      </template>
    </react-partial-anchor>
  </div>

      </div>
    </div>


    <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0">
      <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0">
          <nav class="HeaderMenu-nav" aria-label="Global">
            <ul class="d-lg-flex list-style-none">
                <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item">
      <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false">
        Platform
        <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1">
    <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path>
</svg>
      </button>

      <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 dropdown-menu-wide">
        <div class="d-lg-flex dropdown-menu-wide">
            <div class="HeaderMenu-column px-lg-4">
                <div class="">

                  <ul class="list-style-none f5" >
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_copilot&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}" href="https://github.com/features/copilot">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3">
    <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          GitHub Copilot

        </div>

        Write better code with AI
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_spark&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_spark_link_platform_navbar&quot;}" href="https://github.com/features/spark">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-sparkle-fill color-fg-subtle mr-3">
    <path d="M11.296 1.924c.24-.656 1.168-.656 1.408 0l.717 1.958a11.25 11.25 0 0 0 6.697 6.697l1.958.717c.657.24.657 1.168 0 1.408l-1.958.717a11.25 11.25 0 0 0-6.697 6.697l-.717 1.958c-.24.657-1.168.657-1.408 0l-.717-1.958a11.25 11.25 0 0 0-6.697-6.697l-1.958-.717c-.656-.24-.656-1.168 0-1.408l1.958-.717a11.25 11.25 0 0 0 6.697-6.697l.717-1.958Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          GitHub Spark

            <span class="HeaderMenu-label">
              New
            </span>
        </div>

        Build and deploy intelligent apps
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_models&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_models_link_platform_navbar&quot;}" href="https://github.com/features/models">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-ai-model color-fg-subtle mr-3">
    <path d="M19.375 8.5a3.25 3.25 0 1 1-3.163 4h-3a3.252 3.252 0 0 1-4.443 2.509L7.214 17.76a3.25 3.25 0 1 1-1.342-.674l1.672-2.957A3.238 3.238 0 0 1 6.75 12c0-.907.371-1.727.97-2.316L6.117 6.846A3.253 3.253 0 0 1 1.875 3.75a3.25 3.25 0 1 1 5.526 2.32l1.603 2.836A3.25 3.25 0 0 1 13.093 11h3.119a3.252 3.252 0 0 1 3.163-2.5ZM10 10.25a1.75 1.75 0 1 0-.001 3.499A1.75 1.75 0 0 0 10 10.25ZM5.125 2a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5Zm12.5 9.75a1.75 1.75 0 1 0 3.5 0 1.75 1.75 0 0 0-3.5 0Zm-14.25 8.5a1.75 1.75 0 1 0 3.501-.001 1.75 1.75 0 0 0-3.501.001Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          GitHub Models

            <span class="HeaderMenu-label">
              New
            </span>
        </div>

        Manage and compare prompts
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}" href="https://github.com/security/advanced-security">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3">
    <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          GitHub Advanced Security

        </div>

        Find and fix vulnerabilities
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;actions&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}" href="https://github.com/features/actions">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3">
    <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Actions

        </div>

        Automate any workflow
      </div>

    
</a></li>

                  </ul>
                </div>
            </div>
            <div class="HeaderMenu-column px-lg-4 pb-3 pb-lg-0 border-lg-right">
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 pb-3">

                  <ul class="list-style-none f5" >
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;codespaces&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}" href="https://github.com/features/codespaces">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3">
    <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Codespaces

        </div>

        Instant dev environments
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;issues&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}" href="https://github.com/features/issues">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3">
    <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Issues

        </div>

        Plan and track work
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;code_review&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}" href="https://github.com/features/code-review">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3">
    <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Code Review

        </div>

        Manage code changes
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;discussions&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;discussions_link_platform_navbar&quot;}" href="https://github.com/features/discussions">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3">
    <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Discussions

        </div>

        Collaborate outside of code
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;code_search&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;code_search_link_platform_navbar&quot;}" href="https://github.com/features/code-search">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3">
    <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Code Search

        </div>

        Find more, search less
      </div>

    
</a></li>

                  </ul>
                </div>
            </div>
            <div class="HeaderMenu-column px-lg-4">
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 mb-3 pb-3">

                      <span class="d-block h4 color-fg-default my-1" id="platform-explore-heading">Explore</span>

                  <ul class="list-style-none f5" aria-labelledby="platform-explore-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;why_github&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}" href="https://github.com/why-github">
      Why GitHub

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;documentation&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" href="https://docs.github.com">
      Documentation

    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle">
    <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path>
</svg>
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_skills&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_skills_link_platform_navbar&quot;}" href="https://skills.github.com">
      GitHub Skills

    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle">
    <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path>
</svg>
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;blog&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" href="https://github.blog">
      Blog

    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle">
    <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path>
</svg>
</a></li>

                  </ul>
                </div>
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 pb-3">

                      <span class="d-block h4 color-fg-default my-1" id="platform-integrations-heading">Integrations</span>

                  <ul class="list-style-none f5" aria-labelledby="platform-integrations-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_marketplace&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_marketplace_link_platform_navbar&quot;}" href="https://github.com/marketplace">
      GitHub Marketplace

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;mcp_registry&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}" href="https://github.com/mcp">
      MCP Registry

    
</a></li>

                  </ul>
                </div>
            </div>
        </div>

          <div class="HeaderMenu-trailing-link rounded-bottom-2 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold">
            <a data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_features&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}" href="https://github.com/features">
              View all features
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon">
    <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</a>          </div>
      </div>
</li>


                <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item">
      <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false">
        Solutions
        <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1">
    <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path>
</svg>
      </button>

      <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 dropdown-menu-wide">
        <div class="d-lg-flex dropdown-menu-wide">
            <div class="HeaderMenu-column px-lg-4 pb-3 pb-lg-0 border-lg-right">
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 pb-3">

                      <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span>

                  <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;enterprises&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}" href="https://github.com/enterprise">
      Enterprises

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}" href="https://github.com/team">
      Small and medium teams

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;startups&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}" href="https://github.com/enterprise/startups">
      Startups

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;nonprofits&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}" href="/solutions/industry/nonprofits">
      Nonprofits

    
</a></li>

                  </ul>
                </div>
            </div>
            <div class="HeaderMenu-column px-lg-4 pb-3 pb-lg-0 border-lg-right">
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 pb-3">

                      <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span>

                  <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;app_modernization&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}" href="/solutions/use-case/app-modernization">
      App Modernization

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devsecops&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}" href="/solutions/use-case/devsecops">
      DevSecOps

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devops&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}" href="/solutions/use-case/devops">
      DevOps

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ci_cd&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ci_cd_link_solutions_navbar&quot;}" href="/solutions/use-case/ci-cd">
      CI/CD

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}" href="/solutions/use-case">
      View all use cases

    
</a></li>

                  </ul>
                </div>
            </div>
            <div class="HeaderMenu-column px-lg-4">
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 pb-3">

                      <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span>

                  <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;healthcare&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}" href="/solutions/industry/healthcare">
      Healthcare

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;financial_services&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}" href="/solutions/industry/financial-services">
      Financial services

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;manufacturing&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}" href="/solutions/industry/manufacturing">
      Manufacturing

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;government&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}" href="/solutions/industry/government">
      Government

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_industries&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}" href="/solutions/industry">
      View all industries

    
</a></li>

                  </ul>
                </div>
            </div>
        </div>

          <div class="HeaderMenu-trailing-link rounded-bottom-2 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold">
            <a data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}" href="/solutions">
              View all solutions
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon">
    <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</a>          </div>
      </div>
</li>


                <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item">
      <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false">
        Resources
        <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1">
    <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path>
</svg>
      </button>

      <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 dropdown-menu-wide">
        <div class="d-lg-flex dropdown-menu-wide">
            <div class="HeaderMenu-column px-lg-4 pb-3 pb-lg-0 border-lg-right">
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 pb-3">

                      <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span>

                  <ul class="list-style-none f5" aria-labelledby="resources-topics-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ai&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}" href="/resources/articles/ai">
      AI

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devops&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}" href="/resources/articles/devops">
      DevOps

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;security&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}" href="/resources/articles/security">
      Security

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;software_development&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}" href="/resources/articles/software-development">
      Software Development

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_link_resources_navbar&quot;}" href="/resources/articles">
      View all

    
</a></li>

                  </ul>
                </div>
            </div>
            <div class="HeaderMenu-column px-lg-4">
                <div class="border-bottom border-lg-bottom-0 pb-lg-0 border-bottom-0">

                      <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span>

                  <ul class="list-style-none f5" aria-labelledby="resources-explore-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;learning_pathways&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;learning_pathways_link_resources_navbar&quot;}" href="https://resources.github.com/learn/pathways">
      Learning Pathways

    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle">
    <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path>
</svg>
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;events_amp_webinars&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;events_amp_webinars_link_resources_navbar&quot;}" href="https://github.com/resources/events">
      Events &amp; Webinars

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ebooks_amp_whitepapers&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ebooks_amp_whitepapers_link_resources_navbar&quot;}" href="https://github.com/resources/whitepapers">
      Ebooks &amp; Whitepapers

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;customer_stories&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}" href="https://github.com/customer-stories">
      Customer Stories

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;partners&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}" href="https://github.com/partners">
      Partners

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;executive_insights&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;executive_insights_link_resources_navbar&quot;}" href="https://github.com/solutions/executive-insights">
      Executive Insights

    
</a></li>

                  </ul>
                </div>
            </div>
        </div>

      </div>
</li>


                <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item">
      <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false">
        Open Source
        <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1">
    <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path>
</svg>
      </button>

      <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4">
        <div class="d-lg-flex dropdown-menu-wide">
            <div class="HeaderMenu-column px-lg-4">
                <div class="border-bottom mb-3 mb-lg-3 pb-3">

                  <ul class="list-style-none f5" >
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_sponsors&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}" href="/sponsors">
      
      <div>
        <div class="color-fg-default h4">
          GitHub Sponsors

        </div>

        Fund open source developers
      </div>

    
</a></li>

                  </ul>
                </div>
                <div class="border-bottom mb-3 mb-lg-3 pb-3">

                  <ul class="list-style-none f5" >
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;the_readme_project&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;the_readme_project_link_open_source_navbar&quot;}" href="https://github.com/readme">
      
      <div>
        <div class="color-fg-default h4">
          The ReadME Project

        </div>

        GitHub community articles
      </div>

    
</a></li>

                  </ul>
                </div>
                <div class="border-bottom border-bottom-0">

                      <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span>

                  <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;topics&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}" href="https://github.com/topics">
      Topics

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;trending&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}" href="https://github.com/trending">
      Trending

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;collections&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}" href="https://github.com/collections">
      Collections

    
</a></li>

                  </ul>
                </div>
            </div>
        </div>

      </div>
</li>


                <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item">
      <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false">
        Enterprise
        <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1">
    <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path>
</svg>
      </button>

      <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4">
        <div class="d-lg-flex dropdown-menu-wide">
            <div class="HeaderMenu-column px-lg-4">
                <div class="border-bottom mb-3 mb-lg-3 pb-3">

                  <ul class="list-style-none f5" >
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}" href="/enterprise">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3">
    <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Enterprise platform

        </div>

        AI-powered developer platform
      </div>

    
</a></li>

                  </ul>
                </div>
                <div class="border-bottom border-bottom-0">

                      <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span>

                  <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading">
                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}" href="https://github.com/security/advanced-security">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3">
    <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          GitHub Advanced Security

        </div>

        Enterprise-grade security features
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description mb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}" href="/features/copilot/copilot-business">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3">
    <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Copilot for business

        </div>

        Enterprise-grade AI features
      </div>

    
</a></li>

                      <li>
  <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;premium_support&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}" href="/premium-support">
      <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3">
    <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path>
</svg>
      <div>
        <div class="color-fg-default h4">
          Premium Support

        </div>

        Enterprise-grade 24/7 support
      </div>

    
</a></li>

                  </ul>
                </div>
            </div>
        </div>

      </div>
</li>


                <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item">
    <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;platform&quot;,&quot;context&quot;:&quot;global&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;platform_link_global_navbar&quot;}" href="https://github.com/pricing">Pricing</a>
</li>

            </ul>
          </nav>

        <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3">
                


<qbsearch-input class="search-input" data-scope="repo:cplusplus/draft" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="KZJmkuExDr9iyTgbIy5q0CP_2OpkwjHtZ1TSIUqfDnLN9NzVh_-217Ui6brN490IEXiQO56lmc9nijGAcaNbGQ" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="cplusplus/draft" data-current-org="cplusplus" data-current-owner="" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true">
  <div
    class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded"
    data-action="click:qbsearch-input#searchInputContainerClicked"
  >
      <button
        type="button"
        class="header-search-button placeholder  input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none"
        data-target="qbsearch-input.inputButton"
        aria-label="Search or jump to…"
        aria-haspopup="dialog"
        placeholder="Search or jump to..."
        data-hotkey=s,/
        autocapitalize="off"
        data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;searchbar&quot;,&quot;context&quot;:&quot;global&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"
        data-action="click:qbsearch-input#handleExpand"
      >
        <div class="mr-2 color-fg-muted">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search">
    <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
</svg>
        </div>
        <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span>
          <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator">
            <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg>
          </div>
      </button>

    <input type="hidden" name="type" class="js-site-search-type-field">

    
<div class="Overlay--hidden " data-modal-dialog-overlay>
  <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto">
      <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1>
    <div class="Overlay-body Overlay-body--paddingNone">
      
          <div data-view-component="true">        <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container"
          style="border-radius: 12px;"
          data-target="qbsearch-input.queryBuilderContainer"
          hidden
        >
          <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get">
  <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder">
    <div class="FormControl FormControl--fullWidth">
      <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only">
        Search
      </label>
      <div
        class="QueryBuilder-StyledInput width-fit "
        data-target="query-builder.styledInput"
      >
          <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap">
            <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual">
    <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
</svg>
          </span>
        <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer">
          <div
            aria-hidden="true"
            class="QueryBuilder-StyledInputContent"
            data-target="query-builder.styledInputContent"
          ></div>
          <div class="QueryBuilder-InputWrapper">
            <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div>
            <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-24671ddd-a77a-4208-b750-64b111400fc9" data-target="query-builder.input" data-action="
          input:query-builder#inputChange
          blur:query-builder#inputBlur
          keydown:query-builder#inputKeydown
          focus:query-builder#inputFocus
        " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" />
          </div>
        </div>
          <span class="sr-only" id="query-builder-test-clear">Clear</span>
          <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action="
                click:query-builder#clear
                focus:query-builder#clearButtonFocus
                blur:query-builder#clearButtonBlur
              " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted">  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual">
    <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path>
</svg>
</button>

      </div>
      <template id="search-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search">
    <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
</svg>
</template>

<template id="code-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</template>

<template id="file-code-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code">
    <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path>
</svg>
</template>

<template id="history-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history">
    <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path>
</svg>
</template>

<template id="repo-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo">
    <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path>
</svg>
</template>

<template id="bookmark-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark">
    <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path>
</svg>
</template>

<template id="plus-circle-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path>
</svg>
</template>

<template id="circle-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill">
    <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path>
</svg>
</template>

<template id="trash-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash">
    <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path>
</svg>
</template>

<template id="team-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people">
    <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path>
</svg>
</template>

<template id="project-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project">
    <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path>
</svg>
</template>

<template id="pencil-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil">
    <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path>
</svg>
</template>

<template id="copilot-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot">
    <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path>
</svg>
</template>

<template id="copilot-error-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error">
    <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path>
</svg>
</template>

<template id="workflow-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow">
    <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
</template>

<template id="book-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book">
    <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path>
</svg>
</template>

<template id="code-review-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review">
    <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</template>

<template id="codespaces-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces">
    <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path>
</svg>
</template>

<template id="comment-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment">
    <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
</template>

<template id="comment-discussion-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion">
    <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path>
</svg>
</template>

<template id="organization-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization">
    <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path>
</svg>
</template>

<template id="rocket-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket">
    <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
</template>

<template id="shield-check-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check">
    <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
</template>

<template id="heart-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart">
    <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path>
</svg>
</template>

<template id="server-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server">
    <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path>
</svg>
</template>

<template id="globe-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path>
</svg>
</template>

<template id="issue-opened-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
</template>

<template id="device-mobile-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile">
    <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
</svg>
</template>

<template id="package-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package">
    <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path>
</svg>
</template>

<template id="credit-card-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card">
    <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path>
</svg>
</template>

<template id="play-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
</template>

<template id="gift-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift">
    <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path>
</svg>
</template>

<template id="code-square-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
</template>

<template id="device-desktop-icon">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop">
    <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path>
</svg>
</template>

        <div class="position-relative">
                <ul
                  role="listbox"
                  class="ActionListWrap QueryBuilder-ListWrap"
                  aria-label="Suggestions"
                  data-action="
                    combobox-commit:query-builder#comboboxCommit
                    mousedown:query-builder#resultsMousedown
                  "
                  data-target="query-builder.resultsList"
                  data-persist-list=false
                  id="query-builder-test-results"
                  tabindex="-1"
                ></ul>
        </div>
      <div class="FormControl-inlineValidation" id="validation-24671ddd-a77a-4208-b750-64b111400fc9" hidden="hidden">
        <span class="FormControl-inlineValidation--visual">
          <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">
    <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>
</svg>
        </span>
        <span></span>
</div>    </div>
    <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div>
</query-builder></form>
          <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt">
            <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2">Search syntax tips</a>            <div class="d-flex flex-1"></div>
          </div>
        </div>
</div>

    </div>
</modal-dialog></div>
  </div>
  <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div>
  <div class="color-fg-default">
    
<dialog-helper>
  <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll">
    <div data-view-component="true" class="Overlay-header">
  <div class="Overlay-headerContentWrap">
    <div class="Overlay-titleWrap">
      <h1 class="Overlay-title " id="feedback-dialog-title">
        Provide feedback
      </h1>
        
    </div>
    <div class="Overlay-actionWrap">
      <button data-close-dialog-id="feedback-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg></button>
    </div>
  </div>
  
</div>
      <scrollable-region data-labelled-by="feedback-dialog-title">
        <div data-view-component="true" class="Overlay-body">        <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="LHRYg3rD3eZJOjAWbUps9Igp0Erh2te1YhEk7iHAK1Grj+Pv3AWew2J4kj89U6Lecyfk/zXMAxnrYC6Lb0fNWQ==" />
          <p>We read every piece of feedback, and take your input very seriously.</p>
          <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea>
          <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox">
          <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label>
</form></div>
      </scrollable-region>
      <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd">          <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn">    Cancel
</button>
          <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn">    Submit feedback
</button>
</div>
</dialog></dialog-helper>

    <custom-scopes data-target="qbsearch-input.customScopesManager">
    
<dialog-helper>
  <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll">
    <div data-view-component="true" class="Overlay-header Overlay-header--divided">
  <div class="Overlay-headerContentWrap">
    <div class="Overlay-titleWrap">
      <h1 class="Overlay-title " id="custom-scopes-dialog-title">
        Saved searches
      </h1>
        <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2>
    </div>
    <div class="Overlay-actionWrap">
      <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg></button>
    </div>
  </div>
  
</div>
      <scrollable-region data-labelled-by="custom-scopes-dialog-title">
        <div data-view-component="true" class="Overlay-body">        <div data-target="custom-scopes.customScopesModalDialogFlash"></div>

        <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm">
        <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="FCMmGhvgtsvU8EaoTQQ+/LfsYNfunXB9Bm/cHjkpDq59atj7+d1lrYi8cDkRN7JzvaI4NBL2jQqnr5HqQq1L/Q==" />
          <div data-target="custom-scopes.customScopesModalDialogFlash"></div>

          <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField">

          <div class="form-group">
            <label for="custom_scope_name">Name</label>
            <auto-check src="/search/custom_scopes/check_name" required>
              <input
                type="text"
                name="custom_scope_name"
                id="custom_scope_name"
                data-target="custom-scopes.customScopesNameField"
                class="form-control"
                autocomplete="off"
                placeholder="github-ruby"
                required
                maxlength="50">
              <input type="hidden" data-csrf="true" value="QvueQs0SQCit0rrL4eWll/SzoxEntWK8mLlK+Z/arGUWWUNC8aJajPIktDep8Q1cPksQT/LXEcwq5c1PGu3uag==" />
            </auto-check>
          </div>

          <div class="form-group">
            <label for="custom_scope_query">Query</label>
            <input
              type="text"
              name="custom_scope_query"
              id="custom_scope_query"
              data-target="custom-scopes.customScopesQueryField"
              class="form-control"
              autocomplete="off"
              placeholder="(repo:mona/a OR repo:mona/b) AND lang:python"
              required
              maxlength="500">
          </div>

          <p class="text-small color-fg-muted">
            To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>.
          </p>
</form>        </div>

        <div data-target="custom-scopes.manageCustomScopesForm">
          <div data-target="custom-scopes.list"></div>
        </div>

</div>
      </scrollable-region>
      <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided">          <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn">    Cancel
</button>
          <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn">    Create saved search
</button>
</div>
</dialog></dialog-helper>
    </custom-scopes>
  </div>
</qbsearch-input>


            <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block">
              <a
                href="/login?return_to=https%3A%2F%2Fgithub.com%2Fcplusplus%2Fdraft%2Fissues%2F6742"
                class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded px-2 py-1"
                style="margin-left: 12px;"
                data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/cplusplus/draft/issues/6742&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="836e17b284ff6f0df04dad8214303d6e0d260e31c94d6636b58dc71fe4607528"
                data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}"
              >
                Sign in
              </a>
            </div>

              <a href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&amp;source=header-repo&amp;source_repo=cplusplus%2Fdraft"
                class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1"
                data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/cplusplus/draft/issues/6742&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="836e17b284ff6f0df04dad8214303d6e0d260e31c94d6636b58dc71fe4607528"
                data-analytics-event="{&quot;category&quot;:&quot;Sign up&quot;,&quot;action&quot;:&quot;click to sign up for account&quot;,&quot;label&quot;:&quot;ref_page:/&lt;user-name&gt;/&lt;repo-name&gt;/voltron/issues_fragments/issue_layout;ref_cta:Sign up;ref_loc:header logged out&quot;}"
              >
                Sign up
              </a>

                <div class="AppHeader-appearanceSettings">
    <react-partial-anchor>
      <button data-target="react-partial-anchor.anchor" id="icon-button-f4465843-06dc-4846-a408-f6828d6a25d9" aria-labelledby="tooltip-ae0a8045-3426-468d-80c0-3516d44cd033" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait">  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual">
    <path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path>
</svg>
</button><tool-tip id="tooltip-ae0a8045-3426-468d-80c0-3516d44cd033" for="icon-button-f4465843-06dc-4846-a408-f6828d6a25d9" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip>

      <template data-target="react-partial-anchor.template">
        <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.6c63a6de228d6520804d.module.css" />

<react-partial
  partial-name="appearance-settings"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


      </template>
    </react-partial-anchor>
  </div>

          <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Resetting focus</button>
        </div>
      </div>
    </div>
  </div>
</header>

      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-b238d887-b8c9-4e68-93e6-7cf173eb5e12" aria-labelledby="tooltip-96c5e5ab-2782-49ad-98a8-6f4c791427ff" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-96c5e5ab-2782-49ad-98a8-6f4c791427ff" for="icon-button-b238d887-b8c9-4e68-93e6-7cf173eb5e12" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>




  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      
    

    






  
  <div id="repository-container-header"  class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace>

      <div class="d-flex flex-nowrap flex-justify-end mb-3  px-3 px-lg-5" style="gap: 1rem;">

        <div class="flex-auto min-width-0 width-fit">
            
  <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal">
      <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2">
    <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path>
</svg>
    
    <span class="author flex-self-stretch" itemprop="author">
      <a class="url fn" rel="author" data-hovercard-type="organization" data-hovercard-url="/orgs/cplusplus/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/cplusplus">
        cplusplus
</a>    </span>
    <span class="mx-1 flex-self-stretch color-fg-muted">/</span>
    <strong itemprop="name" class="mr-2 flex-self-stretch">
      <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/cplusplus/draft">draft</a>
    </strong>

    <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span>
  </div>


        </div>

        <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;">
            <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;">
    
      

  <li>
            <a href="/login?return_to=%2Fcplusplus%2Fdraft" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/cplusplus/draft/issues/6742&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="f0fe2144d473d3ed268d8d9e1ee3a306f07cd4f30324fe9d283bf36919d6e25a" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2">
    <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path>
</svg>Notifications
</a>    <tool-tip id="tooltip-c1502319-f27a-4b44-b4c2-dbd75b355632" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip>

  </li>

  <li>
          <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Fcplusplus%2Fdraft" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:2216249,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/cplusplus/draft/issues/6742&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="e3fd3474dd47f5fda09b7f2bf3d43097e8504cde8784ccda84318879c905f124" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2">
    <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path>
</svg>Fork
    <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="793" data-view-component="true" class="Counter">793</span>
</a>
  </li>

  <li>
        <div data-view-component="true" class="BtnGroup d-flex">
        <a href="/login?return_to=%2Fcplusplus%2Fdraft" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:2216249,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/cplusplus/draft/issues/6742&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="bbc9d03448189715e75ca240849cc42ebddc3e21720815962da90ce644b964d9" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn">    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2">
    <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path>
</svg><span data-view-component="true" class="d-inline">
          Star
</span>          <span id="repo-stars-counter-star" aria-label="5938 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="5,938" data-view-component="true" class="Counter js-social-count">5.9k</span>
</a></div>
  </li>

</ul>

        </div>
      </div>

        <div id="responsive-meta-container" data-turbo-replace>
</div>


          <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5">

  <ul data-view-component="true" class="UnderlineNav-body list-style-none">
      <li data-view-component="true" class="d-inline-flex">
  <a id="code-tab" href="/cplusplus/draft" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /cplusplus/draft" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Code&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        <span data-content="Code">Code</span>
          <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="issues-tab" href="/cplusplus/draft/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /cplusplus/draft/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Issues&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        <span data-content="Issues">Issues</span>
          <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="685" data-view-component="true" class="Counter">685</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="pull-requests-tab" href="/cplusplus/draft/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /cplusplus/draft/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Pull requests&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        <span data-content="Pull requests">Pull requests</span>
          <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="298" data-view-component="true" class="Counter">298</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="actions-tab" href="/cplusplus/draft/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /cplusplus/draft/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Actions&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        <span data-content="Actions">Actions</span>
          <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="projects-tab" href="/cplusplus/draft/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /cplusplus/draft/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Projects&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path>
</svg>
        <span data-content="Projects">Projects</span>
          <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="wiki-tab" href="/cplusplus/draft/wiki" data-tab-item="i5wiki-tab" data-selected-links="repo_wiki /cplusplus/draft/wiki" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g w" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Wiki&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book UnderlineNav-octicon d-none d-sm-inline">
    <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path>
</svg>
        <span data-content="Wiki">Wiki</span>
          <span id="wiki-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="security-tab" href="/cplusplus/draft/security" data-tab-item="i6security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /cplusplus/draft/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Security&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span data-content="Security">Security</span>
          <include-fragment src="/cplusplus/draft/security/overall-count" accept="text/fragment+html" data-nonce="v2:98b5d273-0292-f42e-0a79-a021c09deed5" data-view-component="true">
  
  <div data-show-on-forbidden-error hidden>
    <div class="Box">
  <div class="blankslate-container">
    <div data-view-component="true" class="blankslate blankslate-spacious color-bg-default rounded-2">
      

      <h3 data-view-component="true" class="blankslate-heading">        Uh oh!
</h3>
      <p data-view-component="true">        <p class="color-fg-muted my-2 mb-2 ws-normal">There was an error while loading. <a class="Link--inTextBlock" data-turbo="false" href="" aria-label="Please reload this page">Please reload this page</a>.</p>
</p>

</div>  </div>
</div>  </div>
</include-fragment>

    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="insights-tab" href="/cplusplus/draft/pulse" data-tab-item="i7insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /cplusplus/draft/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Insights&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        <span data-content="Insights">Insights</span>
          <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
</ul>
    <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0">      <action-menu data-select-variant="none" data-view-component="true">
  <focus-group direction="vertical" mnemonics retain>
    <button id="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-button" popovertarget="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-overlay" aria-controls="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-list" aria-haspopup="true" aria-labelledby="tooltip-d6a8c469-dac5-4863-8561-b640d8602a97" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item">  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual">
    <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path>
</svg>
</button><tool-tip id="tooltip-d6a8c469-dac5-4863-8561-b640d8602a97" for="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip>


<anchored-position data-target="action-menu.overlay" id="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-overlay" anchor="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true">
  <div data-view-component="true" class="Overlay Overlay--size-auto">
    
      <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone">          <action-list>
  <div data-view-component="true">
    <ul aria-labelledby="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-button" id="action-menu-0cd3ec71-3f09-4256-bc3e-3d4af9a73c4c-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap">
        <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-e708961d-aa1b-48d2-aa59-1263c42d3127" href="/cplusplus/draft" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Code
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-2af0b51a-5848-4776-831a-9f4b82c49a26" href="/cplusplus/draft/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Issues
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-9a0e5ee3-259b-4f05-8315-a264f14e7728" href="/cplusplus/draft/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Pull requests
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-e38c5baf-7c55-4bca-b8cd-43899c5d5d33" href="/cplusplus/draft/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Actions
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-e6df6a7a-ad6f-46ac-b02c-1d602e2a1d74" href="/cplusplus/draft/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Projects
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i5wiki-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-600af5e2-d057-421c-af00-f2357e8805e7" href="/cplusplus/draft/wiki" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book">
    <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Wiki
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i6security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-3c604493-18be-40a6-83cc-ebf25424c87f" href="/cplusplus/draft/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Security
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i7insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-2eddb592-a637-4acb-9716-77b0caaf5872" href="/cplusplus/draft/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Insights
</span>      
</a>
  
</li>
</ul>    
</div></action-list>


</div>
      
</div></anchored-position>  </focus-group>
</action-menu></div>
</nav>

  </div>

  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








  



<react-app
  app-name="issues-react"
  initial-path="/cplusplus/draft/issues/6742"
    style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"preloaded_records":{},"structured_data":{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Grammar railroad diagram","articleBody":"Using https://github.com/mingodad/squilu to extract the `{bnf}` sections from all `*.tex` files and convert then to an `EBNF` understood by https://www.bottlecaps.de/rr/ui we can have a nice navigable railroad diagram (see bellow the resulting `EBNF` and instructions to visualize the railroad diagram).\r\n\r\n```\r\n//\r\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\r\n//\r\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\r\n// then click the 'View Diagram' tab.\r\n//\r\n\r\n//\r\n//To facilitate start navigating\r\n//\r\n\r\ncplusplus ::=\r\n\tpreprocessing-file? translation-unit\r\n\r\n//== lex.tex\r\n\r\nn-char ::=\r\n     \"{any member of the translation character set except the \\unicode{007d}{right curly bracket} or new-line character}\"\r\n\r\nn-char-sequence ::=\r\n    n-char\r\n  | n-char-sequence n-char\r\n\r\nnamed-universal-character ::=\r\n    \"\\N{\" n-char-sequence \"}\"\r\n\r\nhex-quad ::=\r\n    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit\r\n\r\nsimple-hexadecimal-digit-sequence ::=\r\n    hexadecimal-digit\r\n  | simple-hexadecimal-digit-sequence hexadecimal-digit\r\n\r\nuniversal-character-name ::=\r\n    \"\\u\" hex-quad\r\n  | \"\\U\" hex-quad hex-quad\r\n  | \"\\u{\" simple-hexadecimal-digit-sequence \"}\"\r\n  | named-universal-character\r\n\r\npreprocessing-token ::=\r\n    header-name\r\n  | \"import\"\r\n  | \"module\"\r\n  | \"export\"\r\n  | identifier\r\n  | pp-number\r\n  | character-literal\r\n  | user-defined-character-literal\r\n  | string-literal\r\n  | user-defined-string-literal\r\n  | preprocessing-op-or-punc\r\n  | \"{each non-whitespace character that cannot be one of the above}\"\r\n\r\n//token ::=\r\n//    identifier\r\n//  | keyword\r\n//  | literal\r\n//  | operator-or-punctuator\r\n\r\nheader-name ::=\r\n    \"\u003c\" h-char-sequence \"\u003e\"\r\n  | '\"' q-char-sequence '\"'\r\n\r\nh-char-sequence ::=\r\n    h-char\r\n  | h-char-sequence h-char\r\n\r\nh-char ::=\r\n    \"{any member of the translation character set except new-line and \\unicode{003e}{greater-than sign}}\"\r\n\r\nq-char-sequence ::=\r\n    q-char\r\n  | q-char-sequence q-char\r\n\r\nq-char ::=\r\n    \"{any member of the translation character set except new-line and \\unicode{0022}{quotation mark}}\"\r\n\r\npp-number ::=\r\n    digit\r\n  | \".\" digit\r\n  | pp-number identifier-continue\r\n  | pp-number \"'\" digit\r\n  | pp-number \"'\" nondigit\r\n  | pp-number \"e\" sign\r\n  | pp-number \"E\" sign\r\n  | pp-number \"p\" sign\r\n  | pp-number \"P\" sign\r\n  | pp-number \".\"\r\n\r\nidentifier ::=\r\n    identifier-start\r\n  | identifier identifier-continue\r\n\r\nidentifier-start ::=\r\n    nondigit\r\n  | \"{an element of the translation character set with the Unicode property XID_Start}\"\r\n\r\nidentifier-continue ::=\r\n    digit\r\n  | nondigit\r\n  | \"{an element of the translation character set with the Unicode property XID_Continue}\"\r\n\r\nnondigit ::=\r\n    \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\" | \"g\" | \"h\" | \"i\" | \"j\" | \"k\" | \"l\" | \"m\"\r\n  | \"n\" | \"o\" | \"p\" | \"q\" | \"r\" | \"s\" | \"t\" | \"u\" | \"v\" | \"w\" | \"x\" | \"y\" | \"z\"\r\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\" | \"G\" | \"H\" | \"I\" | \"J\" | \"K\" | \"L\" | \"M\"\r\n  | \"N\" | \"O\" | \"P\" | \"Q\" | \"R\" | \"S\" | \"T\" | \"U\" | \"V\" | \"W\" | \"X\" | \"Y\" | \"Z\" | \"_\"\r\n\r\ndigit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n\r\nkeyword ::=\r\n    \"{any identifier listed in lex.key}\"\r\n  | \"import\"\r\n  | \"module\"\r\n  | \"export\"\r\n\r\npreprocessing-op-or-punc ::=\r\n    preprocessing-operator\r\n  | operator-or-punctuator\r\n\r\npreprocessing-operator ::=\r\n    \"#\" | \"##\" | \"%:\" | \"%:%:\"\r\n\r\noperator-or-punctuator ::=\r\n    \"{\" | \"}\" | \"[\" | \"]\" | \"(\" | \")\"\r\n  | \"\u003c:\" | \":\u003e\" | \"\u003c%\" | \"%\u003e\" | \";\" | \":\" | \"...\"\r\n  | \"?\" | \"::\" | \".\" | \".*\" | \"-\u003e\" | \"-\u003e*\" | \"~\"\r\n  | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\" | \"|\"\r\n  | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\" | \"|=\"\r\n  | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u003c=\u003e\" | \"\u0026\u0026\" | \"||\"\r\n  | \"\u003c\u003c\" | \"\u003e\u003e\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"++\" | \"--\" | \",\"\r\n  | \"and\" | \"or\" | \"xor\" | \"not\" | \"bitand\" | \"bitor\" | \"compl\"\r\n  | \"and_eq\" | \"or_eq\" | \"xor_eq\" | \"not_eq\"\r\n\r\nliteral ::=\r\n    integer-literal\r\n  | character-literal\r\n  | floating-point-literal\r\n  | string-literal\r\n  | boolean-literal\r\n  | pointer-literal\r\n  | user-defined-literal\r\n\r\ninteger-literal ::=\r\n    binary-literal integer-suffix?\r\n  | octal-literal integer-suffix?\r\n  | decimal-literal integer-suffix?\r\n  | hexadecimal-literal integer-suffix?\r\n\r\nbinary-literal ::=\r\n    \"0b\" binary-digit\r\n  | \"0B\" binary-digit\r\n  | binary-literal \"'\"? binary-digit\r\n\r\noctal-literal ::=\r\n    \"0\"\r\n  | octal-literal \"'\"? octal-digit\r\n\r\ndecimal-literal ::=\r\n    nonzero-digit\r\n  | decimal-literal \"'\"? digit\r\n\r\nhexadecimal-literal ::=\r\n    hexadecimal-prefix hexadecimal-digit-sequence\r\n\r\nbinary-digit ::=\r\n    \"0\" | \"1\"\r\n\r\noctal-digit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\"\r\n\r\nnonzero-digit ::=\r\n    \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n\r\nhexadecimal-prefix ::=\r\n    \"0x\" | \"0X\"\r\n\r\nhexadecimal-digit-sequence ::=\r\n    hexadecimal-digit\r\n  | hexadecimal-digit-sequence \"'\"? hexadecimal-digit\r\n\r\nhexadecimal-digit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n  | \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\"\r\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\"\r\n\r\ninteger-suffix ::=\r\n    unsigned-suffix long-suffix?\r\n  | unsigned-suffix long-long-suffix?\r\n  | unsigned-suffix size-suffix?\r\n  | long-suffix unsigned-suffix?\r\n  | long-long-suffix unsigned-suffix?\r\n  | size-suffix unsigned-suffix?\r\n\r\nunsigned-suffix ::=\r\n    \"u\" | \"U\"\r\n\r\nlong-suffix ::=\r\n    \"l\" | \"L\"\r\n\r\nlong-long-suffix ::=\r\n    \"ll\" | \"LL\"\r\n\r\nsize-suffix ::=\r\n   \"z\" | \"Z\"\r\n\r\ncharacter-literal ::=\r\n    encoding-prefix? \"'\" c-char-sequence \"'\"\r\n\r\nencoding-prefix ::=\r\n    \"u8\" | \"u\" | \"U\" | \"L\"\r\n\r\nc-char-sequence ::=\r\n    c-char\r\n  | c-char-sequence c-char\r\n\r\nc-char ::=\r\n    basic-c-char\r\n  | escape-sequence\r\n  | universal-character-name\r\n\r\nbasic-c-char ::=\r\n    \"{any member of the translation character set except the \\unicode{0027}{apostrophe},}\"\r\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\r\n\r\nescape-sequence ::=\r\n    simple-escape-sequence\r\n  | numeric-escape-sequence\r\n  | conditional-escape-sequence\r\n\r\nsimple-escape-sequence ::=\r\n    \"\\\" simple-escape-sequence-char\r\n\r\nsimple-escape-sequence-char ::=\r\n    \"'\" | '\"' | \"?\" | \"\\\" | \"a\" | \"b\" | \"f\" | \"n\" | \"r\" | \"t\" | \"v\"\r\n\r\nnumeric-escape-sequence ::=\r\n    octal-escape-sequence\r\n  | hexadecimal-escape-sequence\r\n\r\nsimple-octal-digit-sequence ::=\r\n    octal-digit\r\n  | simple-octal-digit-sequence octal-digit\r\n\r\noctal-escape-sequence ::=\r\n    \"\\\" octal-digit\r\n  | \"\\\" octal-digit octal-digit\r\n  | \"\\\" octal-digit octal-digit octal-digit\r\n  | \"\\o{\" simple-octal-digit-sequence \"}\"\r\n\r\nhexadecimal-escape-sequence ::=\r\n    \"\\x\" simple-hexadecimal-digit-sequence\r\n  | \"\\x{\" simple-hexadecimal-digit-sequence \"}\"\r\n\r\nconditional-escape-sequence ::=\r\n    \"\\\" conditional-escape-sequence-char\r\n\r\nconditional-escape-sequence-char ::=\r\n    '{any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the characters \"N\", \"o\", \"u\", \"U\", or \"x\"}'\r\n\r\nfloating-point-literal ::=\r\n    decimal-floating-point-literal\r\n  | hexadecimal-floating-point-literal\r\n\r\ndecimal-floating-point-literal ::=\r\n    fractional-constant exponent-part? floating-point-suffix?\r\n  | digit-sequence exponent-part floating-point-suffix?\r\n\r\nhexadecimal-floating-point-literal ::=\r\n    hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-point-suffix?\r\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-point-suffix?\r\n\r\nfractional-constant ::=\r\n    digit-sequence? \".\" digit-sequence\r\n  | digit-sequence \".\"\r\n\r\nhexadecimal-fractional-constant ::=\r\n    hexadecimal-digit-sequence? \".\" hexadecimal-digit-sequence\r\n  | hexadecimal-digit-sequence \".\"\r\n\r\nexponent-part ::=\r\n    \"e\" sign? digit-sequence\r\n  | \"E\" sign? digit-sequence\r\n\r\nbinary-exponent-part ::=\r\n    \"p\" sign? digit-sequence\r\n  | \"P\" sign? digit-sequence\r\n\r\nsign ::=\r\n    \"+\" | \"-\"\r\n\r\ndigit-sequence ::=\r\n    digit\r\n  | digit-sequence \"'\"? digit\r\n\r\nfloating-point-suffix ::=\r\n    \"f\" | \"l\" | \"f16\" | \"f32\" | \"f64\" | \"f128\" | \"bf16\" | \"F\" | \"L\" | \"F16\" | \"F32\" | \"F64\" | \"F128\" | \"BF16\"\r\n\r\nstring-literal ::=\r\n    encoding-prefix? '\"' s-char-sequence? '\"'\r\n  | encoding-prefix? \"R\" raw-string\r\n\r\ns-char-sequence ::=\r\n    s-char\r\n  | s-char-sequence s-char\r\n\r\ns-char ::=\r\n    basic-s-char\r\n  | escape-sequence\r\n  | universal-character-name\r\n\r\nbasic-s-char ::=\r\n    \"{any member of the translation character set except the \\unicode{0022}{quotation mark},}\"\r\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\r\n\r\nraw-string ::=\r\n    '\"' d-char-sequence? \"(\" r-char-sequence? \")\" d-char-sequence? '\"'\r\n\r\nr-char-sequence ::=\r\n    r-char\r\n  | r-char-sequence r-char\r\n\r\nr-char ::=\r\n    \"{any member of the translation character set, except a \\unicode{0029}{right parenthesis} followed by}\"\r\n        \"{the initial d-char-sequence (which may be empty) followed by a \\unicode{0022}{quotation mark}}\"\r\n\r\nd-char-sequence ::=\r\n    d-char\r\n  | d-char-sequence d-char\r\n\r\nd-char ::=\r\n    \"{any member of the basic character set except:}\"\r\n        \"{\\unicode{0020}{space}, \\unicode{0028}{left parenthesis}, \\unicode{0029}{right parenthesis}, \\unicode{005c}{reverse solidus},}\"\r\n        \"{\\unicode{0009}{character tabulation}, \\unicode{000b}{line tabulation}, \\unicode{000c}{form feed}, and new-line}\"\r\n\r\nunevaluated-string ::=\r\n    string-literal\r\n\r\nboolean-literal ::=\r\n    \"false\"\r\n  | \"true\"\r\n\r\npointer-literal ::=\r\n    \"nullptr\"\r\n\r\nuser-defined-literal ::=\r\n    user-defined-integer-literal\r\n  | user-defined-floating-point-literal\r\n  | user-defined-string-literal\r\n  | user-defined-character-literal\r\n\r\nuser-defined-integer-literal ::=\r\n    decimal-literal ud-suffix\r\n  | octal-literal ud-suffix\r\n  | hexadecimal-literal ud-suffix\r\n  | binary-literal ud-suffix\r\n\r\nuser-defined-floating-point-literal ::=\r\n    fractional-constant exponent-part? ud-suffix\r\n  | digit-sequence exponent-part ud-suffix\r\n  | hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix\r\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix\r\n\r\nuser-defined-string-literal ::=\r\n    string-literal ud-suffix\r\n\r\nuser-defined-character-literal ::=\r\n    character-literal ud-suffix\r\n\r\nud-suffix ::=\r\n    identifier\r\n\r\n//== basic.tex\r\n\r\ntranslation-unit ::=\r\n    declaration-seq?\r\n  | global-module-fragment? module-declaration declaration-seq? private-module-fragment?\r\n\r\n//== expressions.tex\r\n\r\nprimary-expression ::=\r\n    literal\r\n  | \"this\"\r\n  | \"(\" expression \")\"\r\n  | id-expression\r\n  | lambda-expression\r\n  | fold-expression\r\n  | requires-expression\r\n\r\nid-expression ::=\r\n    unqualified-id\r\n  | qualified-id\r\n  | pack-index-expression\r\n\r\nunqualified-id ::=\r\n    identifier\r\n  | operator-function-id\r\n  | conversion-function-id\r\n  | literal-operator-id\r\n  | \"~\" type-name\r\n  | \"~\" computed-type-specifier\r\n  | template-id\r\n\r\nqualified-id ::=\r\n    nested-name-specifier \"template\"? unqualified-id\r\n\r\nnested-name-specifier ::=\r\n    \"::\"\r\n  | type-name \"::\"\r\n  | namespace-name \"::\"\r\n  | computed-type-specifier \"::\"\r\n  | nested-name-specifier identifier \"::\"\r\n  | nested-name-specifier \"template\"? simple-template-id \"::\"\r\n\r\npack-index-expression ::=\r\n    id-expression \"...\" \"[\" constant-expression \"]\"\r\n\r\nlambda-expression ::=\r\n    lambda-introducer attribute-specifier-seq? lambda-declarator compound-statement\r\n  | lambda-introducer \"\u003c\" template-parameter-list \"\u003e\" requires-clause? attribute-specifier-seq?\r\n         lambda-declarator compound-statement\r\n\r\nlambda-introducer ::=\r\n    \"[\" lambda-capture? \"]\"\r\n\r\nlambda-declarator ::=\r\n    lambda-specifier-seq noexcept-specifier? attribute-specifier-seq? trailing-return-type?\r\n  | noexcept-specifier attribute-specifier-seq? trailing-return-type?\r\n  | trailing-return-type?\r\n  | \"(\" parameter-declaration-clause \")\" lambda-specifier-seq? noexcept-specifier? attribute-specifier-seq?\r\n         trailing-return-type? requires-clause?\r\n\r\nlambda-specifier ::=\r\n    \"consteval\"\r\n  | \"constexpr\"\r\n  | \"mutable\"\r\n  | \"static\"\r\n\r\nlambda-specifier-seq ::=\r\n    lambda-specifier\r\n  | lambda-specifier lambda-specifier-seq\r\n\r\nlambda-capture ::=\r\n    capture-default\r\n  | capture-list\r\n  | capture-default \",\" capture-list\r\n\r\ncapture-default ::=\r\n    \"\u0026\"\r\n  | \"=\"\r\n\r\ncapture-list ::=\r\n    capture\r\n  | capture-list \",\" capture\r\n\r\ncapture ::=\r\n    simple-capture\r\n  | init-capture\r\n\r\nsimple-capture ::=\r\n    identifier \"...\"?\r\n  | \"\u0026\" identifier \"...\"?\r\n  | \"this\"\r\n  | \"*\" \"this\"\r\n\r\ninit-capture ::=\r\n    \"...\"? identifier initializer\r\n  | \"\u0026\" \"...\"? identifier initializer\r\n\r\nfold-expression ::=\r\n    \"(\" cast-expression fold-operator \"...\" \")\"\r\n  | \"(\" \"...\" fold-operator cast-expression \")\"\r\n  | \"(\" cast-expression fold-operator \"...\" fold-operator cast-expression \")\"\r\n\r\nfold-operator ::=\r\n    \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\" | \"|\" | \"\u003c\u003c\" | \"\u003e\u003e\"\r\n  | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\" | \"|=\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"=\"\r\n  | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u0026\u0026\" | \"||\" | \",\" | \".*\" | \"-\u003e*\"\r\n\r\nrequires-expression ::=\r\n    \"requires\" requirement-parameter-list? requirement-body\r\n\r\nrequirement-parameter-list ::=\r\n    \"(\" parameter-declaration-clause \")\"\r\n\r\nrequirement-body ::=\r\n    \"{\" requirement-seq \"}\"\r\n\r\nrequirement-seq ::=\r\n    requirement\r\n  | requirement requirement-seq\r\n\r\nrequirement ::=\r\n    simple-requirement\r\n  | type-requirement\r\n  | compound-requirement\r\n  | nested-requirement\r\n\r\nsimple-requirement ::=\r\n    expression \";\"\r\n\r\ntype-requirement ::=\r\n    \"typename\" nested-name-specifier? type-name \";\"\r\n\r\ncompound-requirement ::=\r\n    \"{\" expression \"}\" \"noexcept\"? return-type-requirement? \";\"\r\n\r\nreturn-type-requirement ::=\r\n    \"-\u003e\" type-constraint\r\n\r\nnested-requirement ::=\r\n    \"requires\" constraint-expression \";\"\r\n\r\npostfix-expression ::=\r\n    primary-expression\r\n  | postfix-expression \"[\" expression-list? \"]\"\r\n  | postfix-expression \"(\" expression-list? \")\"\r\n  | simple-type-specifier \"(\" expression-list? \")\"\r\n  | typename-specifier \"(\" expression-list? \")\"\r\n  | simple-type-specifier braced-init-list\r\n  | typename-specifier braced-init-list\r\n  | postfix-expression \".\" \"template\"? id-expression\r\n  | postfix-expression \"-\u003e\" \"template\"? id-expression\r\n  | postfix-expression \"++\"\r\n  | postfix-expression \"--\"\r\n  | \"dynamic_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"static_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"reinterpret_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"const_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"typeid\" \"(\" expression \")\"\r\n  | \"typeid\" \"(\" type-id \")\"\r\n\r\nexpression-list ::=\r\n    initializer-list\r\n\r\nunary-expression ::=\r\n    postfix-expression\r\n  | unary-operator cast-expression\r\n  | \"++\" cast-expression\r\n  | \"--\" cast-expression\r\n  | await-expression\r\n  | \"sizeof\" unary-expression\r\n  | \"sizeof\" \"(\" type-id \")\"\r\n  | \"sizeof\" \"...\" \"(\" identifier \")\"\r\n  | \"alignof\" \"(\" type-id \")\"\r\n  | noexcept-expression\r\n  | new-expression\r\n  | delete-expression\r\n\r\nunary-operator ::=\r\n    \"*\" | \"\u0026\" | \"+\" | \"-\" | \"!\" | \"~\"\r\n\r\nawait-expression ::=\r\n    \"co_await\" cast-expression\r\n\r\nnoexcept-expression ::=\r\n  \"noexcept\" \"(\" expression \")\"\r\n\r\nnew-expression ::=\r\n    \"::\"? \"new\" new-placement? new-type-id new-initializer?\r\n  | \"::\"? \"new\" new-placement? \"(\" type-id \")\" new-initializer?\r\n\r\nnew-placement ::=\r\n    \"(\" expression-list \")\"\r\n\r\nnew-type-id ::=\r\n    type-specifier-seq new-declarator?\r\n\r\nnew-declarator ::=\r\n    ptr-operator new-declarator?\r\n  | noptr-new-declarator\r\n\r\nnoptr-new-declarator ::=\r\n    \"[\" expression? \"]\" attribute-specifier-seq?\r\n  | noptr-new-declarator \"[\" constant-expression \"]\" attribute-specifier-seq?\r\n\r\nnew-initializer ::=\r\n    \"(\" expression-list? \")\"\r\n  | braced-init-list\r\n\r\ndelete-expression ::=\r\n    \"::\"? \"delete\" cast-expression\r\n  | \"::\"? \"delete\" \"[\" \"]\" cast-expression\r\n\r\ncast-expression ::=\r\n    unary-expression\r\n  | \"(\" type-id \")\" cast-expression\r\n\r\npm-expression ::=\r\n    cast-expression\r\n  | pm-expression \".*\" cast-expression\r\n  | pm-expression \"-\u003e*\" cast-expression\r\n\r\nmultiplicative-expression ::=\r\n    pm-expression\r\n  | multiplicative-expression \"*\" pm-expression\r\n  | multiplicative-expression \"/\" pm-expression\r\n  | multiplicative-expression \"%\" pm-expression\r\n\r\nadditive-expression ::=\r\n    multiplicative-expression\r\n  | additive-expression \"+\" multiplicative-expression\r\n  | additive-expression \"-\" multiplicative-expression\r\n\r\nshift-expression ::=\r\n    additive-expression\r\n  | shift-expression \"\u003c\u003c\" additive-expression\r\n  | shift-expression \"\u003e\u003e\" additive-expression\r\n\r\ncompare-expression ::=\r\n    shift-expression\r\n  | compare-expression \"\u003c=\u003e\" shift-expression\r\n\r\nrelational-expression ::=\r\n    compare-expression\r\n  | relational-expression \"\u003c\" compare-expression\r\n  | relational-expression \"\u003e\" compare-expression\r\n  | relational-expression \"\u003c=\" compare-expression\r\n  | relational-expression \"\u003e=\" compare-expression\r\n\r\nequality-expression ::=\r\n    relational-expression\r\n  | equality-expression \"==\" relational-expression\r\n  | equality-expression \"!=\" relational-expression\r\n\r\nand-expression ::=\r\n    equality-expression\r\n  | and-expression \"\u0026\" equality-expression\r\n\r\nexclusive-or-expression ::=\r\n    and-expression\r\n  | exclusive-or-expression \"^\" and-expression\r\n\r\ninclusive-or-expression ::=\r\n    exclusive-or-expression\r\n  | inclusive-or-expression \"|\" exclusive-or-expression\r\n\r\nlogical-and-expression ::=\r\n    inclusive-or-expression\r\n  | logical-and-expression \"\u0026\u0026\" inclusive-or-expression\r\n\r\nlogical-or-expression ::=\r\n    logical-and-expression\r\n  | logical-or-expression \"||\" logical-and-expression\r\n\r\nconditional-expression ::=\r\n    logical-or-expression\r\n  | logical-or-expression \"?\" expression \":\" assignment-expression\r\n\r\n  yield-expression ::=\r\n  \"co_yield\" assignment-expression\r\n  | \"co_yield\" braced-init-list\r\n\r\nthrow-expression ::=\r\n    \"throw\"  assignment-expression?\r\n\r\nassignment-expression ::=\r\n    conditional-expression\r\n  | yield-expression\r\n  | throw-expression\r\n  | logical-or-expression assignment-operator initializer-clause\r\n\r\nassignment-operator ::=\r\n    \"=\" | \"*=\" | \"/=\" | \"%=\" | \"+=\" | \"-=\" | \"\u003e\u003e=\" | \"\u003c\u003c=\" | \"\u0026=\" | \"^=\" | \"|=\"\r\n\r\nexpression ::=\r\n    assignment-expression\r\n  | expression \",\" assignment-expression\r\n\r\nconstant-expression ::=\r\n    conditional-expression\r\n\r\n//== statements.tex\r\n\r\nstatement ::=\r\n    labeled-statement\r\n  | attribute-specifier-seq? expression-statement\r\n  | attribute-specifier-seq? compound-statement\r\n  | attribute-specifier-seq? selection-statement\r\n  | attribute-specifier-seq? iteration-statement\r\n  | attribute-specifier-seq? jump-statement\r\n  | declaration-statement\r\n  | attribute-specifier-seq? try-block\r\n\r\ninit-statement ::=\r\n    expression-statement\r\n  | simple-declaration\r\n  | alias-declaration\r\n\r\ncondition ::=\r\n    expression\r\n  | attribute-specifier-seq? decl-specifier-seq declarator brace-or-equal-initializer\r\n\r\nlabel ::=\r\n    attribute-specifier-seq? identifier \":\"\r\n  | attribute-specifier-seq? \"case\" constant-expression \":\"\r\n  | attribute-specifier-seq? \"default\" \":\"\r\n\r\nlabeled-statement ::=\r\n    label statement\r\n\r\nexpression-statement ::=\r\n    expression? \";\"\r\n\r\ncompound-statement ::=\r\n    \"{\" statement-seq? label-seq? \"}\"\r\n\r\nstatement-seq ::=\r\n    statement\r\n  | statement-seq statement\r\n\r\nlabel-seq ::=\r\n    label\r\n  | label-seq label\r\n\r\nselection-statement ::=\r\n    \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement\r\n  | \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement \"else\" statement\r\n  | \"if\" \"!\"? \"consteval\" compound-statement\r\n  | \"if\" \"!\"? \"consteval\" compound-statement \"else\" statement\r\n  | \"switch\" \"(\" init-statement? condition \")\" statement\r\n\r\niteration-statement ::=\r\n    \"while\" \"(\" condition \")\" statement\r\n  | \"do\" statement \"while\" \"(\" expression \")\" \";\"\r\n  | \"for\" \"(\" init-statement condition? \";\" expression? \")\" statement\r\n  | \"for\" \"(\" init-statement? for-range-declaration \":\" for-range-initializer \")\" statement\r\n\r\nfor-range-declaration ::=\r\n    attribute-specifier-seq? decl-specifier-seq declarator\r\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\"\r\n\r\nfor-range-initializer ::=\r\n    expr-or-braced-init-list\r\n\r\njump-statement ::=\r\n    \"break\" \";\"\r\n  | \"continue\" \";\"\r\n  | \"return\" expr-or-braced-init-list? \";\"\r\n  | coroutine-return-statement\r\n  | \"goto\" identifier \";\"\r\n\r\ncoroutine-return-statement ::=\r\n    \"co_return\" expr-or-braced-init-list? \";\"\r\n\r\ndeclaration-statement ::=\r\n    block-declaration\r\n\r\n//== declarations.tex\r\n\r\ndeclaration-seq ::=\r\n    declaration\r\n  | declaration-seq declaration\r\n\r\ndeclaration ::=\r\n    name-declaration\r\n  | special-declaration\r\n\r\nname-declaration ::=\r\n    block-declaration\r\n  | nodeclspec-function-declaration\r\n  | function-definition\r\n  | template-declaration\r\n  | deduction-guide\r\n  | linkage-specification\r\n  | namespace-definition\r\n  | empty-declaration\r\n  | attribute-declaration\r\n  | module-import-declaration\r\n\r\nspecial-declaration ::=\r\n    explicit-instantiation\r\n  | explicit-specialization\r\n  | export-declaration\r\n\r\nblock-declaration ::=\r\n    simple-declaration\r\n  | asm-declaration\r\n  | namespace-alias-definition\r\n  | using-declaration\r\n  | using-enum-declaration\r\n  | using-directive\r\n  | static_assert-declaration\r\n  | alias-declaration\r\n  | opaque-enum-declaration\r\n\r\nnodeclspec-function-declaration ::=\r\n    attribute-specifier-seq? declarator \";\"\r\n\r\nalias-declaration ::=\r\n    \"using\" identifier attribute-specifier-seq? \"=\" defining-type-id \";\"\r\n\r\nsimple-declaration ::=\r\n    decl-specifier-seq init-declarator-list? \";\"\r\n  | attribute-specifier-seq decl-specifier-seq init-declarator-list \";\"\r\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\" initializer \";\"\r\n\r\nstatic_assert-message ::=\r\n  unevaluated-string\r\n  | constant-expression\r\n\r\nstatic_assert-declaration ::=\r\n  \"static_assert\" \"(\" constant-expression \")\" \";\"\r\n  | \"static_assert\" \"(\" constant-expression \",\" static_assert-message \")\" \";\"\r\n\r\nempty-declaration ::=\r\n    \";\"\r\n\r\nattribute-declaration ::=\r\n    attribute-specifier-seq \";\"\r\n\r\ndecl-specifier ::=\r\n    storage-class-specifier\r\n  | defining-type-specifier\r\n  | function-specifier\r\n  | \"friend\"\r\n  | \"typedef\"\r\n  | \"constexpr\"\r\n  | \"consteval\"\r\n  | \"constinit\"\r\n  | \"inline\"\r\n\r\ndecl-specifier-seq ::=\r\n    decl-specifier attribute-specifier-seq?\r\n  | decl-specifier decl-specifier-seq\r\n\r\nstorage-class-specifier ::=\r\n    \"static\"\r\n  | \"thread_local\"\r\n  | \"extern\"\r\n  | \"mutable\"\r\n\r\nfunction-specifier ::=\r\n    \"virtual\"\r\n  | explicit-specifier\r\n\r\nexplicit-specifier ::=\r\n    \"explicit\" \"(\" constant-expression \")\"\r\n  | \"explicit\"\r\n\r\ntypedef-name ::=\r\n    identifier\r\n  | simple-template-id\r\n\r\ntype-specifier ::=\r\n  simple-type-specifier\r\n  | elaborated-type-specifier\r\n  | typename-specifier\r\n  | cv-qualifier\r\n\r\ntype-specifier-seq ::=\r\n    type-specifier attribute-specifier-seq?\r\n  | type-specifier type-specifier-seq\r\n\r\ndefining-type-specifier ::=\r\n    type-specifier\r\n  | class-specifier\r\n  | enum-specifier\r\n\r\ndefining-type-specifier-seq ::=\r\n  defining-type-specifier attribute-specifier-seq?\r\n  | defining-type-specifier defining-type-specifier-seq\r\n\r\nsimple-type-specifier ::=\r\n    nested-name-specifier? type-name\r\n  | nested-name-specifier \"template\" simple-template-id\r\n  | computed-type-specifier\r\n  | placeholder-type-specifier\r\n  | nested-name-specifier? template-name\r\n  | \"char\"\r\n  | \"char8_t\"\r\n  | \"char16_t\"\r\n  | \"char32_t\"\r\n  | \"wchar_t\"\r\n  | \"bool\"\r\n  | \"short\"\r\n  | \"int\"\r\n  | \"long\"\r\n  | \"signed\"\r\n  | \"unsigned\"\r\n  | \"float\"\r\n  | \"double\"\r\n  | \"void\"\r\n\r\ntype-name ::=\r\n    class-name\r\n  | enum-name\r\n  | typedef-name\r\n\r\ncomputed-type-specifier ::=\r\n    decltype-specifier\r\n  | pack-index-specifier\r\n\r\npack-index-specifier ::=\r\n    typedef-name \"...\" \"[\" constant-expression \"]\"\r\n\r\nelaborated-type-specifier ::=\r\n    class-key attribute-specifier-seq? nested-name-specifier? identifier\r\n  | class-key simple-template-id\r\n  | class-key nested-name-specifier \"template\"? simple-template-id\r\n  | \"enum\" nested-name-specifier? identifier\r\n\r\ndecltype-specifier ::=\r\n  \"decltype\" \"(\" expression \")\"\r\n\r\nplaceholder-type-specifier ::=\r\n  type-constraint? \"auto\"\r\n  | type-constraint? \"decltype\" \"(\" \"auto\" \")\"\r\n\r\ninit-declarator-list ::=\r\n    init-declarator\r\n  | init-declarator-list \",\" init-declarator\r\n\r\ninit-declarator ::=\r\n    declarator initializer?\r\n  | declarator requires-clause\r\n\r\ndeclarator ::=\r\n    ptr-declarator\r\n  | noptr-declarator parameters-and-qualifiers trailing-return-type\r\n\r\nptr-declarator ::=\r\n    noptr-declarator\r\n  | ptr-operator ptr-declarator\r\n\r\nnoptr-declarator ::=\r\n    declarator-id attribute-specifier-seq?\r\n  | noptr-declarator parameters-and-qualifiers\r\n  | noptr-declarator \"[\" constant-expression? \"]\" attribute-specifier-seq?\r\n  | \"(\" ptr-declarator \")\"\r\n\r\nparameters-and-qualifiers ::=\r\n    \"(\" parameter-declaration-clause \")\" cv-qualifier-seq?\r\n        ref-qualifier? noexcept-specifier? attribute-specifier-seq?\r\n\r\ntrailing-return-type ::=\r\n    \"-\u003e\" type-id\r\n\r\nptr-operator ::=\r\n    \"*\" attribute-specifier-seq? cv-qualifier-seq?\r\n  | \"\u0026\" attribute-specifier-seq?\r\n  | \"\u0026\u0026\" attribute-specifier-seq?\r\n  | nested-name-specifier \"*\" attribute-specifier-seq? cv-qualifier-seq?\r\n\r\ncv-qualifier-seq ::=\r\n    cv-qualifier cv-qualifier-seq?\r\n\r\ncv-qualifier ::=\r\n    \"const\"\r\n  | \"volatile\"\r\n\r\nref-qualifier ::=\r\n    \"\u0026\"\r\n  | \"\u0026\u0026\"\r\n\r\ndeclarator-id ::=\r\n    \"...\"? id-expression\r\n\r\ntype-id ::=\r\n    type-specifier-seq abstract-declarator?\r\n\r\ndefining-type-id ::=\r\n    defining-type-specifier-seq abstract-declarator?\r\n\r\nabstract-declarator ::=\r\n    ptr-abstract-declarator\r\n  | noptr-abstract-declarator? parameters-and-qualifiers trailing-return-type\r\n  | abstract-pack-declarator\r\n\r\nptr-abstract-declarator ::=\r\n    noptr-abstract-declarator\r\n  | ptr-operator ptr-abstract-declarator?\r\n\r\nnoptr-abstract-declarator ::=\r\n    noptr-abstract-declarator? parameters-and-qualifiers\r\n  | noptr-abstract-declarator? \"[\" constant-expression? \"]\" attribute-specifier-seq?\r\n  | \"(\" ptr-abstract-declarator \")\"\r\n\r\nabstract-pack-declarator ::=\r\n    noptr-abstract-pack-declarator\r\n  | ptr-operator abstract-pack-declarator\r\n\r\nnoptr-abstract-pack-declarator ::=\r\n    noptr-abstract-pack-declarator parameters-and-qualifiers\r\n  | \"...\"\r\n\r\nparameter-declaration-clause ::=\r\n    parameter-declaration-list? \"...\"?\r\n  | parameter-declaration-list \",\" \"...\"\r\n\r\nparameter-declaration-list ::=\r\n    parameter-declaration\r\n  | parameter-declaration-list \",\" parameter-declaration\r\n\r\nparameter-declaration ::=\r\n    attribute-specifier-seq? \"this\"? decl-specifier-seq declarator\r\n  | attribute-specifier-seq? decl-specifier-seq declarator \"=\" initializer-clause\r\n  | attribute-specifier-seq? \"this\"? decl-specifier-seq abstract-declarator?\r\n  | attribute-specifier-seq? decl-specifier-seq abstract-declarator? \"=\" initializer-clause\r\n\r\ninitializer ::=\r\n    brace-or-equal-initializer\r\n  | \"(\" expression-list \")\"\r\n\r\nbrace-or-equal-initializer ::=\r\n    \"=\" initializer-clause\r\n  | braced-init-list\r\n\r\ninitializer-clause ::=\r\n    assignment-expression\r\n  | braced-init-list\r\n\r\nbraced-init-list ::=\r\n    \"{\" initializer-list \",\"? \"}\"\r\n  | \"{\" designated-initializer-list \",\"? \"}\"\r\n  | \"{\" \"}\"\r\n\r\ninitializer-list ::=\r\n    initializer-clause \"...\"?\r\n  | initializer-list \",\" initializer-clause \"...\"?\r\n\r\ndesignated-initializer-list ::=\r\n    designated-initializer-clause\r\n  | designated-initializer-list \",\" designated-initializer-clause\r\n\r\ndesignated-initializer-clause ::=\r\n    designator brace-or-equal-initializer\r\n\r\ndesignator ::=\r\n    \".\" identifier\r\n\r\nexpr-or-braced-init-list ::=\r\n    expression\r\n  | braced-init-list\r\n\r\nfunction-definition ::=\r\n    attribute-specifier-seq? decl-specifier-seq? declarator virt-specifier-seq? function-body\r\n  | attribute-specifier-seq? decl-specifier-seq? declarator requires-clause function-body\r\n\r\nfunction-body ::=\r\n    ctor-initializer? compound-statement\r\n  | function-try-block\r\n  | \"=\" \"default\" \";\"\r\n  | \"=\" \"delete\" \";\"\r\n\r\nenum-name ::=\r\n    identifier\r\n\r\nenum-specifier ::=\r\n    enum-head \"{\" enumerator-list? \"}\"\r\n  | enum-head \"{\" enumerator-list \",\" \"}\"\r\n\r\nenum-head ::=\r\n    enum-key attribute-specifier-seq? enum-head-name? enum-base?\r\n\r\nenum-head-name ::=\r\n    nested-name-specifier? identifier\r\n\r\nopaque-enum-declaration ::=\r\n    enum-key attribute-specifier-seq? enum-head-name enum-base? \";\"\r\n\r\nenum-key ::=\r\n    \"enum\"\r\n  | \"enum\" \"class\"\r\n  | \"enum\" \"struct\"\r\n\r\nenum-base ::=\r\n    \":\" type-specifier-seq\r\n\r\nenumerator-list ::=\r\n    enumerator-definition\r\n  | enumerator-list \",\" enumerator-definition\r\n\r\nenumerator-definition ::=\r\n    enumerator\r\n  | enumerator \"=\" constant-expression\r\n\r\nenumerator ::=\r\n    identifier attribute-specifier-seq?\r\n\r\nusing-enum-declaration ::=\r\n    \"using\" \"enum\" using-enum-declarator \";\"\r\n\r\nusing-enum-declarator ::=\r\n    nested-name-specifier? identifier\r\n  | nested-name-specifier? simple-template-id\r\n\r\nnamespace-name ::=\r\n        identifier\r\n  | namespace-alias\r\n\r\nnamespace-definition ::=\r\n        named-namespace-definition\r\n  | unnamed-namespace-definition\r\n  | nested-namespace-definition\r\n\r\nnamed-namespace-definition ::=\r\n        \"inline\"? \"namespace\" attribute-specifier-seq? identifier \"{\" namespace-body \"}\"\r\n\r\nunnamed-namespace-definition ::=\r\n        \"inline\"? \"namespace\" attribute-specifier-seq? \"{\" namespace-body \"}\"\r\n\r\nnested-namespace-definition ::=\r\n        \"namespace\" enclosing-namespace-specifier \"::\" \"inline\"? identifier \"{\" namespace-body \"}\"\r\n\r\nenclosing-namespace-specifier ::=\r\n        identifier\r\n  | enclosing-namespace-specifier \"::\" \"inline\"? identifier\r\n\r\nnamespace-body ::=\r\n        declaration-seq?\r\n\r\nnamespace-alias ::=\r\n        identifier\r\n\r\nnamespace-alias-definition ::=\r\n        \"namespace\" identifier \"=\" qualified-namespace-specifier \";\"\r\n\r\nqualified-namespace-specifier ::=\r\n    nested-name-specifier? namespace-name\r\n\r\nusing-directive ::=\r\n    attribute-specifier-seq? \"using\" \"namespace\" nested-name-specifier? namespace-name \";\"\r\n\r\nusing-declaration ::=\r\n    \"using\" using-declarator-list \";\"\r\n\r\nusing-declarator-list ::=\r\n    using-declarator \"...\"?\r\n  | using-declarator-list \",\" using-declarator \"...\"?\r\n\r\nusing-declarator ::=\r\n    \"typename\"? nested-name-specifier unqualified-id\r\n\r\nasm-declaration ::=\r\n    attribute-specifier-seq? \"asm\" \"(\" balanced-token-seq \")\" \";\"\r\n\r\nlinkage-specification ::=\r\n    \"extern\" unevaluated-string \"{\" declaration-seq? \"}\"\r\n  | \"extern\" unevaluated-string name-declaration\r\n\r\nattribute-specifier-seq ::=\r\n  attribute-specifier-seq? attribute-specifier\r\n\r\nattribute-specifier ::=\r\n  \"[\" \"[\" attribute-using-prefix? attribute-list \"]\" \"]\"\r\n  | alignment-specifier\r\n\r\nalignment-specifier ::=\r\n  \"alignas\" \"(\" type-id \"...\"? \")\"\r\n  | \"alignas\" \"(\" constant-expression \"...\"? \")\"\r\n\r\nattribute-using-prefix ::=\r\n  \"using\" attribute-namespace \":\"\r\n\r\nattribute-list ::=\r\n  attribute?\r\n  | attribute-list \",\" attribute?\r\n  | attribute \"...\"\r\n  | attribute-list \",\" attribute \"...\"\r\n\r\nattribute ::=\r\n    attribute-token attribute-argument-clause?\r\n\r\nattribute-token ::=\r\n    identifier\r\n  | attribute-scoped-token\r\n\r\nattribute-scoped-token ::=\r\n    attribute-namespace \"::\" identifier\r\n\r\nattribute-namespace ::=\r\n    identifier\r\n\r\nattribute-argument-clause ::=\r\n    \"(\" balanced-token-seq? \")\"\r\n\r\nbalanced-token-seq ::=\r\n    balanced-token\r\n  | balanced-token-seq balanced-token\r\n\r\nbalanced-token ::=\r\n    \"(\" balanced-token-seq? \")\"\r\n  | \"[\" balanced-token-seq? \"]\"\r\n  | \"{\" balanced-token-seq? \"}\"\r\n  | \"{any token other than a parenthesis, a bracket, or a brace}\"\r\n\r\n//== modules.tex\r\n\r\nmodule-declaration ::=\r\n    \"export\"? \"module\" module-name module-partition? attribute-specifier-seq? \";\"\r\n\r\nmodule-name ::=\r\n    module-name-qualifier? identifier\r\n\r\nmodule-partition ::=\r\n    \":\" module-name-qualifier? identifier\r\n\r\nmodule-name-qualifier ::=\r\n    identifier \".\"\r\n  | module-name-qualifier identifier \".\"\r\n\r\nexport-declaration ::=\r\n    \"export\" name-declaration\r\n  | \"export\" \"{\" declaration-seq? \"}\"\r\n  | \"export\" module-import-declaration\r\n\r\nmodule-import-declaration ::=\r\n    \"import\" module-name attribute-specifier-seq? \";\"\r\n  | \"import\" module-partition attribute-specifier-seq? \";\"\r\n  | \"import\" header-name attribute-specifier-seq? \";\"\r\n\r\nglobal-module-fragment ::=\r\n    \"module\" \";\" declaration-seq?\r\n\r\nprivate-module-fragment ::=\r\n    \"module\" \":\" \"private\" \";\" declaration-seq?\r\n\r\n//== classes.tex\r\n\r\nclass-name ::=\r\n    identifier\r\n  | simple-template-id\r\n\r\nclass-specifier ::=\r\n    class-head \"{\" member-specification? \"}\"\r\n\r\nclass-head ::=\r\n    class-key attribute-specifier-seq? class-head-name class-virt-specifier? base-clause?\r\n  | class-key attribute-specifier-seq? base-clause?\r\n\r\nclass-head-name ::=\r\n    nested-name-specifier? class-name\r\n\r\nclass-virt-specifier ::=\r\n    \"final\"\r\n\r\nclass-key ::=\r\n    \"class\"\r\n  | \"struct\"\r\n  | \"union\"\r\n\r\nmember-specification ::=\r\n    member-declaration member-specification?\r\n  | access-specifier \":\" member-specification?\r\n\r\nmember-declaration ::=\r\n    attribute-specifier-seq? decl-specifier-seq? member-declarator-list? \";\"\r\n  | function-definition\r\n  | using-declaration\r\n  | using-enum-declaration\r\n  | static_assert-declaration\r\n  | template-declaration\r\n  | explicit-specialization\r\n  | deduction-guide\r\n  | alias-declaration\r\n  | opaque-enum-declaration\r\n  | empty-declaration\r\n\r\nmember-declarator-list ::=\r\n    member-declarator\r\n  | member-declarator-list \",\" member-declarator\r\n\r\nmember-declarator ::=\r\n    declarator virt-specifier-seq? pure-specifier?\r\n  | declarator requires-clause\r\n  | declarator brace-or-equal-initializer?\r\n  | identifier? attribute-specifier-seq? \":\" constant-expression brace-or-equal-initializer?\r\n\r\nvirt-specifier-seq ::=\r\n    virt-specifier\r\n  | virt-specifier-seq virt-specifier\r\n\r\nvirt-specifier ::=\r\n    \"override\"\r\n  | \"final\"\r\n\r\npure-specifier ::=\r\n    \"=\" \"0\"\r\n\r\nconversion-function-id ::=\r\n    \"operator\" conversion-type-id\r\n\r\nconversion-type-id ::=\r\n    type-specifier-seq conversion-declarator?\r\n\r\nconversion-declarator ::=\r\n    ptr-operator conversion-declarator?\r\n\r\nbase-clause ::=\r\n    \":\" base-specifier-list\r\n\r\nbase-specifier-list ::=\r\n    base-specifier \"...\"?\r\n  | base-specifier-list \",\" base-specifier \"...\"?\r\n\r\nbase-specifier ::=\r\n    attribute-specifier-seq? class-or-decltype\r\n  | attribute-specifier-seq? \"virtual\" access-specifier? class-or-decltype\r\n  | attribute-specifier-seq? access-specifier \"virtual\"? class-or-decltype\r\n\r\nclass-or-decltype ::=\r\n    nested-name-specifier? type-name\r\n  | nested-name-specifier \"template\" simple-template-id\r\n  | decltype-specifier\r\n\r\naccess-specifier ::=\r\n    \"private\"\r\n  | \"protected\"\r\n  | \"public\"\r\n\r\nctor-initializer ::=\r\n    \":\" mem-initializer-list\r\n\r\nmem-initializer-list ::=\r\n    mem-initializer \"...\"?\r\n  | mem-initializer-list \",\" mem-initializer \"...\"?\r\n\r\nmem-initializer ::=\r\n    mem-initializer-id \"(\" expression-list? \")\"\r\n  | mem-initializer-id braced-init-list\r\n\r\nmem-initializer-id ::=\r\n    class-or-decltype\r\n  | identifier\r\n\r\n//== overloading.tex\r\n\r\noperator-function-id ::=\r\n    \"operator\" operator\r\n\r\noperator ::=\r\n    \"new\" | \"delete\" | \"new[]\" | \"delete[]\" | \"co_await\" | \"()\" | \"[]\" | \"-\u003e\" | \"-\u003e*\"\r\n  | \"~\" | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\"\r\n  | \"|\" | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\"\r\n  | \"|=\" | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u003c=\u003e\" | \"\u0026\u0026\"\r\n  | \"||\" | \"\u003c\u003c\" | \"\u003e\u003e\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"++\" | \"--\" | \",\"\r\n\r\nliteral-operator-id ::=\r\n    \"operator\" unevaluated-string identifier\r\n  | \"operator\" user-defined-string-literal\r\n\r\n//== templates.tex\r\n\r\ntemplate-declaration ::=\r\n  template-head declaration\r\n  | template-head concept-definition\r\n\r\ntemplate-head ::=\r\n  \"template\" \"\u003c\" template-parameter-list \"\u003e\" requires-clause?\r\n\r\ntemplate-parameter-list ::=\r\n  template-parameter\r\n  | template-parameter-list \",\" template-parameter\r\n\r\nrequires-clause ::=\r\n  \"requires\" constraint-logical-or-expression\r\n\r\nconstraint-logical-or-expression ::=\r\n  constraint-logical-and-expression\r\n  | constraint-logical-or-expression \"||\" constraint-logical-and-expression\r\n\r\nconstraint-logical-and-expression ::=\r\n  primary-expression\r\n  | constraint-logical-and-expression \"\u0026\u0026\" primary-expression\r\n\r\ntemplate-parameter ::=\r\n  type-parameter\r\n  | parameter-declaration\r\n\r\ntype-parameter ::=\r\n  type-parameter-key \"...\"? identifier?\r\n  | type-parameter-key identifier? \"=\" type-id\r\n  | type-constraint \"...\"? identifier?\r\n  | type-constraint identifier? \"=\" type-id\r\n  | template-head type-parameter-key \"...\"? identifier?\r\n  | template-head type-parameter-key identifier? \"=\" id-expression\r\n\r\ntype-parameter-key ::=\r\n  \"class\"\r\n  | \"typename\"\r\n\r\ntype-constraint ::=\r\n  nested-name-specifier? concept-name\r\n  | nested-name-specifier? concept-name \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\nsimple-template-id ::=\r\n  template-name \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\ntemplate-id ::=\r\n  simple-template-id\r\n  | operator-function-id \"\u003c\" template-argument-list? \"\u003e\"\r\n  | literal-operator-id \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\ntemplate-name ::=\r\n  identifier\r\n\r\ntemplate-argument-list ::=\r\n  template-argument \"...\"?\r\n  | template-argument-list \",\" template-argument \"...\"?\r\n\r\ntemplate-argument ::=\r\n  constant-expression\r\n  | type-id\r\n  | id-expression\r\n  | braced-init-list\r\n\r\nconstraint-expression ::=\r\n    logical-or-expression\r\n\r\ndeduction-guide ::=\r\n    explicit-specifier? template-name \"(\" parameter-declaration-clause \")\" \"-\u003e\" simple-template-id \";\"\r\n\r\nconcept-definition ::=\r\n  \"concept\" concept-name attribute-specifier-seq? \"=\" constraint-expression \";\"\r\n\r\nconcept-name ::=\r\n  identifier\r\n\r\ntypename-specifier ::=\r\n  \"typename\" nested-name-specifier identifier\r\n  | \"typename\" nested-name-specifier \"template\"? simple-template-id\r\n\r\nexplicit-instantiation ::=\r\n  \"extern\"? \"template\" declaration\r\n\r\nexplicit-specialization ::=\r\n  \"template\" \"\u003c\" \"\u003e\" declaration\r\n\r\n//== exceptions.tex\r\n\r\ntry-block ::=\r\n    \"try\" compound-statement handler-seq\r\n\r\nfunction-try-block ::=\r\n    \"try\" ctor-initializer? compound-statement handler-seq\r\n\r\nhandler-seq ::=\r\n    handler handler-seq?\r\n\r\nhandler ::=\r\n    \"catch\" \"(\" exception-declaration \")\" compound-statement\r\n\r\nexception-declaration ::=\r\n    attribute-specifier-seq? type-specifier-seq declarator\r\n  | attribute-specifier-seq? type-specifier-seq abstract-declarator?\r\n  | \"...\"\r\n\r\nnoexcept-specifier ::=\r\n    \"noexcept\" \"(\" constant-expression \")\"\r\n  | \"noexcept\"\r\n\r\n//== preprocessor.tex\r\n\r\npreprocessing-file ::=\r\n    group?\r\n  | module-file\r\n\r\nmodule-file ::=\r\n    pp-global-module-fragment? pp-module group? pp-private-module-fragment?\r\n\r\npp-global-module-fragment ::=\r\n    \"module\" \";\" new-line group?\r\n\r\npp-private-module-fragment ::=\r\n    \"module\" \":\" \"private\" \";\" new-line group?\r\n\r\ngroup ::=\r\n    group-part\r\n  | group group-part\r\n\r\ngroup-part ::=\r\n    control-line\r\n  | if-section\r\n  | text-line\r\n  | \"#\" conditionally-supported-directive\r\n\r\ncontrol-line ::=\r\n    \"#\" \"include\" pp-tokens new-line\r\n  | pp-import\r\n  | \"#\" \"define\" identifier replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen identifier-list? \")\" replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen \"...\" \")\" replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen identifier-list \",\" \"...\" \")\" replacement-list new-line\r\n  | \"#\" \"undef\" identifier new-line\r\n  | \"#\" \"line\" pp-tokens new-line\r\n  | \"#\" \"error\" pp-tokens? new-line\r\n  | \"#\" \"warning\" pp-tokens? new-line\r\n  | \"#\" \"pragma\" pp-tokens? new-line\r\n  | \"#\" new-line\r\n\r\nif-section ::=\r\n    if-group elif-groups? else-group? endif-line\r\n\r\nif-group ::=\r\n    \"#\" \"if\" constant-expression new-line group?\r\n  | \"#\" \"ifdef\" identifier new-line group?\r\n  | \"#\" \"ifndef\" identifier new-line group?\r\n\r\nelif-groups ::=\r\n    elif-group\r\n  | elif-groups elif-group\r\n\r\nelif-group ::=\r\n    \"#\" \"elif\" constant-expression new-line group?\r\n  | \"#\" \"elifdef\" identifier new-line group?\r\n  | \"#\" \"elifndef\" identifier new-line group?\r\n\r\nelse-group ::=\r\n    \"#\" \"else\" new-line group?\r\n\r\nendif-line ::=\r\n    \"#\" \"endif\" new-line\r\n\r\ntext-line ::=\r\n    pp-tokens? new-line\r\n\r\nconditionally-supported-directive ::=\r\n    pp-tokens new-line\r\n\r\nlparen ::=\r\n    '{a \"(\" character not immediately preceded by whitespace}'\r\n\r\nidentifier-list ::=\r\n    identifier\r\n  | identifier-list \",\" identifier\r\n\r\nreplacement-list ::=\r\n    pp-tokens?\r\n\r\npp-tokens ::=\r\n    preprocessing-token\r\n  | pp-tokens preprocessing-token\r\n\r\nnew-line ::=\r\n    \"{the new-line character}\"\r\n\r\ndefined-macro-expression ::=\r\n    \"defined\" identifier\r\n  | \"defined\" \"(\" identifier \")\"\r\n\r\nh-preprocessing-token ::=\r\n    '{any preprocessing-token other than \"\u003e\"}'\r\n\r\nh-pp-tokens ::=\r\n    h-preprocessing-token\r\n  | h-pp-tokens h-preprocessing-token\r\n\r\nheader-name-tokens ::=\r\n    string-literal\r\n  | \"\u003c\" h-pp-tokens \"\u003e\"\r\n\r\nhas-include-expression ::=\r\n    \"has_include\" \"(\" header-name \")\"\r\n  | \"has_include\" \"(\" header-name-tokens \")\"\r\n\r\nhas-attribute-expression ::=\r\n    \"has_cpp_attribute\" \"(\" pp-tokens \")\"\r\n\r\npp-module ::=\r\n    \"export\"? \"module\" pp-tokens? \";\" new-line\r\n\r\npp-import ::=\r\n    \"export\"? \"import\" header-name pp-tokens? \";\" new-line\r\n  | \"export\"? \"import\" header-name-tokens pp-tokens? \";\" new-line\r\n  | \"export\"? \"import\" pp-tokens \";\" new-line\r\n\r\nva-opt-replacement ::=\r\n    \"VA_OPT\" \"(\" pp-tokens? \")\"\r\n```\r\n","author":{"url":"https://github.com/mingodad","@type":"Person","name":"mingodad"},"datePublished":"2023-12-22T15:21:46.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/6742/draft/issues/6742"},"preloadedQueries":[{"queryId":"cee21fcf82c877ad153a2db35b36eb94","queryName":"IssueViewerViewQuery","variables":{"count":15,"id":"repository","number":6742,"owner":"cplusplus","repo":"draft"},"result":{"data":{"repository":{"isOwnerEnterpriseManaged":false,"issue":{"id":"I_kwDOACHROc56bqD9","updatedAt":"2023-12-27T11:55:17Z","title":"Grammar railroad diagram","number":6742,"repository":{"nameWithOwner":"cplusplus/draft","id":"MDEwOlJlcG9zaXRvcnkyMjE2MjQ5","name":"draft","owner":{"__typename":"Organization","login":"cplusplus","id":"MDEyOk9yZ2FuaXphdGlvbjU5Mjc2","url":"https://github.com/cplusplus","databaseId":59276},"isArchived":false,"isPrivate":false,"databaseId":2216249,"slashCommandsEnabled":false,"visibility":"PUBLIC","viewerCanPush":false,"viewerCanInteract":false,"viewerInteractionLimitReasonHTML":"","planFeatures":{"maximumAssignees":10},"isCopilotAgentEnabled":null,"pinnedIssues":{"totalCount":0},"viewerCanPinIssues":false,"viewerIssueCreationPermissions":{"triageable":false},"issueTypes":{"edges":[{"node":{"id":"IT_kwDN54zOAAFvmw"}},{"node":{"id":"IT_kwDN54zOAAFvnQ"}},{"node":{"id":"IT_kwDN54zOAAFvog"}}]}},"titleHTML":"Grammar railroad diagram","url":"https://github.com/cplusplus/draft/issues/6742","viewerCanUpdateNext":false,"issueType":null,"state":"CLOSED","stateReason":"NOT_PLANNED","duplicateOf":null,"linkedPullRequests":{"nodes":[]},"subIssuesSummary":{"total":0,"completed":0},"__isLabelable":"Issue","labels":{"edges":[],"pageInfo":{"endCursor":null,"hasNextPage":false}},"__isNode":"Issue","assignedActors":{"nodes":[]},"milestone":null,"databaseId":2054070525,"viewerDidAuthor":false,"locked":false,"author":{"__typename":"User","__isActor":"User","login":"mingodad","id":"MDQ6VXNlcjQ2MjYxOA==","profileUrl":"https://github.com/mingodad","avatarUrl":"https://avatars.githubusercontent.com/u/462618?u=76da37792120b5cae1c739a669c27d60dfbb427f\u0026v=4"},"__isComment":"Issue","body":"Using https://github.com/mingodad/squilu to extract the `{bnf}` sections from all `*.tex` files and convert then to an `EBNF` understood by https://www.bottlecaps.de/rr/ui we can have a nice navigable railroad diagram (see bellow the resulting `EBNF` and instructions to visualize the railroad diagram).\r\n\r\n```\r\n//\r\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\r\n//\r\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\r\n// then click the 'View Diagram' tab.\r\n//\r\n\r\n//\r\n//To facilitate start navigating\r\n//\r\n\r\ncplusplus ::=\r\n\tpreprocessing-file? translation-unit\r\n\r\n//== lex.tex\r\n\r\nn-char ::=\r\n     \"{any member of the translation character set except the \\unicode{007d}{right curly bracket} or new-line character}\"\r\n\r\nn-char-sequence ::=\r\n    n-char\r\n  | n-char-sequence n-char\r\n\r\nnamed-universal-character ::=\r\n    \"\\N{\" n-char-sequence \"}\"\r\n\r\nhex-quad ::=\r\n    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit\r\n\r\nsimple-hexadecimal-digit-sequence ::=\r\n    hexadecimal-digit\r\n  | simple-hexadecimal-digit-sequence hexadecimal-digit\r\n\r\nuniversal-character-name ::=\r\n    \"\\u\" hex-quad\r\n  | \"\\U\" hex-quad hex-quad\r\n  | \"\\u{\" simple-hexadecimal-digit-sequence \"}\"\r\n  | named-universal-character\r\n\r\npreprocessing-token ::=\r\n    header-name\r\n  | \"import\"\r\n  | \"module\"\r\n  | \"export\"\r\n  | identifier\r\n  | pp-number\r\n  | character-literal\r\n  | user-defined-character-literal\r\n  | string-literal\r\n  | user-defined-string-literal\r\n  | preprocessing-op-or-punc\r\n  | \"{each non-whitespace character that cannot be one of the above}\"\r\n\r\n//token ::=\r\n//    identifier\r\n//  | keyword\r\n//  | literal\r\n//  | operator-or-punctuator\r\n\r\nheader-name ::=\r\n    \"\u003c\" h-char-sequence \"\u003e\"\r\n  | '\"' q-char-sequence '\"'\r\n\r\nh-char-sequence ::=\r\n    h-char\r\n  | h-char-sequence h-char\r\n\r\nh-char ::=\r\n    \"{any member of the translation character set except new-line and \\unicode{003e}{greater-than sign}}\"\r\n\r\nq-char-sequence ::=\r\n    q-char\r\n  | q-char-sequence q-char\r\n\r\nq-char ::=\r\n    \"{any member of the translation character set except new-line and \\unicode{0022}{quotation mark}}\"\r\n\r\npp-number ::=\r\n    digit\r\n  | \".\" digit\r\n  | pp-number identifier-continue\r\n  | pp-number \"'\" digit\r\n  | pp-number \"'\" nondigit\r\n  | pp-number \"e\" sign\r\n  | pp-number \"E\" sign\r\n  | pp-number \"p\" sign\r\n  | pp-number \"P\" sign\r\n  | pp-number \".\"\r\n\r\nidentifier ::=\r\n    identifier-start\r\n  | identifier identifier-continue\r\n\r\nidentifier-start ::=\r\n    nondigit\r\n  | \"{an element of the translation character set with the Unicode property XID_Start}\"\r\n\r\nidentifier-continue ::=\r\n    digit\r\n  | nondigit\r\n  | \"{an element of the translation character set with the Unicode property XID_Continue}\"\r\n\r\nnondigit ::=\r\n    \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\" | \"g\" | \"h\" | \"i\" | \"j\" | \"k\" | \"l\" | \"m\"\r\n  | \"n\" | \"o\" | \"p\" | \"q\" | \"r\" | \"s\" | \"t\" | \"u\" | \"v\" | \"w\" | \"x\" | \"y\" | \"z\"\r\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\" | \"G\" | \"H\" | \"I\" | \"J\" | \"K\" | \"L\" | \"M\"\r\n  | \"N\" | \"O\" | \"P\" | \"Q\" | \"R\" | \"S\" | \"T\" | \"U\" | \"V\" | \"W\" | \"X\" | \"Y\" | \"Z\" | \"_\"\r\n\r\ndigit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n\r\nkeyword ::=\r\n    \"{any identifier listed in lex.key}\"\r\n  | \"import\"\r\n  | \"module\"\r\n  | \"export\"\r\n\r\npreprocessing-op-or-punc ::=\r\n    preprocessing-operator\r\n  | operator-or-punctuator\r\n\r\npreprocessing-operator ::=\r\n    \"#\" | \"##\" | \"%:\" | \"%:%:\"\r\n\r\noperator-or-punctuator ::=\r\n    \"{\" | \"}\" | \"[\" | \"]\" | \"(\" | \")\"\r\n  | \"\u003c:\" | \":\u003e\" | \"\u003c%\" | \"%\u003e\" | \";\" | \":\" | \"...\"\r\n  | \"?\" | \"::\" | \".\" | \".*\" | \"-\u003e\" | \"-\u003e*\" | \"~\"\r\n  | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\" | \"|\"\r\n  | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\" | \"|=\"\r\n  | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u003c=\u003e\" | \"\u0026\u0026\" | \"||\"\r\n  | \"\u003c\u003c\" | \"\u003e\u003e\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"++\" | \"--\" | \",\"\r\n  | \"and\" | \"or\" | \"xor\" | \"not\" | \"bitand\" | \"bitor\" | \"compl\"\r\n  | \"and_eq\" | \"or_eq\" | \"xor_eq\" | \"not_eq\"\r\n\r\nliteral ::=\r\n    integer-literal\r\n  | character-literal\r\n  | floating-point-literal\r\n  | string-literal\r\n  | boolean-literal\r\n  | pointer-literal\r\n  | user-defined-literal\r\n\r\ninteger-literal ::=\r\n    binary-literal integer-suffix?\r\n  | octal-literal integer-suffix?\r\n  | decimal-literal integer-suffix?\r\n  | hexadecimal-literal integer-suffix?\r\n\r\nbinary-literal ::=\r\n    \"0b\" binary-digit\r\n  | \"0B\" binary-digit\r\n  | binary-literal \"'\"? binary-digit\r\n\r\noctal-literal ::=\r\n    \"0\"\r\n  | octal-literal \"'\"? octal-digit\r\n\r\ndecimal-literal ::=\r\n    nonzero-digit\r\n  | decimal-literal \"'\"? digit\r\n\r\nhexadecimal-literal ::=\r\n    hexadecimal-prefix hexadecimal-digit-sequence\r\n\r\nbinary-digit ::=\r\n    \"0\" | \"1\"\r\n\r\noctal-digit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\"\r\n\r\nnonzero-digit ::=\r\n    \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n\r\nhexadecimal-prefix ::=\r\n    \"0x\" | \"0X\"\r\n\r\nhexadecimal-digit-sequence ::=\r\n    hexadecimal-digit\r\n  | hexadecimal-digit-sequence \"'\"? hexadecimal-digit\r\n\r\nhexadecimal-digit ::=\r\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\r\n  | \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\"\r\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\"\r\n\r\ninteger-suffix ::=\r\n    unsigned-suffix long-suffix?\r\n  | unsigned-suffix long-long-suffix?\r\n  | unsigned-suffix size-suffix?\r\n  | long-suffix unsigned-suffix?\r\n  | long-long-suffix unsigned-suffix?\r\n  | size-suffix unsigned-suffix?\r\n\r\nunsigned-suffix ::=\r\n    \"u\" | \"U\"\r\n\r\nlong-suffix ::=\r\n    \"l\" | \"L\"\r\n\r\nlong-long-suffix ::=\r\n    \"ll\" | \"LL\"\r\n\r\nsize-suffix ::=\r\n   \"z\" | \"Z\"\r\n\r\ncharacter-literal ::=\r\n    encoding-prefix? \"'\" c-char-sequence \"'\"\r\n\r\nencoding-prefix ::=\r\n    \"u8\" | \"u\" | \"U\" | \"L\"\r\n\r\nc-char-sequence ::=\r\n    c-char\r\n  | c-char-sequence c-char\r\n\r\nc-char ::=\r\n    basic-c-char\r\n  | escape-sequence\r\n  | universal-character-name\r\n\r\nbasic-c-char ::=\r\n    \"{any member of the translation character set except the \\unicode{0027}{apostrophe},}\"\r\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\r\n\r\nescape-sequence ::=\r\n    simple-escape-sequence\r\n  | numeric-escape-sequence\r\n  | conditional-escape-sequence\r\n\r\nsimple-escape-sequence ::=\r\n    \"\\\" simple-escape-sequence-char\r\n\r\nsimple-escape-sequence-char ::=\r\n    \"'\" | '\"' | \"?\" | \"\\\" | \"a\" | \"b\" | \"f\" | \"n\" | \"r\" | \"t\" | \"v\"\r\n\r\nnumeric-escape-sequence ::=\r\n    octal-escape-sequence\r\n  | hexadecimal-escape-sequence\r\n\r\nsimple-octal-digit-sequence ::=\r\n    octal-digit\r\n  | simple-octal-digit-sequence octal-digit\r\n\r\noctal-escape-sequence ::=\r\n    \"\\\" octal-digit\r\n  | \"\\\" octal-digit octal-digit\r\n  | \"\\\" octal-digit octal-digit octal-digit\r\n  | \"\\o{\" simple-octal-digit-sequence \"}\"\r\n\r\nhexadecimal-escape-sequence ::=\r\n    \"\\x\" simple-hexadecimal-digit-sequence\r\n  | \"\\x{\" simple-hexadecimal-digit-sequence \"}\"\r\n\r\nconditional-escape-sequence ::=\r\n    \"\\\" conditional-escape-sequence-char\r\n\r\nconditional-escape-sequence-char ::=\r\n    '{any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the characters \"N\", \"o\", \"u\", \"U\", or \"x\"}'\r\n\r\nfloating-point-literal ::=\r\n    decimal-floating-point-literal\r\n  | hexadecimal-floating-point-literal\r\n\r\ndecimal-floating-point-literal ::=\r\n    fractional-constant exponent-part? floating-point-suffix?\r\n  | digit-sequence exponent-part floating-point-suffix?\r\n\r\nhexadecimal-floating-point-literal ::=\r\n    hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-point-suffix?\r\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-point-suffix?\r\n\r\nfractional-constant ::=\r\n    digit-sequence? \".\" digit-sequence\r\n  | digit-sequence \".\"\r\n\r\nhexadecimal-fractional-constant ::=\r\n    hexadecimal-digit-sequence? \".\" hexadecimal-digit-sequence\r\n  | hexadecimal-digit-sequence \".\"\r\n\r\nexponent-part ::=\r\n    \"e\" sign? digit-sequence\r\n  | \"E\" sign? digit-sequence\r\n\r\nbinary-exponent-part ::=\r\n    \"p\" sign? digit-sequence\r\n  | \"P\" sign? digit-sequence\r\n\r\nsign ::=\r\n    \"+\" | \"-\"\r\n\r\ndigit-sequence ::=\r\n    digit\r\n  | digit-sequence \"'\"? digit\r\n\r\nfloating-point-suffix ::=\r\n    \"f\" | \"l\" | \"f16\" | \"f32\" | \"f64\" | \"f128\" | \"bf16\" | \"F\" | \"L\" | \"F16\" | \"F32\" | \"F64\" | \"F128\" | \"BF16\"\r\n\r\nstring-literal ::=\r\n    encoding-prefix? '\"' s-char-sequence? '\"'\r\n  | encoding-prefix? \"R\" raw-string\r\n\r\ns-char-sequence ::=\r\n    s-char\r\n  | s-char-sequence s-char\r\n\r\ns-char ::=\r\n    basic-s-char\r\n  | escape-sequence\r\n  | universal-character-name\r\n\r\nbasic-s-char ::=\r\n    \"{any member of the translation character set except the \\unicode{0022}{quotation mark},}\"\r\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\r\n\r\nraw-string ::=\r\n    '\"' d-char-sequence? \"(\" r-char-sequence? \")\" d-char-sequence? '\"'\r\n\r\nr-char-sequence ::=\r\n    r-char\r\n  | r-char-sequence r-char\r\n\r\nr-char ::=\r\n    \"{any member of the translation character set, except a \\unicode{0029}{right parenthesis} followed by}\"\r\n        \"{the initial d-char-sequence (which may be empty) followed by a \\unicode{0022}{quotation mark}}\"\r\n\r\nd-char-sequence ::=\r\n    d-char\r\n  | d-char-sequence d-char\r\n\r\nd-char ::=\r\n    \"{any member of the basic character set except:}\"\r\n        \"{\\unicode{0020}{space}, \\unicode{0028}{left parenthesis}, \\unicode{0029}{right parenthesis}, \\unicode{005c}{reverse solidus},}\"\r\n        \"{\\unicode{0009}{character tabulation}, \\unicode{000b}{line tabulation}, \\unicode{000c}{form feed}, and new-line}\"\r\n\r\nunevaluated-string ::=\r\n    string-literal\r\n\r\nboolean-literal ::=\r\n    \"false\"\r\n  | \"true\"\r\n\r\npointer-literal ::=\r\n    \"nullptr\"\r\n\r\nuser-defined-literal ::=\r\n    user-defined-integer-literal\r\n  | user-defined-floating-point-literal\r\n  | user-defined-string-literal\r\n  | user-defined-character-literal\r\n\r\nuser-defined-integer-literal ::=\r\n    decimal-literal ud-suffix\r\n  | octal-literal ud-suffix\r\n  | hexadecimal-literal ud-suffix\r\n  | binary-literal ud-suffix\r\n\r\nuser-defined-floating-point-literal ::=\r\n    fractional-constant exponent-part? ud-suffix\r\n  | digit-sequence exponent-part ud-suffix\r\n  | hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix\r\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix\r\n\r\nuser-defined-string-literal ::=\r\n    string-literal ud-suffix\r\n\r\nuser-defined-character-literal ::=\r\n    character-literal ud-suffix\r\n\r\nud-suffix ::=\r\n    identifier\r\n\r\n//== basic.tex\r\n\r\ntranslation-unit ::=\r\n    declaration-seq?\r\n  | global-module-fragment? module-declaration declaration-seq? private-module-fragment?\r\n\r\n//== expressions.tex\r\n\r\nprimary-expression ::=\r\n    literal\r\n  | \"this\"\r\n  | \"(\" expression \")\"\r\n  | id-expression\r\n  | lambda-expression\r\n  | fold-expression\r\n  | requires-expression\r\n\r\nid-expression ::=\r\n    unqualified-id\r\n  | qualified-id\r\n  | pack-index-expression\r\n\r\nunqualified-id ::=\r\n    identifier\r\n  | operator-function-id\r\n  | conversion-function-id\r\n  | literal-operator-id\r\n  | \"~\" type-name\r\n  | \"~\" computed-type-specifier\r\n  | template-id\r\n\r\nqualified-id ::=\r\n    nested-name-specifier \"template\"? unqualified-id\r\n\r\nnested-name-specifier ::=\r\n    \"::\"\r\n  | type-name \"::\"\r\n  | namespace-name \"::\"\r\n  | computed-type-specifier \"::\"\r\n  | nested-name-specifier identifier \"::\"\r\n  | nested-name-specifier \"template\"? simple-template-id \"::\"\r\n\r\npack-index-expression ::=\r\n    id-expression \"...\" \"[\" constant-expression \"]\"\r\n\r\nlambda-expression ::=\r\n    lambda-introducer attribute-specifier-seq? lambda-declarator compound-statement\r\n  | lambda-introducer \"\u003c\" template-parameter-list \"\u003e\" requires-clause? attribute-specifier-seq?\r\n         lambda-declarator compound-statement\r\n\r\nlambda-introducer ::=\r\n    \"[\" lambda-capture? \"]\"\r\n\r\nlambda-declarator ::=\r\n    lambda-specifier-seq noexcept-specifier? attribute-specifier-seq? trailing-return-type?\r\n  | noexcept-specifier attribute-specifier-seq? trailing-return-type?\r\n  | trailing-return-type?\r\n  | \"(\" parameter-declaration-clause \")\" lambda-specifier-seq? noexcept-specifier? attribute-specifier-seq?\r\n         trailing-return-type? requires-clause?\r\n\r\nlambda-specifier ::=\r\n    \"consteval\"\r\n  | \"constexpr\"\r\n  | \"mutable\"\r\n  | \"static\"\r\n\r\nlambda-specifier-seq ::=\r\n    lambda-specifier\r\n  | lambda-specifier lambda-specifier-seq\r\n\r\nlambda-capture ::=\r\n    capture-default\r\n  | capture-list\r\n  | capture-default \",\" capture-list\r\n\r\ncapture-default ::=\r\n    \"\u0026\"\r\n  | \"=\"\r\n\r\ncapture-list ::=\r\n    capture\r\n  | capture-list \",\" capture\r\n\r\ncapture ::=\r\n    simple-capture\r\n  | init-capture\r\n\r\nsimple-capture ::=\r\n    identifier \"...\"?\r\n  | \"\u0026\" identifier \"...\"?\r\n  | \"this\"\r\n  | \"*\" \"this\"\r\n\r\ninit-capture ::=\r\n    \"...\"? identifier initializer\r\n  | \"\u0026\" \"...\"? identifier initializer\r\n\r\nfold-expression ::=\r\n    \"(\" cast-expression fold-operator \"...\" \")\"\r\n  | \"(\" \"...\" fold-operator cast-expression \")\"\r\n  | \"(\" cast-expression fold-operator \"...\" fold-operator cast-expression \")\"\r\n\r\nfold-operator ::=\r\n    \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\" | \"|\" | \"\u003c\u003c\" | \"\u003e\u003e\"\r\n  | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\" | \"|=\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"=\"\r\n  | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u0026\u0026\" | \"||\" | \",\" | \".*\" | \"-\u003e*\"\r\n\r\nrequires-expression ::=\r\n    \"requires\" requirement-parameter-list? requirement-body\r\n\r\nrequirement-parameter-list ::=\r\n    \"(\" parameter-declaration-clause \")\"\r\n\r\nrequirement-body ::=\r\n    \"{\" requirement-seq \"}\"\r\n\r\nrequirement-seq ::=\r\n    requirement\r\n  | requirement requirement-seq\r\n\r\nrequirement ::=\r\n    simple-requirement\r\n  | type-requirement\r\n  | compound-requirement\r\n  | nested-requirement\r\n\r\nsimple-requirement ::=\r\n    expression \";\"\r\n\r\ntype-requirement ::=\r\n    \"typename\" nested-name-specifier? type-name \";\"\r\n\r\ncompound-requirement ::=\r\n    \"{\" expression \"}\" \"noexcept\"? return-type-requirement? \";\"\r\n\r\nreturn-type-requirement ::=\r\n    \"-\u003e\" type-constraint\r\n\r\nnested-requirement ::=\r\n    \"requires\" constraint-expression \";\"\r\n\r\npostfix-expression ::=\r\n    primary-expression\r\n  | postfix-expression \"[\" expression-list? \"]\"\r\n  | postfix-expression \"(\" expression-list? \")\"\r\n  | simple-type-specifier \"(\" expression-list? \")\"\r\n  | typename-specifier \"(\" expression-list? \")\"\r\n  | simple-type-specifier braced-init-list\r\n  | typename-specifier braced-init-list\r\n  | postfix-expression \".\" \"template\"? id-expression\r\n  | postfix-expression \"-\u003e\" \"template\"? id-expression\r\n  | postfix-expression \"++\"\r\n  | postfix-expression \"--\"\r\n  | \"dynamic_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"static_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"reinterpret_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"const_cast\" \"\u003c\" type-id \"\u003e\" \"(\" expression \")\"\r\n  | \"typeid\" \"(\" expression \")\"\r\n  | \"typeid\" \"(\" type-id \")\"\r\n\r\nexpression-list ::=\r\n    initializer-list\r\n\r\nunary-expression ::=\r\n    postfix-expression\r\n  | unary-operator cast-expression\r\n  | \"++\" cast-expression\r\n  | \"--\" cast-expression\r\n  | await-expression\r\n  | \"sizeof\" unary-expression\r\n  | \"sizeof\" \"(\" type-id \")\"\r\n  | \"sizeof\" \"...\" \"(\" identifier \")\"\r\n  | \"alignof\" \"(\" type-id \")\"\r\n  | noexcept-expression\r\n  | new-expression\r\n  | delete-expression\r\n\r\nunary-operator ::=\r\n    \"*\" | \"\u0026\" | \"+\" | \"-\" | \"!\" | \"~\"\r\n\r\nawait-expression ::=\r\n    \"co_await\" cast-expression\r\n\r\nnoexcept-expression ::=\r\n  \"noexcept\" \"(\" expression \")\"\r\n\r\nnew-expression ::=\r\n    \"::\"? \"new\" new-placement? new-type-id new-initializer?\r\n  | \"::\"? \"new\" new-placement? \"(\" type-id \")\" new-initializer?\r\n\r\nnew-placement ::=\r\n    \"(\" expression-list \")\"\r\n\r\nnew-type-id ::=\r\n    type-specifier-seq new-declarator?\r\n\r\nnew-declarator ::=\r\n    ptr-operator new-declarator?\r\n  | noptr-new-declarator\r\n\r\nnoptr-new-declarator ::=\r\n    \"[\" expression? \"]\" attribute-specifier-seq?\r\n  | noptr-new-declarator \"[\" constant-expression \"]\" attribute-specifier-seq?\r\n\r\nnew-initializer ::=\r\n    \"(\" expression-list? \")\"\r\n  | braced-init-list\r\n\r\ndelete-expression ::=\r\n    \"::\"? \"delete\" cast-expression\r\n  | \"::\"? \"delete\" \"[\" \"]\" cast-expression\r\n\r\ncast-expression ::=\r\n    unary-expression\r\n  | \"(\" type-id \")\" cast-expression\r\n\r\npm-expression ::=\r\n    cast-expression\r\n  | pm-expression \".*\" cast-expression\r\n  | pm-expression \"-\u003e*\" cast-expression\r\n\r\nmultiplicative-expression ::=\r\n    pm-expression\r\n  | multiplicative-expression \"*\" pm-expression\r\n  | multiplicative-expression \"/\" pm-expression\r\n  | multiplicative-expression \"%\" pm-expression\r\n\r\nadditive-expression ::=\r\n    multiplicative-expression\r\n  | additive-expression \"+\" multiplicative-expression\r\n  | additive-expression \"-\" multiplicative-expression\r\n\r\nshift-expression ::=\r\n    additive-expression\r\n  | shift-expression \"\u003c\u003c\" additive-expression\r\n  | shift-expression \"\u003e\u003e\" additive-expression\r\n\r\ncompare-expression ::=\r\n    shift-expression\r\n  | compare-expression \"\u003c=\u003e\" shift-expression\r\n\r\nrelational-expression ::=\r\n    compare-expression\r\n  | relational-expression \"\u003c\" compare-expression\r\n  | relational-expression \"\u003e\" compare-expression\r\n  | relational-expression \"\u003c=\" compare-expression\r\n  | relational-expression \"\u003e=\" compare-expression\r\n\r\nequality-expression ::=\r\n    relational-expression\r\n  | equality-expression \"==\" relational-expression\r\n  | equality-expression \"!=\" relational-expression\r\n\r\nand-expression ::=\r\n    equality-expression\r\n  | and-expression \"\u0026\" equality-expression\r\n\r\nexclusive-or-expression ::=\r\n    and-expression\r\n  | exclusive-or-expression \"^\" and-expression\r\n\r\ninclusive-or-expression ::=\r\n    exclusive-or-expression\r\n  | inclusive-or-expression \"|\" exclusive-or-expression\r\n\r\nlogical-and-expression ::=\r\n    inclusive-or-expression\r\n  | logical-and-expression \"\u0026\u0026\" inclusive-or-expression\r\n\r\nlogical-or-expression ::=\r\n    logical-and-expression\r\n  | logical-or-expression \"||\" logical-and-expression\r\n\r\nconditional-expression ::=\r\n    logical-or-expression\r\n  | logical-or-expression \"?\" expression \":\" assignment-expression\r\n\r\n  yield-expression ::=\r\n  \"co_yield\" assignment-expression\r\n  | \"co_yield\" braced-init-list\r\n\r\nthrow-expression ::=\r\n    \"throw\"  assignment-expression?\r\n\r\nassignment-expression ::=\r\n    conditional-expression\r\n  | yield-expression\r\n  | throw-expression\r\n  | logical-or-expression assignment-operator initializer-clause\r\n\r\nassignment-operator ::=\r\n    \"=\" | \"*=\" | \"/=\" | \"%=\" | \"+=\" | \"-=\" | \"\u003e\u003e=\" | \"\u003c\u003c=\" | \"\u0026=\" | \"^=\" | \"|=\"\r\n\r\nexpression ::=\r\n    assignment-expression\r\n  | expression \",\" assignment-expression\r\n\r\nconstant-expression ::=\r\n    conditional-expression\r\n\r\n//== statements.tex\r\n\r\nstatement ::=\r\n    labeled-statement\r\n  | attribute-specifier-seq? expression-statement\r\n  | attribute-specifier-seq? compound-statement\r\n  | attribute-specifier-seq? selection-statement\r\n  | attribute-specifier-seq? iteration-statement\r\n  | attribute-specifier-seq? jump-statement\r\n  | declaration-statement\r\n  | attribute-specifier-seq? try-block\r\n\r\ninit-statement ::=\r\n    expression-statement\r\n  | simple-declaration\r\n  | alias-declaration\r\n\r\ncondition ::=\r\n    expression\r\n  | attribute-specifier-seq? decl-specifier-seq declarator brace-or-equal-initializer\r\n\r\nlabel ::=\r\n    attribute-specifier-seq? identifier \":\"\r\n  | attribute-specifier-seq? \"case\" constant-expression \":\"\r\n  | attribute-specifier-seq? \"default\" \":\"\r\n\r\nlabeled-statement ::=\r\n    label statement\r\n\r\nexpression-statement ::=\r\n    expression? \";\"\r\n\r\ncompound-statement ::=\r\n    \"{\" statement-seq? label-seq? \"}\"\r\n\r\nstatement-seq ::=\r\n    statement\r\n  | statement-seq statement\r\n\r\nlabel-seq ::=\r\n    label\r\n  | label-seq label\r\n\r\nselection-statement ::=\r\n    \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement\r\n  | \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement \"else\" statement\r\n  | \"if\" \"!\"? \"consteval\" compound-statement\r\n  | \"if\" \"!\"? \"consteval\" compound-statement \"else\" statement\r\n  | \"switch\" \"(\" init-statement? condition \")\" statement\r\n\r\niteration-statement ::=\r\n    \"while\" \"(\" condition \")\" statement\r\n  | \"do\" statement \"while\" \"(\" expression \")\" \";\"\r\n  | \"for\" \"(\" init-statement condition? \";\" expression? \")\" statement\r\n  | \"for\" \"(\" init-statement? for-range-declaration \":\" for-range-initializer \")\" statement\r\n\r\nfor-range-declaration ::=\r\n    attribute-specifier-seq? decl-specifier-seq declarator\r\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\"\r\n\r\nfor-range-initializer ::=\r\n    expr-or-braced-init-list\r\n\r\njump-statement ::=\r\n    \"break\" \";\"\r\n  | \"continue\" \";\"\r\n  | \"return\" expr-or-braced-init-list? \";\"\r\n  | coroutine-return-statement\r\n  | \"goto\" identifier \";\"\r\n\r\ncoroutine-return-statement ::=\r\n    \"co_return\" expr-or-braced-init-list? \";\"\r\n\r\ndeclaration-statement ::=\r\n    block-declaration\r\n\r\n//== declarations.tex\r\n\r\ndeclaration-seq ::=\r\n    declaration\r\n  | declaration-seq declaration\r\n\r\ndeclaration ::=\r\n    name-declaration\r\n  | special-declaration\r\n\r\nname-declaration ::=\r\n    block-declaration\r\n  | nodeclspec-function-declaration\r\n  | function-definition\r\n  | template-declaration\r\n  | deduction-guide\r\n  | linkage-specification\r\n  | namespace-definition\r\n  | empty-declaration\r\n  | attribute-declaration\r\n  | module-import-declaration\r\n\r\nspecial-declaration ::=\r\n    explicit-instantiation\r\n  | explicit-specialization\r\n  | export-declaration\r\n\r\nblock-declaration ::=\r\n    simple-declaration\r\n  | asm-declaration\r\n  | namespace-alias-definition\r\n  | using-declaration\r\n  | using-enum-declaration\r\n  | using-directive\r\n  | static_assert-declaration\r\n  | alias-declaration\r\n  | opaque-enum-declaration\r\n\r\nnodeclspec-function-declaration ::=\r\n    attribute-specifier-seq? declarator \";\"\r\n\r\nalias-declaration ::=\r\n    \"using\" identifier attribute-specifier-seq? \"=\" defining-type-id \";\"\r\n\r\nsimple-declaration ::=\r\n    decl-specifier-seq init-declarator-list? \";\"\r\n  | attribute-specifier-seq decl-specifier-seq init-declarator-list \";\"\r\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\" initializer \";\"\r\n\r\nstatic_assert-message ::=\r\n  unevaluated-string\r\n  | constant-expression\r\n\r\nstatic_assert-declaration ::=\r\n  \"static_assert\" \"(\" constant-expression \")\" \";\"\r\n  | \"static_assert\" \"(\" constant-expression \",\" static_assert-message \")\" \";\"\r\n\r\nempty-declaration ::=\r\n    \";\"\r\n\r\nattribute-declaration ::=\r\n    attribute-specifier-seq \";\"\r\n\r\ndecl-specifier ::=\r\n    storage-class-specifier\r\n  | defining-type-specifier\r\n  | function-specifier\r\n  | \"friend\"\r\n  | \"typedef\"\r\n  | \"constexpr\"\r\n  | \"consteval\"\r\n  | \"constinit\"\r\n  | \"inline\"\r\n\r\ndecl-specifier-seq ::=\r\n    decl-specifier attribute-specifier-seq?\r\n  | decl-specifier decl-specifier-seq\r\n\r\nstorage-class-specifier ::=\r\n    \"static\"\r\n  | \"thread_local\"\r\n  | \"extern\"\r\n  | \"mutable\"\r\n\r\nfunction-specifier ::=\r\n    \"virtual\"\r\n  | explicit-specifier\r\n\r\nexplicit-specifier ::=\r\n    \"explicit\" \"(\" constant-expression \")\"\r\n  | \"explicit\"\r\n\r\ntypedef-name ::=\r\n    identifier\r\n  | simple-template-id\r\n\r\ntype-specifier ::=\r\n  simple-type-specifier\r\n  | elaborated-type-specifier\r\n  | typename-specifier\r\n  | cv-qualifier\r\n\r\ntype-specifier-seq ::=\r\n    type-specifier attribute-specifier-seq?\r\n  | type-specifier type-specifier-seq\r\n\r\ndefining-type-specifier ::=\r\n    type-specifier\r\n  | class-specifier\r\n  | enum-specifier\r\n\r\ndefining-type-specifier-seq ::=\r\n  defining-type-specifier attribute-specifier-seq?\r\n  | defining-type-specifier defining-type-specifier-seq\r\n\r\nsimple-type-specifier ::=\r\n    nested-name-specifier? type-name\r\n  | nested-name-specifier \"template\" simple-template-id\r\n  | computed-type-specifier\r\n  | placeholder-type-specifier\r\n  | nested-name-specifier? template-name\r\n  | \"char\"\r\n  | \"char8_t\"\r\n  | \"char16_t\"\r\n  | \"char32_t\"\r\n  | \"wchar_t\"\r\n  | \"bool\"\r\n  | \"short\"\r\n  | \"int\"\r\n  | \"long\"\r\n  | \"signed\"\r\n  | \"unsigned\"\r\n  | \"float\"\r\n  | \"double\"\r\n  | \"void\"\r\n\r\ntype-name ::=\r\n    class-name\r\n  | enum-name\r\n  | typedef-name\r\n\r\ncomputed-type-specifier ::=\r\n    decltype-specifier\r\n  | pack-index-specifier\r\n\r\npack-index-specifier ::=\r\n    typedef-name \"...\" \"[\" constant-expression \"]\"\r\n\r\nelaborated-type-specifier ::=\r\n    class-key attribute-specifier-seq? nested-name-specifier? identifier\r\n  | class-key simple-template-id\r\n  | class-key nested-name-specifier \"template\"? simple-template-id\r\n  | \"enum\" nested-name-specifier? identifier\r\n\r\ndecltype-specifier ::=\r\n  \"decltype\" \"(\" expression \")\"\r\n\r\nplaceholder-type-specifier ::=\r\n  type-constraint? \"auto\"\r\n  | type-constraint? \"decltype\" \"(\" \"auto\" \")\"\r\n\r\ninit-declarator-list ::=\r\n    init-declarator\r\n  | init-declarator-list \",\" init-declarator\r\n\r\ninit-declarator ::=\r\n    declarator initializer?\r\n  | declarator requires-clause\r\n\r\ndeclarator ::=\r\n    ptr-declarator\r\n  | noptr-declarator parameters-and-qualifiers trailing-return-type\r\n\r\nptr-declarator ::=\r\n    noptr-declarator\r\n  | ptr-operator ptr-declarator\r\n\r\nnoptr-declarator ::=\r\n    declarator-id attribute-specifier-seq?\r\n  | noptr-declarator parameters-and-qualifiers\r\n  | noptr-declarator \"[\" constant-expression? \"]\" attribute-specifier-seq?\r\n  | \"(\" ptr-declarator \")\"\r\n\r\nparameters-and-qualifiers ::=\r\n    \"(\" parameter-declaration-clause \")\" cv-qualifier-seq?\r\n        ref-qualifier? noexcept-specifier? attribute-specifier-seq?\r\n\r\ntrailing-return-type ::=\r\n    \"-\u003e\" type-id\r\n\r\nptr-operator ::=\r\n    \"*\" attribute-specifier-seq? cv-qualifier-seq?\r\n  | \"\u0026\" attribute-specifier-seq?\r\n  | \"\u0026\u0026\" attribute-specifier-seq?\r\n  | nested-name-specifier \"*\" attribute-specifier-seq? cv-qualifier-seq?\r\n\r\ncv-qualifier-seq ::=\r\n    cv-qualifier cv-qualifier-seq?\r\n\r\ncv-qualifier ::=\r\n    \"const\"\r\n  | \"volatile\"\r\n\r\nref-qualifier ::=\r\n    \"\u0026\"\r\n  | \"\u0026\u0026\"\r\n\r\ndeclarator-id ::=\r\n    \"...\"? id-expression\r\n\r\ntype-id ::=\r\n    type-specifier-seq abstract-declarator?\r\n\r\ndefining-type-id ::=\r\n    defining-type-specifier-seq abstract-declarator?\r\n\r\nabstract-declarator ::=\r\n    ptr-abstract-declarator\r\n  | noptr-abstract-declarator? parameters-and-qualifiers trailing-return-type\r\n  | abstract-pack-declarator\r\n\r\nptr-abstract-declarator ::=\r\n    noptr-abstract-declarator\r\n  | ptr-operator ptr-abstract-declarator?\r\n\r\nnoptr-abstract-declarator ::=\r\n    noptr-abstract-declarator? parameters-and-qualifiers\r\n  | noptr-abstract-declarator? \"[\" constant-expression? \"]\" attribute-specifier-seq?\r\n  | \"(\" ptr-abstract-declarator \")\"\r\n\r\nabstract-pack-declarator ::=\r\n    noptr-abstract-pack-declarator\r\n  | ptr-operator abstract-pack-declarator\r\n\r\nnoptr-abstract-pack-declarator ::=\r\n    noptr-abstract-pack-declarator parameters-and-qualifiers\r\n  | \"...\"\r\n\r\nparameter-declaration-clause ::=\r\n    parameter-declaration-list? \"...\"?\r\n  | parameter-declaration-list \",\" \"...\"\r\n\r\nparameter-declaration-list ::=\r\n    parameter-declaration\r\n  | parameter-declaration-list \",\" parameter-declaration\r\n\r\nparameter-declaration ::=\r\n    attribute-specifier-seq? \"this\"? decl-specifier-seq declarator\r\n  | attribute-specifier-seq? decl-specifier-seq declarator \"=\" initializer-clause\r\n  | attribute-specifier-seq? \"this\"? decl-specifier-seq abstract-declarator?\r\n  | attribute-specifier-seq? decl-specifier-seq abstract-declarator? \"=\" initializer-clause\r\n\r\ninitializer ::=\r\n    brace-or-equal-initializer\r\n  | \"(\" expression-list \")\"\r\n\r\nbrace-or-equal-initializer ::=\r\n    \"=\" initializer-clause\r\n  | braced-init-list\r\n\r\ninitializer-clause ::=\r\n    assignment-expression\r\n  | braced-init-list\r\n\r\nbraced-init-list ::=\r\n    \"{\" initializer-list \",\"? \"}\"\r\n  | \"{\" designated-initializer-list \",\"? \"}\"\r\n  | \"{\" \"}\"\r\n\r\ninitializer-list ::=\r\n    initializer-clause \"...\"?\r\n  | initializer-list \",\" initializer-clause \"...\"?\r\n\r\ndesignated-initializer-list ::=\r\n    designated-initializer-clause\r\n  | designated-initializer-list \",\" designated-initializer-clause\r\n\r\ndesignated-initializer-clause ::=\r\n    designator brace-or-equal-initializer\r\n\r\ndesignator ::=\r\n    \".\" identifier\r\n\r\nexpr-or-braced-init-list ::=\r\n    expression\r\n  | braced-init-list\r\n\r\nfunction-definition ::=\r\n    attribute-specifier-seq? decl-specifier-seq? declarator virt-specifier-seq? function-body\r\n  | attribute-specifier-seq? decl-specifier-seq? declarator requires-clause function-body\r\n\r\nfunction-body ::=\r\n    ctor-initializer? compound-statement\r\n  | function-try-block\r\n  | \"=\" \"default\" \";\"\r\n  | \"=\" \"delete\" \";\"\r\n\r\nenum-name ::=\r\n    identifier\r\n\r\nenum-specifier ::=\r\n    enum-head \"{\" enumerator-list? \"}\"\r\n  | enum-head \"{\" enumerator-list \",\" \"}\"\r\n\r\nenum-head ::=\r\n    enum-key attribute-specifier-seq? enum-head-name? enum-base?\r\n\r\nenum-head-name ::=\r\n    nested-name-specifier? identifier\r\n\r\nopaque-enum-declaration ::=\r\n    enum-key attribute-specifier-seq? enum-head-name enum-base? \";\"\r\n\r\nenum-key ::=\r\n    \"enum\"\r\n  | \"enum\" \"class\"\r\n  | \"enum\" \"struct\"\r\n\r\nenum-base ::=\r\n    \":\" type-specifier-seq\r\n\r\nenumerator-list ::=\r\n    enumerator-definition\r\n  | enumerator-list \",\" enumerator-definition\r\n\r\nenumerator-definition ::=\r\n    enumerator\r\n  | enumerator \"=\" constant-expression\r\n\r\nenumerator ::=\r\n    identifier attribute-specifier-seq?\r\n\r\nusing-enum-declaration ::=\r\n    \"using\" \"enum\" using-enum-declarator \";\"\r\n\r\nusing-enum-declarator ::=\r\n    nested-name-specifier? identifier\r\n  | nested-name-specifier? simple-template-id\r\n\r\nnamespace-name ::=\r\n        identifier\r\n  | namespace-alias\r\n\r\nnamespace-definition ::=\r\n        named-namespace-definition\r\n  | unnamed-namespace-definition\r\n  | nested-namespace-definition\r\n\r\nnamed-namespace-definition ::=\r\n        \"inline\"? \"namespace\" attribute-specifier-seq? identifier \"{\" namespace-body \"}\"\r\n\r\nunnamed-namespace-definition ::=\r\n        \"inline\"? \"namespace\" attribute-specifier-seq? \"{\" namespace-body \"}\"\r\n\r\nnested-namespace-definition ::=\r\n        \"namespace\" enclosing-namespace-specifier \"::\" \"inline\"? identifier \"{\" namespace-body \"}\"\r\n\r\nenclosing-namespace-specifier ::=\r\n        identifier\r\n  | enclosing-namespace-specifier \"::\" \"inline\"? identifier\r\n\r\nnamespace-body ::=\r\n        declaration-seq?\r\n\r\nnamespace-alias ::=\r\n        identifier\r\n\r\nnamespace-alias-definition ::=\r\n        \"namespace\" identifier \"=\" qualified-namespace-specifier \";\"\r\n\r\nqualified-namespace-specifier ::=\r\n    nested-name-specifier? namespace-name\r\n\r\nusing-directive ::=\r\n    attribute-specifier-seq? \"using\" \"namespace\" nested-name-specifier? namespace-name \";\"\r\n\r\nusing-declaration ::=\r\n    \"using\" using-declarator-list \";\"\r\n\r\nusing-declarator-list ::=\r\n    using-declarator \"...\"?\r\n  | using-declarator-list \",\" using-declarator \"...\"?\r\n\r\nusing-declarator ::=\r\n    \"typename\"? nested-name-specifier unqualified-id\r\n\r\nasm-declaration ::=\r\n    attribute-specifier-seq? \"asm\" \"(\" balanced-token-seq \")\" \";\"\r\n\r\nlinkage-specification ::=\r\n    \"extern\" unevaluated-string \"{\" declaration-seq? \"}\"\r\n  | \"extern\" unevaluated-string name-declaration\r\n\r\nattribute-specifier-seq ::=\r\n  attribute-specifier-seq? attribute-specifier\r\n\r\nattribute-specifier ::=\r\n  \"[\" \"[\" attribute-using-prefix? attribute-list \"]\" \"]\"\r\n  | alignment-specifier\r\n\r\nalignment-specifier ::=\r\n  \"alignas\" \"(\" type-id \"...\"? \")\"\r\n  | \"alignas\" \"(\" constant-expression \"...\"? \")\"\r\n\r\nattribute-using-prefix ::=\r\n  \"using\" attribute-namespace \":\"\r\n\r\nattribute-list ::=\r\n  attribute?\r\n  | attribute-list \",\" attribute?\r\n  | attribute \"...\"\r\n  | attribute-list \",\" attribute \"...\"\r\n\r\nattribute ::=\r\n    attribute-token attribute-argument-clause?\r\n\r\nattribute-token ::=\r\n    identifier\r\n  | attribute-scoped-token\r\n\r\nattribute-scoped-token ::=\r\n    attribute-namespace \"::\" identifier\r\n\r\nattribute-namespace ::=\r\n    identifier\r\n\r\nattribute-argument-clause ::=\r\n    \"(\" balanced-token-seq? \")\"\r\n\r\nbalanced-token-seq ::=\r\n    balanced-token\r\n  | balanced-token-seq balanced-token\r\n\r\nbalanced-token ::=\r\n    \"(\" balanced-token-seq? \")\"\r\n  | \"[\" balanced-token-seq? \"]\"\r\n  | \"{\" balanced-token-seq? \"}\"\r\n  | \"{any token other than a parenthesis, a bracket, or a brace}\"\r\n\r\n//== modules.tex\r\n\r\nmodule-declaration ::=\r\n    \"export\"? \"module\" module-name module-partition? attribute-specifier-seq? \";\"\r\n\r\nmodule-name ::=\r\n    module-name-qualifier? identifier\r\n\r\nmodule-partition ::=\r\n    \":\" module-name-qualifier? identifier\r\n\r\nmodule-name-qualifier ::=\r\n    identifier \".\"\r\n  | module-name-qualifier identifier \".\"\r\n\r\nexport-declaration ::=\r\n    \"export\" name-declaration\r\n  | \"export\" \"{\" declaration-seq? \"}\"\r\n  | \"export\" module-import-declaration\r\n\r\nmodule-import-declaration ::=\r\n    \"import\" module-name attribute-specifier-seq? \";\"\r\n  | \"import\" module-partition attribute-specifier-seq? \";\"\r\n  | \"import\" header-name attribute-specifier-seq? \";\"\r\n\r\nglobal-module-fragment ::=\r\n    \"module\" \";\" declaration-seq?\r\n\r\nprivate-module-fragment ::=\r\n    \"module\" \":\" \"private\" \";\" declaration-seq?\r\n\r\n//== classes.tex\r\n\r\nclass-name ::=\r\n    identifier\r\n  | simple-template-id\r\n\r\nclass-specifier ::=\r\n    class-head \"{\" member-specification? \"}\"\r\n\r\nclass-head ::=\r\n    class-key attribute-specifier-seq? class-head-name class-virt-specifier? base-clause?\r\n  | class-key attribute-specifier-seq? base-clause?\r\n\r\nclass-head-name ::=\r\n    nested-name-specifier? class-name\r\n\r\nclass-virt-specifier ::=\r\n    \"final\"\r\n\r\nclass-key ::=\r\n    \"class\"\r\n  | \"struct\"\r\n  | \"union\"\r\n\r\nmember-specification ::=\r\n    member-declaration member-specification?\r\n  | access-specifier \":\" member-specification?\r\n\r\nmember-declaration ::=\r\n    attribute-specifier-seq? decl-specifier-seq? member-declarator-list? \";\"\r\n  | function-definition\r\n  | using-declaration\r\n  | using-enum-declaration\r\n  | static_assert-declaration\r\n  | template-declaration\r\n  | explicit-specialization\r\n  | deduction-guide\r\n  | alias-declaration\r\n  | opaque-enum-declaration\r\n  | empty-declaration\r\n\r\nmember-declarator-list ::=\r\n    member-declarator\r\n  | member-declarator-list \",\" member-declarator\r\n\r\nmember-declarator ::=\r\n    declarator virt-specifier-seq? pure-specifier?\r\n  | declarator requires-clause\r\n  | declarator brace-or-equal-initializer?\r\n  | identifier? attribute-specifier-seq? \":\" constant-expression brace-or-equal-initializer?\r\n\r\nvirt-specifier-seq ::=\r\n    virt-specifier\r\n  | virt-specifier-seq virt-specifier\r\n\r\nvirt-specifier ::=\r\n    \"override\"\r\n  | \"final\"\r\n\r\npure-specifier ::=\r\n    \"=\" \"0\"\r\n\r\nconversion-function-id ::=\r\n    \"operator\" conversion-type-id\r\n\r\nconversion-type-id ::=\r\n    type-specifier-seq conversion-declarator?\r\n\r\nconversion-declarator ::=\r\n    ptr-operator conversion-declarator?\r\n\r\nbase-clause ::=\r\n    \":\" base-specifier-list\r\n\r\nbase-specifier-list ::=\r\n    base-specifier \"...\"?\r\n  | base-specifier-list \",\" base-specifier \"...\"?\r\n\r\nbase-specifier ::=\r\n    attribute-specifier-seq? class-or-decltype\r\n  | attribute-specifier-seq? \"virtual\" access-specifier? class-or-decltype\r\n  | attribute-specifier-seq? access-specifier \"virtual\"? class-or-decltype\r\n\r\nclass-or-decltype ::=\r\n    nested-name-specifier? type-name\r\n  | nested-name-specifier \"template\" simple-template-id\r\n  | decltype-specifier\r\n\r\naccess-specifier ::=\r\n    \"private\"\r\n  | \"protected\"\r\n  | \"public\"\r\n\r\nctor-initializer ::=\r\n    \":\" mem-initializer-list\r\n\r\nmem-initializer-list ::=\r\n    mem-initializer \"...\"?\r\n  | mem-initializer-list \",\" mem-initializer \"...\"?\r\n\r\nmem-initializer ::=\r\n    mem-initializer-id \"(\" expression-list? \")\"\r\n  | mem-initializer-id braced-init-list\r\n\r\nmem-initializer-id ::=\r\n    class-or-decltype\r\n  | identifier\r\n\r\n//== overloading.tex\r\n\r\noperator-function-id ::=\r\n    \"operator\" operator\r\n\r\noperator ::=\r\n    \"new\" | \"delete\" | \"new[]\" | \"delete[]\" | \"co_await\" | \"()\" | \"[]\" | \"-\u003e\" | \"-\u003e*\"\r\n  | \"~\" | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026\"\r\n  | \"|\" | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026=\"\r\n  | \"|=\" | \"==\" | \"!=\" | \"\u003c\" | \"\u003e\" | \"\u003c=\" | \"\u003e=\" | \"\u003c=\u003e\" | \"\u0026\u0026\"\r\n  | \"||\" | \"\u003c\u003c\" | \"\u003e\u003e\" | \"\u003c\u003c=\" | \"\u003e\u003e=\" | \"++\" | \"--\" | \",\"\r\n\r\nliteral-operator-id ::=\r\n    \"operator\" unevaluated-string identifier\r\n  | \"operator\" user-defined-string-literal\r\n\r\n//== templates.tex\r\n\r\ntemplate-declaration ::=\r\n  template-head declaration\r\n  | template-head concept-definition\r\n\r\ntemplate-head ::=\r\n  \"template\" \"\u003c\" template-parameter-list \"\u003e\" requires-clause?\r\n\r\ntemplate-parameter-list ::=\r\n  template-parameter\r\n  | template-parameter-list \",\" template-parameter\r\n\r\nrequires-clause ::=\r\n  \"requires\" constraint-logical-or-expression\r\n\r\nconstraint-logical-or-expression ::=\r\n  constraint-logical-and-expression\r\n  | constraint-logical-or-expression \"||\" constraint-logical-and-expression\r\n\r\nconstraint-logical-and-expression ::=\r\n  primary-expression\r\n  | constraint-logical-and-expression \"\u0026\u0026\" primary-expression\r\n\r\ntemplate-parameter ::=\r\n  type-parameter\r\n  | parameter-declaration\r\n\r\ntype-parameter ::=\r\n  type-parameter-key \"...\"? identifier?\r\n  | type-parameter-key identifier? \"=\" type-id\r\n  | type-constraint \"...\"? identifier?\r\n  | type-constraint identifier? \"=\" type-id\r\n  | template-head type-parameter-key \"...\"? identifier?\r\n  | template-head type-parameter-key identifier? \"=\" id-expression\r\n\r\ntype-parameter-key ::=\r\n  \"class\"\r\n  | \"typename\"\r\n\r\ntype-constraint ::=\r\n  nested-name-specifier? concept-name\r\n  | nested-name-specifier? concept-name \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\nsimple-template-id ::=\r\n  template-name \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\ntemplate-id ::=\r\n  simple-template-id\r\n  | operator-function-id \"\u003c\" template-argument-list? \"\u003e\"\r\n  | literal-operator-id \"\u003c\" template-argument-list? \"\u003e\"\r\n\r\ntemplate-name ::=\r\n  identifier\r\n\r\ntemplate-argument-list ::=\r\n  template-argument \"...\"?\r\n  | template-argument-list \",\" template-argument \"...\"?\r\n\r\ntemplate-argument ::=\r\n  constant-expression\r\n  | type-id\r\n  | id-expression\r\n  | braced-init-list\r\n\r\nconstraint-expression ::=\r\n    logical-or-expression\r\n\r\ndeduction-guide ::=\r\n    explicit-specifier? template-name \"(\" parameter-declaration-clause \")\" \"-\u003e\" simple-template-id \";\"\r\n\r\nconcept-definition ::=\r\n  \"concept\" concept-name attribute-specifier-seq? \"=\" constraint-expression \";\"\r\n\r\nconcept-name ::=\r\n  identifier\r\n\r\ntypename-specifier ::=\r\n  \"typename\" nested-name-specifier identifier\r\n  | \"typename\" nested-name-specifier \"template\"? simple-template-id\r\n\r\nexplicit-instantiation ::=\r\n  \"extern\"? \"template\" declaration\r\n\r\nexplicit-specialization ::=\r\n  \"template\" \"\u003c\" \"\u003e\" declaration\r\n\r\n//== exceptions.tex\r\n\r\ntry-block ::=\r\n    \"try\" compound-statement handler-seq\r\n\r\nfunction-try-block ::=\r\n    \"try\" ctor-initializer? compound-statement handler-seq\r\n\r\nhandler-seq ::=\r\n    handler handler-seq?\r\n\r\nhandler ::=\r\n    \"catch\" \"(\" exception-declaration \")\" compound-statement\r\n\r\nexception-declaration ::=\r\n    attribute-specifier-seq? type-specifier-seq declarator\r\n  | attribute-specifier-seq? type-specifier-seq abstract-declarator?\r\n  | \"...\"\r\n\r\nnoexcept-specifier ::=\r\n    \"noexcept\" \"(\" constant-expression \")\"\r\n  | \"noexcept\"\r\n\r\n//== preprocessor.tex\r\n\r\npreprocessing-file ::=\r\n    group?\r\n  | module-file\r\n\r\nmodule-file ::=\r\n    pp-global-module-fragment? pp-module group? pp-private-module-fragment?\r\n\r\npp-global-module-fragment ::=\r\n    \"module\" \";\" new-line group?\r\n\r\npp-private-module-fragment ::=\r\n    \"module\" \":\" \"private\" \";\" new-line group?\r\n\r\ngroup ::=\r\n    group-part\r\n  | group group-part\r\n\r\ngroup-part ::=\r\n    control-line\r\n  | if-section\r\n  | text-line\r\n  | \"#\" conditionally-supported-directive\r\n\r\ncontrol-line ::=\r\n    \"#\" \"include\" pp-tokens new-line\r\n  | pp-import\r\n  | \"#\" \"define\" identifier replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen identifier-list? \")\" replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen \"...\" \")\" replacement-list new-line\r\n  | \"#\" \"define\" identifier lparen identifier-list \",\" \"...\" \")\" replacement-list new-line\r\n  | \"#\" \"undef\" identifier new-line\r\n  | \"#\" \"line\" pp-tokens new-line\r\n  | \"#\" \"error\" pp-tokens? new-line\r\n  | \"#\" \"warning\" pp-tokens? new-line\r\n  | \"#\" \"pragma\" pp-tokens? new-line\r\n  | \"#\" new-line\r\n\r\nif-section ::=\r\n    if-group elif-groups? else-group? endif-line\r\n\r\nif-group ::=\r\n    \"#\" \"if\" constant-expression new-line group?\r\n  | \"#\" \"ifdef\" identifier new-line group?\r\n  | \"#\" \"ifndef\" identifier new-line group?\r\n\r\nelif-groups ::=\r\n    elif-group\r\n  | elif-groups elif-group\r\n\r\nelif-group ::=\r\n    \"#\" \"elif\" constant-expression new-line group?\r\n  | \"#\" \"elifdef\" identifier new-line group?\r\n  | \"#\" \"elifndef\" identifier new-line group?\r\n\r\nelse-group ::=\r\n    \"#\" \"else\" new-line group?\r\n\r\nendif-line ::=\r\n    \"#\" \"endif\" new-line\r\n\r\ntext-line ::=\r\n    pp-tokens? new-line\r\n\r\nconditionally-supported-directive ::=\r\n    pp-tokens new-line\r\n\r\nlparen ::=\r\n    '{a \"(\" character not immediately preceded by whitespace}'\r\n\r\nidentifier-list ::=\r\n    identifier\r\n  | identifier-list \",\" identifier\r\n\r\nreplacement-list ::=\r\n    pp-tokens?\r\n\r\npp-tokens ::=\r\n    preprocessing-token\r\n  | pp-tokens preprocessing-token\r\n\r\nnew-line ::=\r\n    \"{the new-line character}\"\r\n\r\ndefined-macro-expression ::=\r\n    \"defined\" identifier\r\n  | \"defined\" \"(\" identifier \")\"\r\n\r\nh-preprocessing-token ::=\r\n    '{any preprocessing-token other than \"\u003e\"}'\r\n\r\nh-pp-tokens ::=\r\n    h-preprocessing-token\r\n  | h-pp-tokens h-preprocessing-token\r\n\r\nheader-name-tokens ::=\r\n    string-literal\r\n  | \"\u003c\" h-pp-tokens \"\u003e\"\r\n\r\nhas-include-expression ::=\r\n    \"has_include\" \"(\" header-name \")\"\r\n  | \"has_include\" \"(\" header-name-tokens \")\"\r\n\r\nhas-attribute-expression ::=\r\n    \"has_cpp_attribute\" \"(\" pp-tokens \")\"\r\n\r\npp-module ::=\r\n    \"export\"? \"module\" pp-tokens? \";\" new-line\r\n\r\npp-import ::=\r\n    \"export\"? \"import\" header-name pp-tokens? \";\" new-line\r\n  | \"export\"? \"import\" header-name-tokens pp-tokens? \";\" new-line\r\n  | \"export\"? \"import\" pp-tokens \";\" new-line\r\n\r\nva-opt-replacement ::=\r\n    \"VA_OPT\" \"(\" pp-tokens? \")\"\r\n```\r\n","bodyHTML":"\u003cp dir=\"auto\"\u003eUsing \u003ca href=\"https://github.com/mingodad/squilu\"\u003ehttps://github.com/mingodad/squilu\u003c/a\u003e to extract the \u003ccode class=\"notranslate\"\u003e{bnf}\u003c/code\u003e sections from all \u003ccode class=\"notranslate\"\u003e*.tex\u003c/code\u003e files and convert then to an \u003ccode class=\"notranslate\"\u003eEBNF\u003c/code\u003e understood by \u003ca href=\"https://www.bottlecaps.de/rr/ui\" rel=\"nofollow\"\u003ehttps://www.bottlecaps.de/rr/ui\u003c/a\u003e we can have a nice navigable railroad diagram (see bellow the resulting \u003ccode class=\"notranslate\"\u003eEBNF\u003c/code\u003e and instructions to visualize the railroad diagram).\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"//\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\n//\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\n// then click the 'View Diagram' tab.\n//\n\n//\n//To facilitate start navigating\n//\n\ncplusplus ::=\n\tpreprocessing-file? translation-unit\n\n//== lex.tex\n\nn-char ::=\n     \u0026quot;{any member of the translation character set except the \\unicode{007d}{right curly bracket} or new-line character}\u0026quot;\n\nn-char-sequence ::=\n    n-char\n  | n-char-sequence n-char\n\nnamed-universal-character ::=\n    \u0026quot;\\N{\u0026quot; n-char-sequence \u0026quot;}\u0026quot;\n\nhex-quad ::=\n    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit\n\nsimple-hexadecimal-digit-sequence ::=\n    hexadecimal-digit\n  | simple-hexadecimal-digit-sequence hexadecimal-digit\n\nuniversal-character-name ::=\n    \u0026quot;\\u\u0026quot; hex-quad\n  | \u0026quot;\\U\u0026quot; hex-quad hex-quad\n  | \u0026quot;\\u{\u0026quot; simple-hexadecimal-digit-sequence \u0026quot;}\u0026quot;\n  | named-universal-character\n\npreprocessing-token ::=\n    header-name\n  | \u0026quot;import\u0026quot;\n  | \u0026quot;module\u0026quot;\n  | \u0026quot;export\u0026quot;\n  | identifier\n  | pp-number\n  | character-literal\n  | user-defined-character-literal\n  | string-literal\n  | user-defined-string-literal\n  | preprocessing-op-or-punc\n  | \u0026quot;{each non-whitespace character that cannot be one of the above}\u0026quot;\n\n//token ::=\n//    identifier\n//  | keyword\n//  | literal\n//  | operator-or-punctuator\n\nheader-name ::=\n    \u0026quot;\u0026lt;\u0026quot; h-char-sequence \u0026quot;\u0026gt;\u0026quot;\n  | '\u0026quot;' q-char-sequence '\u0026quot;'\n\nh-char-sequence ::=\n    h-char\n  | h-char-sequence h-char\n\nh-char ::=\n    \u0026quot;{any member of the translation character set except new-line and \\unicode{003e}{greater-than sign}}\u0026quot;\n\nq-char-sequence ::=\n    q-char\n  | q-char-sequence q-char\n\nq-char ::=\n    \u0026quot;{any member of the translation character set except new-line and \\unicode{0022}{quotation mark}}\u0026quot;\n\npp-number ::=\n    digit\n  | \u0026quot;.\u0026quot; digit\n  | pp-number identifier-continue\n  | pp-number \u0026quot;'\u0026quot; digit\n  | pp-number \u0026quot;'\u0026quot; nondigit\n  | pp-number \u0026quot;e\u0026quot; sign\n  | pp-number \u0026quot;E\u0026quot; sign\n  | pp-number \u0026quot;p\u0026quot; sign\n  | pp-number \u0026quot;P\u0026quot; sign\n  | pp-number \u0026quot;.\u0026quot;\n\nidentifier ::=\n    identifier-start\n  | identifier identifier-continue\n\nidentifier-start ::=\n    nondigit\n  | \u0026quot;{an element of the translation character set with the Unicode property XID_Start}\u0026quot;\n\nidentifier-continue ::=\n    digit\n  | nondigit\n  | \u0026quot;{an element of the translation character set with the Unicode property XID_Continue}\u0026quot;\n\nnondigit ::=\n    \u0026quot;a\u0026quot; | \u0026quot;b\u0026quot; | \u0026quot;c\u0026quot; | \u0026quot;d\u0026quot; | \u0026quot;e\u0026quot; | \u0026quot;f\u0026quot; | \u0026quot;g\u0026quot; | \u0026quot;h\u0026quot; | \u0026quot;i\u0026quot; | \u0026quot;j\u0026quot; | \u0026quot;k\u0026quot; | \u0026quot;l\u0026quot; | \u0026quot;m\u0026quot;\n  | \u0026quot;n\u0026quot; | \u0026quot;o\u0026quot; | \u0026quot;p\u0026quot; | \u0026quot;q\u0026quot; | \u0026quot;r\u0026quot; | \u0026quot;s\u0026quot; | \u0026quot;t\u0026quot; | \u0026quot;u\u0026quot; | \u0026quot;v\u0026quot; | \u0026quot;w\u0026quot; | \u0026quot;x\u0026quot; | \u0026quot;y\u0026quot; | \u0026quot;z\u0026quot;\n  | \u0026quot;A\u0026quot; | \u0026quot;B\u0026quot; | \u0026quot;C\u0026quot; | \u0026quot;D\u0026quot; | \u0026quot;E\u0026quot; | \u0026quot;F\u0026quot; | \u0026quot;G\u0026quot; | \u0026quot;H\u0026quot; | \u0026quot;I\u0026quot; | \u0026quot;J\u0026quot; | \u0026quot;K\u0026quot; | \u0026quot;L\u0026quot; | \u0026quot;M\u0026quot;\n  | \u0026quot;N\u0026quot; | \u0026quot;O\u0026quot; | \u0026quot;P\u0026quot; | \u0026quot;Q\u0026quot; | \u0026quot;R\u0026quot; | \u0026quot;S\u0026quot; | \u0026quot;T\u0026quot; | \u0026quot;U\u0026quot; | \u0026quot;V\u0026quot; | \u0026quot;W\u0026quot; | \u0026quot;X\u0026quot; | \u0026quot;Y\u0026quot; | \u0026quot;Z\u0026quot; | \u0026quot;_\u0026quot;\n\ndigit ::=\n    \u0026quot;0\u0026quot; | \u0026quot;1\u0026quot; | \u0026quot;2\u0026quot; | \u0026quot;3\u0026quot; | \u0026quot;4\u0026quot; | \u0026quot;5\u0026quot; | \u0026quot;6\u0026quot; | \u0026quot;7\u0026quot; | \u0026quot;8\u0026quot; | \u0026quot;9\u0026quot;\n\nkeyword ::=\n    \u0026quot;{any identifier listed in lex.key}\u0026quot;\n  | \u0026quot;import\u0026quot;\n  | \u0026quot;module\u0026quot;\n  | \u0026quot;export\u0026quot;\n\npreprocessing-op-or-punc ::=\n    preprocessing-operator\n  | operator-or-punctuator\n\npreprocessing-operator ::=\n    \u0026quot;#\u0026quot; | \u0026quot;##\u0026quot; | \u0026quot;%:\u0026quot; | \u0026quot;%:%:\u0026quot;\n\noperator-or-punctuator ::=\n    \u0026quot;{\u0026quot; | \u0026quot;}\u0026quot; | \u0026quot;[\u0026quot; | \u0026quot;]\u0026quot; | \u0026quot;(\u0026quot; | \u0026quot;)\u0026quot;\n  | \u0026quot;\u0026lt;:\u0026quot; | \u0026quot;:\u0026gt;\u0026quot; | \u0026quot;\u0026lt;%\u0026quot; | \u0026quot;%\u0026gt;\u0026quot; | \u0026quot;;\u0026quot; | \u0026quot;:\u0026quot; | \u0026quot;...\u0026quot;\n  | \u0026quot;?\u0026quot; | \u0026quot;::\u0026quot; | \u0026quot;.\u0026quot; | \u0026quot;.*\u0026quot; | \u0026quot;-\u0026gt;\u0026quot; | \u0026quot;-\u0026gt;*\u0026quot; | \u0026quot;~\u0026quot;\n  | \u0026quot;!\u0026quot; | \u0026quot;+\u0026quot; | \u0026quot;-\u0026quot; | \u0026quot;*\u0026quot; | \u0026quot;/\u0026quot; | \u0026quot;%\u0026quot; | \u0026quot;^\u0026quot; | \u0026quot;\u0026amp;\u0026quot; | \u0026quot;|\u0026quot;\n  | \u0026quot;=\u0026quot; | \u0026quot;+=\u0026quot; | \u0026quot;-=\u0026quot; | \u0026quot;*=\u0026quot; | \u0026quot;/=\u0026quot; | \u0026quot;%=\u0026quot; | \u0026quot;^=\u0026quot; | \u0026quot;\u0026amp;=\u0026quot; | \u0026quot;|=\u0026quot;\n  | \u0026quot;==\u0026quot; | \u0026quot;!=\u0026quot; | \u0026quot;\u0026lt;\u0026quot; | \u0026quot;\u0026gt;\u0026quot; | \u0026quot;\u0026lt;=\u0026quot; | \u0026quot;\u0026gt;=\u0026quot; | \u0026quot;\u0026lt;=\u0026gt;\u0026quot; | \u0026quot;\u0026amp;\u0026amp;\u0026quot; | \u0026quot;||\u0026quot;\n  | \u0026quot;\u0026lt;\u0026lt;\u0026quot; | \u0026quot;\u0026gt;\u0026gt;\u0026quot; | \u0026quot;\u0026lt;\u0026lt;=\u0026quot; | \u0026quot;\u0026gt;\u0026gt;=\u0026quot; | \u0026quot;++\u0026quot; | \u0026quot;--\u0026quot; | \u0026quot;,\u0026quot;\n  | \u0026quot;and\u0026quot; | \u0026quot;or\u0026quot; | \u0026quot;xor\u0026quot; | \u0026quot;not\u0026quot; | \u0026quot;bitand\u0026quot; | \u0026quot;bitor\u0026quot; | \u0026quot;compl\u0026quot;\n  | \u0026quot;and_eq\u0026quot; | \u0026quot;or_eq\u0026quot; | \u0026quot;xor_eq\u0026quot; | \u0026quot;not_eq\u0026quot;\n\nliteral ::=\n    integer-literal\n  | character-literal\n  | floating-point-literal\n  | string-literal\n  | boolean-literal\n  | pointer-literal\n  | user-defined-literal\n\ninteger-literal ::=\n    binary-literal integer-suffix?\n  | octal-literal integer-suffix?\n  | decimal-literal integer-suffix?\n  | hexadecimal-literal integer-suffix?\n\nbinary-literal ::=\n    \u0026quot;0b\u0026quot; binary-digit\n  | \u0026quot;0B\u0026quot; binary-digit\n  | binary-literal \u0026quot;'\u0026quot;? binary-digit\n\noctal-literal ::=\n    \u0026quot;0\u0026quot;\n  | octal-literal \u0026quot;'\u0026quot;? octal-digit\n\ndecimal-literal ::=\n    nonzero-digit\n  | decimal-literal \u0026quot;'\u0026quot;? digit\n\nhexadecimal-literal ::=\n    hexadecimal-prefix hexadecimal-digit-sequence\n\nbinary-digit ::=\n    \u0026quot;0\u0026quot; | \u0026quot;1\u0026quot;\n\noctal-digit ::=\n    \u0026quot;0\u0026quot; | \u0026quot;1\u0026quot; | \u0026quot;2\u0026quot; | \u0026quot;3\u0026quot; | \u0026quot;4\u0026quot; | \u0026quot;5\u0026quot; | \u0026quot;6\u0026quot; | \u0026quot;7\u0026quot;\n\nnonzero-digit ::=\n    \u0026quot;1\u0026quot; | \u0026quot;2\u0026quot; | \u0026quot;3\u0026quot; | \u0026quot;4\u0026quot; | \u0026quot;5\u0026quot; | \u0026quot;6\u0026quot; | \u0026quot;7\u0026quot; | \u0026quot;8\u0026quot; | \u0026quot;9\u0026quot;\n\nhexadecimal-prefix ::=\n    \u0026quot;0x\u0026quot; | \u0026quot;0X\u0026quot;\n\nhexadecimal-digit-sequence ::=\n    hexadecimal-digit\n  | hexadecimal-digit-sequence \u0026quot;'\u0026quot;? hexadecimal-digit\n\nhexadecimal-digit ::=\n    \u0026quot;0\u0026quot; | \u0026quot;1\u0026quot; | \u0026quot;2\u0026quot; | \u0026quot;3\u0026quot; | \u0026quot;4\u0026quot; | \u0026quot;5\u0026quot; | \u0026quot;6\u0026quot; | \u0026quot;7\u0026quot; | \u0026quot;8\u0026quot; | \u0026quot;9\u0026quot;\n  | \u0026quot;a\u0026quot; | \u0026quot;b\u0026quot; | \u0026quot;c\u0026quot; | \u0026quot;d\u0026quot; | \u0026quot;e\u0026quot; | \u0026quot;f\u0026quot;\n  | \u0026quot;A\u0026quot; | \u0026quot;B\u0026quot; | \u0026quot;C\u0026quot; | \u0026quot;D\u0026quot; | \u0026quot;E\u0026quot; | \u0026quot;F\u0026quot;\n\ninteger-suffix ::=\n    unsigned-suffix long-suffix?\n  | unsigned-suffix long-long-suffix?\n  | unsigned-suffix size-suffix?\n  | long-suffix unsigned-suffix?\n  | long-long-suffix unsigned-suffix?\n  | size-suffix unsigned-suffix?\n\nunsigned-suffix ::=\n    \u0026quot;u\u0026quot; | \u0026quot;U\u0026quot;\n\nlong-suffix ::=\n    \u0026quot;l\u0026quot; | \u0026quot;L\u0026quot;\n\nlong-long-suffix ::=\n    \u0026quot;ll\u0026quot; | \u0026quot;LL\u0026quot;\n\nsize-suffix ::=\n   \u0026quot;z\u0026quot; | \u0026quot;Z\u0026quot;\n\ncharacter-literal ::=\n    encoding-prefix? \u0026quot;'\u0026quot; c-char-sequence \u0026quot;'\u0026quot;\n\nencoding-prefix ::=\n    \u0026quot;u8\u0026quot; | \u0026quot;u\u0026quot; | \u0026quot;U\u0026quot; | \u0026quot;L\u0026quot;\n\nc-char-sequence ::=\n    c-char\n  | c-char-sequence c-char\n\nc-char ::=\n    basic-c-char\n  | escape-sequence\n  | universal-character-name\n\nbasic-c-char ::=\n    \u0026quot;{any member of the translation character set except the \\unicode{0027}{apostrophe},}\u0026quot;\n        \u0026quot;{\\unicode{005c}{reverse solidus}, or new-line character}\u0026quot;\n\nescape-sequence ::=\n    simple-escape-sequence\n  | numeric-escape-sequence\n  | conditional-escape-sequence\n\nsimple-escape-sequence ::=\n    \u0026quot;\\\u0026quot; simple-escape-sequence-char\n\nsimple-escape-sequence-char ::=\n    \u0026quot;'\u0026quot; | '\u0026quot;' | \u0026quot;?\u0026quot; | \u0026quot;\\\u0026quot; | \u0026quot;a\u0026quot; | \u0026quot;b\u0026quot; | \u0026quot;f\u0026quot; | \u0026quot;n\u0026quot; | \u0026quot;r\u0026quot; | \u0026quot;t\u0026quot; | \u0026quot;v\u0026quot;\n\nnumeric-escape-sequence ::=\n    octal-escape-sequence\n  | hexadecimal-escape-sequence\n\nsimple-octal-digit-sequence ::=\n    octal-digit\n  | simple-octal-digit-sequence octal-digit\n\noctal-escape-sequence ::=\n    \u0026quot;\\\u0026quot; octal-digit\n  | \u0026quot;\\\u0026quot; octal-digit octal-digit\n  | \u0026quot;\\\u0026quot; octal-digit octal-digit octal-digit\n  | \u0026quot;\\o{\u0026quot; simple-octal-digit-sequence \u0026quot;}\u0026quot;\n\nhexadecimal-escape-sequence ::=\n    \u0026quot;\\x\u0026quot; simple-hexadecimal-digit-sequence\n  | \u0026quot;\\x{\u0026quot; simple-hexadecimal-digit-sequence \u0026quot;}\u0026quot;\n\nconditional-escape-sequence ::=\n    \u0026quot;\\\u0026quot; conditional-escape-sequence-char\n\nconditional-escape-sequence-char ::=\n    '{any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the characters \u0026quot;N\u0026quot;, \u0026quot;o\u0026quot;, \u0026quot;u\u0026quot;, \u0026quot;U\u0026quot;, or \u0026quot;x\u0026quot;}'\n\nfloating-point-literal ::=\n    decimal-floating-point-literal\n  | hexadecimal-floating-point-literal\n\ndecimal-floating-point-literal ::=\n    fractional-constant exponent-part? floating-point-suffix?\n  | digit-sequence exponent-part floating-point-suffix?\n\nhexadecimal-floating-point-literal ::=\n    hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-point-suffix?\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-point-suffix?\n\nfractional-constant ::=\n    digit-sequence? \u0026quot;.\u0026quot; digit-sequence\n  | digit-sequence \u0026quot;.\u0026quot;\n\nhexadecimal-fractional-constant ::=\n    hexadecimal-digit-sequence? \u0026quot;.\u0026quot; hexadecimal-digit-sequence\n  | hexadecimal-digit-sequence \u0026quot;.\u0026quot;\n\nexponent-part ::=\n    \u0026quot;e\u0026quot; sign? digit-sequence\n  | \u0026quot;E\u0026quot; sign? digit-sequence\n\nbinary-exponent-part ::=\n    \u0026quot;p\u0026quot; sign? digit-sequence\n  | \u0026quot;P\u0026quot; sign? digit-sequence\n\nsign ::=\n    \u0026quot;+\u0026quot; | \u0026quot;-\u0026quot;\n\ndigit-sequence ::=\n    digit\n  | digit-sequence \u0026quot;'\u0026quot;? digit\n\nfloating-point-suffix ::=\n    \u0026quot;f\u0026quot; | \u0026quot;l\u0026quot; | \u0026quot;f16\u0026quot; | \u0026quot;f32\u0026quot; | \u0026quot;f64\u0026quot; | \u0026quot;f128\u0026quot; | \u0026quot;bf16\u0026quot; | \u0026quot;F\u0026quot; | \u0026quot;L\u0026quot; | \u0026quot;F16\u0026quot; | \u0026quot;F32\u0026quot; | \u0026quot;F64\u0026quot; | \u0026quot;F128\u0026quot; | \u0026quot;BF16\u0026quot;\n\nstring-literal ::=\n    encoding-prefix? '\u0026quot;' s-char-sequence? '\u0026quot;'\n  | encoding-prefix? \u0026quot;R\u0026quot; raw-string\n\ns-char-sequence ::=\n    s-char\n  | s-char-sequence s-char\n\ns-char ::=\n    basic-s-char\n  | escape-sequence\n  | universal-character-name\n\nbasic-s-char ::=\n    \u0026quot;{any member of the translation character set except the \\unicode{0022}{quotation mark},}\u0026quot;\n        \u0026quot;{\\unicode{005c}{reverse solidus}, or new-line character}\u0026quot;\n\nraw-string ::=\n    '\u0026quot;' d-char-sequence? \u0026quot;(\u0026quot; r-char-sequence? \u0026quot;)\u0026quot; d-char-sequence? '\u0026quot;'\n\nr-char-sequence ::=\n    r-char\n  | r-char-sequence r-char\n\nr-char ::=\n    \u0026quot;{any member of the translation character set, except a \\unicode{0029}{right parenthesis} followed by}\u0026quot;\n        \u0026quot;{the initial d-char-sequence (which may be empty) followed by a \\unicode{0022}{quotation mark}}\u0026quot;\n\nd-char-sequence ::=\n    d-char\n  | d-char-sequence d-char\n\nd-char ::=\n    \u0026quot;{any member of the basic character set except:}\u0026quot;\n        \u0026quot;{\\unicode{0020}{space}, \\unicode{0028}{left parenthesis}, \\unicode{0029}{right parenthesis}, \\unicode{005c}{reverse solidus},}\u0026quot;\n        \u0026quot;{\\unicode{0009}{character tabulation}, \\unicode{000b}{line tabulation}, \\unicode{000c}{form feed}, and new-line}\u0026quot;\n\nunevaluated-string ::=\n    string-literal\n\nboolean-literal ::=\n    \u0026quot;false\u0026quot;\n  | \u0026quot;true\u0026quot;\n\npointer-literal ::=\n    \u0026quot;nullptr\u0026quot;\n\nuser-defined-literal ::=\n    user-defined-integer-literal\n  | user-defined-floating-point-literal\n  | user-defined-string-literal\n  | user-defined-character-literal\n\nuser-defined-integer-literal ::=\n    decimal-literal ud-suffix\n  | octal-literal ud-suffix\n  | hexadecimal-literal ud-suffix\n  | binary-literal ud-suffix\n\nuser-defined-floating-point-literal ::=\n    fractional-constant exponent-part? ud-suffix\n  | digit-sequence exponent-part ud-suffix\n  | hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix\n\nuser-defined-string-literal ::=\n    string-literal ud-suffix\n\nuser-defined-character-literal ::=\n    character-literal ud-suffix\n\nud-suffix ::=\n    identifier\n\n//== basic.tex\n\ntranslation-unit ::=\n    declaration-seq?\n  | global-module-fragment? module-declaration declaration-seq? private-module-fragment?\n\n//== expressions.tex\n\nprimary-expression ::=\n    literal\n  | \u0026quot;this\u0026quot;\n  | \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n  | id-expression\n  | lambda-expression\n  | fold-expression\n  | requires-expression\n\nid-expression ::=\n    unqualified-id\n  | qualified-id\n  | pack-index-expression\n\nunqualified-id ::=\n    identifier\n  | operator-function-id\n  | conversion-function-id\n  | literal-operator-id\n  | \u0026quot;~\u0026quot; type-name\n  | \u0026quot;~\u0026quot; computed-type-specifier\n  | template-id\n\nqualified-id ::=\n    nested-name-specifier \u0026quot;template\u0026quot;? unqualified-id\n\nnested-name-specifier ::=\n    \u0026quot;::\u0026quot;\n  | type-name \u0026quot;::\u0026quot;\n  | namespace-name \u0026quot;::\u0026quot;\n  | computed-type-specifier \u0026quot;::\u0026quot;\n  | nested-name-specifier identifier \u0026quot;::\u0026quot;\n  | nested-name-specifier \u0026quot;template\u0026quot;? simple-template-id \u0026quot;::\u0026quot;\n\npack-index-expression ::=\n    id-expression \u0026quot;...\u0026quot; \u0026quot;[\u0026quot; constant-expression \u0026quot;]\u0026quot;\n\nlambda-expression ::=\n    lambda-introducer attribute-specifier-seq? lambda-declarator compound-statement\n  | lambda-introducer \u0026quot;\u0026lt;\u0026quot; template-parameter-list \u0026quot;\u0026gt;\u0026quot; requires-clause? attribute-specifier-seq?\n         lambda-declarator compound-statement\n\nlambda-introducer ::=\n    \u0026quot;[\u0026quot; lambda-capture? \u0026quot;]\u0026quot;\n\nlambda-declarator ::=\n    lambda-specifier-seq noexcept-specifier? attribute-specifier-seq? trailing-return-type?\n  | noexcept-specifier attribute-specifier-seq? trailing-return-type?\n  | trailing-return-type?\n  | \u0026quot;(\u0026quot; parameter-declaration-clause \u0026quot;)\u0026quot; lambda-specifier-seq? noexcept-specifier? attribute-specifier-seq?\n         trailing-return-type? requires-clause?\n\nlambda-specifier ::=\n    \u0026quot;consteval\u0026quot;\n  | \u0026quot;constexpr\u0026quot;\n  | \u0026quot;mutable\u0026quot;\n  | \u0026quot;static\u0026quot;\n\nlambda-specifier-seq ::=\n    lambda-specifier\n  | lambda-specifier lambda-specifier-seq\n\nlambda-capture ::=\n    capture-default\n  | capture-list\n  | capture-default \u0026quot;,\u0026quot; capture-list\n\ncapture-default ::=\n    \u0026quot;\u0026amp;\u0026quot;\n  | \u0026quot;=\u0026quot;\n\ncapture-list ::=\n    capture\n  | capture-list \u0026quot;,\u0026quot; capture\n\ncapture ::=\n    simple-capture\n  | init-capture\n\nsimple-capture ::=\n    identifier \u0026quot;...\u0026quot;?\n  | \u0026quot;\u0026amp;\u0026quot; identifier \u0026quot;...\u0026quot;?\n  | \u0026quot;this\u0026quot;\n  | \u0026quot;*\u0026quot; \u0026quot;this\u0026quot;\n\ninit-capture ::=\n    \u0026quot;...\u0026quot;? identifier initializer\n  | \u0026quot;\u0026amp;\u0026quot; \u0026quot;...\u0026quot;? identifier initializer\n\nfold-expression ::=\n    \u0026quot;(\u0026quot; cast-expression fold-operator \u0026quot;...\u0026quot; \u0026quot;)\u0026quot;\n  | \u0026quot;(\u0026quot; \u0026quot;...\u0026quot; fold-operator cast-expression \u0026quot;)\u0026quot;\n  | \u0026quot;(\u0026quot; cast-expression fold-operator \u0026quot;...\u0026quot; fold-operator cast-expression \u0026quot;)\u0026quot;\n\nfold-operator ::=\n    \u0026quot;+\u0026quot; | \u0026quot;-\u0026quot; | \u0026quot;*\u0026quot; | \u0026quot;/\u0026quot; | \u0026quot;%\u0026quot; | \u0026quot;^\u0026quot; | \u0026quot;\u0026amp;\u0026quot; | \u0026quot;|\u0026quot; | \u0026quot;\u0026lt;\u0026lt;\u0026quot; | \u0026quot;\u0026gt;\u0026gt;\u0026quot;\n  | \u0026quot;+=\u0026quot; | \u0026quot;-=\u0026quot; | \u0026quot;*=\u0026quot; | \u0026quot;/=\u0026quot; | \u0026quot;%=\u0026quot; | \u0026quot;^=\u0026quot; | \u0026quot;\u0026amp;=\u0026quot; | \u0026quot;|=\u0026quot; | \u0026quot;\u0026lt;\u0026lt;=\u0026quot; | \u0026quot;\u0026gt;\u0026gt;=\u0026quot; | \u0026quot;=\u0026quot;\n  | \u0026quot;==\u0026quot; | \u0026quot;!=\u0026quot; | \u0026quot;\u0026lt;\u0026quot; | \u0026quot;\u0026gt;\u0026quot; | \u0026quot;\u0026lt;=\u0026quot; | \u0026quot;\u0026gt;=\u0026quot; | \u0026quot;\u0026amp;\u0026amp;\u0026quot; | \u0026quot;||\u0026quot; | \u0026quot;,\u0026quot; | \u0026quot;.*\u0026quot; | \u0026quot;-\u0026gt;*\u0026quot;\n\nrequires-expression ::=\n    \u0026quot;requires\u0026quot; requirement-parameter-list? requirement-body\n\nrequirement-parameter-list ::=\n    \u0026quot;(\u0026quot; parameter-declaration-clause \u0026quot;)\u0026quot;\n\nrequirement-body ::=\n    \u0026quot;{\u0026quot; requirement-seq \u0026quot;}\u0026quot;\n\nrequirement-seq ::=\n    requirement\n  | requirement requirement-seq\n\nrequirement ::=\n    simple-requirement\n  | type-requirement\n  | compound-requirement\n  | nested-requirement\n\nsimple-requirement ::=\n    expression \u0026quot;;\u0026quot;\n\ntype-requirement ::=\n    \u0026quot;typename\u0026quot; nested-name-specifier? type-name \u0026quot;;\u0026quot;\n\ncompound-requirement ::=\n    \u0026quot;{\u0026quot; expression \u0026quot;}\u0026quot; \u0026quot;noexcept\u0026quot;? return-type-requirement? \u0026quot;;\u0026quot;\n\nreturn-type-requirement ::=\n    \u0026quot;-\u0026gt;\u0026quot; type-constraint\n\nnested-requirement ::=\n    \u0026quot;requires\u0026quot; constraint-expression \u0026quot;;\u0026quot;\n\npostfix-expression ::=\n    primary-expression\n  | postfix-expression \u0026quot;[\u0026quot; expression-list? \u0026quot;]\u0026quot;\n  | postfix-expression \u0026quot;(\u0026quot; expression-list? \u0026quot;)\u0026quot;\n  | simple-type-specifier \u0026quot;(\u0026quot; expression-list? \u0026quot;)\u0026quot;\n  | typename-specifier \u0026quot;(\u0026quot; expression-list? \u0026quot;)\u0026quot;\n  | simple-type-specifier braced-init-list\n  | typename-specifier braced-init-list\n  | postfix-expression \u0026quot;.\u0026quot; \u0026quot;template\u0026quot;? id-expression\n  | postfix-expression \u0026quot;-\u0026gt;\u0026quot; \u0026quot;template\u0026quot;? id-expression\n  | postfix-expression \u0026quot;++\u0026quot;\n  | postfix-expression \u0026quot;--\u0026quot;\n  | \u0026quot;dynamic_cast\u0026quot; \u0026quot;\u0026lt;\u0026quot; type-id \u0026quot;\u0026gt;\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n  | \u0026quot;static_cast\u0026quot; \u0026quot;\u0026lt;\u0026quot; type-id \u0026quot;\u0026gt;\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n  | \u0026quot;reinterpret_cast\u0026quot; \u0026quot;\u0026lt;\u0026quot; type-id \u0026quot;\u0026gt;\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n  | \u0026quot;const_cast\u0026quot; \u0026quot;\u0026lt;\u0026quot; type-id \u0026quot;\u0026gt;\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n  | \u0026quot;typeid\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n  | \u0026quot;typeid\u0026quot; \u0026quot;(\u0026quot; type-id \u0026quot;)\u0026quot;\n\nexpression-list ::=\n    initializer-list\n\nunary-expression ::=\n    postfix-expression\n  | unary-operator cast-expression\n  | \u0026quot;++\u0026quot; cast-expression\n  | \u0026quot;--\u0026quot; cast-expression\n  | await-expression\n  | \u0026quot;sizeof\u0026quot; unary-expression\n  | \u0026quot;sizeof\u0026quot; \u0026quot;(\u0026quot; type-id \u0026quot;)\u0026quot;\n  | \u0026quot;sizeof\u0026quot; \u0026quot;...\u0026quot; \u0026quot;(\u0026quot; identifier \u0026quot;)\u0026quot;\n  | \u0026quot;alignof\u0026quot; \u0026quot;(\u0026quot; type-id \u0026quot;)\u0026quot;\n  | noexcept-expression\n  | new-expression\n  | delete-expression\n\nunary-operator ::=\n    \u0026quot;*\u0026quot; | \u0026quot;\u0026amp;\u0026quot; | \u0026quot;+\u0026quot; | \u0026quot;-\u0026quot; | \u0026quot;!\u0026quot; | \u0026quot;~\u0026quot;\n\nawait-expression ::=\n    \u0026quot;co_await\u0026quot; cast-expression\n\nnoexcept-expression ::=\n  \u0026quot;noexcept\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n\nnew-expression ::=\n    \u0026quot;::\u0026quot;? \u0026quot;new\u0026quot; new-placement? new-type-id new-initializer?\n  | \u0026quot;::\u0026quot;? \u0026quot;new\u0026quot; new-placement? \u0026quot;(\u0026quot; type-id \u0026quot;)\u0026quot; new-initializer?\n\nnew-placement ::=\n    \u0026quot;(\u0026quot; expression-list \u0026quot;)\u0026quot;\n\nnew-type-id ::=\n    type-specifier-seq new-declarator?\n\nnew-declarator ::=\n    ptr-operator new-declarator?\n  | noptr-new-declarator\n\nnoptr-new-declarator ::=\n    \u0026quot;[\u0026quot; expression? \u0026quot;]\u0026quot; attribute-specifier-seq?\n  | noptr-new-declarator \u0026quot;[\u0026quot; constant-expression \u0026quot;]\u0026quot; attribute-specifier-seq?\n\nnew-initializer ::=\n    \u0026quot;(\u0026quot; expression-list? \u0026quot;)\u0026quot;\n  | braced-init-list\n\ndelete-expression ::=\n    \u0026quot;::\u0026quot;? \u0026quot;delete\u0026quot; cast-expression\n  | \u0026quot;::\u0026quot;? \u0026quot;delete\u0026quot; \u0026quot;[\u0026quot; \u0026quot;]\u0026quot; cast-expression\n\ncast-expression ::=\n    unary-expression\n  | \u0026quot;(\u0026quot; type-id \u0026quot;)\u0026quot; cast-expression\n\npm-expression ::=\n    cast-expression\n  | pm-expression \u0026quot;.*\u0026quot; cast-expression\n  | pm-expression \u0026quot;-\u0026gt;*\u0026quot; cast-expression\n\nmultiplicative-expression ::=\n    pm-expression\n  | multiplicative-expression \u0026quot;*\u0026quot; pm-expression\n  | multiplicative-expression \u0026quot;/\u0026quot; pm-expression\n  | multiplicative-expression \u0026quot;%\u0026quot; pm-expression\n\nadditive-expression ::=\n    multiplicative-expression\n  | additive-expression \u0026quot;+\u0026quot; multiplicative-expression\n  | additive-expression \u0026quot;-\u0026quot; multiplicative-expression\n\nshift-expression ::=\n    additive-expression\n  | shift-expression \u0026quot;\u0026lt;\u0026lt;\u0026quot; additive-expression\n  | shift-expression \u0026quot;\u0026gt;\u0026gt;\u0026quot; additive-expression\n\ncompare-expression ::=\n    shift-expression\n  | compare-expression \u0026quot;\u0026lt;=\u0026gt;\u0026quot; shift-expression\n\nrelational-expression ::=\n    compare-expression\n  | relational-expression \u0026quot;\u0026lt;\u0026quot; compare-expression\n  | relational-expression \u0026quot;\u0026gt;\u0026quot; compare-expression\n  | relational-expression \u0026quot;\u0026lt;=\u0026quot; compare-expression\n  | relational-expression \u0026quot;\u0026gt;=\u0026quot; compare-expression\n\nequality-expression ::=\n    relational-expression\n  | equality-expression \u0026quot;==\u0026quot; relational-expression\n  | equality-expression \u0026quot;!=\u0026quot; relational-expression\n\nand-expression ::=\n    equality-expression\n  | and-expression \u0026quot;\u0026amp;\u0026quot; equality-expression\n\nexclusive-or-expression ::=\n    and-expression\n  | exclusive-or-expression \u0026quot;^\u0026quot; and-expression\n\ninclusive-or-expression ::=\n    exclusive-or-expression\n  | inclusive-or-expression \u0026quot;|\u0026quot; exclusive-or-expression\n\nlogical-and-expression ::=\n    inclusive-or-expression\n  | logical-and-expression \u0026quot;\u0026amp;\u0026amp;\u0026quot; inclusive-or-expression\n\nlogical-or-expression ::=\n    logical-and-expression\n  | logical-or-expression \u0026quot;||\u0026quot; logical-and-expression\n\nconditional-expression ::=\n    logical-or-expression\n  | logical-or-expression \u0026quot;?\u0026quot; expression \u0026quot;:\u0026quot; assignment-expression\n\n  yield-expression ::=\n  \u0026quot;co_yield\u0026quot; assignment-expression\n  | \u0026quot;co_yield\u0026quot; braced-init-list\n\nthrow-expression ::=\n    \u0026quot;throw\u0026quot;  assignment-expression?\n\nassignment-expression ::=\n    conditional-expression\n  | yield-expression\n  | throw-expression\n  | logical-or-expression assignment-operator initializer-clause\n\nassignment-operator ::=\n    \u0026quot;=\u0026quot; | \u0026quot;*=\u0026quot; | \u0026quot;/=\u0026quot; | \u0026quot;%=\u0026quot; | \u0026quot;+=\u0026quot; | \u0026quot;-=\u0026quot; | \u0026quot;\u0026gt;\u0026gt;=\u0026quot; | \u0026quot;\u0026lt;\u0026lt;=\u0026quot; | \u0026quot;\u0026amp;=\u0026quot; | \u0026quot;^=\u0026quot; | \u0026quot;|=\u0026quot;\n\nexpression ::=\n    assignment-expression\n  | expression \u0026quot;,\u0026quot; assignment-expression\n\nconstant-expression ::=\n    conditional-expression\n\n//== statements.tex\n\nstatement ::=\n    labeled-statement\n  | attribute-specifier-seq? expression-statement\n  | attribute-specifier-seq? compound-statement\n  | attribute-specifier-seq? selection-statement\n  | attribute-specifier-seq? iteration-statement\n  | attribute-specifier-seq? jump-statement\n  | declaration-statement\n  | attribute-specifier-seq? try-block\n\ninit-statement ::=\n    expression-statement\n  | simple-declaration\n  | alias-declaration\n\ncondition ::=\n    expression\n  | attribute-specifier-seq? decl-specifier-seq declarator brace-or-equal-initializer\n\nlabel ::=\n    attribute-specifier-seq? identifier \u0026quot;:\u0026quot;\n  | attribute-specifier-seq? \u0026quot;case\u0026quot; constant-expression \u0026quot;:\u0026quot;\n  | attribute-specifier-seq? \u0026quot;default\u0026quot; \u0026quot;:\u0026quot;\n\nlabeled-statement ::=\n    label statement\n\nexpression-statement ::=\n    expression? \u0026quot;;\u0026quot;\n\ncompound-statement ::=\n    \u0026quot;{\u0026quot; statement-seq? label-seq? \u0026quot;}\u0026quot;\n\nstatement-seq ::=\n    statement\n  | statement-seq statement\n\nlabel-seq ::=\n    label\n  | label-seq label\n\nselection-statement ::=\n    \u0026quot;if\u0026quot; \u0026quot;constexpr\u0026quot;? \u0026quot;(\u0026quot; init-statement? condition \u0026quot;)\u0026quot; statement\n  | \u0026quot;if\u0026quot; \u0026quot;constexpr\u0026quot;? \u0026quot;(\u0026quot; init-statement? condition \u0026quot;)\u0026quot; statement \u0026quot;else\u0026quot; statement\n  | \u0026quot;if\u0026quot; \u0026quot;!\u0026quot;? \u0026quot;consteval\u0026quot; compound-statement\n  | \u0026quot;if\u0026quot; \u0026quot;!\u0026quot;? \u0026quot;consteval\u0026quot; compound-statement \u0026quot;else\u0026quot; statement\n  | \u0026quot;switch\u0026quot; \u0026quot;(\u0026quot; init-statement? condition \u0026quot;)\u0026quot; statement\n\niteration-statement ::=\n    \u0026quot;while\u0026quot; \u0026quot;(\u0026quot; condition \u0026quot;)\u0026quot; statement\n  | \u0026quot;do\u0026quot; statement \u0026quot;while\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot; \u0026quot;;\u0026quot;\n  | \u0026quot;for\u0026quot; \u0026quot;(\u0026quot; init-statement condition? \u0026quot;;\u0026quot; expression? \u0026quot;)\u0026quot; statement\n  | \u0026quot;for\u0026quot; \u0026quot;(\u0026quot; init-statement? for-range-declaration \u0026quot;:\u0026quot; for-range-initializer \u0026quot;)\u0026quot; statement\n\nfor-range-declaration ::=\n    attribute-specifier-seq? decl-specifier-seq declarator\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \u0026quot;[\u0026quot; identifier-list \u0026quot;]\u0026quot;\n\nfor-range-initializer ::=\n    expr-or-braced-init-list\n\njump-statement ::=\n    \u0026quot;break\u0026quot; \u0026quot;;\u0026quot;\n  | \u0026quot;continue\u0026quot; \u0026quot;;\u0026quot;\n  | \u0026quot;return\u0026quot; expr-or-braced-init-list? \u0026quot;;\u0026quot;\n  | coroutine-return-statement\n  | \u0026quot;goto\u0026quot; identifier \u0026quot;;\u0026quot;\n\ncoroutine-return-statement ::=\n    \u0026quot;co_return\u0026quot; expr-or-braced-init-list? \u0026quot;;\u0026quot;\n\ndeclaration-statement ::=\n    block-declaration\n\n//== declarations.tex\n\ndeclaration-seq ::=\n    declaration\n  | declaration-seq declaration\n\ndeclaration ::=\n    name-declaration\n  | special-declaration\n\nname-declaration ::=\n    block-declaration\n  | nodeclspec-function-declaration\n  | function-definition\n  | template-declaration\n  | deduction-guide\n  | linkage-specification\n  | namespace-definition\n  | empty-declaration\n  | attribute-declaration\n  | module-import-declaration\n\nspecial-declaration ::=\n    explicit-instantiation\n  | explicit-specialization\n  | export-declaration\n\nblock-declaration ::=\n    simple-declaration\n  | asm-declaration\n  | namespace-alias-definition\n  | using-declaration\n  | using-enum-declaration\n  | using-directive\n  | static_assert-declaration\n  | alias-declaration\n  | opaque-enum-declaration\n\nnodeclspec-function-declaration ::=\n    attribute-specifier-seq? declarator \u0026quot;;\u0026quot;\n\nalias-declaration ::=\n    \u0026quot;using\u0026quot; identifier attribute-specifier-seq? \u0026quot;=\u0026quot; defining-type-id \u0026quot;;\u0026quot;\n\nsimple-declaration ::=\n    decl-specifier-seq init-declarator-list? \u0026quot;;\u0026quot;\n  | attribute-specifier-seq decl-specifier-seq init-declarator-list \u0026quot;;\u0026quot;\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \u0026quot;[\u0026quot; identifier-list \u0026quot;]\u0026quot; initializer \u0026quot;;\u0026quot;\n\nstatic_assert-message ::=\n  unevaluated-string\n  | constant-expression\n\nstatic_assert-declaration ::=\n  \u0026quot;static_assert\u0026quot; \u0026quot;(\u0026quot; constant-expression \u0026quot;)\u0026quot; \u0026quot;;\u0026quot;\n  | \u0026quot;static_assert\u0026quot; \u0026quot;(\u0026quot; constant-expression \u0026quot;,\u0026quot; static_assert-message \u0026quot;)\u0026quot; \u0026quot;;\u0026quot;\n\nempty-declaration ::=\n    \u0026quot;;\u0026quot;\n\nattribute-declaration ::=\n    attribute-specifier-seq \u0026quot;;\u0026quot;\n\ndecl-specifier ::=\n    storage-class-specifier\n  | defining-type-specifier\n  | function-specifier\n  | \u0026quot;friend\u0026quot;\n  | \u0026quot;typedef\u0026quot;\n  | \u0026quot;constexpr\u0026quot;\n  | \u0026quot;consteval\u0026quot;\n  | \u0026quot;constinit\u0026quot;\n  | \u0026quot;inline\u0026quot;\n\ndecl-specifier-seq ::=\n    decl-specifier attribute-specifier-seq?\n  | decl-specifier decl-specifier-seq\n\nstorage-class-specifier ::=\n    \u0026quot;static\u0026quot;\n  | \u0026quot;thread_local\u0026quot;\n  | \u0026quot;extern\u0026quot;\n  | \u0026quot;mutable\u0026quot;\n\nfunction-specifier ::=\n    \u0026quot;virtual\u0026quot;\n  | explicit-specifier\n\nexplicit-specifier ::=\n    \u0026quot;explicit\u0026quot; \u0026quot;(\u0026quot; constant-expression \u0026quot;)\u0026quot;\n  | \u0026quot;explicit\u0026quot;\n\ntypedef-name ::=\n    identifier\n  | simple-template-id\n\ntype-specifier ::=\n  simple-type-specifier\n  | elaborated-type-specifier\n  | typename-specifier\n  | cv-qualifier\n\ntype-specifier-seq ::=\n    type-specifier attribute-specifier-seq?\n  | type-specifier type-specifier-seq\n\ndefining-type-specifier ::=\n    type-specifier\n  | class-specifier\n  | enum-specifier\n\ndefining-type-specifier-seq ::=\n  defining-type-specifier attribute-specifier-seq?\n  | defining-type-specifier defining-type-specifier-seq\n\nsimple-type-specifier ::=\n    nested-name-specifier? type-name\n  | nested-name-specifier \u0026quot;template\u0026quot; simple-template-id\n  | computed-type-specifier\n  | placeholder-type-specifier\n  | nested-name-specifier? template-name\n  | \u0026quot;char\u0026quot;\n  | \u0026quot;char8_t\u0026quot;\n  | \u0026quot;char16_t\u0026quot;\n  | \u0026quot;char32_t\u0026quot;\n  | \u0026quot;wchar_t\u0026quot;\n  | \u0026quot;bool\u0026quot;\n  | \u0026quot;short\u0026quot;\n  | \u0026quot;int\u0026quot;\n  | \u0026quot;long\u0026quot;\n  | \u0026quot;signed\u0026quot;\n  | \u0026quot;unsigned\u0026quot;\n  | \u0026quot;float\u0026quot;\n  | \u0026quot;double\u0026quot;\n  | \u0026quot;void\u0026quot;\n\ntype-name ::=\n    class-name\n  | enum-name\n  | typedef-name\n\ncomputed-type-specifier ::=\n    decltype-specifier\n  | pack-index-specifier\n\npack-index-specifier ::=\n    typedef-name \u0026quot;...\u0026quot; \u0026quot;[\u0026quot; constant-expression \u0026quot;]\u0026quot;\n\nelaborated-type-specifier ::=\n    class-key attribute-specifier-seq? nested-name-specifier? identifier\n  | class-key simple-template-id\n  | class-key nested-name-specifier \u0026quot;template\u0026quot;? simple-template-id\n  | \u0026quot;enum\u0026quot; nested-name-specifier? identifier\n\ndecltype-specifier ::=\n  \u0026quot;decltype\u0026quot; \u0026quot;(\u0026quot; expression \u0026quot;)\u0026quot;\n\nplaceholder-type-specifier ::=\n  type-constraint? \u0026quot;auto\u0026quot;\n  | type-constraint? \u0026quot;decltype\u0026quot; \u0026quot;(\u0026quot; \u0026quot;auto\u0026quot; \u0026quot;)\u0026quot;\n\ninit-declarator-list ::=\n    init-declarator\n  | init-declarator-list \u0026quot;,\u0026quot; init-declarator\n\ninit-declarator ::=\n    declarator initializer?\n  | declarator requires-clause\n\ndeclarator ::=\n    ptr-declarator\n  | noptr-declarator parameters-and-qualifiers trailing-return-type\n\nptr-declarator ::=\n    noptr-declarator\n  | ptr-operator ptr-declarator\n\nnoptr-declarator ::=\n    declarator-id attribute-specifier-seq?\n  | noptr-declarator parameters-and-qualifiers\n  | noptr-declarator \u0026quot;[\u0026quot; constant-expression? \u0026quot;]\u0026quot; attribute-specifier-seq?\n  | \u0026quot;(\u0026quot; ptr-declarator \u0026quot;)\u0026quot;\n\nparameters-and-qualifiers ::=\n    \u0026quot;(\u0026quot; parameter-declaration-clause \u0026quot;)\u0026quot; cv-qualifier-seq?\n        ref-qualifier? noexcept-specifier? attribute-specifier-seq?\n\ntrailing-return-type ::=\n    \u0026quot;-\u0026gt;\u0026quot; type-id\n\nptr-operator ::=\n    \u0026quot;*\u0026quot; attribute-specifier-seq? cv-qualifier-seq?\n  | \u0026quot;\u0026amp;\u0026quot; attribute-specifier-seq?\n  | \u0026quot;\u0026amp;\u0026amp;\u0026quot; attribute-specifier-seq?\n  | nested-name-specifier \u0026quot;*\u0026quot; attribute-specifier-seq? cv-qualifier-seq?\n\ncv-qualifier-seq ::=\n    cv-qualifier cv-qualifier-seq?\n\ncv-qualifier ::=\n    \u0026quot;const\u0026quot;\n  | \u0026quot;volatile\u0026quot;\n\nref-qualifier ::=\n    \u0026quot;\u0026amp;\u0026quot;\n  | \u0026quot;\u0026amp;\u0026amp;\u0026quot;\n\ndeclarator-id ::=\n    \u0026quot;...\u0026quot;? id-expression\n\ntype-id ::=\n    type-specifier-seq abstract-declarator?\n\ndefining-type-id ::=\n    defining-type-specifier-seq abstract-declarator?\n\nabstract-declarator ::=\n    ptr-abstract-declarator\n  | noptr-abstract-declarator? parameters-and-qualifiers trailing-return-type\n  | abstract-pack-declarator\n\nptr-abstract-declarator ::=\n    noptr-abstract-declarator\n  | ptr-operator ptr-abstract-declarator?\n\nnoptr-abstract-declarator ::=\n    noptr-abstract-declarator? parameters-and-qualifiers\n  | noptr-abstract-declarator? \u0026quot;[\u0026quot; constant-expression? \u0026quot;]\u0026quot; attribute-specifier-seq?\n  | \u0026quot;(\u0026quot; ptr-abstract-declarator \u0026quot;)\u0026quot;\n\nabstract-pack-declarator ::=\n    noptr-abstract-pack-declarator\n  | ptr-operator abstract-pack-declarator\n\nnoptr-abstract-pack-declarator ::=\n    noptr-abstract-pack-declarator parameters-and-qualifiers\n  | \u0026quot;...\u0026quot;\n\nparameter-declaration-clause ::=\n    parameter-declaration-list? \u0026quot;...\u0026quot;?\n  | parameter-declaration-list \u0026quot;,\u0026quot; \u0026quot;...\u0026quot;\n\nparameter-declaration-list ::=\n    parameter-declaration\n  | parameter-declaration-list \u0026quot;,\u0026quot; parameter-declaration\n\nparameter-declaration ::=\n    attribute-specifier-seq? \u0026quot;this\u0026quot;? decl-specifier-seq declarator\n  | attribute-specifier-seq? decl-specifier-seq declarator \u0026quot;=\u0026quot; initializer-clause\n  | attribute-specifier-seq? \u0026quot;this\u0026quot;? decl-specifier-seq abstract-declarator?\n  | attribute-specifier-seq? decl-specifier-seq abstract-declarator? \u0026quot;=\u0026quot; initializer-clause\n\ninitializer ::=\n    brace-or-equal-initializer\n  | \u0026quot;(\u0026quot; expression-list \u0026quot;)\u0026quot;\n\nbrace-or-equal-initializer ::=\n    \u0026quot;=\u0026quot; initializer-clause\n  | braced-init-list\n\ninitializer-clause ::=\n    assignment-expression\n  | braced-init-list\n\nbraced-init-list ::=\n    \u0026quot;{\u0026quot; initializer-list \u0026quot;,\u0026quot;? \u0026quot;}\u0026quot;\n  | \u0026quot;{\u0026quot; designated-initializer-list \u0026quot;,\u0026quot;? \u0026quot;}\u0026quot;\n  | \u0026quot;{\u0026quot; \u0026quot;}\u0026quot;\n\ninitializer-list ::=\n    initializer-clause \u0026quot;...\u0026quot;?\n  | initializer-list \u0026quot;,\u0026quot; initializer-clause \u0026quot;...\u0026quot;?\n\ndesignated-initializer-list ::=\n    designated-initializer-clause\n  | designated-initializer-list \u0026quot;,\u0026quot; designated-initializer-clause\n\ndesignated-initializer-clause ::=\n    designator brace-or-equal-initializer\n\ndesignator ::=\n    \u0026quot;.\u0026quot; identifier\n\nexpr-or-braced-init-list ::=\n    expression\n  | braced-init-list\n\nfunction-definition ::=\n    attribute-specifier-seq? decl-specifier-seq? declarator virt-specifier-seq? function-body\n  | attribute-specifier-seq? decl-specifier-seq? declarator requires-clause function-body\n\nfunction-body ::=\n    ctor-initializer? compound-statement\n  | function-try-block\n  | \u0026quot;=\u0026quot; \u0026quot;default\u0026quot; \u0026quot;;\u0026quot;\n  | \u0026quot;=\u0026quot; \u0026quot;delete\u0026quot; \u0026quot;;\u0026quot;\n\nenum-name ::=\n    identifier\n\nenum-specifier ::=\n    enum-head \u0026quot;{\u0026quot; enumerator-list? \u0026quot;}\u0026quot;\n  | enum-head \u0026quot;{\u0026quot; enumerator-list \u0026quot;,\u0026quot; \u0026quot;}\u0026quot;\n\nenum-head ::=\n    enum-key attribute-specifier-seq? enum-head-name? enum-base?\n\nenum-head-name ::=\n    nested-name-specifier? identifier\n\nopaque-enum-declaration ::=\n    enum-key attribute-specifier-seq? enum-head-name enum-base? \u0026quot;;\u0026quot;\n\nenum-key ::=\n    \u0026quot;enum\u0026quot;\n  | \u0026quot;enum\u0026quot; \u0026quot;class\u0026quot;\n  | \u0026quot;enum\u0026quot; \u0026quot;struct\u0026quot;\n\nenum-base ::=\n    \u0026quot;:\u0026quot; type-specifier-seq\n\nenumerator-list ::=\n    enumerator-definition\n  | enumerator-list \u0026quot;,\u0026quot; enumerator-definition\n\nenumerator-definition ::=\n    enumerator\n  | enumerator \u0026quot;=\u0026quot; constant-expression\n\nenumerator ::=\n    identifier attribute-specifier-seq?\n\nusing-enum-declaration ::=\n    \u0026quot;using\u0026quot; \u0026quot;enum\u0026quot; using-enum-declarator \u0026quot;;\u0026quot;\n\nusing-enum-declarator ::=\n    nested-name-specifier? identifier\n  | nested-name-specifier? simple-template-id\n\nnamespace-name ::=\n        identifier\n  | namespace-alias\n\nnamespace-definition ::=\n        named-namespace-definition\n  | unnamed-namespace-definition\n  | nested-namespace-definition\n\nnamed-namespace-definition ::=\n        \u0026quot;inline\u0026quot;? \u0026quot;namespace\u0026quot; attribute-specifier-seq? identifier \u0026quot;{\u0026quot; namespace-body \u0026quot;}\u0026quot;\n\nunnamed-namespace-definition ::=\n        \u0026quot;inline\u0026quot;? \u0026quot;namespace\u0026quot; attribute-specifier-seq? \u0026quot;{\u0026quot; namespace-body \u0026quot;}\u0026quot;\n\nnested-namespace-definition ::=\n        \u0026quot;namespace\u0026quot; enclosing-namespace-specifier \u0026quot;::\u0026quot; \u0026quot;inline\u0026quot;? identifier \u0026quot;{\u0026quot; namespace-body \u0026quot;}\u0026quot;\n\nenclosing-namespace-specifier ::=\n        identifier\n  | enclosing-namespace-specifier \u0026quot;::\u0026quot; \u0026quot;inline\u0026quot;? identifier\n\nnamespace-body ::=\n        declaration-seq?\n\nnamespace-alias ::=\n        identifier\n\nnamespace-alias-definition ::=\n        \u0026quot;namespace\u0026quot; identifier \u0026quot;=\u0026quot; qualified-namespace-specifier \u0026quot;;\u0026quot;\n\nqualified-namespace-specifier ::=\n    nested-name-specifier? namespace-name\n\nusing-directive ::=\n    attribute-specifier-seq? \u0026quot;using\u0026quot; \u0026quot;namespace\u0026quot; nested-name-specifier? namespace-name \u0026quot;;\u0026quot;\n\nusing-declaration ::=\n    \u0026quot;using\u0026quot; using-declarator-list \u0026quot;;\u0026quot;\n\nusing-declarator-list ::=\n    using-declarator \u0026quot;...\u0026quot;?\n  | using-declarator-list \u0026quot;,\u0026quot; using-declarator \u0026quot;...\u0026quot;?\n\nusing-declarator ::=\n    \u0026quot;typename\u0026quot;? nested-name-specifier unqualified-id\n\nasm-declaration ::=\n    attribute-specifier-seq? \u0026quot;asm\u0026quot; \u0026quot;(\u0026quot; balanced-token-seq \u0026quot;)\u0026quot; \u0026quot;;\u0026quot;\n\nlinkage-specification ::=\n    \u0026quot;extern\u0026quot; unevaluated-string \u0026quot;{\u0026quot; declaration-seq? \u0026quot;}\u0026quot;\n  | \u0026quot;extern\u0026quot; unevaluated-string name-declaration\n\nattribute-specifier-seq ::=\n  attribute-specifier-seq? attribute-specifier\n\nattribute-specifier ::=\n  \u0026quot;[\u0026quot; \u0026quot;[\u0026quot; attribute-using-prefix? attribute-list \u0026quot;]\u0026quot; \u0026quot;]\u0026quot;\n  | alignment-specifier\n\nalignment-specifier ::=\n  \u0026quot;alignas\u0026quot; \u0026quot;(\u0026quot; type-id \u0026quot;...\u0026quot;? \u0026quot;)\u0026quot;\n  | \u0026quot;alignas\u0026quot; \u0026quot;(\u0026quot; constant-expression \u0026quot;...\u0026quot;? \u0026quot;)\u0026quot;\n\nattribute-using-prefix ::=\n  \u0026quot;using\u0026quot; attribute-namespace \u0026quot;:\u0026quot;\n\nattribute-list ::=\n  attribute?\n  | attribute-list \u0026quot;,\u0026quot; attribute?\n  | attribute \u0026quot;...\u0026quot;\n  | attribute-list \u0026quot;,\u0026quot; attribute \u0026quot;...\u0026quot;\n\nattribute ::=\n    attribute-token attribute-argument-clause?\n\nattribute-token ::=\n    identifier\n  | attribute-scoped-token\n\nattribute-scoped-token ::=\n    attribute-namespace \u0026quot;::\u0026quot; identifier\n\nattribute-namespace ::=\n    identifier\n\nattribute-argument-clause ::=\n    \u0026quot;(\u0026quot; balanced-token-seq? \u0026quot;)\u0026quot;\n\nbalanced-token-seq ::=\n    balanced-token\n  | balanced-token-seq balanced-token\n\nbalanced-token ::=\n    \u0026quot;(\u0026quot; balanced-token-seq? \u0026quot;)\u0026quot;\n  | \u0026quot;[\u0026quot; balanced-token-seq? \u0026quot;]\u0026quot;\n  | \u0026quot;{\u0026quot; balanced-token-seq? \u0026quot;}\u0026quot;\n  | \u0026quot;{any token other than a parenthesis, a bracket, or a brace}\u0026quot;\n\n//== modules.tex\n\nmodule-declaration ::=\n    \u0026quot;export\u0026quot;? \u0026quot;module\u0026quot; module-name module-partition? attribute-specifier-seq? \u0026quot;;\u0026quot;\n\nmodule-name ::=\n    module-name-qualifier? identifier\n\nmodule-partition ::=\n    \u0026quot;:\u0026quot; module-name-qualifier? identifier\n\nmodule-name-qualifier ::=\n    identifier \u0026quot;.\u0026quot;\n  | module-name-qualifier identifier \u0026quot;.\u0026quot;\n\nexport-declaration ::=\n    \u0026quot;export\u0026quot; name-declaration\n  | \u0026quot;export\u0026quot; \u0026quot;{\u0026quot; declaration-seq? \u0026quot;}\u0026quot;\n  | \u0026quot;export\u0026quot; module-import-declaration\n\nmodule-import-declaration ::=\n    \u0026quot;import\u0026quot; module-name attribute-specifier-seq? \u0026quot;;\u0026quot;\n  | \u0026quot;import\u0026quot; module-partition attribute-specifier-seq? \u0026quot;;\u0026quot;\n  | \u0026quot;import\u0026quot; header-name attribute-specifier-seq? \u0026quot;;\u0026quot;\n\nglobal-module-fragment ::=\n    \u0026quot;module\u0026quot; \u0026quot;;\u0026quot; declaration-seq?\n\nprivate-module-fragment ::=\n    \u0026quot;module\u0026quot; \u0026quot;:\u0026quot; \u0026quot;private\u0026quot; \u0026quot;;\u0026quot; declaration-seq?\n\n//== classes.tex\n\nclass-name ::=\n    identifier\n  | simple-template-id\n\nclass-specifier ::=\n    class-head \u0026quot;{\u0026quot; member-specification? \u0026quot;}\u0026quot;\n\nclass-head ::=\n    class-key attribute-specifier-seq? class-head-name class-virt-specifier? base-clause?\n  | class-key attribute-specifier-seq? base-clause?\n\nclass-head-name ::=\n    nested-name-specifier? class-name\n\nclass-virt-specifier ::=\n    \u0026quot;final\u0026quot;\n\nclass-key ::=\n    \u0026quot;class\u0026quot;\n  | \u0026quot;struct\u0026quot;\n  | \u0026quot;union\u0026quot;\n\nmember-specification ::=\n    member-declaration member-specification?\n  | access-specifier \u0026quot;:\u0026quot; member-specification?\n\nmember-declaration ::=\n    attribute-specifier-seq? decl-specifier-seq? member-declarator-list? \u0026quot;;\u0026quot;\n  | function-definition\n  | using-declaration\n  | using-enum-declaration\n  | static_assert-declaration\n  | template-declaration\n  | explicit-specialization\n  | deduction-guide\n  | alias-declaration\n  | opaque-enum-declaration\n  | empty-declaration\n\nmember-declarator-list ::=\n    member-declarator\n  | member-declarator-list \u0026quot;,\u0026quot; member-declarator\n\nmember-declarator ::=\n    declarator virt-specifier-seq? pure-specifier?\n  | declarator requires-clause\n  | declarator brace-or-equal-initializer?\n  | identifier? attribute-specifier-seq? \u0026quot;:\u0026quot; constant-expression brace-or-equal-initializer?\n\nvirt-specifier-seq ::=\n    virt-specifier\n  | virt-specifier-seq virt-specifier\n\nvirt-specifier ::=\n    \u0026quot;override\u0026quot;\n  | \u0026quot;final\u0026quot;\n\npure-specifier ::=\n    \u0026quot;=\u0026quot; \u0026quot;0\u0026quot;\n\nconversion-function-id ::=\n    \u0026quot;operator\u0026quot; conversion-type-id\n\nconversion-type-id ::=\n    type-specifier-seq conversion-declarator?\n\nconversion-declarator ::=\n    ptr-operator conversion-declarator?\n\nbase-clause ::=\n    \u0026quot;:\u0026quot; base-specifier-list\n\nbase-specifier-list ::=\n    base-specifier \u0026quot;...\u0026quot;?\n  | base-specifier-list \u0026quot;,\u0026quot; base-specifier \u0026quot;...\u0026quot;?\n\nbase-specifier ::=\n    attribute-specifier-seq? class-or-decltype\n  | attribute-specifier-seq? \u0026quot;virtual\u0026quot; access-specifier? class-or-decltype\n  | attribute-specifier-seq? access-specifier \u0026quot;virtual\u0026quot;? class-or-decltype\n\nclass-or-decltype ::=\n    nested-name-specifier? type-name\n  | nested-name-specifier \u0026quot;template\u0026quot; simple-template-id\n  | decltype-specifier\n\naccess-specifier ::=\n    \u0026quot;private\u0026quot;\n  | \u0026quot;protected\u0026quot;\n  | \u0026quot;public\u0026quot;\n\nctor-initializer ::=\n    \u0026quot;:\u0026quot; mem-initializer-list\n\nmem-initializer-list ::=\n    mem-initializer \u0026quot;...\u0026quot;?\n  | mem-initializer-list \u0026quot;,\u0026quot; mem-initializer \u0026quot;...\u0026quot;?\n\nmem-initializer ::=\n    mem-initializer-id \u0026quot;(\u0026quot; expression-list? \u0026quot;)\u0026quot;\n  | mem-initializer-id braced-init-list\n\nmem-initializer-id ::=\n    class-or-decltype\n  | identifier\n\n//== overloading.tex\n\noperator-function-id ::=\n    \u0026quot;operator\u0026quot; operator\n\noperator ::=\n    \u0026quot;new\u0026quot; | \u0026quot;delete\u0026quot; | \u0026quot;new[]\u0026quot; | \u0026quot;delete[]\u0026quot; | \u0026quot;co_await\u0026quot; | \u0026quot;()\u0026quot; | \u0026quot;[]\u0026quot; | \u0026quot;-\u0026gt;\u0026quot; | \u0026quot;-\u0026gt;*\u0026quot;\n  | \u0026quot;~\u0026quot; | \u0026quot;!\u0026quot; | \u0026quot;+\u0026quot; | \u0026quot;-\u0026quot; | \u0026quot;*\u0026quot; | \u0026quot;/\u0026quot; | \u0026quot;%\u0026quot; | \u0026quot;^\u0026quot; | \u0026quot;\u0026amp;\u0026quot;\n  | \u0026quot;|\u0026quot; | \u0026quot;=\u0026quot; | \u0026quot;+=\u0026quot; | \u0026quot;-=\u0026quot; | \u0026quot;*=\u0026quot; | \u0026quot;/=\u0026quot; | \u0026quot;%=\u0026quot; | \u0026quot;^=\u0026quot; | \u0026quot;\u0026amp;=\u0026quot;\n  | \u0026quot;|=\u0026quot; | \u0026quot;==\u0026quot; | \u0026quot;!=\u0026quot; | \u0026quot;\u0026lt;\u0026quot; | \u0026quot;\u0026gt;\u0026quot; | \u0026quot;\u0026lt;=\u0026quot; | \u0026quot;\u0026gt;=\u0026quot; | \u0026quot;\u0026lt;=\u0026gt;\u0026quot; | \u0026quot;\u0026amp;\u0026amp;\u0026quot;\n  | \u0026quot;||\u0026quot; | \u0026quot;\u0026lt;\u0026lt;\u0026quot; | \u0026quot;\u0026gt;\u0026gt;\u0026quot; | \u0026quot;\u0026lt;\u0026lt;=\u0026quot; | \u0026quot;\u0026gt;\u0026gt;=\u0026quot; | \u0026quot;++\u0026quot; | \u0026quot;--\u0026quot; | \u0026quot;,\u0026quot;\n\nliteral-operator-id ::=\n    \u0026quot;operator\u0026quot; unevaluated-string identifier\n  | \u0026quot;operator\u0026quot; user-defined-string-literal\n\n//== templates.tex\n\ntemplate-declaration ::=\n  template-head declaration\n  | template-head concept-definition\n\ntemplate-head ::=\n  \u0026quot;template\u0026quot; \u0026quot;\u0026lt;\u0026quot; template-parameter-list \u0026quot;\u0026gt;\u0026quot; requires-clause?\n\ntemplate-parameter-list ::=\n  template-parameter\n  | template-parameter-list \u0026quot;,\u0026quot; template-parameter\n\nrequires-clause ::=\n  \u0026quot;requires\u0026quot; constraint-logical-or-expression\n\nconstraint-logical-or-expression ::=\n  constraint-logical-and-expression\n  | constraint-logical-or-expression \u0026quot;||\u0026quot; constraint-logical-and-expression\n\nconstraint-logical-and-expression ::=\n  primary-expression\n  | constraint-logical-and-expression \u0026quot;\u0026amp;\u0026amp;\u0026quot; primary-expression\n\ntemplate-parameter ::=\n  type-parameter\n  | parameter-declaration\n\ntype-parameter ::=\n  type-parameter-key \u0026quot;...\u0026quot;? identifier?\n  | type-parameter-key identifier? \u0026quot;=\u0026quot; type-id\n  | type-constraint \u0026quot;...\u0026quot;? identifier?\n  | type-constraint identifier? \u0026quot;=\u0026quot; type-id\n  | template-head type-parameter-key \u0026quot;...\u0026quot;? identifier?\n  | template-head type-parameter-key identifier? \u0026quot;=\u0026quot; id-expression\n\ntype-parameter-key ::=\n  \u0026quot;class\u0026quot;\n  | \u0026quot;typename\u0026quot;\n\ntype-constraint ::=\n  nested-name-specifier? concept-name\n  | nested-name-specifier? concept-name \u0026quot;\u0026lt;\u0026quot; template-argument-list? \u0026quot;\u0026gt;\u0026quot;\n\nsimple-template-id ::=\n  template-name \u0026quot;\u0026lt;\u0026quot; template-argument-list? \u0026quot;\u0026gt;\u0026quot;\n\ntemplate-id ::=\n  simple-template-id\n  | operator-function-id \u0026quot;\u0026lt;\u0026quot; template-argument-list? \u0026quot;\u0026gt;\u0026quot;\n  | literal-operator-id \u0026quot;\u0026lt;\u0026quot; template-argument-list? \u0026quot;\u0026gt;\u0026quot;\n\ntemplate-name ::=\n  identifier\n\ntemplate-argument-list ::=\n  template-argument \u0026quot;...\u0026quot;?\n  | template-argument-list \u0026quot;,\u0026quot; template-argument \u0026quot;...\u0026quot;?\n\ntemplate-argument ::=\n  constant-expression\n  | type-id\n  | id-expression\n  | braced-init-list\n\nconstraint-expression ::=\n    logical-or-expression\n\ndeduction-guide ::=\n    explicit-specifier? template-name \u0026quot;(\u0026quot; parameter-declaration-clause \u0026quot;)\u0026quot; \u0026quot;-\u0026gt;\u0026quot; simple-template-id \u0026quot;;\u0026quot;\n\nconcept-definition ::=\n  \u0026quot;concept\u0026quot; concept-name attribute-specifier-seq? \u0026quot;=\u0026quot; constraint-expression \u0026quot;;\u0026quot;\n\nconcept-name ::=\n  identifier\n\ntypename-specifier ::=\n  \u0026quot;typename\u0026quot; nested-name-specifier identifier\n  | \u0026quot;typename\u0026quot; nested-name-specifier \u0026quot;template\u0026quot;? simple-template-id\n\nexplicit-instantiation ::=\n  \u0026quot;extern\u0026quot;? \u0026quot;template\u0026quot; declaration\n\nexplicit-specialization ::=\n  \u0026quot;template\u0026quot; \u0026quot;\u0026lt;\u0026quot; \u0026quot;\u0026gt;\u0026quot; declaration\n\n//== exceptions.tex\n\ntry-block ::=\n    \u0026quot;try\u0026quot; compound-statement handler-seq\n\nfunction-try-block ::=\n    \u0026quot;try\u0026quot; ctor-initializer? compound-statement handler-seq\n\nhandler-seq ::=\n    handler handler-seq?\n\nhandler ::=\n    \u0026quot;catch\u0026quot; \u0026quot;(\u0026quot; exception-declaration \u0026quot;)\u0026quot; compound-statement\n\nexception-declaration ::=\n    attribute-specifier-seq? type-specifier-seq declarator\n  | attribute-specifier-seq? type-specifier-seq abstract-declarator?\n  | \u0026quot;...\u0026quot;\n\nnoexcept-specifier ::=\n    \u0026quot;noexcept\u0026quot; \u0026quot;(\u0026quot; constant-expression \u0026quot;)\u0026quot;\n  | \u0026quot;noexcept\u0026quot;\n\n//== preprocessor.tex\n\npreprocessing-file ::=\n    group?\n  | module-file\n\nmodule-file ::=\n    pp-global-module-fragment? pp-module group? pp-private-module-fragment?\n\npp-global-module-fragment ::=\n    \u0026quot;module\u0026quot; \u0026quot;;\u0026quot; new-line group?\n\npp-private-module-fragment ::=\n    \u0026quot;module\u0026quot; \u0026quot;:\u0026quot; \u0026quot;private\u0026quot; \u0026quot;;\u0026quot; new-line group?\n\ngroup ::=\n    group-part\n  | group group-part\n\ngroup-part ::=\n    control-line\n  | if-section\n  | text-line\n  | \u0026quot;#\u0026quot; conditionally-supported-directive\n\ncontrol-line ::=\n    \u0026quot;#\u0026quot; \u0026quot;include\u0026quot; pp-tokens new-line\n  | pp-import\n  | \u0026quot;#\u0026quot; \u0026quot;define\u0026quot; identifier replacement-list new-line\n  | \u0026quot;#\u0026quot; \u0026quot;define\u0026quot; identifier lparen identifier-list? \u0026quot;)\u0026quot; replacement-list new-line\n  | \u0026quot;#\u0026quot; \u0026quot;define\u0026quot; identifier lparen \u0026quot;...\u0026quot; \u0026quot;)\u0026quot; replacement-list new-line\n  | \u0026quot;#\u0026quot; \u0026quot;define\u0026quot; identifier lparen identifier-list \u0026quot;,\u0026quot; \u0026quot;...\u0026quot; \u0026quot;)\u0026quot; replacement-list new-line\n  | \u0026quot;#\u0026quot; \u0026quot;undef\u0026quot; identifier new-line\n  | \u0026quot;#\u0026quot; \u0026quot;line\u0026quot; pp-tokens new-line\n  | \u0026quot;#\u0026quot; \u0026quot;error\u0026quot; pp-tokens? new-line\n  | \u0026quot;#\u0026quot; \u0026quot;warning\u0026quot; pp-tokens? new-line\n  | \u0026quot;#\u0026quot; \u0026quot;pragma\u0026quot; pp-tokens? new-line\n  | \u0026quot;#\u0026quot; new-line\n\nif-section ::=\n    if-group elif-groups? else-group? endif-line\n\nif-group ::=\n    \u0026quot;#\u0026quot; \u0026quot;if\u0026quot; constant-expression new-line group?\n  | \u0026quot;#\u0026quot; \u0026quot;ifdef\u0026quot; identifier new-line group?\n  | \u0026quot;#\u0026quot; \u0026quot;ifndef\u0026quot; identifier new-line group?\n\nelif-groups ::=\n    elif-group\n  | elif-groups elif-group\n\nelif-group ::=\n    \u0026quot;#\u0026quot; \u0026quot;elif\u0026quot; constant-expression new-line group?\n  | \u0026quot;#\u0026quot; \u0026quot;elifdef\u0026quot; identifier new-line group?\n  | \u0026quot;#\u0026quot; \u0026quot;elifndef\u0026quot; identifier new-line group?\n\nelse-group ::=\n    \u0026quot;#\u0026quot; \u0026quot;else\u0026quot; new-line group?\n\nendif-line ::=\n    \u0026quot;#\u0026quot; \u0026quot;endif\u0026quot; new-line\n\ntext-line ::=\n    pp-tokens? new-line\n\nconditionally-supported-directive ::=\n    pp-tokens new-line\n\nlparen ::=\n    '{a \u0026quot;(\u0026quot; character not immediately preceded by whitespace}'\n\nidentifier-list ::=\n    identifier\n  | identifier-list \u0026quot;,\u0026quot; identifier\n\nreplacement-list ::=\n    pp-tokens?\n\npp-tokens ::=\n    preprocessing-token\n  | pp-tokens preprocessing-token\n\nnew-line ::=\n    \u0026quot;{the new-line character}\u0026quot;\n\ndefined-macro-expression ::=\n    \u0026quot;defined\u0026quot; identifier\n  | \u0026quot;defined\u0026quot; \u0026quot;(\u0026quot; identifier \u0026quot;)\u0026quot;\n\nh-preprocessing-token ::=\n    '{any preprocessing-token other than \u0026quot;\u0026gt;\u0026quot;}'\n\nh-pp-tokens ::=\n    h-preprocessing-token\n  | h-pp-tokens h-preprocessing-token\n\nheader-name-tokens ::=\n    string-literal\n  | \u0026quot;\u0026lt;\u0026quot; h-pp-tokens \u0026quot;\u0026gt;\u0026quot;\n\nhas-include-expression ::=\n    \u0026quot;has_include\u0026quot; \u0026quot;(\u0026quot; header-name \u0026quot;)\u0026quot;\n  | \u0026quot;has_include\u0026quot; \u0026quot;(\u0026quot; header-name-tokens \u0026quot;)\u0026quot;\n\nhas-attribute-expression ::=\n    \u0026quot;has_cpp_attribute\u0026quot; \u0026quot;(\u0026quot; pp-tokens \u0026quot;)\u0026quot;\n\npp-module ::=\n    \u0026quot;export\u0026quot;? \u0026quot;module\u0026quot; pp-tokens? \u0026quot;;\u0026quot; new-line\n\npp-import ::=\n    \u0026quot;export\u0026quot;? \u0026quot;import\u0026quot; header-name pp-tokens? \u0026quot;;\u0026quot; new-line\n  | \u0026quot;export\u0026quot;? \u0026quot;import\u0026quot; header-name-tokens pp-tokens? \u0026quot;;\u0026quot; new-line\n  | \u0026quot;export\u0026quot;? \u0026quot;import\u0026quot; pp-tokens \u0026quot;;\u0026quot; new-line\n\nva-opt-replacement ::=\n    \u0026quot;VA_OPT\u0026quot; \u0026quot;(\u0026quot; pp-tokens? \u0026quot;)\u0026quot;\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode class=\"notranslate\"\u003e//\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\n//\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\n// then click the 'View Diagram' tab.\n//\n\n//\n//To facilitate start navigating\n//\n\ncplusplus ::=\n\tpreprocessing-file? translation-unit\n\n//== lex.tex\n\nn-char ::=\n     \"{any member of the translation character set except the \\unicode{007d}{right curly bracket} or new-line character}\"\n\nn-char-sequence ::=\n    n-char\n  | n-char-sequence n-char\n\nnamed-universal-character ::=\n    \"\\N{\" n-char-sequence \"}\"\n\nhex-quad ::=\n    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit\n\nsimple-hexadecimal-digit-sequence ::=\n    hexadecimal-digit\n  | simple-hexadecimal-digit-sequence hexadecimal-digit\n\nuniversal-character-name ::=\n    \"\\u\" hex-quad\n  | \"\\U\" hex-quad hex-quad\n  | \"\\u{\" simple-hexadecimal-digit-sequence \"}\"\n  | named-universal-character\n\npreprocessing-token ::=\n    header-name\n  | \"import\"\n  | \"module\"\n  | \"export\"\n  | identifier\n  | pp-number\n  | character-literal\n  | user-defined-character-literal\n  | string-literal\n  | user-defined-string-literal\n  | preprocessing-op-or-punc\n  | \"{each non-whitespace character that cannot be one of the above}\"\n\n//token ::=\n//    identifier\n//  | keyword\n//  | literal\n//  | operator-or-punctuator\n\nheader-name ::=\n    \"\u0026lt;\" h-char-sequence \"\u0026gt;\"\n  | '\"' q-char-sequence '\"'\n\nh-char-sequence ::=\n    h-char\n  | h-char-sequence h-char\n\nh-char ::=\n    \"{any member of the translation character set except new-line and \\unicode{003e}{greater-than sign}}\"\n\nq-char-sequence ::=\n    q-char\n  | q-char-sequence q-char\n\nq-char ::=\n    \"{any member of the translation character set except new-line and \\unicode{0022}{quotation mark}}\"\n\npp-number ::=\n    digit\n  | \".\" digit\n  | pp-number identifier-continue\n  | pp-number \"'\" digit\n  | pp-number \"'\" nondigit\n  | pp-number \"e\" sign\n  | pp-number \"E\" sign\n  | pp-number \"p\" sign\n  | pp-number \"P\" sign\n  | pp-number \".\"\n\nidentifier ::=\n    identifier-start\n  | identifier identifier-continue\n\nidentifier-start ::=\n    nondigit\n  | \"{an element of the translation character set with the Unicode property XID_Start}\"\n\nidentifier-continue ::=\n    digit\n  | nondigit\n  | \"{an element of the translation character set with the Unicode property XID_Continue}\"\n\nnondigit ::=\n    \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\" | \"g\" | \"h\" | \"i\" | \"j\" | \"k\" | \"l\" | \"m\"\n  | \"n\" | \"o\" | \"p\" | \"q\" | \"r\" | \"s\" | \"t\" | \"u\" | \"v\" | \"w\" | \"x\" | \"y\" | \"z\"\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\" | \"G\" | \"H\" | \"I\" | \"J\" | \"K\" | \"L\" | \"M\"\n  | \"N\" | \"O\" | \"P\" | \"Q\" | \"R\" | \"S\" | \"T\" | \"U\" | \"V\" | \"W\" | \"X\" | \"Y\" | \"Z\" | \"_\"\n\ndigit ::=\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\n\nkeyword ::=\n    \"{any identifier listed in lex.key}\"\n  | \"import\"\n  | \"module\"\n  | \"export\"\n\npreprocessing-op-or-punc ::=\n    preprocessing-operator\n  | operator-or-punctuator\n\npreprocessing-operator ::=\n    \"#\" | \"##\" | \"%:\" | \"%:%:\"\n\noperator-or-punctuator ::=\n    \"{\" | \"}\" | \"[\" | \"]\" | \"(\" | \")\"\n  | \"\u0026lt;:\" | \":\u0026gt;\" | \"\u0026lt;%\" | \"%\u0026gt;\" | \";\" | \":\" | \"...\"\n  | \"?\" | \"::\" | \".\" | \".*\" | \"-\u0026gt;\" | \"-\u0026gt;*\" | \"~\"\n  | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026amp;\" | \"|\"\n  | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026amp;=\" | \"|=\"\n  | \"==\" | \"!=\" | \"\u0026lt;\" | \"\u0026gt;\" | \"\u0026lt;=\" | \"\u0026gt;=\" | \"\u0026lt;=\u0026gt;\" | \"\u0026amp;\u0026amp;\" | \"||\"\n  | \"\u0026lt;\u0026lt;\" | \"\u0026gt;\u0026gt;\" | \"\u0026lt;\u0026lt;=\" | \"\u0026gt;\u0026gt;=\" | \"++\" | \"--\" | \",\"\n  | \"and\" | \"or\" | \"xor\" | \"not\" | \"bitand\" | \"bitor\" | \"compl\"\n  | \"and_eq\" | \"or_eq\" | \"xor_eq\" | \"not_eq\"\n\nliteral ::=\n    integer-literal\n  | character-literal\n  | floating-point-literal\n  | string-literal\n  | boolean-literal\n  | pointer-literal\n  | user-defined-literal\n\ninteger-literal ::=\n    binary-literal integer-suffix?\n  | octal-literal integer-suffix?\n  | decimal-literal integer-suffix?\n  | hexadecimal-literal integer-suffix?\n\nbinary-literal ::=\n    \"0b\" binary-digit\n  | \"0B\" binary-digit\n  | binary-literal \"'\"? binary-digit\n\noctal-literal ::=\n    \"0\"\n  | octal-literal \"'\"? octal-digit\n\ndecimal-literal ::=\n    nonzero-digit\n  | decimal-literal \"'\"? digit\n\nhexadecimal-literal ::=\n    hexadecimal-prefix hexadecimal-digit-sequence\n\nbinary-digit ::=\n    \"0\" | \"1\"\n\noctal-digit ::=\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\"\n\nnonzero-digit ::=\n    \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\n\nhexadecimal-prefix ::=\n    \"0x\" | \"0X\"\n\nhexadecimal-digit-sequence ::=\n    hexadecimal-digit\n  | hexadecimal-digit-sequence \"'\"? hexadecimal-digit\n\nhexadecimal-digit ::=\n    \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\"\n  | \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\"\n  | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\"\n\ninteger-suffix ::=\n    unsigned-suffix long-suffix?\n  | unsigned-suffix long-long-suffix?\n  | unsigned-suffix size-suffix?\n  | long-suffix unsigned-suffix?\n  | long-long-suffix unsigned-suffix?\n  | size-suffix unsigned-suffix?\n\nunsigned-suffix ::=\n    \"u\" | \"U\"\n\nlong-suffix ::=\n    \"l\" | \"L\"\n\nlong-long-suffix ::=\n    \"ll\" | \"LL\"\n\nsize-suffix ::=\n   \"z\" | \"Z\"\n\ncharacter-literal ::=\n    encoding-prefix? \"'\" c-char-sequence \"'\"\n\nencoding-prefix ::=\n    \"u8\" | \"u\" | \"U\" | \"L\"\n\nc-char-sequence ::=\n    c-char\n  | c-char-sequence c-char\n\nc-char ::=\n    basic-c-char\n  | escape-sequence\n  | universal-character-name\n\nbasic-c-char ::=\n    \"{any member of the translation character set except the \\unicode{0027}{apostrophe},}\"\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\n\nescape-sequence ::=\n    simple-escape-sequence\n  | numeric-escape-sequence\n  | conditional-escape-sequence\n\nsimple-escape-sequence ::=\n    \"\\\" simple-escape-sequence-char\n\nsimple-escape-sequence-char ::=\n    \"'\" | '\"' | \"?\" | \"\\\" | \"a\" | \"b\" | \"f\" | \"n\" | \"r\" | \"t\" | \"v\"\n\nnumeric-escape-sequence ::=\n    octal-escape-sequence\n  | hexadecimal-escape-sequence\n\nsimple-octal-digit-sequence ::=\n    octal-digit\n  | simple-octal-digit-sequence octal-digit\n\noctal-escape-sequence ::=\n    \"\\\" octal-digit\n  | \"\\\" octal-digit octal-digit\n  | \"\\\" octal-digit octal-digit octal-digit\n  | \"\\o{\" simple-octal-digit-sequence \"}\"\n\nhexadecimal-escape-sequence ::=\n    \"\\x\" simple-hexadecimal-digit-sequence\n  | \"\\x{\" simple-hexadecimal-digit-sequence \"}\"\n\nconditional-escape-sequence ::=\n    \"\\\" conditional-escape-sequence-char\n\nconditional-escape-sequence-char ::=\n    '{any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the characters \"N\", \"o\", \"u\", \"U\", or \"x\"}'\n\nfloating-point-literal ::=\n    decimal-floating-point-literal\n  | hexadecimal-floating-point-literal\n\ndecimal-floating-point-literal ::=\n    fractional-constant exponent-part? floating-point-suffix?\n  | digit-sequence exponent-part floating-point-suffix?\n\nhexadecimal-floating-point-literal ::=\n    hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-point-suffix?\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-point-suffix?\n\nfractional-constant ::=\n    digit-sequence? \".\" digit-sequence\n  | digit-sequence \".\"\n\nhexadecimal-fractional-constant ::=\n    hexadecimal-digit-sequence? \".\" hexadecimal-digit-sequence\n  | hexadecimal-digit-sequence \".\"\n\nexponent-part ::=\n    \"e\" sign? digit-sequence\n  | \"E\" sign? digit-sequence\n\nbinary-exponent-part ::=\n    \"p\" sign? digit-sequence\n  | \"P\" sign? digit-sequence\n\nsign ::=\n    \"+\" | \"-\"\n\ndigit-sequence ::=\n    digit\n  | digit-sequence \"'\"? digit\n\nfloating-point-suffix ::=\n    \"f\" | \"l\" | \"f16\" | \"f32\" | \"f64\" | \"f128\" | \"bf16\" | \"F\" | \"L\" | \"F16\" | \"F32\" | \"F64\" | \"F128\" | \"BF16\"\n\nstring-literal ::=\n    encoding-prefix? '\"' s-char-sequence? '\"'\n  | encoding-prefix? \"R\" raw-string\n\ns-char-sequence ::=\n    s-char\n  | s-char-sequence s-char\n\ns-char ::=\n    basic-s-char\n  | escape-sequence\n  | universal-character-name\n\nbasic-s-char ::=\n    \"{any member of the translation character set except the \\unicode{0022}{quotation mark},}\"\n        \"{\\unicode{005c}{reverse solidus}, or new-line character}\"\n\nraw-string ::=\n    '\"' d-char-sequence? \"(\" r-char-sequence? \")\" d-char-sequence? '\"'\n\nr-char-sequence ::=\n    r-char\n  | r-char-sequence r-char\n\nr-char ::=\n    \"{any member of the translation character set, except a \\unicode{0029}{right parenthesis} followed by}\"\n        \"{the initial d-char-sequence (which may be empty) followed by a \\unicode{0022}{quotation mark}}\"\n\nd-char-sequence ::=\n    d-char\n  | d-char-sequence d-char\n\nd-char ::=\n    \"{any member of the basic character set except:}\"\n        \"{\\unicode{0020}{space}, \\unicode{0028}{left parenthesis}, \\unicode{0029}{right parenthesis}, \\unicode{005c}{reverse solidus},}\"\n        \"{\\unicode{0009}{character tabulation}, \\unicode{000b}{line tabulation}, \\unicode{000c}{form feed}, and new-line}\"\n\nunevaluated-string ::=\n    string-literal\n\nboolean-literal ::=\n    \"false\"\n  | \"true\"\n\npointer-literal ::=\n    \"nullptr\"\n\nuser-defined-literal ::=\n    user-defined-integer-literal\n  | user-defined-floating-point-literal\n  | user-defined-string-literal\n  | user-defined-character-literal\n\nuser-defined-integer-literal ::=\n    decimal-literal ud-suffix\n  | octal-literal ud-suffix\n  | hexadecimal-literal ud-suffix\n  | binary-literal ud-suffix\n\nuser-defined-floating-point-literal ::=\n    fractional-constant exponent-part? ud-suffix\n  | digit-sequence exponent-part ud-suffix\n  | hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix\n  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix\n\nuser-defined-string-literal ::=\n    string-literal ud-suffix\n\nuser-defined-character-literal ::=\n    character-literal ud-suffix\n\nud-suffix ::=\n    identifier\n\n//== basic.tex\n\ntranslation-unit ::=\n    declaration-seq?\n  | global-module-fragment? module-declaration declaration-seq? private-module-fragment?\n\n//== expressions.tex\n\nprimary-expression ::=\n    literal\n  | \"this\"\n  | \"(\" expression \")\"\n  | id-expression\n  | lambda-expression\n  | fold-expression\n  | requires-expression\n\nid-expression ::=\n    unqualified-id\n  | qualified-id\n  | pack-index-expression\n\nunqualified-id ::=\n    identifier\n  | operator-function-id\n  | conversion-function-id\n  | literal-operator-id\n  | \"~\" type-name\n  | \"~\" computed-type-specifier\n  | template-id\n\nqualified-id ::=\n    nested-name-specifier \"template\"? unqualified-id\n\nnested-name-specifier ::=\n    \"::\"\n  | type-name \"::\"\n  | namespace-name \"::\"\n  | computed-type-specifier \"::\"\n  | nested-name-specifier identifier \"::\"\n  | nested-name-specifier \"template\"? simple-template-id \"::\"\n\npack-index-expression ::=\n    id-expression \"...\" \"[\" constant-expression \"]\"\n\nlambda-expression ::=\n    lambda-introducer attribute-specifier-seq? lambda-declarator compound-statement\n  | lambda-introducer \"\u0026lt;\" template-parameter-list \"\u0026gt;\" requires-clause? attribute-specifier-seq?\n         lambda-declarator compound-statement\n\nlambda-introducer ::=\n    \"[\" lambda-capture? \"]\"\n\nlambda-declarator ::=\n    lambda-specifier-seq noexcept-specifier? attribute-specifier-seq? trailing-return-type?\n  | noexcept-specifier attribute-specifier-seq? trailing-return-type?\n  | trailing-return-type?\n  | \"(\" parameter-declaration-clause \")\" lambda-specifier-seq? noexcept-specifier? attribute-specifier-seq?\n         trailing-return-type? requires-clause?\n\nlambda-specifier ::=\n    \"consteval\"\n  | \"constexpr\"\n  | \"mutable\"\n  | \"static\"\n\nlambda-specifier-seq ::=\n    lambda-specifier\n  | lambda-specifier lambda-specifier-seq\n\nlambda-capture ::=\n    capture-default\n  | capture-list\n  | capture-default \",\" capture-list\n\ncapture-default ::=\n    \"\u0026amp;\"\n  | \"=\"\n\ncapture-list ::=\n    capture\n  | capture-list \",\" capture\n\ncapture ::=\n    simple-capture\n  | init-capture\n\nsimple-capture ::=\n    identifier \"...\"?\n  | \"\u0026amp;\" identifier \"...\"?\n  | \"this\"\n  | \"*\" \"this\"\n\ninit-capture ::=\n    \"...\"? identifier initializer\n  | \"\u0026amp;\" \"...\"? identifier initializer\n\nfold-expression ::=\n    \"(\" cast-expression fold-operator \"...\" \")\"\n  | \"(\" \"...\" fold-operator cast-expression \")\"\n  | \"(\" cast-expression fold-operator \"...\" fold-operator cast-expression \")\"\n\nfold-operator ::=\n    \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026amp;\" | \"|\" | \"\u0026lt;\u0026lt;\" | \"\u0026gt;\u0026gt;\"\n  | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026amp;=\" | \"|=\" | \"\u0026lt;\u0026lt;=\" | \"\u0026gt;\u0026gt;=\" | \"=\"\n  | \"==\" | \"!=\" | \"\u0026lt;\" | \"\u0026gt;\" | \"\u0026lt;=\" | \"\u0026gt;=\" | \"\u0026amp;\u0026amp;\" | \"||\" | \",\" | \".*\" | \"-\u0026gt;*\"\n\nrequires-expression ::=\n    \"requires\" requirement-parameter-list? requirement-body\n\nrequirement-parameter-list ::=\n    \"(\" parameter-declaration-clause \")\"\n\nrequirement-body ::=\n    \"{\" requirement-seq \"}\"\n\nrequirement-seq ::=\n    requirement\n  | requirement requirement-seq\n\nrequirement ::=\n    simple-requirement\n  | type-requirement\n  | compound-requirement\n  | nested-requirement\n\nsimple-requirement ::=\n    expression \";\"\n\ntype-requirement ::=\n    \"typename\" nested-name-specifier? type-name \";\"\n\ncompound-requirement ::=\n    \"{\" expression \"}\" \"noexcept\"? return-type-requirement? \";\"\n\nreturn-type-requirement ::=\n    \"-\u0026gt;\" type-constraint\n\nnested-requirement ::=\n    \"requires\" constraint-expression \";\"\n\npostfix-expression ::=\n    primary-expression\n  | postfix-expression \"[\" expression-list? \"]\"\n  | postfix-expression \"(\" expression-list? \")\"\n  | simple-type-specifier \"(\" expression-list? \")\"\n  | typename-specifier \"(\" expression-list? \")\"\n  | simple-type-specifier braced-init-list\n  | typename-specifier braced-init-list\n  | postfix-expression \".\" \"template\"? id-expression\n  | postfix-expression \"-\u0026gt;\" \"template\"? id-expression\n  | postfix-expression \"++\"\n  | postfix-expression \"--\"\n  | \"dynamic_cast\" \"\u0026lt;\" type-id \"\u0026gt;\" \"(\" expression \")\"\n  | \"static_cast\" \"\u0026lt;\" type-id \"\u0026gt;\" \"(\" expression \")\"\n  | \"reinterpret_cast\" \"\u0026lt;\" type-id \"\u0026gt;\" \"(\" expression \")\"\n  | \"const_cast\" \"\u0026lt;\" type-id \"\u0026gt;\" \"(\" expression \")\"\n  | \"typeid\" \"(\" expression \")\"\n  | \"typeid\" \"(\" type-id \")\"\n\nexpression-list ::=\n    initializer-list\n\nunary-expression ::=\n    postfix-expression\n  | unary-operator cast-expression\n  | \"++\" cast-expression\n  | \"--\" cast-expression\n  | await-expression\n  | \"sizeof\" unary-expression\n  | \"sizeof\" \"(\" type-id \")\"\n  | \"sizeof\" \"...\" \"(\" identifier \")\"\n  | \"alignof\" \"(\" type-id \")\"\n  | noexcept-expression\n  | new-expression\n  | delete-expression\n\nunary-operator ::=\n    \"*\" | \"\u0026amp;\" | \"+\" | \"-\" | \"!\" | \"~\"\n\nawait-expression ::=\n    \"co_await\" cast-expression\n\nnoexcept-expression ::=\n  \"noexcept\" \"(\" expression \")\"\n\nnew-expression ::=\n    \"::\"? \"new\" new-placement? new-type-id new-initializer?\n  | \"::\"? \"new\" new-placement? \"(\" type-id \")\" new-initializer?\n\nnew-placement ::=\n    \"(\" expression-list \")\"\n\nnew-type-id ::=\n    type-specifier-seq new-declarator?\n\nnew-declarator ::=\n    ptr-operator new-declarator?\n  | noptr-new-declarator\n\nnoptr-new-declarator ::=\n    \"[\" expression? \"]\" attribute-specifier-seq?\n  | noptr-new-declarator \"[\" constant-expression \"]\" attribute-specifier-seq?\n\nnew-initializer ::=\n    \"(\" expression-list? \")\"\n  | braced-init-list\n\ndelete-expression ::=\n    \"::\"? \"delete\" cast-expression\n  | \"::\"? \"delete\" \"[\" \"]\" cast-expression\n\ncast-expression ::=\n    unary-expression\n  | \"(\" type-id \")\" cast-expression\n\npm-expression ::=\n    cast-expression\n  | pm-expression \".*\" cast-expression\n  | pm-expression \"-\u0026gt;*\" cast-expression\n\nmultiplicative-expression ::=\n    pm-expression\n  | multiplicative-expression \"*\" pm-expression\n  | multiplicative-expression \"/\" pm-expression\n  | multiplicative-expression \"%\" pm-expression\n\nadditive-expression ::=\n    multiplicative-expression\n  | additive-expression \"+\" multiplicative-expression\n  | additive-expression \"-\" multiplicative-expression\n\nshift-expression ::=\n    additive-expression\n  | shift-expression \"\u0026lt;\u0026lt;\" additive-expression\n  | shift-expression \"\u0026gt;\u0026gt;\" additive-expression\n\ncompare-expression ::=\n    shift-expression\n  | compare-expression \"\u0026lt;=\u0026gt;\" shift-expression\n\nrelational-expression ::=\n    compare-expression\n  | relational-expression \"\u0026lt;\" compare-expression\n  | relational-expression \"\u0026gt;\" compare-expression\n  | relational-expression \"\u0026lt;=\" compare-expression\n  | relational-expression \"\u0026gt;=\" compare-expression\n\nequality-expression ::=\n    relational-expression\n  | equality-expression \"==\" relational-expression\n  | equality-expression \"!=\" relational-expression\n\nand-expression ::=\n    equality-expression\n  | and-expression \"\u0026amp;\" equality-expression\n\nexclusive-or-expression ::=\n    and-expression\n  | exclusive-or-expression \"^\" and-expression\n\ninclusive-or-expression ::=\n    exclusive-or-expression\n  | inclusive-or-expression \"|\" exclusive-or-expression\n\nlogical-and-expression ::=\n    inclusive-or-expression\n  | logical-and-expression \"\u0026amp;\u0026amp;\" inclusive-or-expression\n\nlogical-or-expression ::=\n    logical-and-expression\n  | logical-or-expression \"||\" logical-and-expression\n\nconditional-expression ::=\n    logical-or-expression\n  | logical-or-expression \"?\" expression \":\" assignment-expression\n\n  yield-expression ::=\n  \"co_yield\" assignment-expression\n  | \"co_yield\" braced-init-list\n\nthrow-expression ::=\n    \"throw\"  assignment-expression?\n\nassignment-expression ::=\n    conditional-expression\n  | yield-expression\n  | throw-expression\n  | logical-or-expression assignment-operator initializer-clause\n\nassignment-operator ::=\n    \"=\" | \"*=\" | \"/=\" | \"%=\" | \"+=\" | \"-=\" | \"\u0026gt;\u0026gt;=\" | \"\u0026lt;\u0026lt;=\" | \"\u0026amp;=\" | \"^=\" | \"|=\"\n\nexpression ::=\n    assignment-expression\n  | expression \",\" assignment-expression\n\nconstant-expression ::=\n    conditional-expression\n\n//== statements.tex\n\nstatement ::=\n    labeled-statement\n  | attribute-specifier-seq? expression-statement\n  | attribute-specifier-seq? compound-statement\n  | attribute-specifier-seq? selection-statement\n  | attribute-specifier-seq? iteration-statement\n  | attribute-specifier-seq? jump-statement\n  | declaration-statement\n  | attribute-specifier-seq? try-block\n\ninit-statement ::=\n    expression-statement\n  | simple-declaration\n  | alias-declaration\n\ncondition ::=\n    expression\n  | attribute-specifier-seq? decl-specifier-seq declarator brace-or-equal-initializer\n\nlabel ::=\n    attribute-specifier-seq? identifier \":\"\n  | attribute-specifier-seq? \"case\" constant-expression \":\"\n  | attribute-specifier-seq? \"default\" \":\"\n\nlabeled-statement ::=\n    label statement\n\nexpression-statement ::=\n    expression? \";\"\n\ncompound-statement ::=\n    \"{\" statement-seq? label-seq? \"}\"\n\nstatement-seq ::=\n    statement\n  | statement-seq statement\n\nlabel-seq ::=\n    label\n  | label-seq label\n\nselection-statement ::=\n    \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement\n  | \"if\" \"constexpr\"? \"(\" init-statement? condition \")\" statement \"else\" statement\n  | \"if\" \"!\"? \"consteval\" compound-statement\n  | \"if\" \"!\"? \"consteval\" compound-statement \"else\" statement\n  | \"switch\" \"(\" init-statement? condition \")\" statement\n\niteration-statement ::=\n    \"while\" \"(\" condition \")\" statement\n  | \"do\" statement \"while\" \"(\" expression \")\" \";\"\n  | \"for\" \"(\" init-statement condition? \";\" expression? \")\" statement\n  | \"for\" \"(\" init-statement? for-range-declaration \":\" for-range-initializer \")\" statement\n\nfor-range-declaration ::=\n    attribute-specifier-seq? decl-specifier-seq declarator\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\"\n\nfor-range-initializer ::=\n    expr-or-braced-init-list\n\njump-statement ::=\n    \"break\" \";\"\n  | \"continue\" \";\"\n  | \"return\" expr-or-braced-init-list? \";\"\n  | coroutine-return-statement\n  | \"goto\" identifier \";\"\n\ncoroutine-return-statement ::=\n    \"co_return\" expr-or-braced-init-list? \";\"\n\ndeclaration-statement ::=\n    block-declaration\n\n//== declarations.tex\n\ndeclaration-seq ::=\n    declaration\n  | declaration-seq declaration\n\ndeclaration ::=\n    name-declaration\n  | special-declaration\n\nname-declaration ::=\n    block-declaration\n  | nodeclspec-function-declaration\n  | function-definition\n  | template-declaration\n  | deduction-guide\n  | linkage-specification\n  | namespace-definition\n  | empty-declaration\n  | attribute-declaration\n  | module-import-declaration\n\nspecial-declaration ::=\n    explicit-instantiation\n  | explicit-specialization\n  | export-declaration\n\nblock-declaration ::=\n    simple-declaration\n  | asm-declaration\n  | namespace-alias-definition\n  | using-declaration\n  | using-enum-declaration\n  | using-directive\n  | static_assert-declaration\n  | alias-declaration\n  | opaque-enum-declaration\n\nnodeclspec-function-declaration ::=\n    attribute-specifier-seq? declarator \";\"\n\nalias-declaration ::=\n    \"using\" identifier attribute-specifier-seq? \"=\" defining-type-id \";\"\n\nsimple-declaration ::=\n    decl-specifier-seq init-declarator-list? \";\"\n  | attribute-specifier-seq decl-specifier-seq init-declarator-list \";\"\n  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? \"[\" identifier-list \"]\" initializer \";\"\n\nstatic_assert-message ::=\n  unevaluated-string\n  | constant-expression\n\nstatic_assert-declaration ::=\n  \"static_assert\" \"(\" constant-expression \")\" \";\"\n  | \"static_assert\" \"(\" constant-expression \",\" static_assert-message \")\" \";\"\n\nempty-declaration ::=\n    \";\"\n\nattribute-declaration ::=\n    attribute-specifier-seq \";\"\n\ndecl-specifier ::=\n    storage-class-specifier\n  | defining-type-specifier\n  | function-specifier\n  | \"friend\"\n  | \"typedef\"\n  | \"constexpr\"\n  | \"consteval\"\n  | \"constinit\"\n  | \"inline\"\n\ndecl-specifier-seq ::=\n    decl-specifier attribute-specifier-seq?\n  | decl-specifier decl-specifier-seq\n\nstorage-class-specifier ::=\n    \"static\"\n  | \"thread_local\"\n  | \"extern\"\n  | \"mutable\"\n\nfunction-specifier ::=\n    \"virtual\"\n  | explicit-specifier\n\nexplicit-specifier ::=\n    \"explicit\" \"(\" constant-expression \")\"\n  | \"explicit\"\n\ntypedef-name ::=\n    identifier\n  | simple-template-id\n\ntype-specifier ::=\n  simple-type-specifier\n  | elaborated-type-specifier\n  | typename-specifier\n  | cv-qualifier\n\ntype-specifier-seq ::=\n    type-specifier attribute-specifier-seq?\n  | type-specifier type-specifier-seq\n\ndefining-type-specifier ::=\n    type-specifier\n  | class-specifier\n  | enum-specifier\n\ndefining-type-specifier-seq ::=\n  defining-type-specifier attribute-specifier-seq?\n  | defining-type-specifier defining-type-specifier-seq\n\nsimple-type-specifier ::=\n    nested-name-specifier? type-name\n  | nested-name-specifier \"template\" simple-template-id\n  | computed-type-specifier\n  | placeholder-type-specifier\n  | nested-name-specifier? template-name\n  | \"char\"\n  | \"char8_t\"\n  | \"char16_t\"\n  | \"char32_t\"\n  | \"wchar_t\"\n  | \"bool\"\n  | \"short\"\n  | \"int\"\n  | \"long\"\n  | \"signed\"\n  | \"unsigned\"\n  | \"float\"\n  | \"double\"\n  | \"void\"\n\ntype-name ::=\n    class-name\n  | enum-name\n  | typedef-name\n\ncomputed-type-specifier ::=\n    decltype-specifier\n  | pack-index-specifier\n\npack-index-specifier ::=\n    typedef-name \"...\" \"[\" constant-expression \"]\"\n\nelaborated-type-specifier ::=\n    class-key attribute-specifier-seq? nested-name-specifier? identifier\n  | class-key simple-template-id\n  | class-key nested-name-specifier \"template\"? simple-template-id\n  | \"enum\" nested-name-specifier? identifier\n\ndecltype-specifier ::=\n  \"decltype\" \"(\" expression \")\"\n\nplaceholder-type-specifier ::=\n  type-constraint? \"auto\"\n  | type-constraint? \"decltype\" \"(\" \"auto\" \")\"\n\ninit-declarator-list ::=\n    init-declarator\n  | init-declarator-list \",\" init-declarator\n\ninit-declarator ::=\n    declarator initializer?\n  | declarator requires-clause\n\ndeclarator ::=\n    ptr-declarator\n  | noptr-declarator parameters-and-qualifiers trailing-return-type\n\nptr-declarator ::=\n    noptr-declarator\n  | ptr-operator ptr-declarator\n\nnoptr-declarator ::=\n    declarator-id attribute-specifier-seq?\n  | noptr-declarator parameters-and-qualifiers\n  | noptr-declarator \"[\" constant-expression? \"]\" attribute-specifier-seq?\n  | \"(\" ptr-declarator \")\"\n\nparameters-and-qualifiers ::=\n    \"(\" parameter-declaration-clause \")\" cv-qualifier-seq?\n        ref-qualifier? noexcept-specifier? attribute-specifier-seq?\n\ntrailing-return-type ::=\n    \"-\u0026gt;\" type-id\n\nptr-operator ::=\n    \"*\" attribute-specifier-seq? cv-qualifier-seq?\n  | \"\u0026amp;\" attribute-specifier-seq?\n  | \"\u0026amp;\u0026amp;\" attribute-specifier-seq?\n  | nested-name-specifier \"*\" attribute-specifier-seq? cv-qualifier-seq?\n\ncv-qualifier-seq ::=\n    cv-qualifier cv-qualifier-seq?\n\ncv-qualifier ::=\n    \"const\"\n  | \"volatile\"\n\nref-qualifier ::=\n    \"\u0026amp;\"\n  | \"\u0026amp;\u0026amp;\"\n\ndeclarator-id ::=\n    \"...\"? id-expression\n\ntype-id ::=\n    type-specifier-seq abstract-declarator?\n\ndefining-type-id ::=\n    defining-type-specifier-seq abstract-declarator?\n\nabstract-declarator ::=\n    ptr-abstract-declarator\n  | noptr-abstract-declarator? parameters-and-qualifiers trailing-return-type\n  | abstract-pack-declarator\n\nptr-abstract-declarator ::=\n    noptr-abstract-declarator\n  | ptr-operator ptr-abstract-declarator?\n\nnoptr-abstract-declarator ::=\n    noptr-abstract-declarator? parameters-and-qualifiers\n  | noptr-abstract-declarator? \"[\" constant-expression? \"]\" attribute-specifier-seq?\n  | \"(\" ptr-abstract-declarator \")\"\n\nabstract-pack-declarator ::=\n    noptr-abstract-pack-declarator\n  | ptr-operator abstract-pack-declarator\n\nnoptr-abstract-pack-declarator ::=\n    noptr-abstract-pack-declarator parameters-and-qualifiers\n  | \"...\"\n\nparameter-declaration-clause ::=\n    parameter-declaration-list? \"...\"?\n  | parameter-declaration-list \",\" \"...\"\n\nparameter-declaration-list ::=\n    parameter-declaration\n  | parameter-declaration-list \",\" parameter-declaration\n\nparameter-declaration ::=\n    attribute-specifier-seq? \"this\"? decl-specifier-seq declarator\n  | attribute-specifier-seq? decl-specifier-seq declarator \"=\" initializer-clause\n  | attribute-specifier-seq? \"this\"? decl-specifier-seq abstract-declarator?\n  | attribute-specifier-seq? decl-specifier-seq abstract-declarator? \"=\" initializer-clause\n\ninitializer ::=\n    brace-or-equal-initializer\n  | \"(\" expression-list \")\"\n\nbrace-or-equal-initializer ::=\n    \"=\" initializer-clause\n  | braced-init-list\n\ninitializer-clause ::=\n    assignment-expression\n  | braced-init-list\n\nbraced-init-list ::=\n    \"{\" initializer-list \",\"? \"}\"\n  | \"{\" designated-initializer-list \",\"? \"}\"\n  | \"{\" \"}\"\n\ninitializer-list ::=\n    initializer-clause \"...\"?\n  | initializer-list \",\" initializer-clause \"...\"?\n\ndesignated-initializer-list ::=\n    designated-initializer-clause\n  | designated-initializer-list \",\" designated-initializer-clause\n\ndesignated-initializer-clause ::=\n    designator brace-or-equal-initializer\n\ndesignator ::=\n    \".\" identifier\n\nexpr-or-braced-init-list ::=\n    expression\n  | braced-init-list\n\nfunction-definition ::=\n    attribute-specifier-seq? decl-specifier-seq? declarator virt-specifier-seq? function-body\n  | attribute-specifier-seq? decl-specifier-seq? declarator requires-clause function-body\n\nfunction-body ::=\n    ctor-initializer? compound-statement\n  | function-try-block\n  | \"=\" \"default\" \";\"\n  | \"=\" \"delete\" \";\"\n\nenum-name ::=\n    identifier\n\nenum-specifier ::=\n    enum-head \"{\" enumerator-list? \"}\"\n  | enum-head \"{\" enumerator-list \",\" \"}\"\n\nenum-head ::=\n    enum-key attribute-specifier-seq? enum-head-name? enum-base?\n\nenum-head-name ::=\n    nested-name-specifier? identifier\n\nopaque-enum-declaration ::=\n    enum-key attribute-specifier-seq? enum-head-name enum-base? \";\"\n\nenum-key ::=\n    \"enum\"\n  | \"enum\" \"class\"\n  | \"enum\" \"struct\"\n\nenum-base ::=\n    \":\" type-specifier-seq\n\nenumerator-list ::=\n    enumerator-definition\n  | enumerator-list \",\" enumerator-definition\n\nenumerator-definition ::=\n    enumerator\n  | enumerator \"=\" constant-expression\n\nenumerator ::=\n    identifier attribute-specifier-seq?\n\nusing-enum-declaration ::=\n    \"using\" \"enum\" using-enum-declarator \";\"\n\nusing-enum-declarator ::=\n    nested-name-specifier? identifier\n  | nested-name-specifier? simple-template-id\n\nnamespace-name ::=\n        identifier\n  | namespace-alias\n\nnamespace-definition ::=\n        named-namespace-definition\n  | unnamed-namespace-definition\n  | nested-namespace-definition\n\nnamed-namespace-definition ::=\n        \"inline\"? \"namespace\" attribute-specifier-seq? identifier \"{\" namespace-body \"}\"\n\nunnamed-namespace-definition ::=\n        \"inline\"? \"namespace\" attribute-specifier-seq? \"{\" namespace-body \"}\"\n\nnested-namespace-definition ::=\n        \"namespace\" enclosing-namespace-specifier \"::\" \"inline\"? identifier \"{\" namespace-body \"}\"\n\nenclosing-namespace-specifier ::=\n        identifier\n  | enclosing-namespace-specifier \"::\" \"inline\"? identifier\n\nnamespace-body ::=\n        declaration-seq?\n\nnamespace-alias ::=\n        identifier\n\nnamespace-alias-definition ::=\n        \"namespace\" identifier \"=\" qualified-namespace-specifier \";\"\n\nqualified-namespace-specifier ::=\n    nested-name-specifier? namespace-name\n\nusing-directive ::=\n    attribute-specifier-seq? \"using\" \"namespace\" nested-name-specifier? namespace-name \";\"\n\nusing-declaration ::=\n    \"using\" using-declarator-list \";\"\n\nusing-declarator-list ::=\n    using-declarator \"...\"?\n  | using-declarator-list \",\" using-declarator \"...\"?\n\nusing-declarator ::=\n    \"typename\"? nested-name-specifier unqualified-id\n\nasm-declaration ::=\n    attribute-specifier-seq? \"asm\" \"(\" balanced-token-seq \")\" \";\"\n\nlinkage-specification ::=\n    \"extern\" unevaluated-string \"{\" declaration-seq? \"}\"\n  | \"extern\" unevaluated-string name-declaration\n\nattribute-specifier-seq ::=\n  attribute-specifier-seq? attribute-specifier\n\nattribute-specifier ::=\n  \"[\" \"[\" attribute-using-prefix? attribute-list \"]\" \"]\"\n  | alignment-specifier\n\nalignment-specifier ::=\n  \"alignas\" \"(\" type-id \"...\"? \")\"\n  | \"alignas\" \"(\" constant-expression \"...\"? \")\"\n\nattribute-using-prefix ::=\n  \"using\" attribute-namespace \":\"\n\nattribute-list ::=\n  attribute?\n  | attribute-list \",\" attribute?\n  | attribute \"...\"\n  | attribute-list \",\" attribute \"...\"\n\nattribute ::=\n    attribute-token attribute-argument-clause?\n\nattribute-token ::=\n    identifier\n  | attribute-scoped-token\n\nattribute-scoped-token ::=\n    attribute-namespace \"::\" identifier\n\nattribute-namespace ::=\n    identifier\n\nattribute-argument-clause ::=\n    \"(\" balanced-token-seq? \")\"\n\nbalanced-token-seq ::=\n    balanced-token\n  | balanced-token-seq balanced-token\n\nbalanced-token ::=\n    \"(\" balanced-token-seq? \")\"\n  | \"[\" balanced-token-seq? \"]\"\n  | \"{\" balanced-token-seq? \"}\"\n  | \"{any token other than a parenthesis, a bracket, or a brace}\"\n\n//== modules.tex\n\nmodule-declaration ::=\n    \"export\"? \"module\" module-name module-partition? attribute-specifier-seq? \";\"\n\nmodule-name ::=\n    module-name-qualifier? identifier\n\nmodule-partition ::=\n    \":\" module-name-qualifier? identifier\n\nmodule-name-qualifier ::=\n    identifier \".\"\n  | module-name-qualifier identifier \".\"\n\nexport-declaration ::=\n    \"export\" name-declaration\n  | \"export\" \"{\" declaration-seq? \"}\"\n  | \"export\" module-import-declaration\n\nmodule-import-declaration ::=\n    \"import\" module-name attribute-specifier-seq? \";\"\n  | \"import\" module-partition attribute-specifier-seq? \";\"\n  | \"import\" header-name attribute-specifier-seq? \";\"\n\nglobal-module-fragment ::=\n    \"module\" \";\" declaration-seq?\n\nprivate-module-fragment ::=\n    \"module\" \":\" \"private\" \";\" declaration-seq?\n\n//== classes.tex\n\nclass-name ::=\n    identifier\n  | simple-template-id\n\nclass-specifier ::=\n    class-head \"{\" member-specification? \"}\"\n\nclass-head ::=\n    class-key attribute-specifier-seq? class-head-name class-virt-specifier? base-clause?\n  | class-key attribute-specifier-seq? base-clause?\n\nclass-head-name ::=\n    nested-name-specifier? class-name\n\nclass-virt-specifier ::=\n    \"final\"\n\nclass-key ::=\n    \"class\"\n  | \"struct\"\n  | \"union\"\n\nmember-specification ::=\n    member-declaration member-specification?\n  | access-specifier \":\" member-specification?\n\nmember-declaration ::=\n    attribute-specifier-seq? decl-specifier-seq? member-declarator-list? \";\"\n  | function-definition\n  | using-declaration\n  | using-enum-declaration\n  | static_assert-declaration\n  | template-declaration\n  | explicit-specialization\n  | deduction-guide\n  | alias-declaration\n  | opaque-enum-declaration\n  | empty-declaration\n\nmember-declarator-list ::=\n    member-declarator\n  | member-declarator-list \",\" member-declarator\n\nmember-declarator ::=\n    declarator virt-specifier-seq? pure-specifier?\n  | declarator requires-clause\n  | declarator brace-or-equal-initializer?\n  | identifier? attribute-specifier-seq? \":\" constant-expression brace-or-equal-initializer?\n\nvirt-specifier-seq ::=\n    virt-specifier\n  | virt-specifier-seq virt-specifier\n\nvirt-specifier ::=\n    \"override\"\n  | \"final\"\n\npure-specifier ::=\n    \"=\" \"0\"\n\nconversion-function-id ::=\n    \"operator\" conversion-type-id\n\nconversion-type-id ::=\n    type-specifier-seq conversion-declarator?\n\nconversion-declarator ::=\n    ptr-operator conversion-declarator?\n\nbase-clause ::=\n    \":\" base-specifier-list\n\nbase-specifier-list ::=\n    base-specifier \"...\"?\n  | base-specifier-list \",\" base-specifier \"...\"?\n\nbase-specifier ::=\n    attribute-specifier-seq? class-or-decltype\n  | attribute-specifier-seq? \"virtual\" access-specifier? class-or-decltype\n  | attribute-specifier-seq? access-specifier \"virtual\"? class-or-decltype\n\nclass-or-decltype ::=\n    nested-name-specifier? type-name\n  | nested-name-specifier \"template\" simple-template-id\n  | decltype-specifier\n\naccess-specifier ::=\n    \"private\"\n  | \"protected\"\n  | \"public\"\n\nctor-initializer ::=\n    \":\" mem-initializer-list\n\nmem-initializer-list ::=\n    mem-initializer \"...\"?\n  | mem-initializer-list \",\" mem-initializer \"...\"?\n\nmem-initializer ::=\n    mem-initializer-id \"(\" expression-list? \")\"\n  | mem-initializer-id braced-init-list\n\nmem-initializer-id ::=\n    class-or-decltype\n  | identifier\n\n//== overloading.tex\n\noperator-function-id ::=\n    \"operator\" operator\n\noperator ::=\n    \"new\" | \"delete\" | \"new[]\" | \"delete[]\" | \"co_await\" | \"()\" | \"[]\" | \"-\u0026gt;\" | \"-\u0026gt;*\"\n  | \"~\" | \"!\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"^\" | \"\u0026amp;\"\n  | \"|\" | \"=\" | \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"%=\" | \"^=\" | \"\u0026amp;=\"\n  | \"|=\" | \"==\" | \"!=\" | \"\u0026lt;\" | \"\u0026gt;\" | \"\u0026lt;=\" | \"\u0026gt;=\" | \"\u0026lt;=\u0026gt;\" | \"\u0026amp;\u0026amp;\"\n  | \"||\" | \"\u0026lt;\u0026lt;\" | \"\u0026gt;\u0026gt;\" | \"\u0026lt;\u0026lt;=\" | \"\u0026gt;\u0026gt;=\" | \"++\" | \"--\" | \",\"\n\nliteral-operator-id ::=\n    \"operator\" unevaluated-string identifier\n  | \"operator\" user-defined-string-literal\n\n//== templates.tex\n\ntemplate-declaration ::=\n  template-head declaration\n  | template-head concept-definition\n\ntemplate-head ::=\n  \"template\" \"\u0026lt;\" template-parameter-list \"\u0026gt;\" requires-clause?\n\ntemplate-parameter-list ::=\n  template-parameter\n  | template-parameter-list \",\" template-parameter\n\nrequires-clause ::=\n  \"requires\" constraint-logical-or-expression\n\nconstraint-logical-or-expression ::=\n  constraint-logical-and-expression\n  | constraint-logical-or-expression \"||\" constraint-logical-and-expression\n\nconstraint-logical-and-expression ::=\n  primary-expression\n  | constraint-logical-and-expression \"\u0026amp;\u0026amp;\" primary-expression\n\ntemplate-parameter ::=\n  type-parameter\n  | parameter-declaration\n\ntype-parameter ::=\n  type-parameter-key \"...\"? identifier?\n  | type-parameter-key identifier? \"=\" type-id\n  | type-constraint \"...\"? identifier?\n  | type-constraint identifier? \"=\" type-id\n  | template-head type-parameter-key \"...\"? identifier?\n  | template-head type-parameter-key identifier? \"=\" id-expression\n\ntype-parameter-key ::=\n  \"class\"\n  | \"typename\"\n\ntype-constraint ::=\n  nested-name-specifier? concept-name\n  | nested-name-specifier? concept-name \"\u0026lt;\" template-argument-list? \"\u0026gt;\"\n\nsimple-template-id ::=\n  template-name \"\u0026lt;\" template-argument-list? \"\u0026gt;\"\n\ntemplate-id ::=\n  simple-template-id\n  | operator-function-id \"\u0026lt;\" template-argument-list? \"\u0026gt;\"\n  | literal-operator-id \"\u0026lt;\" template-argument-list? \"\u0026gt;\"\n\ntemplate-name ::=\n  identifier\n\ntemplate-argument-list ::=\n  template-argument \"...\"?\n  | template-argument-list \",\" template-argument \"...\"?\n\ntemplate-argument ::=\n  constant-expression\n  | type-id\n  | id-expression\n  | braced-init-list\n\nconstraint-expression ::=\n    logical-or-expression\n\ndeduction-guide ::=\n    explicit-specifier? template-name \"(\" parameter-declaration-clause \")\" \"-\u0026gt;\" simple-template-id \";\"\n\nconcept-definition ::=\n  \"concept\" concept-name attribute-specifier-seq? \"=\" constraint-expression \";\"\n\nconcept-name ::=\n  identifier\n\ntypename-specifier ::=\n  \"typename\" nested-name-specifier identifier\n  | \"typename\" nested-name-specifier \"template\"? simple-template-id\n\nexplicit-instantiation ::=\n  \"extern\"? \"template\" declaration\n\nexplicit-specialization ::=\n  \"template\" \"\u0026lt;\" \"\u0026gt;\" declaration\n\n//== exceptions.tex\n\ntry-block ::=\n    \"try\" compound-statement handler-seq\n\nfunction-try-block ::=\n    \"try\" ctor-initializer? compound-statement handler-seq\n\nhandler-seq ::=\n    handler handler-seq?\n\nhandler ::=\n    \"catch\" \"(\" exception-declaration \")\" compound-statement\n\nexception-declaration ::=\n    attribute-specifier-seq? type-specifier-seq declarator\n  | attribute-specifier-seq? type-specifier-seq abstract-declarator?\n  | \"...\"\n\nnoexcept-specifier ::=\n    \"noexcept\" \"(\" constant-expression \")\"\n  | \"noexcept\"\n\n//== preprocessor.tex\n\npreprocessing-file ::=\n    group?\n  | module-file\n\nmodule-file ::=\n    pp-global-module-fragment? pp-module group? pp-private-module-fragment?\n\npp-global-module-fragment ::=\n    \"module\" \";\" new-line group?\n\npp-private-module-fragment ::=\n    \"module\" \":\" \"private\" \";\" new-line group?\n\ngroup ::=\n    group-part\n  | group group-part\n\ngroup-part ::=\n    control-line\n  | if-section\n  | text-line\n  | \"#\" conditionally-supported-directive\n\ncontrol-line ::=\n    \"#\" \"include\" pp-tokens new-line\n  | pp-import\n  | \"#\" \"define\" identifier replacement-list new-line\n  | \"#\" \"define\" identifier lparen identifier-list? \")\" replacement-list new-line\n  | \"#\" \"define\" identifier lparen \"...\" \")\" replacement-list new-line\n  | \"#\" \"define\" identifier lparen identifier-list \",\" \"...\" \")\" replacement-list new-line\n  | \"#\" \"undef\" identifier new-line\n  | \"#\" \"line\" pp-tokens new-line\n  | \"#\" \"error\" pp-tokens? new-line\n  | \"#\" \"warning\" pp-tokens? new-line\n  | \"#\" \"pragma\" pp-tokens? new-line\n  | \"#\" new-line\n\nif-section ::=\n    if-group elif-groups? else-group? endif-line\n\nif-group ::=\n    \"#\" \"if\" constant-expression new-line group?\n  | \"#\" \"ifdef\" identifier new-line group?\n  | \"#\" \"ifndef\" identifier new-line group?\n\nelif-groups ::=\n    elif-group\n  | elif-groups elif-group\n\nelif-group ::=\n    \"#\" \"elif\" constant-expression new-line group?\n  | \"#\" \"elifdef\" identifier new-line group?\n  | \"#\" \"elifndef\" identifier new-line group?\n\nelse-group ::=\n    \"#\" \"else\" new-line group?\n\nendif-line ::=\n    \"#\" \"endif\" new-line\n\ntext-line ::=\n    pp-tokens? new-line\n\nconditionally-supported-directive ::=\n    pp-tokens new-line\n\nlparen ::=\n    '{a \"(\" character not immediately preceded by whitespace}'\n\nidentifier-list ::=\n    identifier\n  | identifier-list \",\" identifier\n\nreplacement-list ::=\n    pp-tokens?\n\npp-tokens ::=\n    preprocessing-token\n  | pp-tokens preprocessing-token\n\nnew-line ::=\n    \"{the new-line character}\"\n\ndefined-macro-expression ::=\n    \"defined\" identifier\n  | \"defined\" \"(\" identifier \")\"\n\nh-preprocessing-token ::=\n    '{any preprocessing-token other than \"\u0026gt;\"}'\n\nh-pp-tokens ::=\n    h-preprocessing-token\n  | h-pp-tokens h-preprocessing-token\n\nheader-name-tokens ::=\n    string-literal\n  | \"\u0026lt;\" h-pp-tokens \"\u0026gt;\"\n\nhas-include-expression ::=\n    \"has_include\" \"(\" header-name \")\"\n  | \"has_include\" \"(\" header-name-tokens \")\"\n\nhas-attribute-expression ::=\n    \"has_cpp_attribute\" \"(\" pp-tokens \")\"\n\npp-module ::=\n    \"export\"? \"module\" pp-tokens? \";\" new-line\n\npp-import ::=\n    \"export\"? \"import\" header-name pp-tokens? \";\" new-line\n  | \"export\"? \"import\" header-name-tokens pp-tokens? \";\" new-line\n  | \"export\"? \"import\" pp-tokens \";\" new-line\n\nva-opt-replacement ::=\n    \"VA_OPT\" \"(\" pp-tokens? \")\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","bodyVersion":"91b7ff3be0cd1639f94db158141c897861e904dead4f57f509303ffd16e2d71c","createdAt":"2023-12-22T15:21:46Z","__isReactable":"Issue","reactionGroups":[{"content":"THUMBS_UP","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"THUMBS_DOWN","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"LAUGH","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HOORAY","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"CONFUSED","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HEART","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"ROCKET","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"EYES","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}}],"viewerCanUpdateMetadata":false,"viewerCanComment":false,"viewerCanAssign":false,"viewerCanLabel":false,"__isIssueOrPullRequest":"Issue","projectItemsNext":{"edges":[],"pageInfo":{"endCursor":null,"hasNextPage":false}},"viewerCanSetMilestone":false,"isPinned":false,"viewerCanDelete":false,"viewerCanTransfer":false,"viewerCanConvertToDiscussion":false,"viewerCanLock":false,"viewerCanType":false,"viewerCanSetFields":false,"issueFieldValues":{"nodes":[]},"frontTimelineItems":{"pageInfo":{"hasNextPage":false,"endCursor":"Y3Vyc29yOnYyOpPPAAABjLT0w8gCqjEzNDMxOTYwOTA="},"totalCount":6,"edges":[{"node":{"__typename":"IssueComment","__isIssueTimelineItems":"IssueComment","databaseId":1867809150,"viewerDidAuthor":false,"issue":{"author":{"__typename":"User","login":"mingodad","id":"MDQ6VXNlcjQ2MjYxOA=="},"id":"I_kwDOACHROc56bqD9","number":6742,"locked":false,"databaseId":2054070525},"author":{"__typename":"User","login":"mingodad","avatarUrl":"https://avatars.githubusercontent.com/u/462618?u=76da37792120b5cae1c739a669c27d60dfbb427f\u0026v=4","profileUrl":"https://github.com/mingodad","id":"MDQ6VXNlcjQ2MjYxOA=="},"id":"IC_kwDOACHROc5vVIF-","body":"And here is the script used to extract the `EBNF` shown on the first message:\r\n```\r\nauto base_dir = \"./\";\r\n\r\nauto keywords = {};\r\nauto non_terminals = {};\r\nauto terminals = {};\r\n\r\nauto tinc = table_incnum;\r\n\r\nauto need_nl = false;\r\n\r\nfunction process_tex(fn)\r\n{\r\n\tif(fn.endswith(\".tex\"))\r\n\t//if(fn == \"expressions.tex\")\r\n\t{\r\n\t\tif(need_nl)\r\n\t\t{\r\n\t\t\tprint(\"\");\r\n\t\t\tneed_nl = false;\r\n\t\t}\r\n\t\tprint(\"//== \" + fn);\r\n\t\tauto txt = readfile(base_dir + fn);\r\n\t\ttxt.gmatch(\r\n\t\t\t\"\\\\begin{bnf}(.-)\\\\end{bnf}\",\r\n\t\t\tfunction(bnf)\r\n\t\t\t{\r\n\t\t\t\tprint(\"\");\r\n\t\t\t\t//print(\"+++\");\r\n\t\t\t\t//print(bnf);\r\n\t\t\t\t//print(\"+++\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\br\", \"\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\\u0026\", \"\u0026\");\r\n\t\t\t\t//print(\"===\");\r\n\t\t\t\t//print(bnf);\r\n\t\t\t\t//print(\"===\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\caret{}\", \"^\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\caret\", \"^\");\r\n\t\t\t\t//print(\"***\");\r\n\t\t\t\t//print(bnf);\r\n\t\t\t\t//print(\"***\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\quad\", \" | \");\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\rlap{\\\\,(.)}\", \"%1\");\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\tref{(.-)}\", \"%1\");\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\[xm]name{(.-)}\", \"%1\");\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\grammarterm{(.-)%-keyword}\", \"\\\\keyword{%1}\");\r\n\r\n\t\t\t\tbnf = bnf.gsub(\"\\n%%.-\\n\", \"\\n\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\{\", \"__LBRACE__\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\}\", \"__RBRACE__\");\r\n\r\n\t\t\t\tneed_nl = true;\r\n\t\t\t\tconst ONEOF = \"\\\\textnormal{one of}\";\r\n\t\t\t\tauto isOneOf = bnf.match(ONEOF);\r\n\t\t\t\tif(isOneOf)\r\n\t\t\t\t{\r\n\t\t\t\t\tbnf = bnf.replace(ONEOF, \"\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbnf = bnf.replace(\"\\\\microtypesetup{protrusion=false}\\\\obeyspaces\", \"\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\microtypesetup{protrusion=false}\", \"\");\r\n\t\t\t\tbnf = bnf.replace(\"\\\\obeyspaces\", \"\");\r\n\t\t\t\tforeach(re in [\"\\\\textnormal(%b{})\", \"\\\\descr(%b{})\"])\r\n\t\t\t\t{\r\n\t\t\t\t\tbnf = bnf.gsub(re,\r\n\t\t\t\t\t\tfunction(m)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tm = m.gsub(\"\\\\grammarterm{(.-)}\", \"%1\");\r\n\t\t\t\t\t\t\tif(m.match(\"\\\\terminal{\"))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn \"'\" + m + \"'\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn \"\\\"\" + m + \"\\\"\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\t//bnf = bnf.gsub(\"(%w)%-(%w)\", \"%1_%2\");\r\n\t\t\t\t//bnf = bnf.gsub(\"(%w)%-(%w)\", \"%1_%2\"); //second time to catch one letter alone\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\nontermdef{(.-)}\",\r\n\t\t\t\t\tfunction(m)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttinc(non_terminals, m, 1, true);\r\n\t\t\t\t\t\treturn m + \" ::=\";\r\n\t\t\t\t\t});\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\keyword{(.-)}\",\r\n\t\t\t\t\tfunction(m)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttinc(keywords, m, 1, true);\r\n\t\t\t\t\t\treturn \"\\\"\" + m + \"\\\"\"\r\n\t\t\t\t\t});\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\terminal(%b{})\",\r\n\t\t\t\t\tfunction(m)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tm = m.slice(1,-1);\r\n\t\t\t\t\t\t//m = m.replace(\"\\\\textbackslash \", \"\\\\\\\\\");\r\n\t\t\t\t\t\tm = m.replace(\"\\\\textbackslash \", \"\\\\\");\r\n\t\t\t\t\t\tm = m.replace(\"\\\\textbackslash{}\", \"\\\\\"); //order is important\r\n\t\t\t\t\t\tm = m.replace(\"\\\\textbackslash\", \"\\\\\");\r\n\t\t\t\t\t\tif(isOneOf)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tm = m.gsub(\" +\", \" \");\r\n\t\t\t\t\t\t\tm = m.split(' ');\r\n\t\t\t\t\t\t\tforeach(idx, str in m)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ttinc(terminals, str, 1, true);\r\n\t\t\t\t\t\t\t\tif(str == \"\\\"\")\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tm[idx] = \"'\" + str + \"'\";\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse if(str[0] == '\"')\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t//do nothing\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tm[idx] = \"\\\"\" + str + \"\\\"\";\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn m.concat(\" | \");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tauto joined_terminal = m.gsub(\" \", \"\");\r\n\t\t\t\t\t\t\ttinc(terminals, joined_terminal, 1, true);\r\n\t\t\t\t\t\t\tif(m == \"\\\"\")\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn \"'\" + joined_terminal + \"'\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn \"\\\"\" + joined_terminal + \"\\\"\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\tbnf = bnf.gsub(\"\\\"\\\\opt{(.-)}\\\"\", \"\\\"%1\\\"?\"); //order is important\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\opt{(.-)}\", \"%1?\");\r\n\t\t\t\tbnf = bnf.split('\\n');\r\n\t\t\t\tforeach(idx, line in bnf)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(idx \u003e 1)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tline = line.trim();\r\n\t\t\t\t\t\tif(line.startswith(\"\\\\bnfindent\"))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tbnf[idx] = line.replace(\"\\\\bnfindent\", \"        \");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tbnf[idx] = \"  | \" + line;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbnf = bnf.concat(\"\\n\");\r\n\t\t\t\tbnf = bnf.replace(\"__LBRACE__\", \"{\");\r\n\t\t\t\tbnf = bnf.replace(\"__RBRACE__\", \"}\");\r\n\t\t\t\tbnf = bnf.gsub(\"\\\\([%%~#])\", \"%1\");\r\n\t\t\t\t//bnf = bnf.gsub(\"(%S+)_keyword\", \"\\\"%1\\\"\");\r\n\t\t\t\tbnf = bnf.gsub(\"(%S+)%-keyword\", \"\\\"%1\\\"\");\r\n\r\n\t\t\t\tprint(bnf);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n}\r\n\r\nprint([==[\r\n//\r\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\r\n//\r\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\r\n// then click the 'View Diagram' tab.\r\n//\r\n\r\n//\r\n//To facilitate start navigating\r\n//\r\ncplusplus ::=\r\n\tpreprocessing-file? translation-unit\r\n]==]);\r\n\r\nconst start_tex_fn = \"basic.tex\";\r\nprocess_tex(start_tex_fn); // to facilitate rairoad navigation we start with this tex file\r\n\r\nforeach(fn in sqfs.dir(base_dir))\r\n{\r\n\tif(fn != start_tex_fn)\r\n\t{\r\n\t\tprocess_tex(fn);\r\n\t}\r\n}\r\n```","bodyHTML":"\u003cp dir=\"auto\"\u003eAnd here is the script used to extract the \u003ccode class=\"notranslate\"\u003eEBNF\u003c/code\u003e shown on the first message:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"auto base_dir = \u0026quot;./\u0026quot;;\n\nauto keywords = {};\nauto non_terminals = {};\nauto terminals = {};\n\nauto tinc = table_incnum;\n\nauto need_nl = false;\n\nfunction process_tex(fn)\n{\n\tif(fn.endswith(\u0026quot;.tex\u0026quot;))\n\t//if(fn == \u0026quot;expressions.tex\u0026quot;)\n\t{\n\t\tif(need_nl)\n\t\t{\n\t\t\tprint(\u0026quot;\u0026quot;);\n\t\t\tneed_nl = false;\n\t\t}\n\t\tprint(\u0026quot;//== \u0026quot; + fn);\n\t\tauto txt = readfile(base_dir + fn);\n\t\ttxt.gmatch(\n\t\t\t\u0026quot;\\\\begin{bnf}(.-)\\\\end{bnf}\u0026quot;,\n\t\t\tfunction(bnf)\n\t\t\t{\n\t\t\t\tprint(\u0026quot;\u0026quot;);\n\t\t\t\t//print(\u0026quot;+++\u0026quot;);\n\t\t\t\t//print(bnf);\n\t\t\t\t//print(\u0026quot;+++\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\br\u0026quot;, \u0026quot;\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\\u0026amp;\u0026quot;, \u0026quot;\u0026amp;\u0026quot;);\n\t\t\t\t//print(\u0026quot;===\u0026quot;);\n\t\t\t\t//print(bnf);\n\t\t\t\t//print(\u0026quot;===\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\caret{}\u0026quot;, \u0026quot;^\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\caret\u0026quot;, \u0026quot;^\u0026quot;);\n\t\t\t\t//print(\u0026quot;***\u0026quot;);\n\t\t\t\t//print(bnf);\n\t\t\t\t//print(\u0026quot;***\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\quad\u0026quot;, \u0026quot; | \u0026quot;);\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\rlap{\\\\,(.)}\u0026quot;, \u0026quot;%1\u0026quot;);\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\tref{(.-)}\u0026quot;, \u0026quot;%1\u0026quot;);\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\[xm]name{(.-)}\u0026quot;, \u0026quot;%1\u0026quot;);\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\grammarterm{(.-)%-keyword}\u0026quot;, \u0026quot;\\\\keyword{%1}\u0026quot;);\n\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\n%%.-\\n\u0026quot;, \u0026quot;\\n\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\{\u0026quot;, \u0026quot;__LBRACE__\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\}\u0026quot;, \u0026quot;__RBRACE__\u0026quot;);\n\n\t\t\t\tneed_nl = true;\n\t\t\t\tconst ONEOF = \u0026quot;\\\\textnormal{one of}\u0026quot;;\n\t\t\t\tauto isOneOf = bnf.match(ONEOF);\n\t\t\t\tif(isOneOf)\n\t\t\t\t{\n\t\t\t\t\tbnf = bnf.replace(ONEOF, \u0026quot;\u0026quot;);\n\t\t\t\t}\n\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\microtypesetup{protrusion=false}\\\\obeyspaces\u0026quot;, \u0026quot;\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\microtypesetup{protrusion=false}\u0026quot;, \u0026quot;\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;\\\\obeyspaces\u0026quot;, \u0026quot;\u0026quot;);\n\t\t\t\tforeach(re in [\u0026quot;\\\\textnormal(%b{})\u0026quot;, \u0026quot;\\\\descr(%b{})\u0026quot;])\n\t\t\t\t{\n\t\t\t\t\tbnf = bnf.gsub(re,\n\t\t\t\t\t\tfunction(m)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm = m.gsub(\u0026quot;\\\\grammarterm{(.-)}\u0026quot;, \u0026quot;%1\u0026quot;);\n\t\t\t\t\t\t\tif(m.match(\u0026quot;\\\\terminal{\u0026quot;))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \u0026quot;'\u0026quot; + m + \u0026quot;'\u0026quot;;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \u0026quot;\\\u0026quot;\u0026quot; + m + \u0026quot;\\\u0026quot;\u0026quot;;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t//bnf = bnf.gsub(\u0026quot;(%w)%-(%w)\u0026quot;, \u0026quot;%1_%2\u0026quot;);\n\t\t\t\t//bnf = bnf.gsub(\u0026quot;(%w)%-(%w)\u0026quot;, \u0026quot;%1_%2\u0026quot;); //second time to catch one letter alone\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\nontermdef{(.-)}\u0026quot;,\n\t\t\t\t\tfunction(m)\n\t\t\t\t\t{\n\t\t\t\t\t\ttinc(non_terminals, m, 1, true);\n\t\t\t\t\t\treturn m + \u0026quot; ::=\u0026quot;;\n\t\t\t\t\t});\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\keyword{(.-)}\u0026quot;,\n\t\t\t\t\tfunction(m)\n\t\t\t\t\t{\n\t\t\t\t\t\ttinc(keywords, m, 1, true);\n\t\t\t\t\t\treturn \u0026quot;\\\u0026quot;\u0026quot; + m + \u0026quot;\\\u0026quot;\u0026quot;\n\t\t\t\t\t});\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\terminal(%b{})\u0026quot;,\n\t\t\t\t\tfunction(m)\n\t\t\t\t\t{\n\t\t\t\t\t\tm = m.slice(1,-1);\n\t\t\t\t\t\t//m = m.replace(\u0026quot;\\\\textbackslash \u0026quot;, \u0026quot;\\\\\\\\\u0026quot;);\n\t\t\t\t\t\tm = m.replace(\u0026quot;\\\\textbackslash \u0026quot;, \u0026quot;\\\\\u0026quot;);\n\t\t\t\t\t\tm = m.replace(\u0026quot;\\\\textbackslash{}\u0026quot;, \u0026quot;\\\\\u0026quot;); //order is important\n\t\t\t\t\t\tm = m.replace(\u0026quot;\\\\textbackslash\u0026quot;, \u0026quot;\\\\\u0026quot;);\n\t\t\t\t\t\tif(isOneOf)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm = m.gsub(\u0026quot; +\u0026quot;, \u0026quot; \u0026quot;);\n\t\t\t\t\t\t\tm = m.split(' ');\n\t\t\t\t\t\t\tforeach(idx, str in m)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttinc(terminals, str, 1, true);\n\t\t\t\t\t\t\t\tif(str == \u0026quot;\\\u0026quot;\u0026quot;)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tm[idx] = \u0026quot;'\u0026quot; + str + \u0026quot;'\u0026quot;;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if(str[0] == '\u0026quot;')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//do nothing\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tm[idx] = \u0026quot;\\\u0026quot;\u0026quot; + str + \u0026quot;\\\u0026quot;\u0026quot;;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn m.concat(\u0026quot; | \u0026quot;);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto joined_terminal = m.gsub(\u0026quot; \u0026quot;, \u0026quot;\u0026quot;);\n\t\t\t\t\t\t\ttinc(terminals, joined_terminal, 1, true);\n\t\t\t\t\t\t\tif(m == \u0026quot;\\\u0026quot;\u0026quot;)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \u0026quot;'\u0026quot; + joined_terminal + \u0026quot;'\u0026quot;;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \u0026quot;\\\u0026quot;\u0026quot; + joined_terminal + \u0026quot;\\\u0026quot;\u0026quot;;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\u0026quot;\\\\opt{(.-)}\\\u0026quot;\u0026quot;, \u0026quot;\\\u0026quot;%1\\\u0026quot;?\u0026quot;); //order is important\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\opt{(.-)}\u0026quot;, \u0026quot;%1?\u0026quot;);\n\t\t\t\tbnf = bnf.split('\\n');\n\t\t\t\tforeach(idx, line in bnf)\n\t\t\t\t{\n\t\t\t\t\tif(idx \u0026gt; 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tline = line.trim();\n\t\t\t\t\t\tif(line.startswith(\u0026quot;\\\\bnfindent\u0026quot;))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbnf[idx] = line.replace(\u0026quot;\\\\bnfindent\u0026quot;, \u0026quot;        \u0026quot;);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbnf[idx] = \u0026quot;  | \u0026quot; + line;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbnf = bnf.concat(\u0026quot;\\n\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;__LBRACE__\u0026quot;, \u0026quot;{\u0026quot;);\n\t\t\t\tbnf = bnf.replace(\u0026quot;__RBRACE__\u0026quot;, \u0026quot;}\u0026quot;);\n\t\t\t\tbnf = bnf.gsub(\u0026quot;\\\\([%%~#])\u0026quot;, \u0026quot;%1\u0026quot;);\n\t\t\t\t//bnf = bnf.gsub(\u0026quot;(%S+)_keyword\u0026quot;, \u0026quot;\\\u0026quot;%1\\\u0026quot;\u0026quot;);\n\t\t\t\tbnf = bnf.gsub(\u0026quot;(%S+)%-keyword\u0026quot;, \u0026quot;\\\u0026quot;%1\\\u0026quot;\u0026quot;);\n\n\t\t\t\tprint(bnf);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\t}\n}\n\nprint([==[\n//\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\n//\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\n// then click the 'View Diagram' tab.\n//\n\n//\n//To facilitate start navigating\n//\ncplusplus ::=\n\tpreprocessing-file? translation-unit\n]==]);\n\nconst start_tex_fn = \u0026quot;basic.tex\u0026quot;;\nprocess_tex(start_tex_fn); // to facilitate rairoad navigation we start with this tex file\n\nforeach(fn in sqfs.dir(base_dir))\n{\n\tif(fn != start_tex_fn)\n\t{\n\t\tprocess_tex(fn);\n\t}\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode class=\"notranslate\"\u003eauto base_dir = \"./\";\n\nauto keywords = {};\nauto non_terminals = {};\nauto terminals = {};\n\nauto tinc = table_incnum;\n\nauto need_nl = false;\n\nfunction process_tex(fn)\n{\n\tif(fn.endswith(\".tex\"))\n\t//if(fn == \"expressions.tex\")\n\t{\n\t\tif(need_nl)\n\t\t{\n\t\t\tprint(\"\");\n\t\t\tneed_nl = false;\n\t\t}\n\t\tprint(\"//== \" + fn);\n\t\tauto txt = readfile(base_dir + fn);\n\t\ttxt.gmatch(\n\t\t\t\"\\\\begin{bnf}(.-)\\\\end{bnf}\",\n\t\t\tfunction(bnf)\n\t\t\t{\n\t\t\t\tprint(\"\");\n\t\t\t\t//print(\"+++\");\n\t\t\t\t//print(bnf);\n\t\t\t\t//print(\"+++\");\n\t\t\t\tbnf = bnf.replace(\"\\\\br\", \"\");\n\t\t\t\tbnf = bnf.replace(\"\\\\\u0026amp;\", \"\u0026amp;\");\n\t\t\t\t//print(\"===\");\n\t\t\t\t//print(bnf);\n\t\t\t\t//print(\"===\");\n\t\t\t\tbnf = bnf.replace(\"\\\\caret{}\", \"^\");\n\t\t\t\tbnf = bnf.replace(\"\\\\caret\", \"^\");\n\t\t\t\t//print(\"***\");\n\t\t\t\t//print(bnf);\n\t\t\t\t//print(\"***\");\n\t\t\t\tbnf = bnf.replace(\"\\\\quad\", \" | \");\n\t\t\t\tbnf = bnf.gsub(\"\\\\rlap{\\\\,(.)}\", \"%1\");\n\t\t\t\tbnf = bnf.gsub(\"\\\\tref{(.-)}\", \"%1\");\n\t\t\t\tbnf = bnf.gsub(\"\\\\[xm]name{(.-)}\", \"%1\");\n\t\t\t\tbnf = bnf.gsub(\"\\\\grammarterm{(.-)%-keyword}\", \"\\\\keyword{%1}\");\n\n\t\t\t\tbnf = bnf.gsub(\"\\n%%.-\\n\", \"\\n\");\n\t\t\t\tbnf = bnf.replace(\"\\\\{\", \"__LBRACE__\");\n\t\t\t\tbnf = bnf.replace(\"\\\\}\", \"__RBRACE__\");\n\n\t\t\t\tneed_nl = true;\n\t\t\t\tconst ONEOF = \"\\\\textnormal{one of}\";\n\t\t\t\tauto isOneOf = bnf.match(ONEOF);\n\t\t\t\tif(isOneOf)\n\t\t\t\t{\n\t\t\t\t\tbnf = bnf.replace(ONEOF, \"\");\n\t\t\t\t}\n\n\t\t\t\tbnf = bnf.replace(\"\\\\microtypesetup{protrusion=false}\\\\obeyspaces\", \"\");\n\t\t\t\tbnf = bnf.replace(\"\\\\microtypesetup{protrusion=false}\", \"\");\n\t\t\t\tbnf = bnf.replace(\"\\\\obeyspaces\", \"\");\n\t\t\t\tforeach(re in [\"\\\\textnormal(%b{})\", \"\\\\descr(%b{})\"])\n\t\t\t\t{\n\t\t\t\t\tbnf = bnf.gsub(re,\n\t\t\t\t\t\tfunction(m)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm = m.gsub(\"\\\\grammarterm{(.-)}\", \"%1\");\n\t\t\t\t\t\t\tif(m.match(\"\\\\terminal{\"))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \"'\" + m + \"'\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \"\\\"\" + m + \"\\\"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t//bnf = bnf.gsub(\"(%w)%-(%w)\", \"%1_%2\");\n\t\t\t\t//bnf = bnf.gsub(\"(%w)%-(%w)\", \"%1_%2\"); //second time to catch one letter alone\n\t\t\t\tbnf = bnf.gsub(\"\\\\nontermdef{(.-)}\",\n\t\t\t\t\tfunction(m)\n\t\t\t\t\t{\n\t\t\t\t\t\ttinc(non_terminals, m, 1, true);\n\t\t\t\t\t\treturn m + \" ::=\";\n\t\t\t\t\t});\n\t\t\t\tbnf = bnf.gsub(\"\\\\keyword{(.-)}\",\n\t\t\t\t\tfunction(m)\n\t\t\t\t\t{\n\t\t\t\t\t\ttinc(keywords, m, 1, true);\n\t\t\t\t\t\treturn \"\\\"\" + m + \"\\\"\"\n\t\t\t\t\t});\n\t\t\t\tbnf = bnf.gsub(\"\\\\terminal(%b{})\",\n\t\t\t\t\tfunction(m)\n\t\t\t\t\t{\n\t\t\t\t\t\tm = m.slice(1,-1);\n\t\t\t\t\t\t//m = m.replace(\"\\\\textbackslash \", \"\\\\\\\\\");\n\t\t\t\t\t\tm = m.replace(\"\\\\textbackslash \", \"\\\\\");\n\t\t\t\t\t\tm = m.replace(\"\\\\textbackslash{}\", \"\\\\\"); //order is important\n\t\t\t\t\t\tm = m.replace(\"\\\\textbackslash\", \"\\\\\");\n\t\t\t\t\t\tif(isOneOf)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm = m.gsub(\" +\", \" \");\n\t\t\t\t\t\t\tm = m.split(' ');\n\t\t\t\t\t\t\tforeach(idx, str in m)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttinc(terminals, str, 1, true);\n\t\t\t\t\t\t\t\tif(str == \"\\\"\")\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tm[idx] = \"'\" + str + \"'\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if(str[0] == '\"')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//do nothing\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tm[idx] = \"\\\"\" + str + \"\\\"\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn m.concat(\" | \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto joined_terminal = m.gsub(\" \", \"\");\n\t\t\t\t\t\t\ttinc(terminals, joined_terminal, 1, true);\n\t\t\t\t\t\t\tif(m == \"\\\"\")\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \"'\" + joined_terminal + \"'\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn \"\\\"\" + joined_terminal + \"\\\"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tbnf = bnf.gsub(\"\\\"\\\\opt{(.-)}\\\"\", \"\\\"%1\\\"?\"); //order is important\n\t\t\t\tbnf = bnf.gsub(\"\\\\opt{(.-)}\", \"%1?\");\n\t\t\t\tbnf = bnf.split('\\n');\n\t\t\t\tforeach(idx, line in bnf)\n\t\t\t\t{\n\t\t\t\t\tif(idx \u0026gt; 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tline = line.trim();\n\t\t\t\t\t\tif(line.startswith(\"\\\\bnfindent\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbnf[idx] = line.replace(\"\\\\bnfindent\", \"        \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbnf[idx] = \"  | \" + line;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbnf = bnf.concat(\"\\n\");\n\t\t\t\tbnf = bnf.replace(\"__LBRACE__\", \"{\");\n\t\t\t\tbnf = bnf.replace(\"__RBRACE__\", \"}\");\n\t\t\t\tbnf = bnf.gsub(\"\\\\([%%~#])\", \"%1\");\n\t\t\t\t//bnf = bnf.gsub(\"(%S+)_keyword\", \"\\\"%1\\\"\");\n\t\t\t\tbnf = bnf.gsub(\"(%S+)%-keyword\", \"\\\"%1\\\"\");\n\n\t\t\t\tprint(bnf);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\t}\n}\n\nprint([==[\n//\n// EBNF to be viewd at https://www.bottlecaps.de/rr/ui\n//\n// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab\n// then click the 'View Diagram' tab.\n//\n\n//\n//To facilitate start navigating\n//\ncplusplus ::=\n\tpreprocessing-file? translation-unit\n]==]);\n\nconst start_tex_fn = \"basic.tex\";\nprocess_tex(start_tex_fn); // to facilitate rairoad navigation we start with this tex file\n\nforeach(fn in sqfs.dir(base_dir))\n{\n\tif(fn != start_tex_fn)\n\t{\n\t\tprocess_tex(fn);\n\t}\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","bodyVersion":"bddcbd472cdf2f94973524080edcf961a9c9debd2b4f01571f4faec3c4cb1312","viewerCanUpdate":false,"url":"https://github.com/cplusplus/draft/issues/6742#issuecomment-1867809150","createdAt":"2023-12-22T15:23:04Z","authorAssociation":"NONE","viewerCanDelete":false,"viewerCanMinimize":false,"viewerCanUnminimize":false,"viewerCanReport":false,"viewerCanReportToMaintainer":false,"viewerCanBlockFromOrg":false,"viewerCanUnblockFromOrg":false,"viaApp":null,"isHidden":false,"minimizedReason":null,"showSpammyBadge":false,"createdViaEmail":false,"authorToRepoOwnerSponsorship":null,"repository":{"id":"MDEwOlJlcG9zaXRvcnkyMjE2MjQ5","name":"draft","owner":{"__typename":"Organization","id":"MDEyOk9yZ2FuaXphdGlvbjU5Mjc2","login":"cplusplus","url":"https://github.com/cplusplus"},"isPrivate":false,"slashCommandsEnabled":false,"nameWithOwner":"cplusplus/draft","databaseId":2216249},"__isComment":"IssueComment","viewerCanReadUserContentEdits":true,"lastEditedAt":null,"lastUserContentEdit":null,"__isReactable":"IssueComment","reactionGroups":[{"content":"THUMBS_UP","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"THUMBS_DOWN","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"LAUGH","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HOORAY","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"CONFUSED","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HEART","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"ROCKET","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"EYES","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}}],"__isNode":"IssueComment"},"cursor":"Y3Vyc29yOnYyOpPPAAABjJIfc8AAqjE4Njc4MDkxNTA="},{"node":{"__typename":"IssueComment","__isIssueTimelineItems":"IssueComment","databaseId":1867813530,"viewerDidAuthor":false,"issue":{"author":{"__typename":"User","login":"mingodad","id":"MDQ6VXNlcjQ2MjYxOA=="},"id":"I_kwDOACHROc56bqD9","number":6742,"locked":false,"databaseId":2054070525},"author":{"__typename":"User","login":"mingodad","avatarUrl":"https://avatars.githubusercontent.com/u/462618?u=76da37792120b5cae1c739a669c27d60dfbb427f\u0026v=4","profileUrl":"https://github.com/mingodad","id":"MDQ6VXNlcjQ2MjYxOA=="},"id":"IC_kwDOACHROc5vVJKa","body":"There is several non-terminals that are not referenced anywhere:\r\n```\r\ntranslation-unit //This one is expected \r\npreprocessing-file //This one can also be expected\r\n\r\n//but this ones probably should be referenced by one or more rules\r\ndefined-macro-expression\r\ntoken\r\nhas-attribute-expression\r\nhas-include-expression\r\nva-opt-replacement\r\n```","bodyHTML":"\u003cp dir=\"auto\"\u003eThere is several non-terminals that are not referenced anywhere:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"translation-unit //This one is expected \npreprocessing-file //This one can also be expected\n\n//but this ones probably should be referenced by one or more rules\ndefined-macro-expression\ntoken\nhas-attribute-expression\nhas-include-expression\nva-opt-replacement\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode class=\"notranslate\"\u003etranslation-unit //This one is expected \npreprocessing-file //This one can also be expected\n\n//but this ones probably should be referenced by one or more rules\ndefined-macro-expression\ntoken\nhas-attribute-expression\nhas-include-expression\nva-opt-replacement\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","bodyVersion":"42595d1e3573c2692da4e0d2446b2972c508825cd7e6fc32ebd9573c58e26167","viewerCanUpdate":false,"url":"https://github.com/cplusplus/draft/issues/6742#issuecomment-1867813530","createdAt":"2023-12-22T15:27:30Z","authorAssociation":"NONE","viewerCanDelete":false,"viewerCanMinimize":false,"viewerCanUnminimize":false,"viewerCanReport":false,"viewerCanReportToMaintainer":false,"viewerCanBlockFromOrg":false,"viewerCanUnblockFromOrg":false,"viaApp":null,"isHidden":false,"minimizedReason":null,"showSpammyBadge":false,"createdViaEmail":false,"authorToRepoOwnerSponsorship":null,"repository":{"id":"MDEwOlJlcG9zaXRvcnkyMjE2MjQ5","name":"draft","owner":{"__typename":"Organization","id":"MDEyOk9yZ2FuaXphdGlvbjU5Mjc2","login":"cplusplus","url":"https://github.com/cplusplus"},"isPrivate":false,"slashCommandsEnabled":false,"nameWithOwner":"cplusplus/draft","databaseId":2216249},"__isComment":"IssueComment","viewerCanReadUserContentEdits":true,"lastEditedAt":null,"lastUserContentEdit":null,"__isReactable":"IssueComment","reactionGroups":[{"content":"THUMBS_UP","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"THUMBS_DOWN","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"LAUGH","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HOORAY","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"CONFUSED","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HEART","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"ROCKET","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"EYES","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}}],"__isNode":"IssueComment"},"cursor":"Y3Vyc29yOnYyOpPPAAABjJIjgtAAqjE4Njc4MTM1MzA="},{"node":{"__typename":"CrossReferencedEvent","__isIssueTimelineItems":"CrossReferencedEvent","__isTimelineEvent":"CrossReferencedEvent","databaseId":1342334594,"createdAt":"2023-12-22T15:30:11Z","actor":{"__typename":"User","login":"mingodad","id":"MDQ6VXNlcjQ2MjYxOA==","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/462618?s=64\u0026u=76da37792120b5cae1c739a669c27d60dfbb427f\u0026v=4","profileResourcePath":"/mingodad"},"source":{"__typename":"Issue","__isNode":"Issue","id":"I_kwDOAPVoI856PB0B"},"willCloseTarget":false,"referencedAt":"2023-12-22T15:30:10Z","innerSource":{"__typename":"Issue","__isReferencedSubject":"Issue","id":"I_kwDOAPVoI856PB0B","issueTitleHTML":"Changing \"specs/grammar.txt\" to an EBNF understood by https://www.bottlecaps.de/rr/ui","url":"https://github.com/robertoraggi/cplusplus/issues/281","number":281,"stateReason":null,"repository":{"id":"MDEwOlJlcG9zaXRvcnkxNjA4Mjk3OQ==","name":"cplusplus","isPrivate":false,"owner":{"__typename":"User","login":"robertoraggi","id":"MDQ6VXNlcjY0MzY1Njc="}},"__isNode":"Issue"},"__isNode":"CrossReferencedEvent","id":"CRE_kwDOAPVoI85QAmaC"},"cursor":"Y3Vyc29yOnYyOpPPAAABjJIl97gCqjEzNDIzMzQ1OTQ="},{"node":{"__typename":"IssueComment","__isIssueTimelineItems":"IssueComment","databaseId":1868255878,"viewerDidAuthor":false,"issue":{"author":{"__typename":"User","login":"mingodad","id":"MDQ6VXNlcjQ2MjYxOA=="},"id":"I_kwDOACHROc56bqD9","number":6742,"locked":false,"databaseId":2054070525},"author":{"__typename":"User","login":"jensmaurer","avatarUrl":"https://avatars.githubusercontent.com/u/23412755?v=4","profileUrl":"https://github.com/jensmaurer","id":"MDQ6VXNlcjIzNDEyNzU1"},"id":"IC_kwDOACHROc5vW1KG","body":"This is an issue tracker for handling editorial issues of the C++ Standard and/or Working Draft.\r\n\r\nI'm not seeing an issue being described here.","bodyHTML":"\u003cp dir=\"auto\"\u003eThis is an issue tracker for handling editorial issues of the C++ Standard and/or Working Draft.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eI'm not seeing an issue being described here.\u003c/p\u003e","bodyVersion":"b4c35ed6716865ab385c81030b927fc31bb72328628575ddcf2b2a128be07dd6","viewerCanUpdate":false,"url":"https://github.com/cplusplus/draft/issues/6742#issuecomment-1868255878","createdAt":"2023-12-23T09:49:42Z","authorAssociation":"MEMBER","viewerCanDelete":false,"viewerCanMinimize":false,"viewerCanUnminimize":false,"viewerCanReport":false,"viewerCanReportToMaintainer":false,"viewerCanBlockFromOrg":false,"viewerCanUnblockFromOrg":false,"viaApp":null,"isHidden":false,"minimizedReason":null,"showSpammyBadge":false,"createdViaEmail":false,"authorToRepoOwnerSponsorship":null,"repository":{"id":"MDEwOlJlcG9zaXRvcnkyMjE2MjQ5","name":"draft","owner":{"__typename":"Organization","id":"MDEyOk9yZ2FuaXphdGlvbjU5Mjc2","login":"cplusplus","url":"https://github.com/cplusplus"},"isPrivate":false,"slashCommandsEnabled":false,"nameWithOwner":"cplusplus/draft","databaseId":2216249},"__isComment":"IssueComment","viewerCanReadUserContentEdits":true,"lastEditedAt":null,"lastUserContentEdit":null,"__isReactable":"IssueComment","reactionGroups":[{"content":"THUMBS_UP","viewerHasReacted":false,"reactors":{"totalCount":1,"nodes":[{"__typename":"User","login":"frederick-vs-ja","__isNode":"User","id":"MDQ6VXNlcjIzMjI4OTg5"}]}},{"content":"THUMBS_DOWN","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"LAUGH","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HOORAY","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"CONFUSED","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HEART","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"ROCKET","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"EYES","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}}],"__isNode":"IssueComment"},"cursor":"Y3Vyc29yOnYyOpPPAAABjJYUmvAAqjE4NjgyNTU4Nzg="},{"node":{"__typename":"ClosedEvent","__isIssueTimelineItems":"ClosedEvent","__isTimelineEvent":"ClosedEvent","databaseId":11330680436,"createdAt":"2023-12-23T09:49:42Z","actor":{"__typename":"User","login":"jensmaurer","id":"MDQ6VXNlcjIzNDEyNzU1","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/23412755?s=64\u0026v=4","profileResourcePath":"/jensmaurer"},"stateReason":"NOT_PLANNED","duplicateOf":null,"closingProjectItemStatus":null,"closer":null,"__isNode":"ClosedEvent","id":"CE_lADOACHROc56bqD9zwAAAAKjXHZ0"},"cursor":"Y3Vyc29yOnYyOpPPAAABjJYUmvABqzExMzMwNjgwNDM2"},{"node":{"__typename":"CrossReferencedEvent","__isIssueTimelineItems":"CrossReferencedEvent","__isTimelineEvent":"CrossReferencedEvent","databaseId":1343196090,"createdAt":"2023-12-29T09:43:09Z","actor":{"__typename":"User","login":"mingodad","id":"MDQ6VXNlcjQ2MjYxOA==","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/462618?s=64\u0026u=76da37792120b5cae1c739a669c27d60dfbb427f\u0026v=4","profileResourcePath":"/mingodad"},"source":{"__typename":"Issue","__isNode":"Issue","id":"I_kwDOGEEp0856n6HY"},"willCloseTarget":false,"referencedAt":"2023-12-29T09:43:09Z","innerSource":{"__typename":"Issue","__isReferencedSubject":"Issue","id":"I_kwDOGEEp0856n6HY","issueTitleHTML":"[SUGGESTION] Grammar railroad diagram","url":"https://github.com/hsutter/cppfront/issues/910","number":910,"stateReason":null,"repository":{"id":"MDEwOlJlcG9zaXRvcnk0MDY5MjM3MzE=","name":"cppfront","isPrivate":false,"owner":{"__typename":"User","login":"hsutter","id":"MDQ6VXNlcjE4MDE1MjY="}},"__isNode":"Issue"},"__isNode":"CrossReferencedEvent","id":"CRE_kwDOGEEp085QD4u6"},"cursor":"Y3Vyc29yOnYyOpPPAAABjLT0w8gCqjEzNDMxOTYwOTA="}]},"backTimelineItems":{"pageInfo":{"hasPreviousPage":true,"startCursor":null},"totalCount":6,"edges":[]}},"id":"MDEwOlJlcG9zaXRvcnkyMjE2MjQ5"},"safeViewer":null}},"timestamp":1759110668}]},"title":null,"appPayload":{"initial_view_content":{"team_id":null,"can_edit_view":true},"current_user":null,"current_user_settings":{"preferred_emoji_skin_tone":null,"copilot_show_functionality":false,"use_single_key_shortcut":false},"paste_url_link_as_plain_text":false,"base_avatar_url":"https://avatars.githubusercontent.com","help_url":"https://docs.github.com","sso_organizations":null,"current_sso_orgs_match_dismissed_cookie":null,"multi_tenant":false,"tracing":false,"tracing_flamegraph":false,"catalog_service":"github/issues","scoped_repository":{"id":"MDEwOlJlcG9zaXRvcnkyMjE2MjQ5","owner":"cplusplus","name":"draft","is_archived":false},"enabled_features":{"use_pull_request_subscriptions_enabled":false,"pull_request_single_subscription":true,"disable_issues_react_ssr":false,"issue_dependencies":true,"copilot_natural_language_github_search":false,"private_avatars":false,"reserved_domain":true,"projects_classic_sunset_override":false,"issues_react_bypass_es_limits":true,"notifyd_issue_watch_activity_notify":false,"notifyd_enable_issue_thread_subscriptions":false,"timeline_best_effort_count_optimization":false,"copilot_auto_assign_metadata":false,"issues_react_bots_timeline_pagination":true,"copilot_workspace_cross_repo_selection":false,"copilot_agent_mode":true,"issues_react_force_turbo_nav":false,"copilot_swe_agent":true,"copilot_workspace":null,"tasklist_block":false,"issues_react_perf_test":false}}}</script>
  <div data-target="react-app.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.gjuRkX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;}/*!sc*/
.gjuRkX > *{width:100%;}/*!sc*/
.fdpFjT{font-size:26px;margin-right:8px;}/*!sc*/
@media screen and (min-width:544px){.fdpFjT{font-size:26px;}}/*!sc*/
@media screen and (min-width:768px){.fdpFjT{font-size:var(--text-title-size-large,32px);}}/*!sc*/
@media screen and (min-width:1012px){.fdpFjT{font-size:var(--text-title-size-large,32px);}}/*!sc*/
.kIppVx{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/
@media screen and (min-width:544px){.kIppVx{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/
@media screen and (min-width:768px){.kIppVx{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;}}/*!sc*/
@media screen and (min-width:1012px){.kIppVx{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;}}/*!sc*/
.dXFha-d{display:none;}/*!sc*/
@media screen and (min-width:544px){.dXFha-d{display:none;}}/*!sc*/
@media screen and (min-width:768px){.dXFha-d{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}/*!sc*/
@media screen and (min-width:1012px){.dXFha-d{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}/*!sc*/
.eshSer{height:100%;min-height:56px;width:100%;}/*!sc*/
.imHURM{display:none;height:56px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:-webkit-sticky;position:sticky;width:100%;z-index:14;top:var(--base-sticky-header-height,0);}/*!sc*/
.buMjBU{display:none;}/*!sc*/
@media screen and (min-width:544px){.buMjBU{display:none;}}/*!sc*/
@media screen and (min-width:768px){.buMjBU{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}/*!sc*/
@media screen and (min-width:1012px){.buMjBU{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}/*!sc*/
.hcXOSJ{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/
@media screen and (min-width:544px){.hcXOSJ{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}/*!sc*/
@media screen and (min-width:768px){.hcXOSJ{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}}/*!sc*/
@media screen and (min-width:1012px){.hcXOSJ{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}}/*!sc*/
.bkzAXF{width:100%;}/*!sc*/
@media screen and (min-width:544px){.bkzAXF{width:100%;}}/*!sc*/
@media screen and (min-width:768px){.bkzAXF{width:auto;}}/*!sc*/
@media screen and (min-width:1012px){.bkzAXF{width:auto;}}/*!sc*/
.gRssIw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:16px;}/*!sc*/
.bDlPR{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-order:1;-ms-flex-order:1;order:1;min-width:0;}/*!sc*/
@media screen and (min-width:544px){.bDlPR{-webkit-order:1;-ms-flex-order:1;order:1;}}/*!sc*/
@media screen and (min-width:768px){.bDlPR{-webkit-order:1;-ms-flex-order:1;order:1;}}/*!sc*/
@media screen and (min-width:1012px){.bDlPR{-webkit-order:1;-ms-flex-order:1;order:1;}}/*!sc*/
@media screen and (min-width:1280px){.bDlPR{-webkit-order:0;-ms-flex-order:0;order:0;}}/*!sc*/
.bDlPR video{aspect-ratio:16/9;width:100%;}/*!sc*/
.crMLA-D{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/
.bjwYme{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;width:100%;min-width:0;}/*!sc*/
.bGcKkD:hover{-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.cLtwuV{width:auto;}/*!sc*/
@media screen and (min-width:544px){.cLtwuV{width:auto;}}/*!sc*/
@media screen and (min-width:768px){.cLtwuV{width:256px;}}/*!sc*/
@media screen and (min-width:1012px){.cLtwuV{width:296px;}}/*!sc*/
.bbGjsc{margin-bottom:8px;}/*!sc*/
.bbGjsc:after{content:"";position:absolute;height:1px;bottom:-8px;left:8px;right:8px;background-color:var(--borderColor-muted,var(--color-border-muted,hsla(210,18%,87%,1)));}/*!sc*/
.bwxuvd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;padding-bottom:8px;}/*!sc*/
.bpDFns{position:relative;}/*!sc*/
.kqdiwS{height:40px;width:40px;margin-top:24px;}/*!sc*/
.HpFDd{padding-bottom:16px;}/*!sc*/
.jKxfJf{height:sm;width:150px;}/*!sc*/
.hpcToU{height:sm;width:random;}/*!sc*/
data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"gjuRkX,fdpFjT,kIppVx,dXFha-d,eshSer,imHURM,buMjBU,hcXOSJ,bkzAXF,gRssIw,bDlPR,crMLA-D,bjwYme,bGcKkD,cLtwuV,bbGjsc,bwxuvd,bpDFns,kqdiwS,HpFDd,jKxfJf,hpcToU,"}/*!sc*/
.gALJmv{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:50%;display:block;height:1.2em;border-radius:50%;width:40px;height:40px;margin-top:24px;}/*!sc*/
.gALJmv::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.gpOnMk{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:150px;height:16px;}/*!sc*/
.gpOnMk::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.gyTeWh{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:59%;height:16px;}/*!sc*/
.gyTeWh::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.jPvaA-d{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:77%;height:16px;}/*!sc*/
.jPvaA-d::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.dRdjrc{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:49%;height:16px;}/*!sc*/
.dRdjrc::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.jETYlX{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:71%;height:16px;}/*!sc*/
.jETYlX::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.iUqXOB{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:55%;height:16px;}/*!sc*/
.iUqXOB::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.dRlina{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:78%;height:16px;}/*!sc*/
.dRlina::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.ecARVs{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:41%;height:16px;}/*!sc*/
.ecARVs::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
.fRHxbb{position:relative;overflow:hidden;-webkit-mask-image:radial-gradient(white,black);mask-image:radial-gradient(white,black);background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5)));border-radius:3px;display:block;height:1.2em;width:68%;height:16px;}/*!sc*/
.fRHxbb::after{-webkit-animation:crVFvv 1.5s infinite linear;animation:crVFvv 1.5s infinite linear;background:linear-gradient(90deg,transparent,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))),transparent);content:'';position:absolute;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);bottom:0;left:0;right:0;top:0;}/*!sc*/
data-styled.g10[id="LoadingSkeleton-sc-14d3f1fe-0"]{content:"gALJmv,gpOnMk,gyTeWh,jPvaA-d,dRdjrc,jETYlX,iUqXOB,dRlina,ecARVs,fRHxbb,"}/*!sc*/
@-webkit-keyframes crVFvv{0%{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);}50%{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);}100%{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);}}/*!sc*/
@keyframes crVFvv{0%{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);}50%{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);}100%{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);}}/*!sc*/
data-styled.g39[id="sc-keyframes-crVFvv"]{content:"crVFvv,"}/*!sc*/
</style><!--$--><!--$--><div class="Box-sc-g0xbh4-0 gjuRkX"><div class="primary-viewer IssueDetail-module__IssueDetailContainer--h6eYv" data-testid="issue-viewer-container"><!--$--><div class="IssueViewer-module__issueViewerContainer--C18gM IssueViewer-module__mainContainer--PhquW"><!--$--><div class="Box-sc-g0xbh4-0 ContentWrapper-module__contentContainer--AGolz"><div aria-label="Header" role="region" data-testid="issue-header"><div class="prc-PageHeader-PageHeader-sT1Hp HeaderViewer-module__headerContainer--kkVCB "><div class="prc-PageHeader-TitleArea-jxJZy HeaderViewer-module__PageHeader_TitleArea--RYvOA" data-component="TitleArea" data-size-variant="medium"><h1 class="Box-sc-g0xbh4-0 fdpFjT prc-PageHeader-Title-LKOsd HeaderViewer-module__PageHeader_Title--n_x9h prc-Heading-Heading-6CmGO" data-component="PH_Title" data-hidden="false" style="--custom-font-size:26px,26px,var(--text-title-size-large, 32px),var(--text-title-size-large, 32px)"><bdi class="Box-sc-g0xbh4-0 markdown-title HeaderViewer-module__VerifiedHTMLBox--_DgIv" data-testid="issue-title">Grammar railroad diagram</bdi> <span class="HeaderViewer-module__issueNumberText--ofQHQ">#6742</span></h1></div><div class="prc-PageHeader-ContextArea-6ykSJ" data-hidden-regular="true"><div class="prc-PageHeader-ContextAreaActions-RTJRk HeaderViewer-module__PageHeader_ContextAreaActions--zjX2m" data-hidden-regular="true"><div class="HeaderMenu-module__menuActionsContainer--Gf9W9"><div class="Box-sc-g0xbh4-0 kIppVx HeaderMenu-module__buttonContainer--Nazjm"><a type="button" href="/login?return_to=" target="_blank" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="primary" aria-describedby=":Ria56b:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x">New issue</span></span></a></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":R1ra56b:-loading-announcement" aria-labelledby=":R3a56b:"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardButton-module__tooltip--HDUYz prc-TooltipV2-Tooltip-cYMVY" data-direction="s" aria-label="Copy link" aria-hidden="true" id=":R3a56b:">Copy link</span></div></div></div><div class="Box-sc-g0xbh4-0 dXFha-d prc-PageHeader-Actions-ygtmj HeaderViewer-module__PageHeader_Actions--SRZVA" data-component="PH_Actions"><div class="HeaderMenu-module__menuActionsContainer--Gf9W9"><div class="Box-sc-g0xbh4-0 kIppVx HeaderMenu-module__buttonContainer--Nazjm"><a type="button" href="/login?return_to=" target="_blank" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="primary" aria-describedby=":Rii56b:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x">New issue</span></span></a></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":R1ri56b:-loading-announcement" aria-labelledby=":R3i56b:"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardButton-module__tooltip--HDUYz prc-TooltipV2-Tooltip-cYMVY" data-direction="s" aria-label="Copy link" aria-hidden="true" id=":R3i56b:">Copy link</span></div></div></div></div></div><div class="Box-sc-g0xbh4-0 ContentWrapper-module__contentContainer--AGolz"><div data-testid="issue-metadata-fixed" class="Box-sc-g0xbh4-0 eshSer HeaderMetadata-module__metadataContainer--BhB7Q"><div class="HeaderMetadata-module__metadataBorder--oeBkI"><div class="HeaderMetadata-module__metadataContent--HC0b2"><div><span data-testid="header-state" class="prc-StateLabel-StateLabel-ukDwa HeaderState-module__stateLabel--Na0HJ" data-variant="normal" data-status="issueClosedNotPlanned"><svg focusable="false" aria-label="Issue, not planned" class="octicon octicon-skip Octicon-sc-9kayk9-0 prc-StateLabel-Icon-NuDm4" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm9.78-2.22-5.5 5.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l5.5-5.5a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Closed as not planned</span></div><!--$--><!--/$--></div></div></div></div><div data-testid="issue-metadata-sticky" id="issue-viewer-sticky-header" class="Box-sc-g0xbh4-0 imHURM HeaderMetadata-module__stickyContainer--JBJvS"><div class="Box-sc-g0xbh4-0 ContentWrapper-module__contentContainer--AGolz"><div class="HeaderMetadata-module__stickyContent--jGltj"><div><span data-testid="header-state" class="prc-StateLabel-StateLabel-ukDwa HeaderState-module__stateLabel--Na0HJ" data-variant="normal" data-status="issueClosedNotPlanned"><svg focusable="false" aria-label="Issue, not planned" class="octicon octicon-skip Octicon-sc-9kayk9-0 prc-StateLabel-Icon-NuDm4" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm9.78-2.22-5.5 5.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l5.5-5.5a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Closed as not planned</span></div><div class="HeaderMetadata-module__titleAndMetadata--I5cx4"><div class="StickyHeaderTitle-module__stickyTitleContainer--tWFM_"><a class="StickyHeaderTitle-module__stickyTitleLink--H6l16 prc-Link-Link-85e08" href="#top"><bdi class="Box-sc-g0xbh4-0 markdown-title" data-testid="issue-title-sticky">Grammar railroad diagram</bdi></a><span class="StickyHeaderTitle-module__issueNumberText--t7CBp">#6742</span></div><div class="Box-sc-g0xbh4-0 buMjBU HeaderMetadata-module__smallMetadataRow--gVhbT"><!--$--><!--/$--></div></div><div><div class="HeaderMenu-module__menuActionsContainer--Gf9W9"><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Rsu96b:-loading-announcement" aria-labelledby=":Ru96b:"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardButton-module__tooltip--HDUYz prc-TooltipV2-Tooltip-cYMVY" data-direction="s" aria-label="Copy link" aria-hidden="true" id=":Ru96b:">Copy link</span></div></div></div></div></div><div class="Box-sc-g0xbh4-0 Header-module__stickyObservableBox--GRl72"></div><div class="Header-module__HeaderContentWrapper--WtTMs"><div class="Box-sc-g0xbh4-0 ContentWrapper-module__contentContainer--AGolz"><div class="Header-module__headerSpacer--lQCuP"></div></div></div><div class="Box-sc-g0xbh4-0 ContentWrapper-module__contentContainer--AGolz"><div class="Box-sc-g0xbh4-0 hcXOSJ IssueViewer-module__contentAndSidebarWrapper--KA1nM"><div class="Box-sc-g0xbh4-0 bkzAXF IssueViewer-module__contentArea--IpMnd"><div data-testid="issue-viewer-issue-container"><div class="Box-sc-g0xbh4-0 gRssIw"><a class="Avatar-module__avatarLink--leRdV Avatar-module__avatarOuter--waYVs prc-Link-Link-85e08" href="https://github.com/mingodad" data-hovercard-url="/users/mingodad/hovercard" aria-label="@mingodad&#x27;s profile"><img data-component="Avatar" class="Avatar-module__issueViewerAvatar--LY0E0 prc-Avatar-Avatar-ZRS-m" alt="@mingodad" width="40" height="40" style="--avatarSize-regular:40px" src="https://avatars.githubusercontent.com/u/462618?u=76da37792120b5cae1c739a669c27d60dfbb427f&amp;v=4&amp;size=80" data-testid="github-avatar"/></a><div data-testid="issue-body" class="Box-sc-g0xbh4-0 bDlPR react-issue-body" data-hpc="true"><h2 class="sr-only">Description</h2><div class="Box-sc-g0xbh4-0 crMLA-D"><div class="Box-sc-g0xbh4-0 bjwYme"><div class="IssueBodyHeader-module__IssueBodyHeaderContainer--omzzd IssueBodyHeader-module__viewerDidNotAuthor--QE49X"><div class="ActivityHeader-module__activityHeader--WiwzD IssueBodyHeader-module__activityHeaderWrapper--WDoKj"><div class="Box-sc-g0xbh4-0 Avatar-module__avatarInner--leXLe IssueBodyHeader-module__avatarContainer--tVAqx"><a class="Avatar-module__avatarLink--leRdV prc-Link-Link-85e08" href="https://github.com/mingodad" data-hovercard-url="/users/mingodad/hovercard" aria-label="@mingodad&#x27;s profile"><img data-component="Avatar" class="prc-Avatar-Avatar-ZRS-m" alt="@mingodad" width="24" height="24" style="--avatarSize-regular:24px" src="https://avatars.githubusercontent.com/u/462618?u=76da37792120b5cae1c739a669c27d60dfbb427f&amp;v=4&amp;size=48" data-testid="github-avatar"/></a></div><div class="ActivityHeader-module__narrowViewportWrapper--k4ncm IssueBodyHeader-module__narrowViewportWrapper--cUGQk"><div class="IssueBodyHeader-module__titleSection--a171Q"><a class="Box-sc-g0xbh4-0 bGcKkD IssueBodyHeaderAuthor-module__authorLoginLink--MsgZJ prc-Link-Link-85e08" href="https://github.com/mingodad" data-hovercard-url="/users/mingodad/hovercard" data-testid="issue-body-header-author">mingodad</a></div><div class="ActivityHeader-module__footer--ssKOW IssueBodyHeader-module__footerSection--R3Cax"><span>opened </span><a class="IssueBodyHeader-module__dateLink--GZfps prc-Link-Link-85e08" href="https://github.com/cplusplus/draft/issues/6742#issue-2054070525" data-testid="issue-body-header-link"><relative-time class="sc-aXZVg IssueBodyHeader-module__RelativeTime--LRd7n">on <!-- -->Dec 22, 2023</relative-time></a></div></div><div class="ActivityHeader-module__narrowViewportWrapper--k4ncm IssueBodyHeader-module__actionsWrapper--nZngh"><div class="ActivityHeader-module__edits--WkfqY IssueBodyHeader-module__editsSection--ptNnu"></div><div class="IssueBodyHeader-module__badgesSection--izNBK"><div class="IssueBodyHeader-module__badgeGroup--xiI1A"></div><div class="IssueBodyHeader-module__actionsSection--CZDiB"><button data-component="IconButton" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-describedby=":R4ldklmb:-loading-announcement" aria-labelledby=":R3sldklmb:" id=":R4ldklmb:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-cYMVY" data-direction="s" aria-hidden="true" id=":R3sldklmb:">Issue body actions</span></div></div></div></div></div><div class="IssueBodyViewer-module__IssueBody--Zg6Wy" id="issue-body-viewer" data-testid="issue-body-viewer"><div data-testid="markdown-body" data-team-hovercards-enabled="true" class="markdown-body" data-turbolinks="false"><div class="Box-sc-g0xbh4-0 markdown-body NewMarkdownViewer-module__safe-html-box--dKCgP"><p dir="auto">Using <a href="https://github.com/mingodad/squilu">https://github.com/mingodad/squilu</a> to extract the <code class="notranslate">{bnf}</code> sections from all <code class="notranslate">*.tex</code> files and convert then to an <code class="notranslate">EBNF</code> understood by <a href="https://www.bottlecaps.de/rr/ui" rel="nofollow">https://www.bottlecaps.de/rr/ui</a> we can have a nice navigable railroad diagram (see bellow the resulting <code class="notranslate">EBNF</code> and instructions to visualize the railroad diagram).</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="//
// EBNF to be viewd at https://www.bottlecaps.de/rr/ui
//
// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//

//
//To facilitate start navigating
//

cplusplus ::=
	preprocessing-file? translation-unit

//== lex.tex

n-char ::=
     &quot;{any member of the translation character set except the \unicode{007d}{right curly bracket} or new-line character}&quot;

n-char-sequence ::=
    n-char
  | n-char-sequence n-char

named-universal-character ::=
    &quot;\N{&quot; n-char-sequence &quot;}&quot;

hex-quad ::=
    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit

simple-hexadecimal-digit-sequence ::=
    hexadecimal-digit
  | simple-hexadecimal-digit-sequence hexadecimal-digit

universal-character-name ::=
    &quot;\u&quot; hex-quad
  | &quot;\U&quot; hex-quad hex-quad
  | &quot;\u{&quot; simple-hexadecimal-digit-sequence &quot;}&quot;
  | named-universal-character

preprocessing-token ::=
    header-name
  | &quot;import&quot;
  | &quot;module&quot;
  | &quot;export&quot;
  | identifier
  | pp-number
  | character-literal
  | user-defined-character-literal
  | string-literal
  | user-defined-string-literal
  | preprocessing-op-or-punc
  | &quot;{each non-whitespace character that cannot be one of the above}&quot;

//token ::=
//    identifier
//  | keyword
//  | literal
//  | operator-or-punctuator

header-name ::=
    &quot;&lt;&quot; h-char-sequence &quot;&gt;&quot;
  | '&quot;' q-char-sequence '&quot;'

h-char-sequence ::=
    h-char
  | h-char-sequence h-char

h-char ::=
    &quot;{any member of the translation character set except new-line and \unicode{003e}{greater-than sign}}&quot;

q-char-sequence ::=
    q-char
  | q-char-sequence q-char

q-char ::=
    &quot;{any member of the translation character set except new-line and \unicode{0022}{quotation mark}}&quot;

pp-number ::=
    digit
  | &quot;.&quot; digit
  | pp-number identifier-continue
  | pp-number &quot;'&quot; digit
  | pp-number &quot;'&quot; nondigit
  | pp-number &quot;e&quot; sign
  | pp-number &quot;E&quot; sign
  | pp-number &quot;p&quot; sign
  | pp-number &quot;P&quot; sign
  | pp-number &quot;.&quot;

identifier ::=
    identifier-start
  | identifier identifier-continue

identifier-start ::=
    nondigit
  | &quot;{an element of the translation character set with the Unicode property XID_Start}&quot;

identifier-continue ::=
    digit
  | nondigit
  | &quot;{an element of the translation character set with the Unicode property XID_Continue}&quot;

nondigit ::=
    &quot;a&quot; | &quot;b&quot; | &quot;c&quot; | &quot;d&quot; | &quot;e&quot; | &quot;f&quot; | &quot;g&quot; | &quot;h&quot; | &quot;i&quot; | &quot;j&quot; | &quot;k&quot; | &quot;l&quot; | &quot;m&quot;
  | &quot;n&quot; | &quot;o&quot; | &quot;p&quot; | &quot;q&quot; | &quot;r&quot; | &quot;s&quot; | &quot;t&quot; | &quot;u&quot; | &quot;v&quot; | &quot;w&quot; | &quot;x&quot; | &quot;y&quot; | &quot;z&quot;
  | &quot;A&quot; | &quot;B&quot; | &quot;C&quot; | &quot;D&quot; | &quot;E&quot; | &quot;F&quot; | &quot;G&quot; | &quot;H&quot; | &quot;I&quot; | &quot;J&quot; | &quot;K&quot; | &quot;L&quot; | &quot;M&quot;
  | &quot;N&quot; | &quot;O&quot; | &quot;P&quot; | &quot;Q&quot; | &quot;R&quot; | &quot;S&quot; | &quot;T&quot; | &quot;U&quot; | &quot;V&quot; | &quot;W&quot; | &quot;X&quot; | &quot;Y&quot; | &quot;Z&quot; | &quot;_&quot;

digit ::=
    &quot;0&quot; | &quot;1&quot; | &quot;2&quot; | &quot;3&quot; | &quot;4&quot; | &quot;5&quot; | &quot;6&quot; | &quot;7&quot; | &quot;8&quot; | &quot;9&quot;

keyword ::=
    &quot;{any identifier listed in lex.key}&quot;
  | &quot;import&quot;
  | &quot;module&quot;
  | &quot;export&quot;

preprocessing-op-or-punc ::=
    preprocessing-operator
  | operator-or-punctuator

preprocessing-operator ::=
    &quot;#&quot; | &quot;##&quot; | &quot;%:&quot; | &quot;%:%:&quot;

operator-or-punctuator ::=
    &quot;{&quot; | &quot;}&quot; | &quot;[&quot; | &quot;]&quot; | &quot;(&quot; | &quot;)&quot;
  | &quot;&lt;:&quot; | &quot;:&gt;&quot; | &quot;&lt;%&quot; | &quot;%&gt;&quot; | &quot;;&quot; | &quot;:&quot; | &quot;...&quot;
  | &quot;?&quot; | &quot;::&quot; | &quot;.&quot; | &quot;.*&quot; | &quot;-&gt;&quot; | &quot;-&gt;*&quot; | &quot;~&quot;
  | &quot;!&quot; | &quot;+&quot; | &quot;-&quot; | &quot;*&quot; | &quot;/&quot; | &quot;%&quot; | &quot;^&quot; | &quot;&amp;&quot; | &quot;|&quot;
  | &quot;=&quot; | &quot;+=&quot; | &quot;-=&quot; | &quot;*=&quot; | &quot;/=&quot; | &quot;%=&quot; | &quot;^=&quot; | &quot;&amp;=&quot; | &quot;|=&quot;
  | &quot;==&quot; | &quot;!=&quot; | &quot;&lt;&quot; | &quot;&gt;&quot; | &quot;&lt;=&quot; | &quot;&gt;=&quot; | &quot;&lt;=&gt;&quot; | &quot;&amp;&amp;&quot; | &quot;||&quot;
  | &quot;&lt;&lt;&quot; | &quot;&gt;&gt;&quot; | &quot;&lt;&lt;=&quot; | &quot;&gt;&gt;=&quot; | &quot;++&quot; | &quot;--&quot; | &quot;,&quot;
  | &quot;and&quot; | &quot;or&quot; | &quot;xor&quot; | &quot;not&quot; | &quot;bitand&quot; | &quot;bitor&quot; | &quot;compl&quot;
  | &quot;and_eq&quot; | &quot;or_eq&quot; | &quot;xor_eq&quot; | &quot;not_eq&quot;

literal ::=
    integer-literal
  | character-literal
  | floating-point-literal
  | string-literal
  | boolean-literal
  | pointer-literal
  | user-defined-literal

integer-literal ::=
    binary-literal integer-suffix?
  | octal-literal integer-suffix?
  | decimal-literal integer-suffix?
  | hexadecimal-literal integer-suffix?

binary-literal ::=
    &quot;0b&quot; binary-digit
  | &quot;0B&quot; binary-digit
  | binary-literal &quot;'&quot;? binary-digit

octal-literal ::=
    &quot;0&quot;
  | octal-literal &quot;'&quot;? octal-digit

decimal-literal ::=
    nonzero-digit
  | decimal-literal &quot;'&quot;? digit

hexadecimal-literal ::=
    hexadecimal-prefix hexadecimal-digit-sequence

binary-digit ::=
    &quot;0&quot; | &quot;1&quot;

octal-digit ::=
    &quot;0&quot; | &quot;1&quot; | &quot;2&quot; | &quot;3&quot; | &quot;4&quot; | &quot;5&quot; | &quot;6&quot; | &quot;7&quot;

nonzero-digit ::=
    &quot;1&quot; | &quot;2&quot; | &quot;3&quot; | &quot;4&quot; | &quot;5&quot; | &quot;6&quot; | &quot;7&quot; | &quot;8&quot; | &quot;9&quot;

hexadecimal-prefix ::=
    &quot;0x&quot; | &quot;0X&quot;

hexadecimal-digit-sequence ::=
    hexadecimal-digit
  | hexadecimal-digit-sequence &quot;'&quot;? hexadecimal-digit

hexadecimal-digit ::=
    &quot;0&quot; | &quot;1&quot; | &quot;2&quot; | &quot;3&quot; | &quot;4&quot; | &quot;5&quot; | &quot;6&quot; | &quot;7&quot; | &quot;8&quot; | &quot;9&quot;
  | &quot;a&quot; | &quot;b&quot; | &quot;c&quot; | &quot;d&quot; | &quot;e&quot; | &quot;f&quot;
  | &quot;A&quot; | &quot;B&quot; | &quot;C&quot; | &quot;D&quot; | &quot;E&quot; | &quot;F&quot;

integer-suffix ::=
    unsigned-suffix long-suffix?
  | unsigned-suffix long-long-suffix?
  | unsigned-suffix size-suffix?
  | long-suffix unsigned-suffix?
  | long-long-suffix unsigned-suffix?
  | size-suffix unsigned-suffix?

unsigned-suffix ::=
    &quot;u&quot; | &quot;U&quot;

long-suffix ::=
    &quot;l&quot; | &quot;L&quot;

long-long-suffix ::=
    &quot;ll&quot; | &quot;LL&quot;

size-suffix ::=
   &quot;z&quot; | &quot;Z&quot;

character-literal ::=
    encoding-prefix? &quot;'&quot; c-char-sequence &quot;'&quot;

encoding-prefix ::=
    &quot;u8&quot; | &quot;u&quot; | &quot;U&quot; | &quot;L&quot;

c-char-sequence ::=
    c-char
  | c-char-sequence c-char

c-char ::=
    basic-c-char
  | escape-sequence
  | universal-character-name

basic-c-char ::=
    &quot;{any member of the translation character set except the \unicode{0027}{apostrophe},}&quot;
        &quot;{\unicode{005c}{reverse solidus}, or new-line character}&quot;

escape-sequence ::=
    simple-escape-sequence
  | numeric-escape-sequence
  | conditional-escape-sequence

simple-escape-sequence ::=
    &quot;\&quot; simple-escape-sequence-char

simple-escape-sequence-char ::=
    &quot;'&quot; | '&quot;' | &quot;?&quot; | &quot;\&quot; | &quot;a&quot; | &quot;b&quot; | &quot;f&quot; | &quot;n&quot; | &quot;r&quot; | &quot;t&quot; | &quot;v&quot;

numeric-escape-sequence ::=
    octal-escape-sequence
  | hexadecimal-escape-sequence

simple-octal-digit-sequence ::=
    octal-digit
  | simple-octal-digit-sequence octal-digit

octal-escape-sequence ::=
    &quot;\&quot; octal-digit
  | &quot;\&quot; octal-digit octal-digit
  | &quot;\&quot; octal-digit octal-digit octal-digit
  | &quot;\o{&quot; simple-octal-digit-sequence &quot;}&quot;

hexadecimal-escape-sequence ::=
    &quot;\x&quot; simple-hexadecimal-digit-sequence
  | &quot;\x{&quot; simple-hexadecimal-digit-sequence &quot;}&quot;

conditional-escape-sequence ::=
    &quot;\&quot; conditional-escape-sequence-char

conditional-escape-sequence-char ::=
    '{any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the characters &quot;N&quot;, &quot;o&quot;, &quot;u&quot;, &quot;U&quot;, or &quot;x&quot;}'

floating-point-literal ::=
    decimal-floating-point-literal
  | hexadecimal-floating-point-literal

decimal-floating-point-literal ::=
    fractional-constant exponent-part? floating-point-suffix?
  | digit-sequence exponent-part floating-point-suffix?

hexadecimal-floating-point-literal ::=
    hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-point-suffix?
  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-point-suffix?

fractional-constant ::=
    digit-sequence? &quot;.&quot; digit-sequence
  | digit-sequence &quot;.&quot;

hexadecimal-fractional-constant ::=
    hexadecimal-digit-sequence? &quot;.&quot; hexadecimal-digit-sequence
  | hexadecimal-digit-sequence &quot;.&quot;

exponent-part ::=
    &quot;e&quot; sign? digit-sequence
  | &quot;E&quot; sign? digit-sequence

binary-exponent-part ::=
    &quot;p&quot; sign? digit-sequence
  | &quot;P&quot; sign? digit-sequence

sign ::=
    &quot;+&quot; | &quot;-&quot;

digit-sequence ::=
    digit
  | digit-sequence &quot;'&quot;? digit

floating-point-suffix ::=
    &quot;f&quot; | &quot;l&quot; | &quot;f16&quot; | &quot;f32&quot; | &quot;f64&quot; | &quot;f128&quot; | &quot;bf16&quot; | &quot;F&quot; | &quot;L&quot; | &quot;F16&quot; | &quot;F32&quot; | &quot;F64&quot; | &quot;F128&quot; | &quot;BF16&quot;

string-literal ::=
    encoding-prefix? '&quot;' s-char-sequence? '&quot;'
  | encoding-prefix? &quot;R&quot; raw-string

s-char-sequence ::=
    s-char
  | s-char-sequence s-char

s-char ::=
    basic-s-char
  | escape-sequence
  | universal-character-name

basic-s-char ::=
    &quot;{any member of the translation character set except the \unicode{0022}{quotation mark},}&quot;
        &quot;{\unicode{005c}{reverse solidus}, or new-line character}&quot;

raw-string ::=
    '&quot;' d-char-sequence? &quot;(&quot; r-char-sequence? &quot;)&quot; d-char-sequence? '&quot;'

r-char-sequence ::=
    r-char
  | r-char-sequence r-char

r-char ::=
    &quot;{any member of the translation character set, except a \unicode{0029}{right parenthesis} followed by}&quot;
        &quot;{the initial d-char-sequence (which may be empty) followed by a \unicode{0022}{quotation mark}}&quot;

d-char-sequence ::=
    d-char
  | d-char-sequence d-char

d-char ::=
    &quot;{any member of the basic character set except:}&quot;
        &quot;{\unicode{0020}{space}, \unicode{0028}{left parenthesis}, \unicode{0029}{right parenthesis}, \unicode{005c}{reverse solidus},}&quot;
        &quot;{\unicode{0009}{character tabulation}, \unicode{000b}{line tabulation}, \unicode{000c}{form feed}, and new-line}&quot;

unevaluated-string ::=
    string-literal

boolean-literal ::=
    &quot;false&quot;
  | &quot;true&quot;

pointer-literal ::=
    &quot;nullptr&quot;

user-defined-literal ::=
    user-defined-integer-literal
  | user-defined-floating-point-literal
  | user-defined-string-literal
  | user-defined-character-literal

user-defined-integer-literal ::=
    decimal-literal ud-suffix
  | octal-literal ud-suffix
  | hexadecimal-literal ud-suffix
  | binary-literal ud-suffix

user-defined-floating-point-literal ::=
    fractional-constant exponent-part? ud-suffix
  | digit-sequence exponent-part ud-suffix
  | hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix
  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix

user-defined-string-literal ::=
    string-literal ud-suffix

user-defined-character-literal ::=
    character-literal ud-suffix

ud-suffix ::=
    identifier

//== basic.tex

translation-unit ::=
    declaration-seq?
  | global-module-fragment? module-declaration declaration-seq? private-module-fragment?

//== expressions.tex

primary-expression ::=
    literal
  | &quot;this&quot;
  | &quot;(&quot; expression &quot;)&quot;
  | id-expression
  | lambda-expression
  | fold-expression
  | requires-expression

id-expression ::=
    unqualified-id
  | qualified-id
  | pack-index-expression

unqualified-id ::=
    identifier
  | operator-function-id
  | conversion-function-id
  | literal-operator-id
  | &quot;~&quot; type-name
  | &quot;~&quot; computed-type-specifier
  | template-id

qualified-id ::=
    nested-name-specifier &quot;template&quot;? unqualified-id

nested-name-specifier ::=
    &quot;::&quot;
  | type-name &quot;::&quot;
  | namespace-name &quot;::&quot;
  | computed-type-specifier &quot;::&quot;
  | nested-name-specifier identifier &quot;::&quot;
  | nested-name-specifier &quot;template&quot;? simple-template-id &quot;::&quot;

pack-index-expression ::=
    id-expression &quot;...&quot; &quot;[&quot; constant-expression &quot;]&quot;

lambda-expression ::=
    lambda-introducer attribute-specifier-seq? lambda-declarator compound-statement
  | lambda-introducer &quot;&lt;&quot; template-parameter-list &quot;&gt;&quot; requires-clause? attribute-specifier-seq?
         lambda-declarator compound-statement

lambda-introducer ::=
    &quot;[&quot; lambda-capture? &quot;]&quot;

lambda-declarator ::=
    lambda-specifier-seq noexcept-specifier? attribute-specifier-seq? trailing-return-type?
  | noexcept-specifier attribute-specifier-seq? trailing-return-type?
  | trailing-return-type?
  | &quot;(&quot; parameter-declaration-clause &quot;)&quot; lambda-specifier-seq? noexcept-specifier? attribute-specifier-seq?
         trailing-return-type? requires-clause?

lambda-specifier ::=
    &quot;consteval&quot;
  | &quot;constexpr&quot;
  | &quot;mutable&quot;
  | &quot;static&quot;

lambda-specifier-seq ::=
    lambda-specifier
  | lambda-specifier lambda-specifier-seq

lambda-capture ::=
    capture-default
  | capture-list
  | capture-default &quot;,&quot; capture-list

capture-default ::=
    &quot;&amp;&quot;
  | &quot;=&quot;

capture-list ::=
    capture
  | capture-list &quot;,&quot; capture

capture ::=
    simple-capture
  | init-capture

simple-capture ::=
    identifier &quot;...&quot;?
  | &quot;&amp;&quot; identifier &quot;...&quot;?
  | &quot;this&quot;
  | &quot;*&quot; &quot;this&quot;

init-capture ::=
    &quot;...&quot;? identifier initializer
  | &quot;&amp;&quot; &quot;...&quot;? identifier initializer

fold-expression ::=
    &quot;(&quot; cast-expression fold-operator &quot;...&quot; &quot;)&quot;
  | &quot;(&quot; &quot;...&quot; fold-operator cast-expression &quot;)&quot;
  | &quot;(&quot; cast-expression fold-operator &quot;...&quot; fold-operator cast-expression &quot;)&quot;

fold-operator ::=
    &quot;+&quot; | &quot;-&quot; | &quot;*&quot; | &quot;/&quot; | &quot;%&quot; | &quot;^&quot; | &quot;&amp;&quot; | &quot;|&quot; | &quot;&lt;&lt;&quot; | &quot;&gt;&gt;&quot;
  | &quot;+=&quot; | &quot;-=&quot; | &quot;*=&quot; | &quot;/=&quot; | &quot;%=&quot; | &quot;^=&quot; | &quot;&amp;=&quot; | &quot;|=&quot; | &quot;&lt;&lt;=&quot; | &quot;&gt;&gt;=&quot; | &quot;=&quot;
  | &quot;==&quot; | &quot;!=&quot; | &quot;&lt;&quot; | &quot;&gt;&quot; | &quot;&lt;=&quot; | &quot;&gt;=&quot; | &quot;&amp;&amp;&quot; | &quot;||&quot; | &quot;,&quot; | &quot;.*&quot; | &quot;-&gt;*&quot;

requires-expression ::=
    &quot;requires&quot; requirement-parameter-list? requirement-body

requirement-parameter-list ::=
    &quot;(&quot; parameter-declaration-clause &quot;)&quot;

requirement-body ::=
    &quot;{&quot; requirement-seq &quot;}&quot;

requirement-seq ::=
    requirement
  | requirement requirement-seq

requirement ::=
    simple-requirement
  | type-requirement
  | compound-requirement
  | nested-requirement

simple-requirement ::=
    expression &quot;;&quot;

type-requirement ::=
    &quot;typename&quot; nested-name-specifier? type-name &quot;;&quot;

compound-requirement ::=
    &quot;{&quot; expression &quot;}&quot; &quot;noexcept&quot;? return-type-requirement? &quot;;&quot;

return-type-requirement ::=
    &quot;-&gt;&quot; type-constraint

nested-requirement ::=
    &quot;requires&quot; constraint-expression &quot;;&quot;

postfix-expression ::=
    primary-expression
  | postfix-expression &quot;[&quot; expression-list? &quot;]&quot;
  | postfix-expression &quot;(&quot; expression-list? &quot;)&quot;
  | simple-type-specifier &quot;(&quot; expression-list? &quot;)&quot;
  | typename-specifier &quot;(&quot; expression-list? &quot;)&quot;
  | simple-type-specifier braced-init-list
  | typename-specifier braced-init-list
  | postfix-expression &quot;.&quot; &quot;template&quot;? id-expression
  | postfix-expression &quot;-&gt;&quot; &quot;template&quot;? id-expression
  | postfix-expression &quot;++&quot;
  | postfix-expression &quot;--&quot;
  | &quot;dynamic_cast&quot; &quot;&lt;&quot; type-id &quot;&gt;&quot; &quot;(&quot; expression &quot;)&quot;
  | &quot;static_cast&quot; &quot;&lt;&quot; type-id &quot;&gt;&quot; &quot;(&quot; expression &quot;)&quot;
  | &quot;reinterpret_cast&quot; &quot;&lt;&quot; type-id &quot;&gt;&quot; &quot;(&quot; expression &quot;)&quot;
  | &quot;const_cast&quot; &quot;&lt;&quot; type-id &quot;&gt;&quot; &quot;(&quot; expression &quot;)&quot;
  | &quot;typeid&quot; &quot;(&quot; expression &quot;)&quot;
  | &quot;typeid&quot; &quot;(&quot; type-id &quot;)&quot;

expression-list ::=
    initializer-list

unary-expression ::=
    postfix-expression
  | unary-operator cast-expression
  | &quot;++&quot; cast-expression
  | &quot;--&quot; cast-expression
  | await-expression
  | &quot;sizeof&quot; unary-expression
  | &quot;sizeof&quot; &quot;(&quot; type-id &quot;)&quot;
  | &quot;sizeof&quot; &quot;...&quot; &quot;(&quot; identifier &quot;)&quot;
  | &quot;alignof&quot; &quot;(&quot; type-id &quot;)&quot;
  | noexcept-expression
  | new-expression
  | delete-expression

unary-operator ::=
    &quot;*&quot; | &quot;&amp;&quot; | &quot;+&quot; | &quot;-&quot; | &quot;!&quot; | &quot;~&quot;

await-expression ::=
    &quot;co_await&quot; cast-expression

noexcept-expression ::=
  &quot;noexcept&quot; &quot;(&quot; expression &quot;)&quot;

new-expression ::=
    &quot;::&quot;? &quot;new&quot; new-placement? new-type-id new-initializer?
  | &quot;::&quot;? &quot;new&quot; new-placement? &quot;(&quot; type-id &quot;)&quot; new-initializer?

new-placement ::=
    &quot;(&quot; expression-list &quot;)&quot;

new-type-id ::=
    type-specifier-seq new-declarator?

new-declarator ::=
    ptr-operator new-declarator?
  | noptr-new-declarator

noptr-new-declarator ::=
    &quot;[&quot; expression? &quot;]&quot; attribute-specifier-seq?
  | noptr-new-declarator &quot;[&quot; constant-expression &quot;]&quot; attribute-specifier-seq?

new-initializer ::=
    &quot;(&quot; expression-list? &quot;)&quot;
  | braced-init-list

delete-expression ::=
    &quot;::&quot;? &quot;delete&quot; cast-expression
  | &quot;::&quot;? &quot;delete&quot; &quot;[&quot; &quot;]&quot; cast-expression

cast-expression ::=
    unary-expression
  | &quot;(&quot; type-id &quot;)&quot; cast-expression

pm-expression ::=
    cast-expression
  | pm-expression &quot;.*&quot; cast-expression
  | pm-expression &quot;-&gt;*&quot; cast-expression

multiplicative-expression ::=
    pm-expression
  | multiplicative-expression &quot;*&quot; pm-expression
  | multiplicative-expression &quot;/&quot; pm-expression
  | multiplicative-expression &quot;%&quot; pm-expression

additive-expression ::=
    multiplicative-expression
  | additive-expression &quot;+&quot; multiplicative-expression
  | additive-expression &quot;-&quot; multiplicative-expression

shift-expression ::=
    additive-expression
  | shift-expression &quot;&lt;&lt;&quot; additive-expression
  | shift-expression &quot;&gt;&gt;&quot; additive-expression

compare-expression ::=
    shift-expression
  | compare-expression &quot;&lt;=&gt;&quot; shift-expression

relational-expression ::=
    compare-expression
  | relational-expression &quot;&lt;&quot; compare-expression
  | relational-expression &quot;&gt;&quot; compare-expression
  | relational-expression &quot;&lt;=&quot; compare-expression
  | relational-expression &quot;&gt;=&quot; compare-expression

equality-expression ::=
    relational-expression
  | equality-expression &quot;==&quot; relational-expression
  | equality-expression &quot;!=&quot; relational-expression

and-expression ::=
    equality-expression
  | and-expression &quot;&amp;&quot; equality-expression

exclusive-or-expression ::=
    and-expression
  | exclusive-or-expression &quot;^&quot; and-expression

inclusive-or-expression ::=
    exclusive-or-expression
  | inclusive-or-expression &quot;|&quot; exclusive-or-expression

logical-and-expression ::=
    inclusive-or-expression
  | logical-and-expression &quot;&amp;&amp;&quot; inclusive-or-expression

logical-or-expression ::=
    logical-and-expression
  | logical-or-expression &quot;||&quot; logical-and-expression

conditional-expression ::=
    logical-or-expression
  | logical-or-expression &quot;?&quot; expression &quot;:&quot; assignment-expression

  yield-expression ::=
  &quot;co_yield&quot; assignment-expression
  | &quot;co_yield&quot; braced-init-list

throw-expression ::=
    &quot;throw&quot;  assignment-expression?

assignment-expression ::=
    conditional-expression
  | yield-expression
  | throw-expression
  | logical-or-expression assignment-operator initializer-clause

assignment-operator ::=
    &quot;=&quot; | &quot;*=&quot; | &quot;/=&quot; | &quot;%=&quot; | &quot;+=&quot; | &quot;-=&quot; | &quot;&gt;&gt;=&quot; | &quot;&lt;&lt;=&quot; | &quot;&amp;=&quot; | &quot;^=&quot; | &quot;|=&quot;

expression ::=
    assignment-expression
  | expression &quot;,&quot; assignment-expression

constant-expression ::=
    conditional-expression

//== statements.tex

statement ::=
    labeled-statement
  | attribute-specifier-seq? expression-statement
  | attribute-specifier-seq? compound-statement
  | attribute-specifier-seq? selection-statement
  | attribute-specifier-seq? iteration-statement
  | attribute-specifier-seq? jump-statement
  | declaration-statement
  | attribute-specifier-seq? try-block

init-statement ::=
    expression-statement
  | simple-declaration
  | alias-declaration

condition ::=
    expression
  | attribute-specifier-seq? decl-specifier-seq declarator brace-or-equal-initializer

label ::=
    attribute-specifier-seq? identifier &quot;:&quot;
  | attribute-specifier-seq? &quot;case&quot; constant-expression &quot;:&quot;
  | attribute-specifier-seq? &quot;default&quot; &quot;:&quot;

labeled-statement ::=
    label statement

expression-statement ::=
    expression? &quot;;&quot;

compound-statement ::=
    &quot;{&quot; statement-seq? label-seq? &quot;}&quot;

statement-seq ::=
    statement
  | statement-seq statement

label-seq ::=
    label
  | label-seq label

selection-statement ::=
    &quot;if&quot; &quot;constexpr&quot;? &quot;(&quot; init-statement? condition &quot;)&quot; statement
  | &quot;if&quot; &quot;constexpr&quot;? &quot;(&quot; init-statement? condition &quot;)&quot; statement &quot;else&quot; statement
  | &quot;if&quot; &quot;!&quot;? &quot;consteval&quot; compound-statement
  | &quot;if&quot; &quot;!&quot;? &quot;consteval&quot; compound-statement &quot;else&quot; statement
  | &quot;switch&quot; &quot;(&quot; init-statement? condition &quot;)&quot; statement

iteration-statement ::=
    &quot;while&quot; &quot;(&quot; condition &quot;)&quot; statement
  | &quot;do&quot; statement &quot;while&quot; &quot;(&quot; expression &quot;)&quot; &quot;;&quot;
  | &quot;for&quot; &quot;(&quot; init-statement condition? &quot;;&quot; expression? &quot;)&quot; statement
  | &quot;for&quot; &quot;(&quot; init-statement? for-range-declaration &quot;:&quot; for-range-initializer &quot;)&quot; statement

for-range-declaration ::=
    attribute-specifier-seq? decl-specifier-seq declarator
  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? &quot;[&quot; identifier-list &quot;]&quot;

for-range-initializer ::=
    expr-or-braced-init-list

jump-statement ::=
    &quot;break&quot; &quot;;&quot;
  | &quot;continue&quot; &quot;;&quot;
  | &quot;return&quot; expr-or-braced-init-list? &quot;;&quot;
  | coroutine-return-statement
  | &quot;goto&quot; identifier &quot;;&quot;

coroutine-return-statement ::=
    &quot;co_return&quot; expr-or-braced-init-list? &quot;;&quot;

declaration-statement ::=
    block-declaration

//== declarations.tex

declaration-seq ::=
    declaration
  | declaration-seq declaration

declaration ::=
    name-declaration
  | special-declaration

name-declaration ::=
    block-declaration
  | nodeclspec-function-declaration
  | function-definition
  | template-declaration
  | deduction-guide
  | linkage-specification
  | namespace-definition
  | empty-declaration
  | attribute-declaration
  | module-import-declaration

special-declaration ::=
    explicit-instantiation
  | explicit-specialization
  | export-declaration

block-declaration ::=
    simple-declaration
  | asm-declaration
  | namespace-alias-definition
  | using-declaration
  | using-enum-declaration
  | using-directive
  | static_assert-declaration
  | alias-declaration
  | opaque-enum-declaration

nodeclspec-function-declaration ::=
    attribute-specifier-seq? declarator &quot;;&quot;

alias-declaration ::=
    &quot;using&quot; identifier attribute-specifier-seq? &quot;=&quot; defining-type-id &quot;;&quot;

simple-declaration ::=
    decl-specifier-seq init-declarator-list? &quot;;&quot;
  | attribute-specifier-seq decl-specifier-seq init-declarator-list &quot;;&quot;
  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? &quot;[&quot; identifier-list &quot;]&quot; initializer &quot;;&quot;

static_assert-message ::=
  unevaluated-string
  | constant-expression

static_assert-declaration ::=
  &quot;static_assert&quot; &quot;(&quot; constant-expression &quot;)&quot; &quot;;&quot;
  | &quot;static_assert&quot; &quot;(&quot; constant-expression &quot;,&quot; static_assert-message &quot;)&quot; &quot;;&quot;

empty-declaration ::=
    &quot;;&quot;

attribute-declaration ::=
    attribute-specifier-seq &quot;;&quot;

decl-specifier ::=
    storage-class-specifier
  | defining-type-specifier
  | function-specifier
  | &quot;friend&quot;
  | &quot;typedef&quot;
  | &quot;constexpr&quot;
  | &quot;consteval&quot;
  | &quot;constinit&quot;
  | &quot;inline&quot;

decl-specifier-seq ::=
    decl-specifier attribute-specifier-seq?
  | decl-specifier decl-specifier-seq

storage-class-specifier ::=
    &quot;static&quot;
  | &quot;thread_local&quot;
  | &quot;extern&quot;
  | &quot;mutable&quot;

function-specifier ::=
    &quot;virtual&quot;
  | explicit-specifier

explicit-specifier ::=
    &quot;explicit&quot; &quot;(&quot; constant-expression &quot;)&quot;
  | &quot;explicit&quot;

typedef-name ::=
    identifier
  | simple-template-id

type-specifier ::=
  simple-type-specifier
  | elaborated-type-specifier
  | typename-specifier
  | cv-qualifier

type-specifier-seq ::=
    type-specifier attribute-specifier-seq?
  | type-specifier type-specifier-seq

defining-type-specifier ::=
    type-specifier
  | class-specifier
  | enum-specifier

defining-type-specifier-seq ::=
  defining-type-specifier attribute-specifier-seq?
  | defining-type-specifier defining-type-specifier-seq

simple-type-specifier ::=
    nested-name-specifier? type-name
  | nested-name-specifier &quot;template&quot; simple-template-id
  | computed-type-specifier
  | placeholder-type-specifier
  | nested-name-specifier? template-name
  | &quot;char&quot;
  | &quot;char8_t&quot;
  | &quot;char16_t&quot;
  | &quot;char32_t&quot;
  | &quot;wchar_t&quot;
  | &quot;bool&quot;
  | &quot;short&quot;
  | &quot;int&quot;
  | &quot;long&quot;
  | &quot;signed&quot;
  | &quot;unsigned&quot;
  | &quot;float&quot;
  | &quot;double&quot;
  | &quot;void&quot;

type-name ::=
    class-name
  | enum-name
  | typedef-name

computed-type-specifier ::=
    decltype-specifier
  | pack-index-specifier

pack-index-specifier ::=
    typedef-name &quot;...&quot; &quot;[&quot; constant-expression &quot;]&quot;

elaborated-type-specifier ::=
    class-key attribute-specifier-seq? nested-name-specifier? identifier
  | class-key simple-template-id
  | class-key nested-name-specifier &quot;template&quot;? simple-template-id
  | &quot;enum&quot; nested-name-specifier? identifier

decltype-specifier ::=
  &quot;decltype&quot; &quot;(&quot; expression &quot;)&quot;

placeholder-type-specifier ::=
  type-constraint? &quot;auto&quot;
  | type-constraint? &quot;decltype&quot; &quot;(&quot; &quot;auto&quot; &quot;)&quot;

init-declarator-list ::=
    init-declarator
  | init-declarator-list &quot;,&quot; init-declarator

init-declarator ::=
    declarator initializer?
  | declarator requires-clause

declarator ::=
    ptr-declarator
  | noptr-declarator parameters-and-qualifiers trailing-return-type

ptr-declarator ::=
    noptr-declarator
  | ptr-operator ptr-declarator

noptr-declarator ::=
    declarator-id attribute-specifier-seq?
  | noptr-declarator parameters-and-qualifiers
  | noptr-declarator &quot;[&quot; constant-expression? &quot;]&quot; attribute-specifier-seq?
  | &quot;(&quot; ptr-declarator &quot;)&quot;

parameters-and-qualifiers ::=
    &quot;(&quot; parameter-declaration-clause &quot;)&quot; cv-qualifier-seq?
        ref-qualifier? noexcept-specifier? attribute-specifier-seq?

trailing-return-type ::=
    &quot;-&gt;&quot; type-id

ptr-operator ::=
    &quot;*&quot; attribute-specifier-seq? cv-qualifier-seq?
  | &quot;&amp;&quot; attribute-specifier-seq?
  | &quot;&amp;&amp;&quot; attribute-specifier-seq?
  | nested-name-specifier &quot;*&quot; attribute-specifier-seq? cv-qualifier-seq?

cv-qualifier-seq ::=
    cv-qualifier cv-qualifier-seq?

cv-qualifier ::=
    &quot;const&quot;
  | &quot;volatile&quot;

ref-qualifier ::=
    &quot;&amp;&quot;
  | &quot;&amp;&amp;&quot;

declarator-id ::=
    &quot;...&quot;? id-expression

type-id ::=
    type-specifier-seq abstract-declarator?

defining-type-id ::=
    defining-type-specifier-seq abstract-declarator?

abstract-declarator ::=
    ptr-abstract-declarator
  | noptr-abstract-declarator? parameters-and-qualifiers trailing-return-type
  | abstract-pack-declarator

ptr-abstract-declarator ::=
    noptr-abstract-declarator
  | ptr-operator ptr-abstract-declarator?

noptr-abstract-declarator ::=
    noptr-abstract-declarator? parameters-and-qualifiers
  | noptr-abstract-declarator? &quot;[&quot; constant-expression? &quot;]&quot; attribute-specifier-seq?
  | &quot;(&quot; ptr-abstract-declarator &quot;)&quot;

abstract-pack-declarator ::=
    noptr-abstract-pack-declarator
  | ptr-operator abstract-pack-declarator

noptr-abstract-pack-declarator ::=
    noptr-abstract-pack-declarator parameters-and-qualifiers
  | &quot;...&quot;

parameter-declaration-clause ::=
    parameter-declaration-list? &quot;...&quot;?
  | parameter-declaration-list &quot;,&quot; &quot;...&quot;

parameter-declaration-list ::=
    parameter-declaration
  | parameter-declaration-list &quot;,&quot; parameter-declaration

parameter-declaration ::=
    attribute-specifier-seq? &quot;this&quot;? decl-specifier-seq declarator
  | attribute-specifier-seq? decl-specifier-seq declarator &quot;=&quot; initializer-clause
  | attribute-specifier-seq? &quot;this&quot;? decl-specifier-seq abstract-declarator?
  | attribute-specifier-seq? decl-specifier-seq abstract-declarator? &quot;=&quot; initializer-clause

initializer ::=
    brace-or-equal-initializer
  | &quot;(&quot; expression-list &quot;)&quot;

brace-or-equal-initializer ::=
    &quot;=&quot; initializer-clause
  | braced-init-list

initializer-clause ::=
    assignment-expression
  | braced-init-list

braced-init-list ::=
    &quot;{&quot; initializer-list &quot;,&quot;? &quot;}&quot;
  | &quot;{&quot; designated-initializer-list &quot;,&quot;? &quot;}&quot;
  | &quot;{&quot; &quot;}&quot;

initializer-list ::=
    initializer-clause &quot;...&quot;?
  | initializer-list &quot;,&quot; initializer-clause &quot;...&quot;?

designated-initializer-list ::=
    designated-initializer-clause
  | designated-initializer-list &quot;,&quot; designated-initializer-clause

designated-initializer-clause ::=
    designator brace-or-equal-initializer

designator ::=
    &quot;.&quot; identifier

expr-or-braced-init-list ::=
    expression
  | braced-init-list

function-definition ::=
    attribute-specifier-seq? decl-specifier-seq? declarator virt-specifier-seq? function-body
  | attribute-specifier-seq? decl-specifier-seq? declarator requires-clause function-body

function-body ::=
    ctor-initializer? compound-statement
  | function-try-block
  | &quot;=&quot; &quot;default&quot; &quot;;&quot;
  | &quot;=&quot; &quot;delete&quot; &quot;;&quot;

enum-name ::=
    identifier

enum-specifier ::=
    enum-head &quot;{&quot; enumerator-list? &quot;}&quot;
  | enum-head &quot;{&quot; enumerator-list &quot;,&quot; &quot;}&quot;

enum-head ::=
    enum-key attribute-specifier-seq? enum-head-name? enum-base?

enum-head-name ::=
    nested-name-specifier? identifier

opaque-enum-declaration ::=
    enum-key attribute-specifier-seq? enum-head-name enum-base? &quot;;&quot;

enum-key ::=
    &quot;enum&quot;
  | &quot;enum&quot; &quot;class&quot;
  | &quot;enum&quot; &quot;struct&quot;

enum-base ::=
    &quot;:&quot; type-specifier-seq

enumerator-list ::=
    enumerator-definition
  | enumerator-list &quot;,&quot; enumerator-definition

enumerator-definition ::=
    enumerator
  | enumerator &quot;=&quot; constant-expression

enumerator ::=
    identifier attribute-specifier-seq?

using-enum-declaration ::=
    &quot;using&quot; &quot;enum&quot; using-enum-declarator &quot;;&quot;

using-enum-declarator ::=
    nested-name-specifier? identifier
  | nested-name-specifier? simple-template-id

namespace-name ::=
        identifier
  | namespace-alias

namespace-definition ::=
        named-namespace-definition
  | unnamed-namespace-definition
  | nested-namespace-definition

named-namespace-definition ::=
        &quot;inline&quot;? &quot;namespace&quot; attribute-specifier-seq? identifier &quot;{&quot; namespace-body &quot;}&quot;

unnamed-namespace-definition ::=
        &quot;inline&quot;? &quot;namespace&quot; attribute-specifier-seq? &quot;{&quot; namespace-body &quot;}&quot;

nested-namespace-definition ::=
        &quot;namespace&quot; enclosing-namespace-specifier &quot;::&quot; &quot;inline&quot;? identifier &quot;{&quot; namespace-body &quot;}&quot;

enclosing-namespace-specifier ::=
        identifier
  | enclosing-namespace-specifier &quot;::&quot; &quot;inline&quot;? identifier

namespace-body ::=
        declaration-seq?

namespace-alias ::=
        identifier

namespace-alias-definition ::=
        &quot;namespace&quot; identifier &quot;=&quot; qualified-namespace-specifier &quot;;&quot;

qualified-namespace-specifier ::=
    nested-name-specifier? namespace-name

using-directive ::=
    attribute-specifier-seq? &quot;using&quot; &quot;namespace&quot; nested-name-specifier? namespace-name &quot;;&quot;

using-declaration ::=
    &quot;using&quot; using-declarator-list &quot;;&quot;

using-declarator-list ::=
    using-declarator &quot;...&quot;?
  | using-declarator-list &quot;,&quot; using-declarator &quot;...&quot;?

using-declarator ::=
    &quot;typename&quot;? nested-name-specifier unqualified-id

asm-declaration ::=
    attribute-specifier-seq? &quot;asm&quot; &quot;(&quot; balanced-token-seq &quot;)&quot; &quot;;&quot;

linkage-specification ::=
    &quot;extern&quot; unevaluated-string &quot;{&quot; declaration-seq? &quot;}&quot;
  | &quot;extern&quot; unevaluated-string name-declaration

attribute-specifier-seq ::=
  attribute-specifier-seq? attribute-specifier

attribute-specifier ::=
  &quot;[&quot; &quot;[&quot; attribute-using-prefix? attribute-list &quot;]&quot; &quot;]&quot;
  | alignment-specifier

alignment-specifier ::=
  &quot;alignas&quot; &quot;(&quot; type-id &quot;...&quot;? &quot;)&quot;
  | &quot;alignas&quot; &quot;(&quot; constant-expression &quot;...&quot;? &quot;)&quot;

attribute-using-prefix ::=
  &quot;using&quot; attribute-namespace &quot;:&quot;

attribute-list ::=
  attribute?
  | attribute-list &quot;,&quot; attribute?
  | attribute &quot;...&quot;
  | attribute-list &quot;,&quot; attribute &quot;...&quot;

attribute ::=
    attribute-token attribute-argument-clause?

attribute-token ::=
    identifier
  | attribute-scoped-token

attribute-scoped-token ::=
    attribute-namespace &quot;::&quot; identifier

attribute-namespace ::=
    identifier

attribute-argument-clause ::=
    &quot;(&quot; balanced-token-seq? &quot;)&quot;

balanced-token-seq ::=
    balanced-token
  | balanced-token-seq balanced-token

balanced-token ::=
    &quot;(&quot; balanced-token-seq? &quot;)&quot;
  | &quot;[&quot; balanced-token-seq? &quot;]&quot;
  | &quot;{&quot; balanced-token-seq? &quot;}&quot;
  | &quot;{any token other than a parenthesis, a bracket, or a brace}&quot;

//== modules.tex

module-declaration ::=
    &quot;export&quot;? &quot;module&quot; module-name module-partition? attribute-specifier-seq? &quot;;&quot;

module-name ::=
    module-name-qualifier? identifier

module-partition ::=
    &quot;:&quot; module-name-qualifier? identifier

module-name-qualifier ::=
    identifier &quot;.&quot;
  | module-name-qualifier identifier &quot;.&quot;

export-declaration ::=
    &quot;export&quot; name-declaration
  | &quot;export&quot; &quot;{&quot; declaration-seq? &quot;}&quot;
  | &quot;export&quot; module-import-declaration

module-import-declaration ::=
    &quot;import&quot; module-name attribute-specifier-seq? &quot;;&quot;
  | &quot;import&quot; module-partition attribute-specifier-seq? &quot;;&quot;
  | &quot;import&quot; header-name attribute-specifier-seq? &quot;;&quot;

global-module-fragment ::=
    &quot;module&quot; &quot;;&quot; declaration-seq?

private-module-fragment ::=
    &quot;module&quot; &quot;:&quot; &quot;private&quot; &quot;;&quot; declaration-seq?

//== classes.tex

class-name ::=
    identifier
  | simple-template-id

class-specifier ::=
    class-head &quot;{&quot; member-specification? &quot;}&quot;

class-head ::=
    class-key attribute-specifier-seq? class-head-name class-virt-specifier? base-clause?
  | class-key attribute-specifier-seq? base-clause?

class-head-name ::=
    nested-name-specifier? class-name

class-virt-specifier ::=
    &quot;final&quot;

class-key ::=
    &quot;class&quot;
  | &quot;struct&quot;
  | &quot;union&quot;

member-specification ::=
    member-declaration member-specification?
  | access-specifier &quot;:&quot; member-specification?

member-declaration ::=
    attribute-specifier-seq? decl-specifier-seq? member-declarator-list? &quot;;&quot;
  | function-definition
  | using-declaration
  | using-enum-declaration
  | static_assert-declaration
  | template-declaration
  | explicit-specialization
  | deduction-guide
  | alias-declaration
  | opaque-enum-declaration
  | empty-declaration

member-declarator-list ::=
    member-declarator
  | member-declarator-list &quot;,&quot; member-declarator

member-declarator ::=
    declarator virt-specifier-seq? pure-specifier?
  | declarator requires-clause
  | declarator brace-or-equal-initializer?
  | identifier? attribute-specifier-seq? &quot;:&quot; constant-expression brace-or-equal-initializer?

virt-specifier-seq ::=
    virt-specifier
  | virt-specifier-seq virt-specifier

virt-specifier ::=
    &quot;override&quot;
  | &quot;final&quot;

pure-specifier ::=
    &quot;=&quot; &quot;0&quot;

conversion-function-id ::=
    &quot;operator&quot; conversion-type-id

conversion-type-id ::=
    type-specifier-seq conversion-declarator?

conversion-declarator ::=
    ptr-operator conversion-declarator?

base-clause ::=
    &quot;:&quot; base-specifier-list

base-specifier-list ::=
    base-specifier &quot;...&quot;?
  | base-specifier-list &quot;,&quot; base-specifier &quot;...&quot;?

base-specifier ::=
    attribute-specifier-seq? class-or-decltype
  | attribute-specifier-seq? &quot;virtual&quot; access-specifier? class-or-decltype
  | attribute-specifier-seq? access-specifier &quot;virtual&quot;? class-or-decltype

class-or-decltype ::=
    nested-name-specifier? type-name
  | nested-name-specifier &quot;template&quot; simple-template-id
  | decltype-specifier

access-specifier ::=
    &quot;private&quot;
  | &quot;protected&quot;
  | &quot;public&quot;

ctor-initializer ::=
    &quot;:&quot; mem-initializer-list

mem-initializer-list ::=
    mem-initializer &quot;...&quot;?
  | mem-initializer-list &quot;,&quot; mem-initializer &quot;...&quot;?

mem-initializer ::=
    mem-initializer-id &quot;(&quot; expression-list? &quot;)&quot;
  | mem-initializer-id braced-init-list

mem-initializer-id ::=
    class-or-decltype
  | identifier

//== overloading.tex

operator-function-id ::=
    &quot;operator&quot; operator

operator ::=
    &quot;new&quot; | &quot;delete&quot; | &quot;new[]&quot; | &quot;delete[]&quot; | &quot;co_await&quot; | &quot;()&quot; | &quot;[]&quot; | &quot;-&gt;&quot; | &quot;-&gt;*&quot;
  | &quot;~&quot; | &quot;!&quot; | &quot;+&quot; | &quot;-&quot; | &quot;*&quot; | &quot;/&quot; | &quot;%&quot; | &quot;^&quot; | &quot;&amp;&quot;
  | &quot;|&quot; | &quot;=&quot; | &quot;+=&quot; | &quot;-=&quot; | &quot;*=&quot; | &quot;/=&quot; | &quot;%=&quot; | &quot;^=&quot; | &quot;&amp;=&quot;
  | &quot;|=&quot; | &quot;==&quot; | &quot;!=&quot; | &quot;&lt;&quot; | &quot;&gt;&quot; | &quot;&lt;=&quot; | &quot;&gt;=&quot; | &quot;&lt;=&gt;&quot; | &quot;&amp;&amp;&quot;
  | &quot;||&quot; | &quot;&lt;&lt;&quot; | &quot;&gt;&gt;&quot; | &quot;&lt;&lt;=&quot; | &quot;&gt;&gt;=&quot; | &quot;++&quot; | &quot;--&quot; | &quot;,&quot;

literal-operator-id ::=
    &quot;operator&quot; unevaluated-string identifier
  | &quot;operator&quot; user-defined-string-literal

//== templates.tex

template-declaration ::=
  template-head declaration
  | template-head concept-definition

template-head ::=
  &quot;template&quot; &quot;&lt;&quot; template-parameter-list &quot;&gt;&quot; requires-clause?

template-parameter-list ::=
  template-parameter
  | template-parameter-list &quot;,&quot; template-parameter

requires-clause ::=
  &quot;requires&quot; constraint-logical-or-expression

constraint-logical-or-expression ::=
  constraint-logical-and-expression
  | constraint-logical-or-expression &quot;||&quot; constraint-logical-and-expression

constraint-logical-and-expression ::=
  primary-expression
  | constraint-logical-and-expression &quot;&amp;&amp;&quot; primary-expression

template-parameter ::=
  type-parameter
  | parameter-declaration

type-parameter ::=
  type-parameter-key &quot;...&quot;? identifier?
  | type-parameter-key identifier? &quot;=&quot; type-id
  | type-constraint &quot;...&quot;? identifier?
  | type-constraint identifier? &quot;=&quot; type-id
  | template-head type-parameter-key &quot;...&quot;? identifier?
  | template-head type-parameter-key identifier? &quot;=&quot; id-expression

type-parameter-key ::=
  &quot;class&quot;
  | &quot;typename&quot;

type-constraint ::=
  nested-name-specifier? concept-name
  | nested-name-specifier? concept-name &quot;&lt;&quot; template-argument-list? &quot;&gt;&quot;

simple-template-id ::=
  template-name &quot;&lt;&quot; template-argument-list? &quot;&gt;&quot;

template-id ::=
  simple-template-id
  | operator-function-id &quot;&lt;&quot; template-argument-list? &quot;&gt;&quot;
  | literal-operator-id &quot;&lt;&quot; template-argument-list? &quot;&gt;&quot;

template-name ::=
  identifier

template-argument-list ::=
  template-argument &quot;...&quot;?
  | template-argument-list &quot;,&quot; template-argument &quot;...&quot;?

template-argument ::=
  constant-expression
  | type-id
  | id-expression
  | braced-init-list

constraint-expression ::=
    logical-or-expression

deduction-guide ::=
    explicit-specifier? template-name &quot;(&quot; parameter-declaration-clause &quot;)&quot; &quot;-&gt;&quot; simple-template-id &quot;;&quot;

concept-definition ::=
  &quot;concept&quot; concept-name attribute-specifier-seq? &quot;=&quot; constraint-expression &quot;;&quot;

concept-name ::=
  identifier

typename-specifier ::=
  &quot;typename&quot; nested-name-specifier identifier
  | &quot;typename&quot; nested-name-specifier &quot;template&quot;? simple-template-id

explicit-instantiation ::=
  &quot;extern&quot;? &quot;template&quot; declaration

explicit-specialization ::=
  &quot;template&quot; &quot;&lt;&quot; &quot;&gt;&quot; declaration

//== exceptions.tex

try-block ::=
    &quot;try&quot; compound-statement handler-seq

function-try-block ::=
    &quot;try&quot; ctor-initializer? compound-statement handler-seq

handler-seq ::=
    handler handler-seq?

handler ::=
    &quot;catch&quot; &quot;(&quot; exception-declaration &quot;)&quot; compound-statement

exception-declaration ::=
    attribute-specifier-seq? type-specifier-seq declarator
  | attribute-specifier-seq? type-specifier-seq abstract-declarator?
  | &quot;...&quot;

noexcept-specifier ::=
    &quot;noexcept&quot; &quot;(&quot; constant-expression &quot;)&quot;
  | &quot;noexcept&quot;

//== preprocessor.tex

preprocessing-file ::=
    group?
  | module-file

module-file ::=
    pp-global-module-fragment? pp-module group? pp-private-module-fragment?

pp-global-module-fragment ::=
    &quot;module&quot; &quot;;&quot; new-line group?

pp-private-module-fragment ::=
    &quot;module&quot; &quot;:&quot; &quot;private&quot; &quot;;&quot; new-line group?

group ::=
    group-part
  | group group-part

group-part ::=
    control-line
  | if-section
  | text-line
  | &quot;#&quot; conditionally-supported-directive

control-line ::=
    &quot;#&quot; &quot;include&quot; pp-tokens new-line
  | pp-import
  | &quot;#&quot; &quot;define&quot; identifier replacement-list new-line
  | &quot;#&quot; &quot;define&quot; identifier lparen identifier-list? &quot;)&quot; replacement-list new-line
  | &quot;#&quot; &quot;define&quot; identifier lparen &quot;...&quot; &quot;)&quot; replacement-list new-line
  | &quot;#&quot; &quot;define&quot; identifier lparen identifier-list &quot;,&quot; &quot;...&quot; &quot;)&quot; replacement-list new-line
  | &quot;#&quot; &quot;undef&quot; identifier new-line
  | &quot;#&quot; &quot;line&quot; pp-tokens new-line
  | &quot;#&quot; &quot;error&quot; pp-tokens? new-line
  | &quot;#&quot; &quot;warning&quot; pp-tokens? new-line
  | &quot;#&quot; &quot;pragma&quot; pp-tokens? new-line
  | &quot;#&quot; new-line

if-section ::=
    if-group elif-groups? else-group? endif-line

if-group ::=
    &quot;#&quot; &quot;if&quot; constant-expression new-line group?
  | &quot;#&quot; &quot;ifdef&quot; identifier new-line group?
  | &quot;#&quot; &quot;ifndef&quot; identifier new-line group?

elif-groups ::=
    elif-group
  | elif-groups elif-group

elif-group ::=
    &quot;#&quot; &quot;elif&quot; constant-expression new-line group?
  | &quot;#&quot; &quot;elifdef&quot; identifier new-line group?
  | &quot;#&quot; &quot;elifndef&quot; identifier new-line group?

else-group ::=
    &quot;#&quot; &quot;else&quot; new-line group?

endif-line ::=
    &quot;#&quot; &quot;endif&quot; new-line

text-line ::=
    pp-tokens? new-line

conditionally-supported-directive ::=
    pp-tokens new-line

lparen ::=
    '{a &quot;(&quot; character not immediately preceded by whitespace}'

identifier-list ::=
    identifier
  | identifier-list &quot;,&quot; identifier

replacement-list ::=
    pp-tokens?

pp-tokens ::=
    preprocessing-token
  | pp-tokens preprocessing-token

new-line ::=
    &quot;{the new-line character}&quot;

defined-macro-expression ::=
    &quot;defined&quot; identifier
  | &quot;defined&quot; &quot;(&quot; identifier &quot;)&quot;

h-preprocessing-token ::=
    '{any preprocessing-token other than &quot;&gt;&quot;}'

h-pp-tokens ::=
    h-preprocessing-token
  | h-pp-tokens h-preprocessing-token

header-name-tokens ::=
    string-literal
  | &quot;&lt;&quot; h-pp-tokens &quot;&gt;&quot;

has-include-expression ::=
    &quot;has_include&quot; &quot;(&quot; header-name &quot;)&quot;
  | &quot;has_include&quot; &quot;(&quot; header-name-tokens &quot;)&quot;

has-attribute-expression ::=
    &quot;has_cpp_attribute&quot; &quot;(&quot; pp-tokens &quot;)&quot;

pp-module ::=
    &quot;export&quot;? &quot;module&quot; pp-tokens? &quot;;&quot; new-line

pp-import ::=
    &quot;export&quot;? &quot;import&quot; header-name pp-tokens? &quot;;&quot; new-line
  | &quot;export&quot;? &quot;import&quot; header-name-tokens pp-tokens? &quot;;&quot; new-line
  | &quot;export&quot;? &quot;import&quot; pp-tokens &quot;;&quot; new-line

va-opt-replacement ::=
    &quot;VA_OPT&quot; &quot;(&quot; pp-tokens? &quot;)&quot;"><pre class="notranslate"><code class="notranslate">//
// EBNF to be viewd at https://www.bottlecaps.de/rr/ui
//
// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//

//
//To facilitate start navigating
//

cplusplus ::=
	preprocessing-file? translation-unit

//== lex.tex

n-char ::=
     "{any member of the translation character set except the \unicode{007d}{right curly bracket} or new-line character}"

n-char-sequence ::=
    n-char
  | n-char-sequence n-char

named-universal-character ::=
    "\N{" n-char-sequence "}"

hex-quad ::=
    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit

simple-hexadecimal-digit-sequence ::=
    hexadecimal-digit
  | simple-hexadecimal-digit-sequence hexadecimal-digit

universal-character-name ::=
    "\u" hex-quad
  | "\U" hex-quad hex-quad
  | "\u{" simple-hexadecimal-digit-sequence "}"
  | named-universal-character

preprocessing-token ::=
    header-name
  | "import"
  | "module"
  | "export"
  | identifier
  | pp-number
  | character-literal
  | user-defined-character-literal
  | string-literal
  | user-defined-string-literal
  | preprocessing-op-or-punc
  | "{each non-whitespace character that cannot be one of the above}"

//token ::=
//    identifier
//  | keyword
//  | literal
//  | operator-or-punctuator

header-name ::=
    "&lt;" h-char-sequence "&gt;"
  | '"' q-char-sequence '"'

h-char-sequence ::=
    h-char
  | h-char-sequence h-char

h-char ::=
    "{any member of the translation character set except new-line and \unicode{003e}{greater-than sign}}"

q-char-sequence ::=
    q-char
  | q-char-sequence q-char

q-char ::=
    "{any member of the translation character set except new-line and \unicode{0022}{quotation mark}}"

pp-number ::=
    digit
  | "." digit
  | pp-number identifier-continue
  | pp-number "'" digit
  | pp-number "'" nondigit
  | pp-number "e" sign
  | pp-number "E" sign
  | pp-number "p" sign
  | pp-number "P" sign
  | pp-number "."

identifier ::=
    identifier-start
  | identifier identifier-continue

identifier-start ::=
    nondigit
  | "{an element of the translation character set with the Unicode property XID_Start}"

identifier-continue ::=
    digit
  | nondigit
  | "{an element of the translation character set with the Unicode property XID_Continue}"

nondigit ::=
    "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m"
  | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
  | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M"
  | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "_"

digit ::=
    "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

keyword ::=
    "{any identifier listed in lex.key}"
  | "import"
  | "module"
  | "export"

preprocessing-op-or-punc ::=
    preprocessing-operator
  | operator-or-punctuator

preprocessing-operator ::=
    "#" | "##" | "%:" | "%:%:"

operator-or-punctuator ::=
    "{" | "}" | "[" | "]" | "(" | ")"
  | "&lt;:" | ":&gt;" | "&lt;%" | "%&gt;" | ";" | ":" | "..."
  | "?" | "::" | "." | ".*" | "-&gt;" | "-&gt;*" | "~"
  | "!" | "+" | "-" | "*" | "/" | "%" | "^" | "&amp;" | "|"
  | "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "^=" | "&amp;=" | "|="
  | "==" | "!=" | "&lt;" | "&gt;" | "&lt;=" | "&gt;=" | "&lt;=&gt;" | "&amp;&amp;" | "||"
  | "&lt;&lt;" | "&gt;&gt;" | "&lt;&lt;=" | "&gt;&gt;=" | "++" | "--" | ","
  | "and" | "or" | "xor" | "not" | "bitand" | "bitor" | "compl"
  | "and_eq" | "or_eq" | "xor_eq" | "not_eq"

literal ::=
    integer-literal
  | character-literal
  | floating-point-literal
  | string-literal
  | boolean-literal
  | pointer-literal
  | user-defined-literal

integer-literal ::=
    binary-literal integer-suffix?
  | octal-literal integer-suffix?
  | decimal-literal integer-suffix?
  | hexadecimal-literal integer-suffix?

binary-literal ::=
    "0b" binary-digit
  | "0B" binary-digit
  | binary-literal "'"? binary-digit

octal-literal ::=
    "0"
  | octal-literal "'"? octal-digit

decimal-literal ::=
    nonzero-digit
  | decimal-literal "'"? digit

hexadecimal-literal ::=
    hexadecimal-prefix hexadecimal-digit-sequence

binary-digit ::=
    "0" | "1"

octal-digit ::=
    "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7"

nonzero-digit ::=
    "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

hexadecimal-prefix ::=
    "0x" | "0X"

hexadecimal-digit-sequence ::=
    hexadecimal-digit
  | hexadecimal-digit-sequence "'"? hexadecimal-digit

hexadecimal-digit ::=
    "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
  | "a" | "b" | "c" | "d" | "e" | "f"
  | "A" | "B" | "C" | "D" | "E" | "F"

integer-suffix ::=
    unsigned-suffix long-suffix?
  | unsigned-suffix long-long-suffix?
  | unsigned-suffix size-suffix?
  | long-suffix unsigned-suffix?
  | long-long-suffix unsigned-suffix?
  | size-suffix unsigned-suffix?

unsigned-suffix ::=
    "u" | "U"

long-suffix ::=
    "l" | "L"

long-long-suffix ::=
    "ll" | "LL"

size-suffix ::=
   "z" | "Z"

character-literal ::=
    encoding-prefix? "'" c-char-sequence "'"

encoding-prefix ::=
    "u8" | "u" | "U" | "L"

c-char-sequence ::=
    c-char
  | c-char-sequence c-char

c-char ::=
    basic-c-char
  | escape-sequence
  | universal-character-name

basic-c-char ::=
    "{any member of the translation character set except the \unicode{0027}{apostrophe},}"
        "{\unicode{005c}{reverse solidus}, or new-line character}"

escape-sequence ::=
    simple-escape-sequence
  | numeric-escape-sequence
  | conditional-escape-sequence

simple-escape-sequence ::=
    "\" simple-escape-sequence-char

simple-escape-sequence-char ::=
    "'" | '"' | "?" | "\" | "a" | "b" | "f" | "n" | "r" | "t" | "v"

numeric-escape-sequence ::=
    octal-escape-sequence
  | hexadecimal-escape-sequence

simple-octal-digit-sequence ::=
    octal-digit
  | simple-octal-digit-sequence octal-digit

octal-escape-sequence ::=
    "\" octal-digit
  | "\" octal-digit octal-digit
  | "\" octal-digit octal-digit octal-digit
  | "\o{" simple-octal-digit-sequence "}"

hexadecimal-escape-sequence ::=
    "\x" simple-hexadecimal-digit-sequence
  | "\x{" simple-hexadecimal-digit-sequence "}"

conditional-escape-sequence ::=
    "\" conditional-escape-sequence-char

conditional-escape-sequence-char ::=
    '{any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the characters "N", "o", "u", "U", or "x"}'

floating-point-literal ::=
    decimal-floating-point-literal
  | hexadecimal-floating-point-literal

decimal-floating-point-literal ::=
    fractional-constant exponent-part? floating-point-suffix?
  | digit-sequence exponent-part floating-point-suffix?

hexadecimal-floating-point-literal ::=
    hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-point-suffix?
  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-point-suffix?

fractional-constant ::=
    digit-sequence? "." digit-sequence
  | digit-sequence "."

hexadecimal-fractional-constant ::=
    hexadecimal-digit-sequence? "." hexadecimal-digit-sequence
  | hexadecimal-digit-sequence "."

exponent-part ::=
    "e" sign? digit-sequence
  | "E" sign? digit-sequence

binary-exponent-part ::=
    "p" sign? digit-sequence
  | "P" sign? digit-sequence

sign ::=
    "+" | "-"

digit-sequence ::=
    digit
  | digit-sequence "'"? digit

floating-point-suffix ::=
    "f" | "l" | "f16" | "f32" | "f64" | "f128" | "bf16" | "F" | "L" | "F16" | "F32" | "F64" | "F128" | "BF16"

string-literal ::=
    encoding-prefix? '"' s-char-sequence? '"'
  | encoding-prefix? "R" raw-string

s-char-sequence ::=
    s-char
  | s-char-sequence s-char

s-char ::=
    basic-s-char
  | escape-sequence
  | universal-character-name

basic-s-char ::=
    "{any member of the translation character set except the \unicode{0022}{quotation mark},}"
        "{\unicode{005c}{reverse solidus}, or new-line character}"

raw-string ::=
    '"' d-char-sequence? "(" r-char-sequence? ")" d-char-sequence? '"'

r-char-sequence ::=
    r-char
  | r-char-sequence r-char

r-char ::=
    "{any member of the translation character set, except a \unicode{0029}{right parenthesis} followed by}"
        "{the initial d-char-sequence (which may be empty) followed by a \unicode{0022}{quotation mark}}"

d-char-sequence ::=
    d-char
  | d-char-sequence d-char

d-char ::=
    "{any member of the basic character set except:}"
        "{\unicode{0020}{space}, \unicode{0028}{left parenthesis}, \unicode{0029}{right parenthesis}, \unicode{005c}{reverse solidus},}"
        "{\unicode{0009}{character tabulation}, \unicode{000b}{line tabulation}, \unicode{000c}{form feed}, and new-line}"

unevaluated-string ::=
    string-literal

boolean-literal ::=
    "false"
  | "true"

pointer-literal ::=
    "nullptr"

user-defined-literal ::=
    user-defined-integer-literal
  | user-defined-floating-point-literal
  | user-defined-string-literal
  | user-defined-character-literal

user-defined-integer-literal ::=
    decimal-literal ud-suffix
  | octal-literal ud-suffix
  | hexadecimal-literal ud-suffix
  | binary-literal ud-suffix

user-defined-floating-point-literal ::=
    fractional-constant exponent-part? ud-suffix
  | digit-sequence exponent-part ud-suffix
  | hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix
  | hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix

user-defined-string-literal ::=
    string-literal ud-suffix

user-defined-character-literal ::=
    character-literal ud-suffix

ud-suffix ::=
    identifier

//== basic.tex

translation-unit ::=
    declaration-seq?
  | global-module-fragment? module-declaration declaration-seq? private-module-fragment?

//== expressions.tex

primary-expression ::=
    literal
  | "this"
  | "(" expression ")"
  | id-expression
  | lambda-expression
  | fold-expression
  | requires-expression

id-expression ::=
    unqualified-id
  | qualified-id
  | pack-index-expression

unqualified-id ::=
    identifier
  | operator-function-id
  | conversion-function-id
  | literal-operator-id
  | "~" type-name
  | "~" computed-type-specifier
  | template-id

qualified-id ::=
    nested-name-specifier "template"? unqualified-id

nested-name-specifier ::=
    "::"
  | type-name "::"
  | namespace-name "::"
  | computed-type-specifier "::"
  | nested-name-specifier identifier "::"
  | nested-name-specifier "template"? simple-template-id "::"

pack-index-expression ::=
    id-expression "..." "[" constant-expression "]"

lambda-expression ::=
    lambda-introducer attribute-specifier-seq? lambda-declarator compound-statement
  | lambda-introducer "&lt;" template-parameter-list "&gt;" requires-clause? attribute-specifier-seq?
         lambda-declarator compound-statement

lambda-introducer ::=
    "[" lambda-capture? "]"

lambda-declarator ::=
    lambda-specifier-seq noexcept-specifier? attribute-specifier-seq? trailing-return-type?
  | noexcept-specifier attribute-specifier-seq? trailing-return-type?
  | trailing-return-type?
  | "(" parameter-declaration-clause ")" lambda-specifier-seq? noexcept-specifier? attribute-specifier-seq?
         trailing-return-type? requires-clause?

lambda-specifier ::=
    "consteval"
  | "constexpr"
  | "mutable"
  | "static"

lambda-specifier-seq ::=
    lambda-specifier
  | lambda-specifier lambda-specifier-seq

lambda-capture ::=
    capture-default
  | capture-list
  | capture-default "," capture-list

capture-default ::=
    "&amp;"
  | "="

capture-list ::=
    capture
  | capture-list "," capture

capture ::=
    simple-capture
  | init-capture

simple-capture ::=
    identifier "..."?
  | "&amp;" identifier "..."?
  | "this"
  | "*" "this"

init-capture ::=
    "..."? identifier initializer
  | "&amp;" "..."? identifier initializer

fold-expression ::=
    "(" cast-expression fold-operator "..." ")"
  | "(" "..." fold-operator cast-expression ")"
  | "(" cast-expression fold-operator "..." fold-operator cast-expression ")"

fold-operator ::=
    "+" | "-" | "*" | "/" | "%" | "^" | "&amp;" | "|" | "&lt;&lt;" | "&gt;&gt;"
  | "+=" | "-=" | "*=" | "/=" | "%=" | "^=" | "&amp;=" | "|=" | "&lt;&lt;=" | "&gt;&gt;=" | "="
  | "==" | "!=" | "&lt;" | "&gt;" | "&lt;=" | "&gt;=" | "&amp;&amp;" | "||" | "," | ".*" | "-&gt;*"

requires-expression ::=
    "requires" requirement-parameter-list? requirement-body

requirement-parameter-list ::=
    "(" parameter-declaration-clause ")"

requirement-body ::=
    "{" requirement-seq "}"

requirement-seq ::=
    requirement
  | requirement requirement-seq

requirement ::=
    simple-requirement
  | type-requirement
  | compound-requirement
  | nested-requirement

simple-requirement ::=
    expression ";"

type-requirement ::=
    "typename" nested-name-specifier? type-name ";"

compound-requirement ::=
    "{" expression "}" "noexcept"? return-type-requirement? ";"

return-type-requirement ::=
    "-&gt;" type-constraint

nested-requirement ::=
    "requires" constraint-expression ";"

postfix-expression ::=
    primary-expression
  | postfix-expression "[" expression-list? "]"
  | postfix-expression "(" expression-list? ")"
  | simple-type-specifier "(" expression-list? ")"
  | typename-specifier "(" expression-list? ")"
  | simple-type-specifier braced-init-list
  | typename-specifier braced-init-list
  | postfix-expression "." "template"? id-expression
  | postfix-expression "-&gt;" "template"? id-expression
  | postfix-expression "++"
  | postfix-expression "--"
  | "dynamic_cast" "&lt;" type-id "&gt;" "(" expression ")"
  | "static_cast" "&lt;" type-id "&gt;" "(" expression ")"
  | "reinterpret_cast" "&lt;" type-id "&gt;" "(" expression ")"
  | "const_cast" "&lt;" type-id "&gt;" "(" expression ")"
  | "typeid" "(" expression ")"
  | "typeid" "(" type-id ")"

expression-list ::=
    initializer-list

unary-expression ::=
    postfix-expression
  | unary-operator cast-expression
  | "++" cast-expression
  | "--" cast-expression
  | await-expression
  | "sizeof" unary-expression
  | "sizeof" "(" type-id ")"
  | "sizeof" "..." "(" identifier ")"
  | "alignof" "(" type-id ")"
  | noexcept-expression
  | new-expression
  | delete-expression

unary-operator ::=
    "*" | "&amp;" | "+" | "-" | "!" | "~"

await-expression ::=
    "co_await" cast-expression

noexcept-expression ::=
  "noexcept" "(" expression ")"

new-expression ::=
    "::"? "new" new-placement? new-type-id new-initializer?
  | "::"? "new" new-placement? "(" type-id ")" new-initializer?

new-placement ::=
    "(" expression-list ")"

new-type-id ::=
    type-specifier-seq new-declarator?

new-declarator ::=
    ptr-operator new-declarator?
  | noptr-new-declarator

noptr-new-declarator ::=
    "[" expression? "]" attribute-specifier-seq?
  | noptr-new-declarator "[" constant-expression "]" attribute-specifier-seq?

new-initializer ::=
    "(" expression-list? ")"
  | braced-init-list

delete-expression ::=
    "::"? "delete" cast-expression
  | "::"? "delete" "[" "]" cast-expression

cast-expression ::=
    unary-expression
  | "(" type-id ")" cast-expression

pm-expression ::=
    cast-expression
  | pm-expression ".*" cast-expression
  | pm-expression "-&gt;*" cast-expression

multiplicative-expression ::=
    pm-expression
  | multiplicative-expression "*" pm-expression
  | multiplicative-expression "/" pm-expression
  | multiplicative-expression "%" pm-expression

additive-expression ::=
    multiplicative-expression
  | additive-expression "+" multiplicative-expression
  | additive-expression "-" multiplicative-expression

shift-expression ::=
    additive-expression
  | shift-expression "&lt;&lt;" additive-expression
  | shift-expression "&gt;&gt;" additive-expression

compare-expression ::=
    shift-expression
  | compare-expression "&lt;=&gt;" shift-expression

relational-expression ::=
    compare-expression
  | relational-expression "&lt;" compare-expression
  | relational-expression "&gt;" compare-expression
  | relational-expression "&lt;=" compare-expression
  | relational-expression "&gt;=" compare-expression

equality-expression ::=
    relational-expression
  | equality-expression "==" relational-expression
  | equality-expression "!=" relational-expression

and-expression ::=
    equality-expression
  | and-expression "&amp;" equality-expression

exclusive-or-expression ::=
    and-expression
  | exclusive-or-expression "^" and-expression

inclusive-or-expression ::=
    exclusive-or-expression
  | inclusive-or-expression "|" exclusive-or-expression

logical-and-expression ::=
    inclusive-or-expression
  | logical-and-expression "&amp;&amp;" inclusive-or-expression

logical-or-expression ::=
    logical-and-expression
  | logical-or-expression "||" logical-and-expression

conditional-expression ::=
    logical-or-expression
  | logical-or-expression "?" expression ":" assignment-expression

  yield-expression ::=
  "co_yield" assignment-expression
  | "co_yield" braced-init-list

throw-expression ::=
    "throw"  assignment-expression?

assignment-expression ::=
    conditional-expression
  | yield-expression
  | throw-expression
  | logical-or-expression assignment-operator initializer-clause

assignment-operator ::=
    "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "&gt;&gt;=" | "&lt;&lt;=" | "&amp;=" | "^=" | "|="

expression ::=
    assignment-expression
  | expression "," assignment-expression

constant-expression ::=
    conditional-expression

//== statements.tex

statement ::=
    labeled-statement
  | attribute-specifier-seq? expression-statement
  | attribute-specifier-seq? compound-statement
  | attribute-specifier-seq? selection-statement
  | attribute-specifier-seq? iteration-statement
  | attribute-specifier-seq? jump-statement
  | declaration-statement
  | attribute-specifier-seq? try-block

init-statement ::=
    expression-statement
  | simple-declaration
  | alias-declaration

condition ::=
    expression
  | attribute-specifier-seq? decl-specifier-seq declarator brace-or-equal-initializer

label ::=
    attribute-specifier-seq? identifier ":"
  | attribute-specifier-seq? "case" constant-expression ":"
  | attribute-specifier-seq? "default" ":"

labeled-statement ::=
    label statement

expression-statement ::=
    expression? ";"

compound-statement ::=
    "{" statement-seq? label-seq? "}"

statement-seq ::=
    statement
  | statement-seq statement

label-seq ::=
    label
  | label-seq label

selection-statement ::=
    "if" "constexpr"? "(" init-statement? condition ")" statement
  | "if" "constexpr"? "(" init-statement? condition ")" statement "else" statement
  | "if" "!"? "consteval" compound-statement
  | "if" "!"? "consteval" compound-statement "else" statement
  | "switch" "(" init-statement? condition ")" statement

iteration-statement ::=
    "while" "(" condition ")" statement
  | "do" statement "while" "(" expression ")" ";"
  | "for" "(" init-statement condition? ";" expression? ")" statement
  | "for" "(" init-statement? for-range-declaration ":" for-range-initializer ")" statement

for-range-declaration ::=
    attribute-specifier-seq? decl-specifier-seq declarator
  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? "[" identifier-list "]"

for-range-initializer ::=
    expr-or-braced-init-list

jump-statement ::=
    "break" ";"
  | "continue" ";"
  | "return" expr-or-braced-init-list? ";"
  | coroutine-return-statement
  | "goto" identifier ";"

coroutine-return-statement ::=
    "co_return" expr-or-braced-init-list? ";"

declaration-statement ::=
    block-declaration

//== declarations.tex

declaration-seq ::=
    declaration
  | declaration-seq declaration

declaration ::=
    name-declaration
  | special-declaration

name-declaration ::=
    block-declaration
  | nodeclspec-function-declaration
  | function-definition
  | template-declaration
  | deduction-guide
  | linkage-specification
  | namespace-definition
  | empty-declaration
  | attribute-declaration
  | module-import-declaration

special-declaration ::=
    explicit-instantiation
  | explicit-specialization
  | export-declaration

block-declaration ::=
    simple-declaration
  | asm-declaration
  | namespace-alias-definition
  | using-declaration
  | using-enum-declaration
  | using-directive
  | static_assert-declaration
  | alias-declaration
  | opaque-enum-declaration

nodeclspec-function-declaration ::=
    attribute-specifier-seq? declarator ";"

alias-declaration ::=
    "using" identifier attribute-specifier-seq? "=" defining-type-id ";"

simple-declaration ::=
    decl-specifier-seq init-declarator-list? ";"
  | attribute-specifier-seq decl-specifier-seq init-declarator-list ";"
  | attribute-specifier-seq? decl-specifier-seq ref-qualifier? "[" identifier-list "]" initializer ";"

static_assert-message ::=
  unevaluated-string
  | constant-expression

static_assert-declaration ::=
  "static_assert" "(" constant-expression ")" ";"
  | "static_assert" "(" constant-expression "," static_assert-message ")" ";"

empty-declaration ::=
    ";"

attribute-declaration ::=
    attribute-specifier-seq ";"

decl-specifier ::=
    storage-class-specifier
  | defining-type-specifier
  | function-specifier
  | "friend"
  | "typedef"
  | "constexpr"
  | "consteval"
  | "constinit"
  | "inline"

decl-specifier-seq ::=
    decl-specifier attribute-specifier-seq?
  | decl-specifier decl-specifier-seq

storage-class-specifier ::=
    "static"
  | "thread_local"
  | "extern"
  | "mutable"

function-specifier ::=
    "virtual"
  | explicit-specifier

explicit-specifier ::=
    "explicit" "(" constant-expression ")"
  | "explicit"

typedef-name ::=
    identifier
  | simple-template-id

type-specifier ::=
  simple-type-specifier
  | elaborated-type-specifier
  | typename-specifier
  | cv-qualifier

type-specifier-seq ::=
    type-specifier attribute-specifier-seq?
  | type-specifier type-specifier-seq

defining-type-specifier ::=
    type-specifier
  | class-specifier
  | enum-specifier

defining-type-specifier-seq ::=
  defining-type-specifier attribute-specifier-seq?
  | defining-type-specifier defining-type-specifier-seq

simple-type-specifier ::=
    nested-name-specifier? type-name
  | nested-name-specifier "template" simple-template-id
  | computed-type-specifier
  | placeholder-type-specifier
  | nested-name-specifier? template-name
  | "char"
  | "char8_t"
  | "char16_t"
  | "char32_t"
  | "wchar_t"
  | "bool"
  | "short"
  | "int"
  | "long"
  | "signed"
  | "unsigned"
  | "float"
  | "double"
  | "void"

type-name ::=
    class-name
  | enum-name
  | typedef-name

computed-type-specifier ::=
    decltype-specifier
  | pack-index-specifier

pack-index-specifier ::=
    typedef-name "..." "[" constant-expression "]"

elaborated-type-specifier ::=
    class-key attribute-specifier-seq? nested-name-specifier? identifier
  | class-key simple-template-id
  | class-key nested-name-specifier "template"? simple-template-id
  | "enum" nested-name-specifier? identifier

decltype-specifier ::=
  "decltype" "(" expression ")"

placeholder-type-specifier ::=
  type-constraint? "auto"
  | type-constraint? "decltype" "(" "auto" ")"

init-declarator-list ::=
    init-declarator
  | init-declarator-list "," init-declarator

init-declarator ::=
    declarator initializer?
  | declarator requires-clause

declarator ::=
    ptr-declarator
  | noptr-declarator parameters-and-qualifiers trailing-return-type

ptr-declarator ::=
    noptr-declarator
  | ptr-operator ptr-declarator

noptr-declarator ::=
    declarator-id attribute-specifier-seq?
  | noptr-declarator parameters-and-qualifiers
  | noptr-declarator "[" constant-expression? "]" attribute-specifier-seq?
  | "(" ptr-declarator ")"

parameters-and-qualifiers ::=
    "(" parameter-declaration-clause ")" cv-qualifier-seq?
        ref-qualifier? noexcept-specifier? attribute-specifier-seq?

trailing-return-type ::=
    "-&gt;" type-id

ptr-operator ::=
    "*" attribute-specifier-seq? cv-qualifier-seq?
  | "&amp;" attribute-specifier-seq?
  | "&amp;&amp;" attribute-specifier-seq?
  | nested-name-specifier "*" attribute-specifier-seq? cv-qualifier-seq?

cv-qualifier-seq ::=
    cv-qualifier cv-qualifier-seq?

cv-qualifier ::=
    "const"
  | "volatile"

ref-qualifier ::=
    "&amp;"
  | "&amp;&amp;"

declarator-id ::=
    "..."? id-expression

type-id ::=
    type-specifier-seq abstract-declarator?

defining-type-id ::=
    defining-type-specifier-seq abstract-declarator?

abstract-declarator ::=
    ptr-abstract-declarator
  | noptr-abstract-declarator? parameters-and-qualifiers trailing-return-type
  | abstract-pack-declarator

ptr-abstract-declarator ::=
    noptr-abstract-declarator
  | ptr-operator ptr-abstract-declarator?

noptr-abstract-declarator ::=
    noptr-abstract-declarator? parameters-and-qualifiers
  | noptr-abstract-declarator? "[" constant-expression? "]" attribute-specifier-seq?
  | "(" ptr-abstract-declarator ")"

abstract-pack-declarator ::=
    noptr-abstract-pack-declarator
  | ptr-operator abstract-pack-declarator

noptr-abstract-pack-declarator ::=
    noptr-abstract-pack-declarator parameters-and-qualifiers
  | "..."

parameter-declaration-clause ::=
    parameter-declaration-list? "..."?
  | parameter-declaration-list "," "..."

parameter-declaration-list ::=
    parameter-declaration
  | parameter-declaration-list "," parameter-declaration

parameter-declaration ::=
    attribute-specifier-seq? "this"? decl-specifier-seq declarator
  | attribute-specifier-seq? decl-specifier-seq declarator "=" initializer-clause
  | attribute-specifier-seq? "this"? decl-specifier-seq abstract-declarator?
  | attribute-specifier-seq? decl-specifier-seq abstract-declarator? "=" initializer-clause

initializer ::=
    brace-or-equal-initializer
  | "(" expression-list ")"

brace-or-equal-initializer ::=
    "=" initializer-clause
  | braced-init-list

initializer-clause ::=
    assignment-expression
  | braced-init-list

braced-init-list ::=
    "{" initializer-list ","? "}"
  | "{" designated-initializer-list ","? "}"
  | "{" "}"

initializer-list ::=
    initializer-clause "..."?
  | initializer-list "," initializer-clause "..."?

designated-initializer-list ::=
    designated-initializer-clause
  | designated-initializer-list "," designated-initializer-clause

designated-initializer-clause ::=
    designator brace-or-equal-initializer

designator ::=
    "." identifier

expr-or-braced-init-list ::=
    expression
  | braced-init-list

function-definition ::=
    attribute-specifier-seq? decl-specifier-seq? declarator virt-specifier-seq? function-body
  | attribute-specifier-seq? decl-specifier-seq? declarator requires-clause function-body

function-body ::=
    ctor-initializer? compound-statement
  | function-try-block
  | "=" "default" ";"
  | "=" "delete" ";"

enum-name ::=
    identifier

enum-specifier ::=
    enum-head "{" enumerator-list? "}"
  | enum-head "{" enumerator-list "," "}"

enum-head ::=
    enum-key attribute-specifier-seq? enum-head-name? enum-base?

enum-head-name ::=
    nested-name-specifier? identifier

opaque-enum-declaration ::=
    enum-key attribute-specifier-seq? enum-head-name enum-base? ";"

enum-key ::=
    "enum"
  | "enum" "class"
  | "enum" "struct"

enum-base ::=
    ":" type-specifier-seq

enumerator-list ::=
    enumerator-definition
  | enumerator-list "," enumerator-definition

enumerator-definition ::=
    enumerator
  | enumerator "=" constant-expression

enumerator ::=
    identifier attribute-specifier-seq?

using-enum-declaration ::=
    "using" "enum" using-enum-declarator ";"

using-enum-declarator ::=
    nested-name-specifier? identifier
  | nested-name-specifier? simple-template-id

namespace-name ::=
        identifier
  | namespace-alias

namespace-definition ::=
        named-namespace-definition
  | unnamed-namespace-definition
  | nested-namespace-definition

named-namespace-definition ::=
        "inline"? "namespace" attribute-specifier-seq? identifier "{" namespace-body "}"

unnamed-namespace-definition ::=
        "inline"? "namespace" attribute-specifier-seq? "{" namespace-body "}"

nested-namespace-definition ::=
        "namespace" enclosing-namespace-specifier "::" "inline"? identifier "{" namespace-body "}"

enclosing-namespace-specifier ::=
        identifier
  | enclosing-namespace-specifier "::" "inline"? identifier

namespace-body ::=
        declaration-seq?

namespace-alias ::=
        identifier

namespace-alias-definition ::=
        "namespace" identifier "=" qualified-namespace-specifier ";"

qualified-namespace-specifier ::=
    nested-name-specifier? namespace-name

using-directive ::=
    attribute-specifier-seq? "using" "namespace" nested-name-specifier? namespace-name ";"

using-declaration ::=
    "using" using-declarator-list ";"

using-declarator-list ::=
    using-declarator "..."?
  | using-declarator-list "," using-declarator "..."?

using-declarator ::=
    "typename"? nested-name-specifier unqualified-id

asm-declaration ::=
    attribute-specifier-seq? "asm" "(" balanced-token-seq ")" ";"

linkage-specification ::=
    "extern" unevaluated-string "{" declaration-seq? "}"
  | "extern" unevaluated-string name-declaration

attribute-specifier-seq ::=
  attribute-specifier-seq? attribute-specifier

attribute-specifier ::=
  "[" "[" attribute-using-prefix? attribute-list "]" "]"
  | alignment-specifier

alignment-specifier ::=
  "alignas" "(" type-id "..."? ")"
  | "alignas" "(" constant-expression "..."? ")"

attribute-using-prefix ::=
  "using" attribute-namespace ":"

attribute-list ::=
  attribute?
  | attribute-list "," attribute?
  | attribute "..."
  | attribute-list "," attribute "..."

attribute ::=
    attribute-token attribute-argument-clause?

attribute-token ::=
    identifier
  | attribute-scoped-token

attribute-scoped-token ::=
    attribute-namespace "::" identifier

attribute-namespace ::=
    identifier

attribute-argument-clause ::=
    "(" balanced-token-seq? ")"

balanced-token-seq ::=
    balanced-token
  | balanced-token-seq balanced-token

balanced-token ::=
    "(" balanced-token-seq? ")"
  | "[" balanced-token-seq? "]"
  | "{" balanced-token-seq? "}"
  | "{any token other than a parenthesis, a bracket, or a brace}"

//== modules.tex

module-declaration ::=
    "export"? "module" module-name module-partition? attribute-specifier-seq? ";"

module-name ::=
    module-name-qualifier? identifier

module-partition ::=
    ":" module-name-qualifier? identifier

module-name-qualifier ::=
    identifier "."
  | module-name-qualifier identifier "."

export-declaration ::=
    "export" name-declaration
  | "export" "{" declaration-seq? "}"
  | "export" module-import-declaration

module-import-declaration ::=
    "import" module-name attribute-specifier-seq? ";"
  | "import" module-partition attribute-specifier-seq? ";"
  | "import" header-name attribute-specifier-seq? ";"

global-module-fragment ::=
    "module" ";" declaration-seq?

private-module-fragment ::=
    "module" ":" "private" ";" declaration-seq?

//== classes.tex

class-name ::=
    identifier
  | simple-template-id

class-specifier ::=
    class-head "{" member-specification? "}"

class-head ::=
    class-key attribute-specifier-seq? class-head-name class-virt-specifier? base-clause?
  | class-key attribute-specifier-seq? base-clause?

class-head-name ::=
    nested-name-specifier? class-name

class-virt-specifier ::=
    "final"

class-key ::=
    "class"
  | "struct"
  | "union"

member-specification ::=
    member-declaration member-specification?
  | access-specifier ":" member-specification?

member-declaration ::=
    attribute-specifier-seq? decl-specifier-seq? member-declarator-list? ";"
  | function-definition
  | using-declaration
  | using-enum-declaration
  | static_assert-declaration
  | template-declaration
  | explicit-specialization
  | deduction-guide
  | alias-declaration
  | opaque-enum-declaration
  | empty-declaration

member-declarator-list ::=
    member-declarator
  | member-declarator-list "," member-declarator

member-declarator ::=
    declarator virt-specifier-seq? pure-specifier?
  | declarator requires-clause
  | declarator brace-or-equal-initializer?
  | identifier? attribute-specifier-seq? ":" constant-expression brace-or-equal-initializer?

virt-specifier-seq ::=
    virt-specifier
  | virt-specifier-seq virt-specifier

virt-specifier ::=
    "override"
  | "final"

pure-specifier ::=
    "=" "0"

conversion-function-id ::=
    "operator" conversion-type-id

conversion-type-id ::=
    type-specifier-seq conversion-declarator?

conversion-declarator ::=
    ptr-operator conversion-declarator?

base-clause ::=
    ":" base-specifier-list

base-specifier-list ::=
    base-specifier "..."?
  | base-specifier-list "," base-specifier "..."?

base-specifier ::=
    attribute-specifier-seq? class-or-decltype
  | attribute-specifier-seq? "virtual" access-specifier? class-or-decltype
  | attribute-specifier-seq? access-specifier "virtual"? class-or-decltype

class-or-decltype ::=
    nested-name-specifier? type-name
  | nested-name-specifier "template" simple-template-id
  | decltype-specifier

access-specifier ::=
    "private"
  | "protected"
  | "public"

ctor-initializer ::=
    ":" mem-initializer-list

mem-initializer-list ::=
    mem-initializer "..."?
  | mem-initializer-list "," mem-initializer "..."?

mem-initializer ::=
    mem-initializer-id "(" expression-list? ")"
  | mem-initializer-id braced-init-list

mem-initializer-id ::=
    class-or-decltype
  | identifier

//== overloading.tex

operator-function-id ::=
    "operator" operator

operator ::=
    "new" | "delete" | "new[]" | "delete[]" | "co_await" | "()" | "[]" | "-&gt;" | "-&gt;*"
  | "~" | "!" | "+" | "-" | "*" | "/" | "%" | "^" | "&amp;"
  | "|" | "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "^=" | "&amp;="
  | "|=" | "==" | "!=" | "&lt;" | "&gt;" | "&lt;=" | "&gt;=" | "&lt;=&gt;" | "&amp;&amp;"
  | "||" | "&lt;&lt;" | "&gt;&gt;" | "&lt;&lt;=" | "&gt;&gt;=" | "++" | "--" | ","

literal-operator-id ::=
    "operator" unevaluated-string identifier
  | "operator" user-defined-string-literal

//== templates.tex

template-declaration ::=
  template-head declaration
  | template-head concept-definition

template-head ::=
  "template" "&lt;" template-parameter-list "&gt;" requires-clause?

template-parameter-list ::=
  template-parameter
  | template-parameter-list "," template-parameter

requires-clause ::=
  "requires" constraint-logical-or-expression

constraint-logical-or-expression ::=
  constraint-logical-and-expression
  | constraint-logical-or-expression "||" constraint-logical-and-expression

constraint-logical-and-expression ::=
  primary-expression
  | constraint-logical-and-expression "&amp;&amp;" primary-expression

template-parameter ::=
  type-parameter
  | parameter-declaration

type-parameter ::=
  type-parameter-key "..."? identifier?
  | type-parameter-key identifier? "=" type-id
  | type-constraint "..."? identifier?
  | type-constraint identifier? "=" type-id
  | template-head type-parameter-key "..."? identifier?
  | template-head type-parameter-key identifier? "=" id-expression

type-parameter-key ::=
  "class"
  | "typename"

type-constraint ::=
  nested-name-specifier? concept-name
  | nested-name-specifier? concept-name "&lt;" template-argument-list? "&gt;"

simple-template-id ::=
  template-name "&lt;" template-argument-list? "&gt;"

template-id ::=
  simple-template-id
  | operator-function-id "&lt;" template-argument-list? "&gt;"
  | literal-operator-id "&lt;" template-argument-list? "&gt;"

template-name ::=
  identifier

template-argument-list ::=
  template-argument "..."?
  | template-argument-list "," template-argument "..."?

template-argument ::=
  constant-expression
  | type-id
  | id-expression
  | braced-init-list

constraint-expression ::=
    logical-or-expression

deduction-guide ::=
    explicit-specifier? template-name "(" parameter-declaration-clause ")" "-&gt;" simple-template-id ";"

concept-definition ::=
  "concept" concept-name attribute-specifier-seq? "=" constraint-expression ";"

concept-name ::=
  identifier

typename-specifier ::=
  "typename" nested-name-specifier identifier
  | "typename" nested-name-specifier "template"? simple-template-id

explicit-instantiation ::=
  "extern"? "template" declaration

explicit-specialization ::=
  "template" "&lt;" "&gt;" declaration

//== exceptions.tex

try-block ::=
    "try" compound-statement handler-seq

function-try-block ::=
    "try" ctor-initializer? compound-statement handler-seq

handler-seq ::=
    handler handler-seq?

handler ::=
    "catch" "(" exception-declaration ")" compound-statement

exception-declaration ::=
    attribute-specifier-seq? type-specifier-seq declarator
  | attribute-specifier-seq? type-specifier-seq abstract-declarator?
  | "..."

noexcept-specifier ::=
    "noexcept" "(" constant-expression ")"
  | "noexcept"

//== preprocessor.tex

preprocessing-file ::=
    group?
  | module-file

module-file ::=
    pp-global-module-fragment? pp-module group? pp-private-module-fragment?

pp-global-module-fragment ::=
    "module" ";" new-line group?

pp-private-module-fragment ::=
    "module" ":" "private" ";" new-line group?

group ::=
    group-part
  | group group-part

group-part ::=
    control-line
  | if-section
  | text-line
  | "#" conditionally-supported-directive

control-line ::=
    "#" "include" pp-tokens new-line
  | pp-import
  | "#" "define" identifier replacement-list new-line
  | "#" "define" identifier lparen identifier-list? ")" replacement-list new-line
  | "#" "define" identifier lparen "..." ")" replacement-list new-line
  | "#" "define" identifier lparen identifier-list "," "..." ")" replacement-list new-line
  | "#" "undef" identifier new-line
  | "#" "line" pp-tokens new-line
  | "#" "error" pp-tokens? new-line
  | "#" "warning" pp-tokens? new-line
  | "#" "pragma" pp-tokens? new-line
  | "#" new-line

if-section ::=
    if-group elif-groups? else-group? endif-line

if-group ::=
    "#" "if" constant-expression new-line group?
  | "#" "ifdef" identifier new-line group?
  | "#" "ifndef" identifier new-line group?

elif-groups ::=
    elif-group
  | elif-groups elif-group

elif-group ::=
    "#" "elif" constant-expression new-line group?
  | "#" "elifdef" identifier new-line group?
  | "#" "elifndef" identifier new-line group?

else-group ::=
    "#" "else" new-line group?

endif-line ::=
    "#" "endif" new-line

text-line ::=
    pp-tokens? new-line

conditionally-supported-directive ::=
    pp-tokens new-line

lparen ::=
    '{a "(" character not immediately preceded by whitespace}'

identifier-list ::=
    identifier
  | identifier-list "," identifier

replacement-list ::=
    pp-tokens?

pp-tokens ::=
    preprocessing-token
  | pp-tokens preprocessing-token

new-line ::=
    "{the new-line character}"

defined-macro-expression ::=
    "defined" identifier
  | "defined" "(" identifier ")"

h-preprocessing-token ::=
    '{any preprocessing-token other than "&gt;"}'

h-pp-tokens ::=
    h-preprocessing-token
  | h-pp-tokens h-preprocessing-token

header-name-tokens ::=
    string-literal
  | "&lt;" h-pp-tokens "&gt;"

has-include-expression ::=
    "has_include" "(" header-name ")"
  | "has_include" "(" header-name-tokens ")"

has-attribute-expression ::=
    "has_cpp_attribute" "(" pp-tokens ")"

pp-module ::=
    "export"? "module" pp-tokens? ";" new-line

pp-import ::=
    "export"? "import" header-name pp-tokens? ";" new-line
  | "export"? "import" header-name-tokens pp-tokens? ";" new-line
  | "export"? "import" pp-tokens ";" new-line

va-opt-replacement ::=
    "VA_OPT" "(" pp-tokens? ")"
</code></pre></div></div></div><div class="IssueBodyViewer-module__IssueBodyTaskList--xb3uu"><!--$--><div role="toolbar" aria-label="Reactions" class="d-flex gap-1 flex-wrap"></div><!--/$--></div></div></div></div></div></div></div><div data-testid="issue-viewer-comments-container" class="react-comments-container"><div class="IssueViewer-module__commentsContainer--H8wxg"><!--$!--><template></template><div class="issue-timeline-loading-module__delaySkeletonLoad--OE2Lq" data-testid="issue-timeline-loading"><div><div class="CommentLoading-module__CommentLoadingContainer--I9JkW"><div height="40px" width="40px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 kqdiwS gALJmv"></div><div class="CommentLoading-module__CommentLoadingContentWrapper--Qd0Vg"><div class="CommentDivider-module__CommentDividerContainer--fCCZA"><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerLeftLine--TwR8y"></div><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerRightLine--_guT1"></div></div><div data-testid="comment-skeleton" class="CommentLoading-module__CommentLoadingCard--QQ_c8"><div class="CommentLoading-module__CommentLoadingHeader--_JjPE"><div height="sm" width="150px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 jKxfJf gpOnMk"></div></div><div class="CommentLoading-module__CommentLoadingContent--QWS3r"><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU gyTeWh"></div><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU jPvaA-d"></div><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU dRdjrc"></div><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU jETYlX"></div></div></div></div></div></div><div><div class="CommentLoading-module__CommentLoadingContainer--I9JkW"><div height="40px" width="40px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 kqdiwS gALJmv"></div><div class="CommentLoading-module__CommentLoadingContentWrapper--Qd0Vg"><div class="CommentDivider-module__CommentDividerContainer--fCCZA"><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerLeftLine--TwR8y"></div><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerRightLine--_guT1"></div></div><div data-testid="comment-skeleton" class="CommentLoading-module__CommentLoadingCard--QQ_c8"><div class="CommentLoading-module__CommentLoadingHeader--_JjPE"><div height="sm" width="150px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 jKxfJf gpOnMk"></div></div><div class="CommentLoading-module__CommentLoadingContent--QWS3r"><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU jETYlX"></div></div></div></div></div></div><div><div class="CommentLoading-module__CommentLoadingContainer--I9JkW"><div height="40px" width="40px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 kqdiwS gALJmv"></div><div class="CommentLoading-module__CommentLoadingContentWrapper--Qd0Vg"><div class="CommentDivider-module__CommentDividerContainer--fCCZA"><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerLeftLine--TwR8y"></div><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerRightLine--_guT1"></div></div><div data-testid="comment-skeleton" class="CommentLoading-module__CommentLoadingCard--QQ_c8"><div class="CommentLoading-module__CommentLoadingHeader--_JjPE"><div height="sm" width="150px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 jKxfJf gpOnMk"></div></div><div class="CommentLoading-module__CommentLoadingContent--QWS3r"><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU iUqXOB"></div><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU dRlina"></div></div></div></div></div></div><div><div class="CommentLoading-module__CommentLoadingContainer--I9JkW"><div height="40px" width="40px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 kqdiwS gALJmv"></div><div class="CommentLoading-module__CommentLoadingContentWrapper--Qd0Vg"><div class="CommentDivider-module__CommentDividerContainer--fCCZA"><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerLeftLine--TwR8y"></div><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerRightLine--_guT1"></div></div><div data-testid="comment-skeleton" class="CommentLoading-module__CommentLoadingCard--QQ_c8"><div class="CommentLoading-module__CommentLoadingHeader--_JjPE"><div height="sm" width="150px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 jKxfJf gpOnMk"></div></div><div class="CommentLoading-module__CommentLoadingContent--QWS3r"><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU ecARVs"></div></div></div></div></div></div><div><div class="CommentLoading-module__CommentLoadingContainer--I9JkW"><div height="40px" width="40px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 kqdiwS gALJmv"></div><div class="CommentLoading-module__CommentLoadingContentWrapper--Qd0Vg"><div class="CommentDivider-module__CommentDividerContainer--fCCZA"><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerLeftLine--TwR8y"></div><div class="Box-sc-g0xbh4-0 HpFDd CommentDivider-module__CommentDividerRightLine--_guT1"></div></div><div data-testid="comment-skeleton" class="CommentLoading-module__CommentLoadingCard--QQ_c8"><div class="CommentLoading-module__CommentLoadingHeader--_JjPE"><div height="sm" width="150px" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 jKxfJf gpOnMk"></div></div><div class="CommentLoading-module__CommentLoadingContent--QWS3r"><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU gyTeWh"></div><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU jPvaA-d"></div><div height="sm" width="random" class="Box-sc-g0xbh4-0 LoadingSkeleton-sc-14d3f1fe-0 hpcToU fRHxbb"></div></div></div></div></div></div></div><!--/$--></div></div></div><div data-testid="issue-viewer-metadata-container" class="Box-sc-g0xbh4-0 cLtwuV IssueViewer-module__metadataSidebar--QdJ2b"><div class="IssueViewer-module__issueViewerMetadataPane--i01ta" data-testid="issue-viewer-metadata-pane"><h2 class="IssueViewer-module__metadataHeader--OGi4i prc-Heading-Heading-6CmGO">Metadata</h2><h2 class="IssueViewer-module__largeScreenMetadataHeader--xPLHt sr-only prc-Heading-Heading-6CmGO">Metadata</h2><div data-testid="sticky-sidebar"><div class="IssueSidebar-module__sidebarContent--II51T"><div data-testid="sidebar-section" class="Box-sc-g0xbh4-0 bbGjsc Section-module__SectionContainer--bIlEv"><div class="Section-module__headerContentWrapper--OIm9m"><div class="Box-sc-g0xbh4-0 bwxuvd"><h3 class="Box-sc-g0xbh4-0 bpDFns SectionHeader-module__SectionHeaderTitle--TxSJL prc-Heading-Heading-6CmGO">Assignees</h3></div><span class="Section-module__emptyText--qZ0Bc">No one assigned</span><div class="Section-module__hiddenChildrenContainer--X126P"><ul class="prc-ActionList-ActionList-X4RiC Assignees-module__assigneesList--JFnuE" data-dividers="false" data-variant="full"></ul></div></div></div><div data-testid="sidebar-section" class="Box-sc-g0xbh4-0 bbGjsc Section-module__SectionContainer--bIlEv"><div class="Section-module__headerContentWrapper--OIm9m"><div class="Box-sc-g0xbh4-0 bwxuvd"><h3 class="Box-sc-g0xbh4-0 bpDFns SectionHeader-module__SectionHeaderTitle--TxSJL prc-Heading-Heading-6CmGO">Labels</h3></div><span class="Section-module__emptyText--qZ0Bc">No labels</span><div class="Section-module__hiddenChildrenContainer--X126P"><div tabindex="-1" data-testid="issue-labels" class="Box-sc-g0xbh4-0 LabelsList-module__labelsListContainer--bS7BO">No labels</div></div></div></div><div data-testid="sidebar-section" class="Box-sc-g0xbh4-0 bbGjsc Section-module__SectionContainer--bIlEv"><div class="Section-module__headerContentWrapper--OIm9m"><div class="Box-sc-g0xbh4-0 bwxuvd"><h3 class="Box-sc-g0xbh4-0 bpDFns SectionHeader-module__SectionHeaderTitle--TxSJL prc-Heading-Heading-6CmGO">Type</h3></div><span class="Section-module__emptyText--qZ0Bc">No type</span><div class="Section-module__hiddenChildrenContainer--X126P"><div class="TypesSection-module__typeContainer--YI5mY"><div class="IssueType-module__hiddenPlaceholder--nnfV9"></div></div></div></div></div><!--$--><div data-testid="sidebar-projects-section" class="Box-sc-g0xbh4-0 bbGjsc Section-module__SectionContainer--bIlEv"><div class="Section-module__headerContentWrapper--OIm9m"><div class="Box-sc-g0xbh4-0 bwxuvd"><h3 class="Box-sc-g0xbh4-0 bpDFns SectionHeader-module__SectionHeaderTitle--TxSJL prc-Heading-Heading-6CmGO">Projects</h3></div><span class="Section-module__emptyText--qZ0Bc">No projects</span><div class="Section-module__hiddenChildrenContainer--X126P"><div class="ProjectsSection-module__projectItemsContainer--XwAWz"></div></div></div></div><!--/$--><div data-testid="sidebar-section" class="Box-sc-g0xbh4-0 bbGjsc Section-module__SectionContainer--bIlEv"><div class="Section-module__headerContentWrapper--OIm9m"><div class="Box-sc-g0xbh4-0 bwxuvd"><h3 class="Box-sc-g0xbh4-0 bpDFns SectionHeader-module__SectionHeaderTitle--TxSJL prc-Heading-Heading-6CmGO">Milestone</h3></div><span class="Section-module__emptyText--qZ0Bc">No milestone</span><div class="Section-module__hiddenChildrenContainer--X126P"><ul class="prc-ActionList-ActionList-X4RiC" data-dividers="false" data-variant="full"><div class="Milestone-module__hiddenPlaceholder--b_yit"></div></ul></div></div></div><!--$--><div data-testid="sidebar-section" class="Box-sc-g0xbh4-0 bbGjsc Section-module__SectionContainer--bIlEv"><div class="Section-module__headerContentWrapper--OIm9m"><div class="Box-sc-g0xbh4-0 bwxuvd"><h3 class="Box-sc-g0xbh4-0 bpDFns SectionHeader-module__SectionHeaderTitle--TxSJL prc-Heading-Heading-6CmGO">Relationships</h3></div><span class="Section-module__emptyText--qZ0Bc">None yet</span><div class="Section-module__hiddenChildrenContainer--X126P"></div></div></div><div data-testid="sidebar-section" class="Box-sc-g0xbh4-0 bbGjsc Section-module__SectionContainer--bIlEv"><div class="Section-module__headerContentWrapper--OIm9m"><div class="Box-sc-g0xbh4-0 bwxuvd"><h3 class="Box-sc-g0xbh4-0 bpDFns SectionHeader-module__SectionHeaderTitle--TxSJL prc-Heading-Heading-6CmGO">Development</h3></div><span class="Section-module__emptyText--qZ0Bc">No branches or pull requests</span><div class="Section-module__hiddenChildrenContainer--X126P"></div></div></div><!--/$--><h2 class="sr-only prc-Heading-Heading-6CmGO">Issue actions</h2><ul class="prc-ActionList-ActionList-X4RiC OptionsSection-module__ActionListOverrides--DkWge" data-dividers="false" data-variant="full"></ul></div></div></div></div></div></div><!--/$--></div><!--/$--></div></div><!--/$--><!--/$--><script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div>
</react-app>
</turbo-frame>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"></path>
</svg>
</a>
      <span>
        &copy; 2025 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          <li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
       Manage cookies
    </button>
  </cookie-consent-link>
</li>

<li class="mx-2">
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
    >
      Do not share my personal information
    </button>
  </cookie-consent-link>
</li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="false"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

