// THIS FILE IS GENERATED AUTOMATICALLY! EDITS WILL BE LOST!
// This file generated by prte-convert-help.py

#include "src/include/prte_config.h"
#include <stdio.h>
#include <string.h>

#include "src/include/pmix_globals.h"

static pmix_show_help_entry_t ini_entries_0[] = {
    { .topic = "mbind failure",
      .content = (const char *[]){
                 "PRRTE failed to bind internal memory to a specific NUMA node.  This",
                 "message will only be reported at most once per process.",
                 "   Local host: %s",
                 "   PID:        %d",
                 "   File:       %s:%d",
                 "   Message:    %s",
                 "   Severity:   %s",
                 NULL}
    },

    { .topic = "invalid binding_policy",
      .content = (const char *[]){
                 "The specified %s policy is not recognized:",
                 "   Policy: %s",
                 "Please check for a typo or ensure that the option is a supported one.",
                 NULL}
    },

    { .topic = "obj-idx-failed",
      .content = (const char *[]){
                 "PRRTE failed to find a cache of a specified type.  This is a highly",
                 "unusual error; it may indicate a system configuration error.  This",
                 "additional information may be of help:",
                 "   Message:     %s",
                 NULL}
    },

    { .topic = "bad-processor-type",
      .content = (const char *[]){
                 "The default CPU list contains an invalid modifier:",
                 "   Default CPU list:  %s",
                 "   Modifier:  %s",
                 "The modifier should indicate the type of CPU being used in the list —",
                 "the only valid values are HWTCPUS (for use of hwthreads as independent",
                 "CPUs) or CORECPUS (for use of cores as independent CPUs). Please",
                 "correct the input.",
                 NULL}
    },

    { .topic = "unrecognized-modifier",
      .content = (const char *[]){
                 "The binding request contains an unrecognized modifier:",
                 "   Request: %s",
                 "Please check your request and try again.",
                 NULL}
    },

    { .topic = "bind-upwards",
      .content = (const char *[]){
                 "Binding is performed to the first available specified object type",
                 "within the object where the process was mapped. In other words,",
                 "binding can only be done to the mapped object or to a resource located",
                 "beneath that object.",
                 "The specified binding lies above the mapping object type:",
                 "   Mapping level: %s",
                 "   Binding level: %s",
                 "Please correct the map/bind directives and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_1[] = {
    { .topic = "failed-daemon-launch",
      .content = (const char *[]){
                 "%s was unable to reliably start one or more daemons.",
                 "This usually is caused by:",
                 "* the inability to resolve specified hostnames - please check",
                 "  above for any output regarding this possibility",
                 "* not finding the required libraries and/or binaries on",
                 "  one or more nodes. Please check your PATH and LD_LIBRARY_PATH",
                 "  settings, or configure OMPI with --enable-prun-prefix-by-default",
                 "* lack of authority to execute on one or more specified nodes.",
                 "  Please verify your allocation and authorities.",
                 "* the inability to write startup files into /tmp (--tmpdir/prte_tmpdir_base).",
                 "  Please check with your sys admin to determine the correct location to use.",
                 "*  compilation of the orted with dynamic libraries when static are required",
                 "  (e.g., on Cray). Please check your configure cmd line and consider using",
                 "  one of the contrib/platform definitions for your system type.",
                 "* an inability to create a connection back to mpirun due to a",
                 "  lack of common network interfaces and/or no route found between",
                 "  them. Please check network connectivity (including firewalls",
                 "  and network routing requirements).",
                 NULL}
    },

    { .topic = "failed-daemon",
      .content = (const char *[]){
                 "An PRTE daemon has unexpectedly failed after launch and before",
                 "communicating back to mpirun. This could be caused by a number",
                 "of factors, including an inability to create a connection back",
                 "to mpirun due to a lack of common network interfaces and/or no",
                 "route found between them. Please check network connectivity",
                 "(including firewalls and network routing requirements).",
                 NULL}
    },

    { .topic = "node-died",
      .content = (const char *[]){
                 "PRTE has lost communication with a remote daemon.",
                 "  HNP daemon   : %s on node %s",
                 "  Remote daemon: %s on node %s",
                 "This is usually due to either a failure of the TCP network",
                 "connection to the node, or possibly an internal failure of",
                 "the daemon itself. We cannot recover from this failure, and",
                 "therefore will terminate the job.",
                 NULL}
    },

    { .topic = "simple-message",
      .content = (const char *[]){
                 "An internal error has occurred in PRTE:",
                 "%s",
                 "This is something that should be reported to the developers.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_2[] = {
    { .topic = "ess-base:cannot-forward",
      .content = (const char *[]){
                 "The system does not support trapping and forwarding of the",
                 "specified signal:",
                 "  signal: %s",
                 "  param:  %s",
                 "Please remove that signal from the ess_base_forward_signals MCA parameter.",
                 NULL}
    },

    { .topic = "ess-base:unknown-signal",
      .content = (const char *[]){
                 "The following signal was included in the ess_base_forward_signals",
                 "MCA parameter:",
                 "  signal: %s",
                 "  param:  %s",
                 "This is not a recognized signal value. Please fix or remove it.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_3[] = {
    { .topic = "prte-odls-base:xterm-rank-out-of-bounds",
      .content = (const char *[]){
                 "The xterm option was asked to display a rank that is larger",
                 "than the number of procs in the job:",
                 "Node:      %s",
                 "Rank:      %d",
                 "Num procs: %d",
                 "Note that ranks start with 0, not 1, and must be specified",
                 "accordingly.",
                 NULL}
    },

    { .topic = "prte-odls-base:xterm-neg-rank",
      .content = (const char *[]){
                 "The xterm option was asked to display a rank that is negative:",
                 "Rank:      %d",
                 "Num procs: %d",
                 "Note that ranks start with 0, not 1, and must be specified",
                 "accordingly.",
                 NULL}
    },

    { .topic = "prte-odls-base:fork-agent-not-found",
      .content = (const char *[]){
                 "The specified fork agent was not found:",
                 "  Node:        %s",
                 "  Fork agent:  %s",
                 "The application cannot be launched.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_4[] = {
    { .topic = "execve error",
      .content = (const char *[]){
                 "PRTE tried to fork a new process via the \"execve\" system call but",
                 "failed.  PRTE checks many things before attempting to launch a",
                 "child process, but nothing is perfect. This error may be indicative",
                 "of another problem on the target host, or even something as silly as",
                 "having specified a directory for your application. Your job will now",
                 "abort.",
                 "  Local host:        %s",
                 "  Working dir:       %s",
                 "  Application name:  %s",
                 "  Error:             %s",
                 NULL}
    },

    { .topic = "binding generic error",
      .content = (const char *[]){
                 "PRTE tried to bind a new process, but something went wrong.  The",
                 "process was killed without launching the target application.  Your job",
                 "will now abort.",
                 "  Local host:        %s",
                 "  Application name:  %s",
                 "  Error message:     %s",
                 "  Location:          %s:%d",
                 NULL}
    },

    { .topic = "iof setup failed",
      .content = (const char *[]){
                 "PRTE tried to launch a child process but the \"IOF child setup\"",
                 "failed.  This should not happen.  Your job will now abort.",
                 "  Local host:        %s",
                 "  Application name:  %s",
                 NULL}
    },

    { .topic = "syscall fail",
      .content = (const char *[]){
                 "A system call failed that should not have.  In this particular case,",
                 "a warning or error message was not displayed that should have been.",
                 "Your job may behave unpredictably after this, or abort.",
                 "  Local host:        %s",
                 "  Application name:  %s",
                 "  Function:          %s",
                 "  Location:          %s:%d",
                 NULL}
    },

    { .topic = "memory binding error",
      .content = (const char *[]){
                 "PRTE tried to bind memory for a new process but something went",
                 "wrong. The process was killed without launching the target",
                 "application. Your job will now abort.",
                 "  Local host:        %s",
                 "  Application name:  %s",
                 "  Error message: %s",
                 "  Location:  %s:%d",
                 NULL}
    },

    { .topic = "set limit",
      .content = (const char *[]){
                 "Error message received from:",
                 "  Local host:        %s",
                 "  Application name:  %s",
                 "  Location:  %s:%d",
                 "Message:",
                 "%s",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_5[] = {
    { .topic = "no-available-pls",
      .content = (const char *[]){
                 "No available launching agents were found.",
                 "This is an unusual error; it means that PRTE was unable to find",
                 "any mechanism to launch proceses, and therefore is unable to start the",
                 "process(es) required by your application.",
                 NULL}
    },

    { .topic = "multiple-prefixes",
      .content = (const char *[]){
                 "%s does not support multiple different %s options.  You can",
                 "specify at most one unique value for the %s option (in any of",
                 "the application contexts); it will be applied to all the application",
                 "contexts of your parallel job.",
                 "Put simply, you must have %s installed in the same location on",
                 "all of your nodes.",
                 "The first two %s values supplied were:",
                 "    %s",
                 "    %s",
                 "Please correct this and try again.",
                 NULL}
    },

    { .topic = "multiple-app-prefixes",
      .content = (const char *[]){
                 "%s does not support multiple different %s options for a given",
                 "application context.  You can specify at most one unique value",
                 "for the option.",
                 "Put simply, you must have PMIx installed in the same location on",
                 "all of your nodes.",
                 "The first two %s values supplied were:",
                 "    %s",
                 "    %s",
                 "Please correct this and try again.",
                 NULL}
    },

    { .topic = "multiple-prrte-prefixes",
      .content = (const char *[]){
                 "%s does not support multiple different prefix settings across the",
                 "various methods for specifying it.",
                 "Put simply, you must have PRRTE installed in the same location on",
                 "all of your nodes.",
                 "If multiple values are given (e.g., in the environment plus on the",
                 "cmd line), a precedence order is used to try and select between them:",
                 "* the cmd line value from \"--prefix\" overrides all others. You can",
                 "  have multiple cmd line entries, but they must all match or else",
                 "  an error will be generated.",
                 "* the configuration option --enable-prte-prefix-by-default takes",
                 "  next precedence",
                 "* the \"PRTE_PREFIX\" environment variable",
                 "* use of a fully-qualified absolute path to %s. The path is",
                 "  extracted from the cmd and used as the prefix value. Note that",
                 "  we do permit the path to be different from the prefix specified",
                 "  by other means. This is done for those situations where the",
                 "  library was installed in a different location on remote nodes",
                 "  from the local node where %s is being executed.",
                 "%s has detected that the prefix was specified in multiple ways,",
                 "and that the values given were different. The first two values",
                 "supplied were:",
                 "    %s",
                 "    %s",
                 "Please correct this and try again.",
                 NULL}
    },

    { .topic = "multiple-pmix-prefixes",
      .content = (const char *[]){
                 "%s does not support multiple different prefix settings across the",
                 "various methods for specifying it.",
                 "Put simply, you must have PMIx installed in the same location on",
                 "all of your nodes.",
                 "If multiple values are given (e.g., in the environment plus on the",
                 "cmd line), a precedence order is used to try and select between them:",
                 "* the cmd line value from \"--pmix-prefix\" overrides all others. You can",
                 "  have multiple cmd line entries, but they must all match or else",
                 "  an error will be generated.",
                 "* the \"PMIX_PREFIX\" environment variable",
                 "%s has detected that the prefix was specified in multiple ways,",
                 "and that the values given were different. The first two values",
                 "supplied were:",
                 "    %s",
                 "    %s",
                 "Please correct this and try again.",
                 NULL}
    },

    { .topic = "prefix-conflict",
      .content = (const char *[]){
                 "%s was given two conflicting directives regarding a prefix value",
                 "for an application context:",
                 "    %s: %s",
                 "    %s",
                 "We cannot execute both of those, so please correct this and",
                 "try again.",
                 NULL}
    },

    { .topic = "multi-endian",
      .content = (const char *[]){
                 "PRRTE does not currently support multi-endian operations. We have",
                 "detected that the following node differs in endianness:",
                 "  Nodename:      %s",
                 "  Endian:        %s",
                 "  Local endian:  %s",
                 "Please correct the situation and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_6[] = {
    { .topic = "lsb_launch-failed",
      .content = (const char *[]){
                 "The LSF process starter (lsb_launch) failed to start the daemons on",
                 "the nodes in the allocation.",
                 " Returned : %d",
                 " lsberrno : (%d) %s",
                 "This may mean that one or more of the nodes in the LSF allocation is",
                 "not setup properly. Below is a list of the %d nodes that were passed",
                 "to lsb_launch:",
                 "%s",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_7[] = {
    { .topic = "no-hosts-in-list",
      .content = (const char *[]){
                 "The PALS process starter for PRTE didn't find any hosts in",
                 "the map for this application. This can be caused by a lack of",
                 "an allocation, or by an error in the PRTE code. Please check",
                 "to ensure you have a PALS allocation. If you do, then please pass",
                 "the error to the PRTE user's mailing list for assistance.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_8[] = {
    { .topic = "no-hosts-in-list",
      .content = (const char *[]){
                 "The SLURM process starter for PRTE didn't find any hosts in",
                 "the map for this application. This can be caused by a lack of",
                 "an allocation, or by an error in the PRTE code. Please check",
                 "to ensure you have a SLURM allocation. If you do, then please pass",
                 "the error to the PRTE user's mailing list for assistance.",
                 NULL}
    },

    { .topic = "no-srun",
      .content = (const char *[]){
                 "The SLURM process starter for OpenMPI was unable to locate a",
                 "usable \"srun\" command in its path. Please check your path",
                 "and try again.",
                 NULL}
    },

    { .topic = "ancient-version",
      .content = (const char *[]){
                 "The Slurm process starter requires a minimum Slurm version level",
                 "of v17.11. The detected version being used here is:",
                 "  Major: %d",
                 "  Minor: %d",
                 "SchedMD strongly recommends that you upgrade your Slurm version.",
                 "Versions of Slurm prior to 21.08.8 and 20.11.9 have been found",
                 "to have a security issue and are not supported - therefore, it",
                 "is recommended that you upgrade to a level at or above those",
                 "versions.",
                 "It is recognized that upgrades can take some time to complete.",
                 "In the interim, you can execute your job by ignoring the Slurm",
                 "process starter via the following MCA parameter:",
                 "  Environment: PRTE_MCA_plm=^slurm",
                 "  Cmd line: --prtemca plm ^slurm",
                 "  Default MCA param file: plm = ^slurm",
                 "This will result in use of the ssh process starter. This will have",
                 "no impact on your application, but will result in any accounting",
                 "being done solely at the allocation level instead of per-job.",
                 NULL}
    },

    { .topic = "srun-failed",
      .content = (const char *[]){
                 "srun returned non-zero exit status (%d) from launching",
                 "the per-node daemon. You may debug this problem further",
                 "by augmenting the cmd line with:",
                 "* \"--debug-daemons\"",
                 "* \"--leave-session-attached\"",
                 "* \"--prtemca plm_base_verbose N\" where N > 0",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_9[] = {
    { .topic = "agent-not-found",
      .content = (const char *[]){
                 "The value of the MCA parameter \"plm_ssh_agent\" was set to a path",
                 "that could not be found:",
                 "  plm_ssh_agent: %s",
                 "Please either unset the parameter, or check that the path is correct",
                 NULL}
    },

    { .topic = "concurrency-less-than-zero",
      .content = (const char *[]){
                 "The value of the MCA parameter \"pls_ssh_num_concurrent\" is less than",
                 "or equal to zero (%d).  This parameter is used to determine how many",
                 "remote agents (typically ssh) to invoke concurrently while launching",
                 "parallel jobs.",
                 "This value has automatically be reset to 1; processing will continue.",
                 NULL}
    },

    { .topic = "deadlock-params",
      .content = (const char *[]){
                 "The ssh launcher has been given a number of %d concurrent daemons to",
                 "launch and is in a debug-daemons option. However, the total number of",
                 "daemons to launch (%d) is greater than this value. This is a scenario that",
                 "will cause the system to deadlock.",
                 "To avoid deadlock, either increase the number of concurrent daemons, or",
                 "remove the debug-daemons flag.",
                 NULL}
    },

    { .topic = "cmd-line-too-long",
      .content = (const char *[]){
                 "The cmd line to launch remote daemons is too long:",
                 "  Length:      %d",
                 "  Max length:  %d",
                 "Consider setting -mca plm_ssh_pass_environ_mca_params 0 to",
                 "avoid including any environmentally set MCA parameters on the",
                 "command line.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_10[] = {
    { .topic = "tm-spawn-failed",
      .content = (const char *[]){
                 "The TM (PBS / Torque) process starter failed to spawn a daemon (prted)",
                 "on a remote node.",
                 "Command line: %s",
                 "Node name: %s",
                 "Launch id: %d",
                 "If you do not understand this error mesage, please try the following:",
                 "1. Ensure that the executable \"prted\" is in your PATH",
                 "2. Use the --prefix option to indicate where we can",
                 "   find that executable",
                 "3. Talk to your local system administrator",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_11[] = {
    { .topic = "ras-base:no-allocation",
      .content = (const char *[]){
                 "We were unable to find an allocation for this job as required by",
                 "setting the \"allocation required\" flag. Please ensure you have",
                 "the necessary allocation before executing again.",
                 "If you wish to execute without a provided allocation (e.g., by",
                 "providing a user-specified hostfile), please ensure that the \"allocation",
                 "required\" flag is not set. This flag can be set in several forms, so",
                 "please check that none of the following exist:",
                 "MCA param file: prte_allocation_required = 1",
                 "Environment: PRTE_MCA_prte_allocation_required=1",
                 "Cmd line: -prtemca prte_allocation_required 1",
                 NULL}
    },

    { .topic = "ras-base:addhost-not-found",
      .content = (const char *[]){
                 "A request was made to add hosts from a hostfile, but the",
                 "file could not be opened for reading:",
                 "  File: %s",
                 "Please check the filename and try again.",
                 NULL}
    },

    { .topic = "ras-base:nonuniform-slots",
      .content = (const char *[]){
                 "A request was made to add hosts from a hostfile while operating",
                 "in a managed allocation. In this case, either the slots must be",
                 "specified in the given hostfile, or the number of slots assigned",
                 "by the resource manager on the existing nodes must be uniform.",
                 "The current allocation does not conform to that requirement:",
                 "   Base number of slots: %d",
                 "   Node: %s",
                 "   Number of slots: %d",
                 "Please assign a number of slots for each node to be added to the",
                 "allocation.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_12[] = {
    { .topic = "cannot-read-pe-hostfile",
      .content = (const char *[]){
                 "The Grid Engine ras component is not able to read the $PE_HOSTFILE for",
                 "the Grid Engine nodes. The $PE_HOSTFILE environment variable shows the",
                 "file is located at:",
                 "  %s",
                 "The following error is returned:",
                 "  %s",
                 NULL}
    },

    { .topic = "no-nodes-found",
      .content = (const char *[]){
                 "No slots were found in the Grid Engine Parallel Environment (PE). This",
                 "is probably a setup issue, or could be due to a corrupted $PE_HOSTFILE.",
                 "There is also a chance that you may not be running under a parallel job",
                 "environment (PE) -- you may have forgotten to specify this is a parallel",
                 "job. If so, please specify that to Grid Engine and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_13[] = {
    { .topic = "nodelist-failed",
      .content = (const char *[]){
                 "While trying to determine what resources are available, LSF failed when",
                 "queried for a list of available nodes. This may indicate a problem with",
                 "LSF or your cluster.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_14[] = {
    { .topic = "no-nodefile",
      .content = (const char *[]){
                 "The PBS_NODEFILE environmental variable was",
                 "not found - no nodes can be allocated",
                 NULL}
    },

    { .topic = "no-nodes-found",
      .content = (const char *[]){
                 "No nodes were found in the PBS_NODEFILE:",
                 "%s",
                 "This is probably a setup issue, could be due to a corrupted file, or",
                 "- most probably - is caused by having failed to obtain an allocation.",
                 NULL}
    },

    { .topic = "smp-error",
      .content = (const char *[]){
                 "The SMP mode flag was given, but the required PBS_PPN environmental",
                 "variable was not found. Please check that your system actually supports",
                 "the indicated mode and try again.",
                 NULL}
    },

    { .topic = "smp-multi",
      .content = (const char *[]){
                 "The SMP mode flag was given, but a node was listed in the PBS_Nodefile",
                 "more than once. This usually indicates that the system is not",
                 "actually operating in SMP mode. Please check your system configuration",
                 "and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_15[] = {
    { .topic = "slurm-env-var-not-found",
      .content = (const char *[]){
                 "While trying to determine what resources are available, the SLURM",
                 "resource allocator expects to find the following environment variables:",
                 "    SLURM_NODELIST",
                 "    SLURM_TASKS_PER_NODE",
                 "However, it was unable to find the following environment variable:",
                 "    %s",
                 "This is a fatal error.",
                 NULL}
    },

    { .topic = "slurm-env-var-bad-value",
      .content = (const char *[]){
                 "While trying to determine what resources are available, the SLURM",
                 "resource allocator uses the following environment variables:",
                 "    SLURM_NODELIST       value: %s",
                 "    SLURM_TASKS_PER_NODE value: %s",
                 "However, an error was encountered when trying to parse the following variable:",
                 "    %s",
                 "This is a fatal error.",
                 NULL}
    },

    { .topic = "slurm-dyn-alloc-timeout",
      .content = (const char *[]){
                 "We attempted to obtain a dynamic allocation from Slurm, but",
                 "contact with the Slurm control daemon timed out. Please check",
                 "that the Slurm dynamic allocation plug-in is properly operating.",
                 NULL}
    },

    { .topic = "slurm-dyn-alloc-failed",
      .content = (const char *[]){
                 "  Allocation request: %s",
                 NULL}
    },

    { .topic = "dyn-alloc-no-config",
      .content = (const char *[]){
                 "Dynamic allocation was enabled, but no Slurm configuration",
                 "file was given. Please provide the required configuration file.",
                 NULL}
    },

    { .topic = "host-not-resolved",
      .content = (const char *[]){
                 "The Slurm control host could not be resolved.",
                 "  Host: %s",
                 "Please check the Slurm configuration and try again.",
                 NULL}
    },

    { .topic = "connection-failed",
      .content = (const char *[]){
                 "Connection to the Slurm controller failed:",
                 "  Host: %s",
                 "  Port: %d",
                 "Please check the Slurm configuration and try again.",
                 NULL}
    },

    { .topic = "config-file-not-found",
      .content = (const char *[]){
                 "The Slurm configuration file was not found.",
                 "  File: %s",
                 "Please check the filename and path and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_16[] = {
    { .topic = "multi-apps-and-zero-np",
      .content = (const char *[]){
                 "PRTE found multiple applications to be launched, with",
                 "at least one that failed to specify the number of processes to execute.",
                 "When specifying multiple applications, you must specify how many processes",
                 "of each to launch via the -np argument.",
                 NULL}
    },

    { .topic = "prte-rmaps-base:alloc-error",
      .content = (const char *[]){
                 "There are not enough slots available in the system to satisfy the %d",
                 "slots that were requested by the application:",
                 "  %s",
                 "Either request fewer procs for your application, or make more slots",
                 "available for use.",
                 "A \"slot\" is the PRRTE term for an allocatable unit where we can",
                 "launch a process.  The number of slots available are defined by the",
                 "environment in which PRRTE processes are run:",
                 "  1. Hostfile, via \"slots=N\" clauses (N defaults to number of",
                 "     processor cores if not provided)",
                 "  2. The --host command line parameter, via a \":N\" suffix on the",
                 "     hostname (N defaults to 1 if not provided)",
                 "  3. Resource manager (e.g., SLURM, PBS/Torque, LSF, etc.)",
                 "  4. If none of a hostfile, the --host command line parameter, or an",
                 "     RM is present, PRRTE defaults to the number of processor cores",
                 "In all the above cases, if you want PRRTE to default to the number",
                 "of hardware threads instead of the number of processor cores, use the",
                 "--use-hwthread-cpus option.",
                 "Alternatively, you can use the --map-by :OVERSUBSCRIBE option to ignore the",
                 "number of available slots when deciding the number of processes to",
                 "launch.",
                 NULL}
    },

    { .topic = "prte-rmaps-base:no-mapped-node",
      .content = (const char *[]){
                 "There are no allocated resources for the application:",
                 "  %s",
                 "that match the requested mapping:",
                 "  %s: %s",
                 "Verify that you have mapped the allocated resources properly for the",
                 "indicated specification.",
                 NULL}
    },

    { .topic = "prte-rmaps-base:no-available-resources",
      .content = (const char *[]){
                 "No nodes are available for this job, either due to a failure to",
                 "allocate nodes to the job, or allocated nodes being marked",
                 "as unavailable (e.g., down, rebooting, or a process attempting",
                 "to be relocated to another node when none are available).",
                 NULL}
    },

    { .topic = "prte-rmaps-base:all-available-resources-used",
      .content = (const char *[]){
                 "All nodes which are allocated for this job are already filled.",
                 NULL}
    },

    { .topic = "out-of-vpids",
      .content = (const char *[]){
                 "The system has exhausted its available ranks - the application is attempting",
                 "to spawn too many daemons and will be aborted.",
                 "This may be resolved by increasing the number of available ranks by",
                 "re-configuring with the --enable-jumbo-apps option, and then",
                 "re-building the application.",
                 NULL}
    },

    { .topic = "failed-map",
      .content = (const char *[]){
                 "Your job failed to map. Either no mapper was available, or none",
                 "of the available mappers was able to perform the requested",
                 "mapping operation.",
                 "  Mapper result:       %s",
                 "  Application:         %s",
                 "  #procs to be mapped: %d",
                 "  Mapping policy:      %s",
                 "  Binding policy:      %s",
                 NULL}
    },

    { .topic = "span-packages-multiple",
      .content = (const char *[]){
                 "Your job failed to map because the resulting process placement",
                 "would cause the process to be bound to CPUs in more than one",
                 "package:",
                 "  Mapping policy:  %s",
                 "  Binding policy:  %s",
                 "  CPUs/rank:       %d",
                 "This configuration almost always results in a loss of performance",
                 "that can significantly impact applications. Either alter the",
                 "mapping, binding, and/or cpus/rank policies so that each process",
                 "can fit into a single package, or consider using an alternative",
                 "mapper that can handle this configuration (e.g., the rankfile mapper).",
                 NULL}
    },

    { .topic = "span-packages-cpuset",
      .content = (const char *[]){
                 "Your job failed to map because the resulting process placement",
                 "would cause the process to be bound to CPUs in more than one",
                 "package:",
                 "  Mapping policy:  %s",
                 "  Binding policy:  %s",
                 "  PE-LIST:         %s",
                 "This configuration almost always results in a loss of performance",
                 "that can significantly impact applications. Either alter the",
                 "mapping, binding, and/or PE-LIST policies so that each process",
                 "can fit into a single package, or consider using an alternative",
                 "mapper that can handle this configuration (e.g., the rankfile mapper).",
                 NULL}
    },

    { .topic = "unrecognized-policy",
      .content = (const char *[]){
                 "The specified %s directive is not recognized:",
                 "  Directive: %s",
                 "Please check for a typo or ensure that the directive is a supported",
                 "one.",
                 NULL}
    },

    { .topic = "rmaps:binding-target-not-found",
      .content = (const char *[]){
                 "A request was made to bind to %s, but an appropriate target could not",
                 "be found on node %s.",
                 NULL}
    },

    { .topic = "allocation-overload",
      .content = (const char *[]){
                 "A request was made to bind that would require binding",
                 "processes to more cpus than are available in your allocation:",
                 "   Application:     %s",
                 "   #processes:      %d",
                 "   Mapping policy:  %s",
                 "   Binding policy:  %s",
                 "You can override this protection by adding the \"overload-allowed\"",
                 "option to your binding directive.",
                 NULL}
    },

    { .topic = "rmaps:no-topology",
      .content = (const char *[]){
                 "A mapping directive was given that requires knowledge of",
                 "a remote node's topology. However, no topology info is",
                 "available for the following node:",
                 "  Node: %s",
                 "The job cannot be executed under this condition. Please either",
                 "remove the directive or investigate the lack of topology info.",
                 NULL}
    },

    { .topic = "rmaps:no-available-cpus",
      .content = (const char *[]){
                 "While computing bindings, we found no available cpus on",
                 "the following node:",
                 "  Node:  %s",
                 "Please check your allocation.",
                 NULL}
    },

    { .topic = "rmaps:cpubind-not-supported",
      .content = (const char *[]){
                 "A request was made to bind a process, but at least one node does NOT",
                 "support binding processes to cpus.",
                 "Node: %s",
                 "PRRTE uses the \"hwloc\" library to perform process and memory",
                 "binding. This error message means that hwloc has indicated that",
                 "processor binding support is not available on this machine.",
                 "On OS X, processor and memory binding is not available at all (i.e.,",
                 "the OS does not expose this functionality).",
                 "On Linux, lack of the functionality can mean that you are on a",
                 "platform where processor and memory affinity is not supported in Linux",
                 "itself, or that hwloc was built without NUMA and/or processor affinity",
                 "support. When building hwloc (which, depending on your PRRTE",
                 "installation, may be embedded in PRRTE itself), it is important to",
                 "have the libnuma header and library files available. Different linux",
                 "distributions package these files under different names; look for",
                 "packages with the word \"numa\" in them. You may also need a developer",
                 "version of the package (e.g., with \"dev\" or \"devel\" in the name) to",
                 "obtain the relevant header files.",
                 "If you are getting this message on a non-OS X, non-Linux platform,",
                 "then hwloc does not support processor / memory affinity on this",
                 "platform. If the OS/platform does actually support processor / memory",
                 "affinity, then you should contact the hwloc maintainers:",
                 "https://github.com/open-mpi/hwloc.",
                 NULL}
    },

    { .topic = "rmaps:membind-not-supported",
      .content = (const char *[]){
                 "WARNING: a request was made to bind a process. While the system",
                 "supports binding the process itself, at least one node does NOT",
                 "support binding memory to the process location.",
                 "  Node:  %s",
                 "PRRTE uses the \"hwloc\" library to perform process and memory",
                 "binding. This error message means that hwloc has indicated that",
                 "processor binding support is not available on this machine.",
                 "On OS X, processor and memory binding is not available at all (i.e.,",
                 "the OS does not expose this functionality).",
                 "On Linux, lack of the functionality can mean that you are on a",
                 "platform where processor and memory affinity is not supported in Linux",
                 "itself, or that hwloc was built without NUMA and/or processor affinity",
                 "support. When building hwloc (which, depending on your PRRTE",
                 "installation, may be embedded in PRRTE itself), it is important to",
                 "have the libnuma header and library files available. Different linux",
                 "distributions package these files under different names; look for",
                 "packages with the word \"numa\" in them. You may also need a developer",
                 "version of the package (e.g., with \"dev\" or \"devel\" in the name) to",
                 "obtain the relevant header files.",
                 "If you are getting this message on a non-OS X, non-Linux platform,",
                 "then hwloc does not support processor / memory affinity on this",
                 "platform. If the OS/platform does actually support processor / memory",
                 "affinity, then you should contact the hwloc maintainers:",
                 "https://github.com/open-mpi/hwloc.",
                 "This is a warning only; your job will continue, though performance may",
                 "be degraded.",
                 NULL}
    },

    { .topic = "rmaps:membind-not-supported-fatal",
      .content = (const char *[]){
                 "A request was made to bind a process. While the system",
                 "supports binding the process itself, at least one node does NOT",
                 "support binding memory to the process location.",
                 "  Node:  %s",
                 "PRRTE uses the \"hwloc\" library to perform process and memory",
                 "binding. This error message means that hwloc has indicated that",
                 "processor binding support is not available on this machine.",
                 "On OS X, processor and memory binding is not available at all (i.e.,",
                 "the OS does not expose this functionality).",
                 "On Linux, lack of the functionality can mean that you are on a",
                 "platform where processor and memory affinity is not supported in Linux",
                 "itself, or that hwloc was built without NUMA and/or processor affinity",
                 "support. When building hwloc (which, depending on your PRRTE",
                 "installation, may be embedded in PRRTE itself), it is important to",
                 "have the libnuma header and library files available. Different linux",
                 "distributions package these files under different names; look for",
                 "packages with the word \"numa\" in them. You may also need a developer",
                 "version of the package (e.g., with \"dev\" or \"devel\" in the name) to",
                 "obtain the relevant header files.",
                 "If you are getting this message on a non-OS X, non-Linux platform,",
                 "then hwloc does not support processor / memory affinity on this",
                 "platform. If the OS/platform does actually support processor / memory",
                 "affinity, then you should contact the hwloc maintainers:",
                 "https://github.com/open-mpi/hwloc.",
                 "The provided memory binding policy requires that PRRTE abort the",
                 "job at this time.",
                 NULL}
    },

    { .topic = "mapping-too-low",
      .content = (const char *[]){
                 "A request for multiple cpus-per-proc was given, but a directive",
                 "was also given to map to an object level that has less cpus than",
                 "requested ones:",
                 "  #cpus-per-proc:  %d",
                 "  number of cpus:  %d",
                 "  map-by:          %s",
                 "Please specify a mapping level that has more cpus, or else let us",
                 "define a default mapping that will allow multiple cpus-per-proc.",
                 NULL}
    },

    { .topic = "unrecognized-modifier",
      .content = (const char *[]){
                 "The mapping request contains an unrecognized qualifier:",
                 "  Request: %s",
                 "Please check your request and try again. Remember, multiple",
                 "qualifiers must be separated by a colon (':').",
                 NULL}
    },

    { .topic = "invalid-pattern",
      .content = (const char *[]){
                 "The mapping request contains a pattern that doesn't match",
                 "the required syntax of #:object",
                 "  Pattern: %s",
                 "Please check your request and try again.",
                 NULL}
    },

    { .topic = "cannot-launch",
      .content = (const char *[]){
                 "Although we were able to map your job, we are unable to launch",
                 "it at this time due to required resources being busy. Please",
                 "try again later.",
                 NULL}
    },

    { .topic = "unsupported-default-modifier",
      .content = (const char *[]){
                 "A %s modifier was provided that is not supported as a default value:",
                 "  Modifier:  %s",
                 "You can provide this modifier on a per-job basis, but it cannot",
                 "be the default setting.",
                 NULL}
    },

    { .topic = "unsupported-default-policy",
      .content = (const char *[]){
                 "A %s policy was provided that is not supported as a default value:",
                 "  Policy:  %s",
                 "You can provide this policy on a per-job basis, but it cannot",
                 "be the default setting.",
                 NULL}
    },

    { .topic = "missing-value",
      .content = (const char *[]){
                 "A %s was given that requires a value, but no value for it was given",
                 "or the value is missing the required '=' sign:",
                 "  Policy:  %s",
                 "  Given:   %s",
                 "Please provide a value for this policy, or remove it.",
                 NULL}
    },

    { .topic = "invalid-value",
      .content = (const char *[]){
                 "A %s was given that requires a value, but the provided value is invalid:",
                 "  Policy:  %s",
                 "  Given:   %s",
                 "Please provide a valid value for this policy, or remove it.",
                 NULL}
    },

    { .topic = "rankfile-no-filename",
      .content = (const char *[]){
                 "The request to map processes using a rankfile could not be completed",
                 "because the filename of the rankfile was not specified. Please",
                 "specify the name of the rankfile.",
                 NULL}
    },

    { .topic = "unrecognized-qualifier",
      .content = (const char *[]){
                 "The %s directive contains an unrecognized qualifier:",
                 "  Qualifier: %s",
                 "  Valid qualifiers: %s",
                 "Please check for a typo or ensure that the qualifier is a supported one.",
                 NULL}
    },

    { .topic = "unrecognized-directive",
      .content = (const char *[]){
                 "The specified %s directive is not recognized:",
                 "  Directive: %s",
                 "  Valid directives: %s",
                 "Please check for a typo or ensure that the directive is a supported one.",
                 NULL}
    },

    { .topic = "missing-qualifier",
      .content = (const char *[]){
                 "The %s option contains a directive that is missing a value:",
                 "  Directive: %s",
                 "  Valid directive: \"%s=<value>\"",
                 "Please check for a typo or ensure that the value is provided.",
                 NULL}
    },

    { .topic = "missing-personality",
      .content = (const char *[]){
                 "PRRTE has hit an internal problem that should never happen - it is",
                 "attempting to map a job that lacks an assigned personality.",
                 "  Job: %s",
                 "Please report this to the PRRTE developers (https://github.com/openpmix/prrte/issues)",
                 NULL}
    },

    { .topic = "unsupported-combination",
      .content = (const char *[]){
                 "A %s policy was provided that is not supported in combination",
                 "with the \"PE=N\" option:",
                 "  Policy:  %s",
                 "When specifying the number of CPUs to use for each process in a job,",
                 "the processes must be bound at the CPU level - either HWThread if",
                 "\"HWTCPUS\" was specified, or CORE. Please remove the bind policy",
                 "specification and try again.",
                 NULL}
    },

    { .topic = "redefining-policy",
      .content = (const char *[]){
                 "Conflicting directives for binding policy are causing the policy to be",
                 "redefined:",
                 "   New policy:   %s",
                 "   Prior policy:  %s",
                 "Please check that only one policy is defined.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_17[] = {
    { .topic = "invalid-ppr",
      .content = (const char *[]){
                 "An invalid value was given for the number of processes",
                 "per resource (ppr) to be mapped on each node:",
                 "  PPR:  %s",
                 "The specification must be a comma-separated list containing",
                 "combinations of number, followed by a colon, followed",
                 "by the resource type. For example, a value of \"1:package\" indicates that",
                 "one process is to be mapped onto each package. Values are supported",
                 "for \"hwthread\", \"core\", \"package\",",
                 "\"l1cache\", \"l2cache\", \"l3cache\", and \"node\" . Note that",
                 "enough characters must be provided to clearly specify the desired",
                 "resource (e.g., \"l1\" for \"l1cache\").",
                 NULL}
    },

    { .topic = "unrecognized-ppr-option",
      .content = (const char *[]){
                 "An unrecognized value was given for the number of processes",
                 "per resource (ppr) to be mapped on each node:",
                 "  Value:  %s",
                 "  PPR:  %s",
                 "The specification must be a number, followed by a colon, followed",
                 "by the resource type. For example, a value of \"1:slot\" indicates that",
                 "anything over one process per slot is to be considered oversubscribed.",
                 "Only values for \"hwthread\", \"core\", \"package\",",
                 "\"l1cache\", \"l2cache\", \"l3cache\", and \"node\" are allowed. Note that",
                 "enough characters must be provided to clearly specify the desired",
                 "resource (e.g., \"l1\" for \"l1cache\").",
                 NULL}
    },

    { .topic = "ppr-too-many-procs",
      .content = (const char *[]){
                 "Your job has requested more processes than the ppr for",
                 "this topology can support:",
                 "  App: %s",
                 "  Number of procs:  %d",
                 "  Procs mapped:  %d",
                 "  Total number of procs:  %d",
                 "  PPR: %s",
                 "Please revise the conflict and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_18[] = {
    { .topic = "no-rankfile",
      .content = (const char *[]){
                 "%s was unable to open the rankfile:",
                 "  Filename: %s",
                 "Check to make sure the path and filename are correct.",
                 "usage:  %s -mca rmaps_rankfile_path rankfile ./app",
                 "Examples of proper syntax include:",
                 "  cat hostfile",
                 "    host1",
                 "    host2",
                 "    host3",
                 "    host4",
                 "  cat rankfile",
                 "    rank 1=host1 slot=1:0,1",
                 "    rank 0=host2 slot=0:*",
                 "    rank 2=host4 slot=1-2",
                 "    rank 3=host3 slot=0:1;1:0-2",
                 NULL}
    },

    { .topic = "bad-host",
      .content = (const char *[]){
                 "The rankfile that was used claimed that a host was either not",
                 "allocated or oversubscribed its slots.  Please review your rank-slot",
                 "assignments and your host allocation to ensure a proper match.  Also,",
                 "some systems may require using full hostnames, such as",
                 "\"host1.example.com\" (instead of just plain \"host1\").",
                 "  Host: %s",
                 NULL}
    },

    { .topic = "bad-index",
      .content = (const char *[]){
                 "Rankfile claimed host %s by index that is bigger than number of allocated hosts.",
                 NULL}
    },

    { .topic = "bad-assign",
      .content = (const char *[]){
                 "Error, rank %d is already assigned to %s, check %s",
                 NULL}
    },

    { .topic = "bad-syntax",
      .content = (const char *[]){
                 "Error, invalid syntax in the rankfile (%s)",
                 "syntax must be the following",
                 "rank i=host_i slot=string",
                 "Examples of proper syntax include:",
                 "    rank 1=host1 slot=1:0,1",
                 "    rank 0=host2 slot=0:*",
                 "    rank 2=host4 slot=1-2",
                 "    rank 3=host3 slot=0:1;1:0-2",
                 NULL}
    },

    { .topic = "missing-rank",
      .content = (const char *[]){
                 "A rank is missing its location specification:",
                 "  Rank:        %d",
                 "  Rank file:   %s",
                 "All processes must have their location specified in the rank file. Either",
                 "add an entry to the file, or provide a default slot_list to use for",
                 "any unspecified ranks.",
                 NULL}
    },

    { .topic = "missing-cpu",
      .content = (const char *[]){
                 "While parsing the rankfile, %s encountered a line that specified",
                 "a non-existent CPU:",
                 "  Slots: %s",
                 "  Available CPUs: %s",
                 "Please correct the line and try again.",
                 NULL}
    },

    { .topic = "lsf-affinity-file-not-found",
      .content = (const char *[]){
                 "The affinity file provided in LSB_AFFINITY_HOSTFILE could not be found:",
                 "  File:  %s",
                 "We cannot continue.",
                 NULL}
    },

    { .topic = "lsf-affinity-file-failed-convert",
      .content = (const char *[]){
                 "The affinity file provided in LSB_AFFINITY_HOSTFILE could not be converted",
                 "to a rankfile:",
                 "  File:  %s",
                 "We cannot continue.",
                 NULL}
    },

    { .topic = "rmaps:proc-slots-overloaded",
      .content = (const char *[]){
                 "A process attempted to bind to resources already allocated on a node",
                 "to a different process.",
                 " Process : %s",
                 " Node    : %s",
                 " Process Requested CPU Set : %s",
                 " Node Available CPU Set    : %s",
                 " Overlapping CPU Set       : %s",
                 "If this is intentional then you must pass the \"overload-allowed\"",
                 "qualifier to the --bind-to option.",
                 "  --bind-to :overload-allowed",
                 NULL}
    },

    { .topic = "resource-not-found",
      .content = (const char *[]){
                 "The specified LSF affinity file contained a node (%s) that is not in your",
                 "allocation. We therefore cannot map a process rank to it. Please",
                 "check your allocation and affinity file to ensure the latter only",
                 "contains allocated nodes.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_19[] = {
    { .topic = "prte-rmaps-rr:not-enough-cpus",
      .content = (const char *[]){
                 "There are not enough slots available in the system or not enough",
                 "CPUs in the specified PE-LIST to map the number of processes requested",
                 "by the application:",
                 "  app:  %s",
                 "  Number of procs: %d",
                 "  pe-list: %s",
                 "Either request fewer procs for your application, make more slots",
                 "available for use, or expand the pe-list.",
                 "A \"slot\" is the PRRTE term for an allocatable unit where we can",
                 "launch a process.  The number of slots available are defined by the",
                 "environment in which PRRTE processes are run:",
                 "  1. Hostfile, via \"slots=N\" clauses (N defaults to number of",
                 "     processor cores if not provided)",
                 "  2. The --host command line parameter, via a \":N\" suffix on the",
                 "     hostname (N defaults to 1 if not provided)",
                 "  3. Resource manager (e.g., SLURM, PBS/Torque, LSF, etc.)",
                 "  4. If none of a hostfile, the --host command line parameter, or an",
                 "     RM is present, PRRTE defaults to the number of processor cores",
                 "In all the above cases, if you want PRRTE to default to the number",
                 "of hardware threads instead of the number of processor cores, use the",
                 "--use-hwthread-cpus option.",
                 "Alternatively, you can use the --map-by :OVERSUBSCRIBE option to ignore",
                 "the number of available slots and size of the pe-list when placing the",
                 "processes.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_20[] = {
    { .topic = "prte-rmaps-seq:resource-not-found",
      .content = (const char *[]){
                 "The specified sequence file contained a node (%s) that is not in your",
                 "allocation. We therefore cannot map a process rank to it. Please",
                 "check your allocation and sequence file to ensure the latter only",
                 "contains allocated nodes.",
                 NULL}
    },

    { .topic = "seq:not-enough-resources",
      .content = (const char *[]){
                 "A sequential map was requested, but not enough node entries",
                 "were given to support the requested number of processes:",
                 "  Num procs:  %d",
                 "  Num nodes:  %d",
                 "The sequential mapper requires that there be a node entry for",
                 "every process in the job, and it processes the provided file",
                 "using each node entry to identify the node where that numbered",
                 "rank is to be placed.",
                 "Note that you can provide a separate sequence file (different",
                 "from a hostfile that specifies the number of slots on each node)",
                 "for use by the sequential mapper in its assignments by using the",
                 "appropriate modifier:",
                 "  Example: --map-by seq:file=myseqfile",
                 NULL}
    },

    { .topic = "proc-failed-to-map",
      .content = (const char *[]){
                 "A process could not be mapped:",
                 "  Hostname: %s",
                 "  App: %s",
                 "Could not continue.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_21[] = {
    { .topic = "missing-param-file",
      .content = (const char *[]){
                 "Unable to locate the variable file:",
                 "   %s",
                 NULL}
    },

    { .topic = "missing-param-file-def",
      .content = (const char *[]){
                 "Unable to locate the variable file:",
                 "   %s",
                 "either relative to the current working directory",
                 "or in the default location:",
                 "   %s",
                 NULL}
    },

    { .topic = "bad-param-line",
      .content = (const char *[]){
                 "Parsing error in variable file:",
                 "  FILE:  %s",
                 "  LINE:  %s",
                 "Please correct and try again.",
                 NULL}
    },

    { .topic = "incorrect-env-list-param",
      .content = (const char *[]){
                 "WARNING: The format of \"mca_base_env_list\" parameter is a delimited list of VAR=VAL or",
                 "VAR instances. By default, the delimiter is a semicolon: VAR1=VAL1;VAR2;VAR3=VAL3;...",
                 "You can set other via \"mca_base_env_list_delimiter\" parameter. If the delimiter is a",
                 "semicolon, the value of \"mca_base_env_list\" variable should be quoted to not interfere",
                 "with SHELL command line parsing. In the case where a value is not assigned to variable",
                 "VAR, the value will be taken from the current environment.",
                 "The following environment variable was not found in the environment:",
                 "  Variable:             %s",
                 "  MCA variable value:   %s",
                 NULL}
    },

    { .topic = "env-not-found",
      .content = (const char *[]){
                 "An environmental variable was requested to be forwarded, but was not found:",
                 "  Variable:  %s",
                 "This may result in unexpected behavior.",
                 NULL}
    },

    { .topic = "single-dash-error",
      .content = (const char *[]){
                 "WARNING: All multi-character command line options must be prefixed with double",
                 "dashes, not a single dash:",
                 "  Deprecated option(s):   %s",
                 "  Corrected  option(s):   %s",
                 "We have updated this for you and will proceed. However, this will be treated",
                 "as an error in a future release. Please update your command line.",
                 NULL}
    },

    { .topic = "deprecated-converted",
      .content = (const char *[]){
                 "WARNING: A deprecated command line option was used.",
                 "  Deprecated option:   %s",
                 "  Corrected option:    %s",
                 "We have updated this for you and will proceed. However, this will be treated",
                 "as an error in a future release. Please update your command line.",
                 NULL}
    },

    { .topic = "deprecated-inform",
      .content = (const char *[]){
                 "WARNING: A deprecated command line option was used.",
                 "  Deprecated option:   %s",
                 "  Reason: %s",
                 NULL}
    },

    { .topic = "bad-ppr",
      .content = (const char *[]){
                 "The proc-per-resource request is not correct. The request must include both",
                 "the number of procs for each resource and the type of resource to be used.",
                 "  Specified option:  %s",
                 "We are not able to proceed. Please correct your command line.",
                 NULL}
    },

    { .topic = "bad-stream-buffering-value",
      .content = (const char *[]){
                 "An incorrect value for the \"--stream-buffering\" option was given:",
                 "  Specified value:  %d",
                 "Valid values are limited to 0, 1, or 2. Your application will continue, but",
                 "please correct your command line in the future.",
                 NULL}
    },

    { .topic = "missing-envar-param",
      .content = (const char *[]){
                 "Warning: Could not find the environment variable: %s",
                 NULL}
    },

    { .topic = "duplicate-mca-value",
      .content = (const char *[]){
                 "Error: an MCA parameter was listed more than once on the command line, or",
                 "multiple times in one or more files, but with conflicting values:",
                 "  Param:  %s",
                 "  Value:  %s",
                 "  Value:  %s",
                 "We cannot determine which value was intended, and therefore are unable to proceed.",
                 "Please correct your command line.",
                 NULL}
    },

    { .topic = "multi-instances",
      .content = (const char *[]){
                 "ERROR: The \"%s\" command line option was listed more than once on the command line.",
                 "Only one instance of this option is permitted.",
                 "Please correct your command line.",
                 NULL}
    },

    { .topic = "no-proxy",
      .content = (const char *[]){
                 "ERROR: %s was unable to identify the proxy for your command.",
                 "  Option specified: %s",
                 "Please specify a personality or ask the library developer's to address",
                 "the problem.",
                 NULL}
    },

    { .topic = "too-many-instances",
      .content = (const char *[]){
                 "The command line includes too many instances of the following option:",
                 "  Command line: %s",
                 "  Option: %s",
                 "  Number of instances: %d",
                 "  Allowed number: %d",
                 "Please correct the command line and try again.",
                 NULL}
    },

    { .topic = "too-many-directives",
      .content = (const char *[]){
                 "When resolving deprecated command line options, the result generated",
                 "too many directives for the target option:",
                 "  Command line option: %s",
                 "  Initial value: %s",
                 "  Deprecated option: %s %s",
                 "Please correct the command line and try again.",
                 NULL}
    },

    { .topic = "too-many-values",
      .content = (const char *[]){
                 "When resolving deprecated command line options, the following",
                 "command line option has more than one value:",
                 "  Option: %s",
                 "The resolution function cannot handle this scenario - please",
                 "notify the developers",
                 NULL}
    },

    { .topic = "binding-pe-conflict",
      .content = (const char *[]){
                 "The PE=<list> mapping directive cannot be combined with a",
                 "binding directive other than \"core\" or \"hwt\" as it already",
                 "mandates that we bind to the specified cpu(s). The conflicting",
                 "directives that were given are:",
                 "  map-by:  %s",
                 "  bind-to: %s",
                 "Please resolve the conflict and try again.",
                 NULL}
    },

    { .topic = "missing-values",
      .content = (const char *[]){
                 "The provided command line option requires passing two",
                 "values:",
                 "  Option:  %s <MCA param name> <param value>",
                 "Please provide the missing values and try again.",
                 NULL}
    },

    { .topic = "non-supporting-pmix",
      .content = (const char *[]){
                 "The given command line directive is technically valid, but the",
                 "underlying PMIx version being employed lacks the necessary attribute",
                 "definitions to support it.",
                 "  Directive:  %s",
                 "  Option:     %s",
                 "We are therefore unable to satisfy this request.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_22[] = {
    { .topic = "version",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "%s",
                 NULL}
    },

    { .topic = "usage",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Usage: %s [OPTION]...",
                 "See the mpirun(1) man page or HTML help for a detailed list of command",
                 "line options that are available.",
                 "%s",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_23[] = {
    { .topic = "usage",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Usage: \"%s [OPTION]...\"",
                 "Provide detailed information on your PRRTE installation.",
                 "The following list of command line options are available. Note that",
                 "more detailed help for any option can be obtained by adding that",
                 "option to the help request as \"--help <option>\".",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"-a\" | \"--all\"       | Show all configuration options and MCA        |",
                 "|                      | parameters                                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--arch\"             | Show architecture on which PRRTE was compiled |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-c\" | \"--config\"    | Show configuration options                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-h\" | \"--help\"      | This help message                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--hostname\"         | Show the hostname on which PRRTE was          |",
                 "|                      | configured and built                          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--internal\"         | Show internal MCA parameters (not meant to be |",
                 "|                      | modified by users)                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--param <framework  | Show MCA parameters.  The first parameter is  |",
                 "| >:<component1>,<com  | the framework (or the keyword \"all\"); the     |",
                 "| ponent2>\"            | second parameter is a comma-delimited list of |",
                 "|                      | specific component names (if only             |",
                 "|                      | \"<framework>\" is given, then all components   |",
                 "|                      | will be reported).                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--path <type>\"      | Show paths with which PRRTE was configured.   |",
                 "|                      | Accepts the following parameters: \"prefix\",   |",
                 "|                      | \"bindir\", \"libdir\", \"incdir\", \"mandir\",       |",
                 "|                      | \"pkglibdir\", \"sysconfdir\".                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--show-version      | Show version of PRRTE or a component.  The    |",
                 "| <type>:<part>\"       | first parameter can be the keywords \"prte\",   |",
                 "|                      | \"all\", or a framework name (indicating all    |",
                 "|                      | components in a framework), or a              |",
                 "|                      | \"framework:component\" string (indicating a    |",
                 "|                      | specific component).  The second parameter    |",
                 "|                      | can be one of: \"full\", \"major\", \"minor\",      |",
                 "|                      | \"release\", \"greek\", \"git\".                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-V\" | \"--version\"   | Print version and exit                        |",
                 "+----------------------+-----------------------------------------------+",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "param",
      .content = (const char *[]){
                 "Syntax: \"--param <arg0> <arg1>\"",
                 "Show MCA parameters.  The first parameter is the framework (or the",
                 "keyword \"all\"); the second parameter is the specific component name",
                 "(or the keyword \"all\").",
                 NULL}
    },

    { .topic = "internal",
      .content = (const char *[]){
                 "Syntax: \"--internal\"",
                 "Show internal MCA parameters (i.e., parameters not meant to be",
                 "modified by users)",
                 NULL}
    },

    { .topic = "path",
      .content = (const char *[]){
                 "Syntax: \"--path <arg0>\"",
                 "Show the paths with which PRRTE was configured.  Accepts the following",
                 "parameters: \"prefix\", \"bindir\", \"libdir\", \"incdir\", \"mandir\",",
                 "\"pkglibdir\", \"sysconfdir\".",
                 NULL}
    },

    { .topic = "arch",
      .content = (const char *[]){
                 "Syntax: \"--arch\" Show architecture on which PRRTE was compiled",
                 NULL}
    },

    { .topic = "config",
      .content = (const char *[]){
                 "Syntax: \"-c\" or \"--config\"",
                 "Show configuration options used to configure PRRTE",
                 NULL}
    },

    { .topic = "hostname",
      .content = (const char *[]){
                 "Syntax: \"--hostname\"",
                 "Show the hostname upon which PRRTE was configured and built",
                 NULL}
    },

    { .topic = "all",
      .content = (const char *[]){
                 "Syntax: \"-a\" or \"--all\"",
                 "Show all configuration options and MCA parameters",
                 NULL}
    },

    { .topic = "lib-call-fail",
      .content = (const char *[]){
                 "A library call unexpectedly failed.  This is a terminal error; please",
                 "show this message to a PRTE wizard:",
                 "   Library call: %s Source file: %s Source line number: %d",
                 "Aborting...",
                 NULL}
    },

    { .topic = "developer warning: field too long",
      .content = (const char *[]){
                 "DEVELOPER WARNING: A field in prte_info output is too long and will",
                 "appear poorly in the prettyprint output.",
                 "   Value:      \"%s\" Max length: %d",
                 NULL}
    },

    { .topic = "not-found",
      .content = (const char *[]){
                 "The specified framework could not be found:",
                 "   Framework: %s",
                 "This could be due to a misspelling of the framework name, or because",
                 "support for that framework was not configured into this version of",
                 "PRTE. Please see",
                 "   prte_info --config",
                 "for a full report of how PRTE was configured.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_24[] = {
    { .topic = "version",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "%s",
                 NULL}
    },

    { .topic = "usage",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Usage: %s [OPTION]...",
                 "Initiate an instance of the PMIx Reference RTE (PRRTE) DVM",
                 "The following list of command line options are available. Note that",
                 "more detailed help for any option can be obtained by adding that",
                 "option to the help request as \"--help <option>\".",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | General Options                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"-h\" | \"--help\"      | This help message                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-h\" | \"--help       | Help for the specified option                 |",
                 "| <arg0>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-v\" | \"--verbose\"   | Enable typical debug options                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-V\" | \"--version\"   | Print version and exit                        |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Debug Options                                 |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--debug-daemons\"    | Debug daemons - if not set, any \"verbose\"     |",
                 "|                      | settings will be limited to the DVM           |",
                 "|                      | controller to reduce clutter                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--debug-daemons-    | Enable debugging of any PRRTE daemons used by |",
                 "| file\"                | this application, storing their verbose       |",
                 "|                      | output in files                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--leave-session-    | Do not discard stdout/stderr of remote PRRTE  |",
                 "| attached\"            | daemons                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--display <arg0>\"   | Comma-delimited list of options for           |",
                 "|                      | displaying information                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--no-aggregate-help\" | Do not aggregate help output from multiple   |",
                 "|                      | processes.                                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--test-suicide      | Suicide instead of clean abort after          |",
                 "| <arg0>\"              | specified delay                               |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | DVM Options                                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--runtime-options   | Comma-delimited list of runtime directives    |",
                 "| <options>\"           | for the job (e.g., show progress reports on   |",
                 "|                      | DVM startup for large systems)                |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--default-hostfile  | Provide a default hostfile                    |",
                 "| <filename>\"          |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-H|--host           | List of hosts to use for the DVM              |",
                 "| <hostname>\"          |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--hostfile          | Provide a hostfile                            |",
                 "| <filename>\"          |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--machinefile       | Provide a hostfile (synonym for \"--hostfile\") |",
                 "| <filename>\"          |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pmixmca <key>     | Pass PMIx MCA parameters                      |",
                 "| <value>\"             |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--prtemca <key>     | Pass PRTE MCA parameters to the DVM           |",
                 "| <value>\"             |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--show-progress\"    | Output a brief periodic report on DVM startup |",
                 "|                      | progress                                      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-x                  | Export an environment variable, optionally    |",
                 "| <var_name>[=value]\"  | specifying a value                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--allow-run-as-     | Allow execution as root (**STRONGLY           |",
                 "| root\"                | DISCOURAGED**)                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--daemonize\"        | Daemonize the DVM daemons into the background |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--forward-signals   | Comma-delimited list of additional signals    |",
                 "| <signals>\"           | (names or integers) to forward                |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--keepalive <arg0>\" | Pipe to monitor - DVM will terminate upon     |",
                 "|                      | closure                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--launch-agent      | Name of daemon executable used to start       |",
                 "| <executable>\"        | processes on remote nodes (default: \"prted\")  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--max-vm-size       | Max number of daemons to start                |",
                 "| <size>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--no-ready-msg\"     | Do not print a \"DVM ready\" message            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--noprefix\"         | Disable automatic \"--prefix\" behavior         |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--prefix <dir>\"     | Prefix to be used to look for RTE executables |",
                 "|                      | AND their libraries on remote nodes. Note     |",
                 "|                      | that an assumption is made that the libraries |",
                 "|                      | will be located at the same subdirectory as   |",
                 "|                      | per the configuration options given when      |",
                 "|                      | PRRTE was built.                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pmix-prefix <dir>\" | Prefix to be used to look for the PMIx       |",
                 "|                      | library used by RTE executables on remote     |",
                 "|                      | nodes. This is the location of the top-level  |",
                 "|                      | directory for the installation.               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-pid <arg>\" | Print out PID on stdout (\"-\"), stderr (\"+\"),  |",
                 "|                      | or a file (anything else)                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-uri <arg>\" | Print out URI on stdout (\"-\"), stderr (\"+\"),  |",
                 "|                      | or a file (anything else)                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--set-sid\"          | Direct the DVM daemons to separate from the   |",
                 "|                      | current session                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--singleton <id>\"   | ID of the singleton process that started us   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--system-server\"    | Start the DVM as the system server            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--tmpdir <dir>\"     | Set the filesystem root for the session       |",
                 "|                      | directory tree                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--tune <arg0>\"      | File(s) containing MCA params for tuning DVM  |",
                 "|                      | operations                                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--timeout           | Timeout DVM startup if time exceeds the       |",
                 "| <seconds>\"           | specified number of seconds                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--hetero-nodes\"     | The allocation contains multiple topologies,  |",
                 "|                      | so optimize the launch for that scenario. For |",
                 "|                      | example, the scheduler could be allocating    |",
                 "|                      | individual CPUs instead of entire nodes, thus |",
                 "|                      | effectively creating different topologies     |",
                 "|                      | (due to differing allocated CPUs) on each     |",
                 "|                      | node.                                         |",
                 "+----------------------+-----------------------------------------------+",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "prtemca",
      .content = (const char *[]){
                 "Pass a PRRTE MCA parameter.",
                 "Syntax: \"--prtemca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "pmixmca",
      .content = (const char *[]){
                 "Pass a PMIx MCA parameter",
                 "Syntax: \"--pmixmca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "tune",
      .content = (const char *[]){
                 "Comma-delimited list of one or more files containing PRRTE and PMIx",
                 "MCA params for tuning DVM and/or application operations. Parameters in",
                 "the file will be treated as *generic* parameters and subject to the",
                 "translation rules/uncertainties.  See \"--help mca\" for more",
                 "information.",
                 "Syntax in the file is:",
                 "   param = value",
                 "with one parameter and its associated value per line. Empty lines and",
                 "lines beginning with the \"#\" character are ignored, as is any",
                 "whitespace around the \"=\" character.",
                 NULL}
    },

    { .topic = "hetero-nodes",
      .content = (const char *[]){
                 "The allocation contains multiple topologies, so optimize the launch for",
                 "that scenario. For example, the scheduler could be allocating individual",
                 "CPUs instead of entire nodes, thus effectively creating different topologies",
                 "(due to differing allocated CPUs) on each node.",
                 NULL}
    },

    { .topic = "no-ready-msg",
      .content = (const char *[]){
                 "Do not print a DVM ready message",
                 NULL}
    },

    { .topic = "daemonize",
      .content = (const char *[]){
                 "Daemonize the DVM daemons and controller into the background",
                 NULL}
    },

    { .topic = "system-server",
      .content = (const char *[]){
                 "Start the DVM controller and its daemons as the system server on their",
                 "nodes",
                 NULL}
    },

    { .topic = "set-sid",
      .content = (const char *[]){
                 "Direct the DVM (controller and daemons) to separate from the current",
                 "session",
                 NULL}
    },

    { .topic = "report-pid",
      .content = (const char *[]){
                 "Printout DVM controller's PID on stdout [-], stderr [+], or a file",
                 "(passed as anything else)",
                 NULL}
    },

    { .topic = "report-uri",
      .content = (const char *[]){
                 "Printout DVM controller's URI on stdout [-], stderr [+], or a file",
                 "(passed as anything else)",
                 NULL}
    },

    { .topic = "test-suicide",
      .content = (const char *[]){
                 "Test DVM cleanup upon daemon failure by having one daemon suicide",
                 "after delay",
                 NULL}
    },

    { .topic = "default-hostfile",
      .content = (const char *[]){
                 "Specify a default hostfile.",
                 "Also see \"--help hostfile\".",
                 NULL}
    },

    { .topic = "singleton",
      .content = (const char *[]){
                 "DVM is being started by a singleton process (i.e., one not started by",
                 "a DVM) - the argument must be the PMIx ID of the singleton process",
                 "that started us",
                 NULL}
    },

    { .topic = "keepalive",
      .content = (const char *[]){
                 "Pipe for DVM controller to monitor - DVM will terminate upon closure",
                 NULL}
    },

    { .topic = "launch-agent",
      .content = (const char *[]){
                 "Name of daemon executable used to start processes on remote nodes",
                 "(default: prted).  This is the executable the DVM controller shall",
                 "start on each remote node when establishing the DVM.",
                 NULL}
    },

    { .topic = "max-vm-size",
      .content = (const char *[]){
                 "Maximum number of daemons to start - sets the maximum size of the DVM.",
                 NULL}
    },

    { .topic = "debug-daemons",
      .content = (const char *[]){
                 "Debug daemon output enabled. This is a somewhat limited stream of",
                 "information normally used to simply confirm that the daemons started.",
                 "Includes leaving the output streams open.",
                 NULL}
    },

    { .topic = "debug-daemons-file",
      .content = (const char *[]){
                 "Debug daemon output is enabled and all output from the daemons is",
                 "redirected into files with names of the form:",
                 "   output-prted-<daemon-nspace>-<nodename>.log",
                 "These names avoid conflict on shared file systems. The files are",
                 "located in the top-level session directory assigned to the DVM.",
                 "See the \"Session directory\" HTML documentation for additional details",
                 "about the PRRTE session directory.",
                 NULL}
    },

    { .topic = "leave-session-attached",
      .content = (const char *[]){
                 "Do not discard stdout/stderr of remote PRRTE daemons. The primary use",
                 "for this option is to ensure that the daemon output streams (i.e.,",
                 "stdout and stderr) remain open after launch, thus allowing the user to",
                 "see any daemon-generated error messages. Otherwise, the daemon will",
                 "\"daemonize\" itself upon launch, thereby closing its output streams.",
                 NULL}
    },

    { .topic = "tmpdir",
      .content = (const char *[]){
                 "Define the root location for the PRRTE session directory tree",
                 "See the \"Session directory\" HTML documentation for additional details",
                 "about the PRRTE session directory.",
                 NULL}
    },

    { .topic = "prefix",
      .content = (const char *[]){
                 "Prefix to be used to look for PRRTE executables. PRRTE automatically",
                 "sets the prefix for remote daemons if it was either configured with",
                 "the \"--enable-prte-prefix-by-default\" option OR prte itself was",
                 "executed with an absolute path to the prte command. This option",
                 "overrides those settings, if present, and forces use of the provided",
                 "path.",
                 NULL}
    },

    { .topic = "noprefix",
      .content = (const char *[]){
                 "Disable automatic \"--prefix\" behavior. PRRTE automatically sets the",
                 "prefix for remote daemons if it was either configured with the \"--",
                 "enable-prte-prefix-by-default\" option OR prte itself was executed with",
                 "an absolute path to the \"prte\" command. This option disables that",
                 "behavior.",
                 NULL}
    },

    { .topic = "pmix-prefix",
      .content = (const char *[]){
                 "Prefix to be used by a PRRTE executable to look for its PMIx installation",
                 "on remote nodes. This is the location of the top-level directory for the",
                 "installation. If the installation has not been moved, it would be the",
                 "value given to \"--prefix\" when the installation was configured.",
                 "Note that PRRTE cannot determine the exact name of the library subdirectory",
                 "under this location. For example, some systems will call it \"lib\" while others",
                 "call it \"lib64\". Accordingly, PRRTE will use the library subdirectory name",
                 "of the PMIx installation used to build PRRTE.",
                 NULL}
    },

    { .topic = "forward-signals",
      .content = (const char *[]){
                 "Comma-delimited list of additional signals (names or integers) to",
                 "forward to application processes (\"none\" = forward nothing). Signals",
                 "provided by default include SIGTSTP, SIGUSR1, SIGUSR2, SIGABRT,",
                 "SIGALRM, and SIGCONT.",
                 NULL}
    },

    { .topic = "allow-run-as-root",
      .content = (const char *[]){
                 "Allow execution as root **(STRONGLY DISCOURAGED)**.",
                 "Running as root exposes the user to potentially catastrophic file",
                 "system corruption and damage — e.g., if the user accidentally points",
                 "the root of the session directory to a system required point, this",
                 "directory and all underlying elements will be deleted upon job",
                 "completion, thereby rendering the system inoperable.",
                 "It is recognized that some environments (e.g., containers) may require",
                 "operation as root, and that the user accepts the risks in those",
                 "scenarios. Accordingly, one can override PRRTE's run-as-root",
                 "protection by providing one of the following:",
                 "* The \"--allow-run-as-root\" command line directive",
                 "* Adding **BOTH** of the following environmental parameters:",
                 "     * \"PRTE_ALLOW_RUN_AS_ROOT=1\"",
                 "     * \"PRTE_ALLOW_RUN_AS_ROOT_CONFIRM=1\"",
                 "Again, we recommend this only be done if absolutely necessary.",
                 NULL}
    },

    { .topic = "no-aggregate-help",
      .content = (const char *[]){
                 "Do not aggregate help output from multiple processes. PRRTE defaults",
                 "to aggregating messages generated by its \"help\" subsystem so that only",
                 "one is printed out per topic (along with the number of processes that",
                 "reported the same issue). This is done to avoid users receiving a",
                 "flood of one-per-process error messages, all containing the identical",
                 "error report.  Setting this option turns off the aggregation, thereby",
                 "allowing the user to see duplicate reports from multiple processes.",
                 NULL}
    },

    { .topic = "timeout",
      .content = (const char *[]){
                 "Timeout DVM startup if time exceeds the specified number of seconds.",
                 "The DVM startup will abort after the specified interval.",
                 NULL}
    },

    { .topic = "x",
      .content = (const char *[]){
                 "Export an environment variable, optionally specifying a value. For",
                 "example:",
                 "* \"-x foo\" exports the environment variable \"foo\" and takes its value",
                 "  from the current environment.",
                 "* \"-x foo=bar\" exports the environment variable name \"foo\" and sets",
                 "  its value to \"bar\" in the started processes.",
                 "* \"-x foo*\" exports all current environmental variables starting with",
                 "  \"foo\".",
                 NULL}
    },

    { .topic = "show-progress",
      .content = (const char *[]){
                 "Output a brief periodic report on DVM startup progress",
                 NULL}
    },

    { .topic = "hostfile",
      .content = (const char *[]){
                 "PRRTE supports several levels of user-specified host lists based on an",
                 "established precedence order. Users can specify a default hostfile",
                 "that contains a list of nodes to be used by the DVM. Only one default",
                 "hostfile can be provided for a given DVM. In addition, users can",
                 "specify a hostfile that contains a list of nodes to be used for a DVM,",
                 "or can provide a comma-delimited list of nodes to be used for that DVM",
                 "via the \"--host\" command line option.",
                 "The precedence order applied to these various options depends to some",
                 "extent on the local environment. The following table illustrates how",
                 "host and hostfile directives work together to define the set of hosts",
                 "upon which a DVM will execute in the absence of a resource manager",
                 "(RM):",
                 "+------------+---------+------------+----------------------------------+",
                 "| Default    | host    | hostfile   | Result                           |",
                 "| hostfile   |         |            |                                  |",
                 "|============|=========|============|==================================|",
                 "| unset      | unset   | unset      | The DVN will consist solely of   |",
                 "|            |         |            | the local host where the DVM was |",
                 "|            |         |            | started.                         |",
                 "+------------+---------+------------+----------------------------------+",
                 "| unset      | set     | unset      | Host option defines resource     |",
                 "|            |         |            | list for the DVM.                |",
                 "+------------+---------+------------+----------------------------------+",
                 "| unset      | unset   | set        | Hostfile option defines resource |",
                 "|            |         |            | list for the DVM.                |",
                 "+------------+---------+------------+----------------------------------+",
                 "| unset      | set     | set        | Hostfile option defines resource |",
                 "|            |         |            | list for the DVM, then host      |",
                 "|            |         |            | filters the list to define the   |",
                 "|            |         |            | final set of nodes to be used by |",
                 "|            |         |            | the DVM                          |",
                 "+------------+---------+------------+----------------------------------+",
                 "| set        | unset   | unset      | Default hostfile defines         |",
                 "|            |         |            | resource list for the DVM        |",
                 "+------------+---------+------------+----------------------------------+",
                 "| set        | set     | unset      | Default hostfile defines         |",
                 "|            |         |            | resource list for the DVM, then  |",
                 "|            |         |            | host filters the list to define  |",
                 "|            |         |            | the final set of nodes to be     |",
                 "|            |         |            | used by the DVM                  |",
                 "+------------+---------+------------+----------------------------------+",
                 "| set        | set     | set        | Default hostfile defines         |",
                 "|            |         |            | resource list for the DVM, then  |",
                 "|            |         |            | hostfile filters the list, and   |",
                 "|            |         |            | then host filters the list to    |",
                 "|            |         |            | define the final set of nodes to |",
                 "|            |         |            | be used by the DVM               |",
                 "+------------+---------+------------+----------------------------------+",
                 "This changes somewhat in the presence of an RM as that entity",
                 "specifies the initial allocation of nodes. In this case, the default",
                 "hostfile, hostfile and host directives are all used to filter the RM's",
                 "specification so that a user can utilize different portions of the",
                 "allocation for different DVMs. This is done according to the same",
                 "precedence order as in the prior table, with the RM providing the",
                 "initial pool of nodes.",
                 "Hostfiles (sometimes called \"machine files\") are a combination of two",
                 "things:",
                 "1. A listing of hosts on which to launch processes.",
                 "2. Optionally, limit the number of processes which can be launched on",
                 "   each host.",
                 "Hostfile syntax consists of one node name on each line, optionally",
                 "including a designated number of \"slots\":",
                 "   # This is a comment line, and will be ignored",
                 "   node01  slots=10",
                 "   node13  slots=5",
                 "   node15",
                 "   node16",
                 "   node17  slots=3",
                 "   ...",
                 "Blank lines and lines beginning with a \"#\" are ignored.",
                 "A \"slot\" is the PRRTE term for an allocatable unit where we can launch",
                 "a process.  See the section on definition of the term \"slot\" for a",
                 "longer description of slots.",
                 "In the absence of the \"slot\" parameter, PRRTE will assign either the",
                 "number of slots to be the number of CPUs detected on the node or the",
                 "resource manager-assigned value if operating in the presence of an RM.",
                 "Important:",
                 "  If using a resource manager, the user-specified number of slots is",
                 "  capped by the RM-assigned value.",
                 "See the \"Host specification\" HTML documentation for details about the",
                 "format and content of hostfiles.",
                 NULL}
    },

    { .topic = "machinefile",
      .content = (const char *[]){
                 "Provide a hostfile.  This option is a synonym for \"--hostfile\"; see",
                 "that option for more information.",
                 NULL}
    },

    { .topic = "host",
      .content = (const char *[]){
                 "Host syntax consists of a comma-delimited list of node names, each",
                 "entry optionally containing a \":N\" extension indicating the number of",
                 "slots to assign to that entry:",
                 "   --host node01:5,node02",
                 "In the absence of the slot extension, one slot will be assigned to the",
                 "node. Duplicate entries are aggregated and the number of slots",
                 "assigned to that node are summed together.",
                 "Note:",
                 "  A \"slot\" is the PRRTE term for an allocatable unit where we can",
                 "  launch a process. Thus, the number of slots equates to the maximum",
                 "  number of processes PRRTE may start on that node without",
                 "  oversubscribing it.",
                 NULL}
    },

    { .topic = "display",
      .content = (const char *[]){
                 "The \"display\" command line directive must be accompanied by a comma-",
                 "delimited list of case-insensitive options indicating what information",
                 "about the job and/or allocation is to be displayed. The full directive",
                 "need not be provided — only enough characters are required to uniquely",
                 "identify the directive. For example, \"ALL\" is sufficient to represent",
                 "the \"ALLOCATION\" directive — while \"MAP\" can not be used to represent",
                 "\"MAP-DEVEL\" (though \"MAP-D\" would suffice).",
                 "Supported values include:",
                 "* \"ALLOCATION\" displays the detected hosts and slot assignments for",
                 "  this job",
                 "* \"BINDINGS\" displays the resulting bindings applied to processes in",
                 "  this job",
                 "* \"MAP\" displays the resulting locations assigned to processes in this",
                 "  job",
                 "* \"MAP-DEVEL\" displays a more detailed report on the locations",
                 "  assigned to processes in this job that includes local and node",
                 "  ranks, assigned bindings, and other data",
                 "* \"TOPO=LIST\" displays the topology of each node in the semicolon-",
                 "  delimited list that is allocated to the job",
                 "* \"CPUS[=LIST]\" displays the available CPUs on the provided semicolon-",
                 "  delimited list of nodes (defaults to all nodes)",
                 "The display command line directive can include qualifiers by adding a",
                 "colon (\":\") and any combination of one or more of the following",
                 "(delimited by colons):",
                 "* \"PARSEABLE\" directs that the output be provided in a format that is",
                 "  easily parsed by machines. Note that \"PARSABLE\" is also accepted as",
                 "  a typical spelling for the qualifier.",
                 "Provided qualifiers will apply to *all* of the display directives.",
                 NULL}
    },

    { .topic = "runtime-options",
      .content = (const char *[]){
                 "The \"--runtime-options\" command line directive must be accompanied by",
                 "a comma-delimited list of case-insensitive options that control the",
                 "runtime behavior of the job. The full directive need not be provided —",
                 "only enough characters are required to uniquely identify the",
                 "directive.",
                 "Runtime options are typically \"true\" or \"false\", though this is not a",
                 "requirement on developers. Since the value of each option may need to",
                 "be set (e.g., to override a default set by MCA parameter), the syntax",
                 "of the command line directive includes the use of an \"=\" character to",
                 "allow inclusion of a value for the option. For example, one can set",
                 "the \"ABORT-NONZERO-STATUS\" option to \"true\" by specifying it as",
                 "\"ABORT-NONZERO-STATUS=1\". Note that boolean options can be set to",
                 "\"true\" using a non-zero integer or a case-insensitive string of the",
                 "word \"true\".  For the latter representation, the user need only",
                 "provide at least the \"T\" character. The same policy applies to setting",
                 "a boolean option to \"false\".",
                 "Note that a boolean option will default to \"true\" if provided without",
                 "a value. Thus, \"--runtime-options abort-nonzero\" is sufficient to set",
                 "the \"ABORT-NONZERO-STATUS\" option to \"true\".",
                 "Supported values include:",
                 "* \"ERROR-NONZERO-STATUS[=(bool)]\": if set to false, this directs the",
                 "  runtime to treat a process that exits with non-zero status as a",
                 "  normal termination.  If set to true, the runtime will consider such",
                 "  an occurrence as an error termination and take appropriate action —",
                 "  i.e., the job will be terminated unless a runtime option directs",
                 "  otherwise. This option defaults to a true value if the option is",
                 "  given without a value.",
                 "* \"DONOTLAUNCH\": directs the runtime to map but not launch the",
                 "  specified job. This is provided to help explore possible process",
                 "  placement patterns before actually starting execution. No value need",
                 "  be passed as this is not an option that can be set by default in",
                 "  PRRTE.",
                 "* \"SHOW-PROGRESS[=(bool)]\": requests that the runtime provide progress",
                 "  reports on its startup procedure — i.e., the launch of its daemons",
                 "  in support of a job. This is typically used to debug DVM startup on",
                 "  large systems.  This option defaults to a true value if the option",
                 "  is given without a value.",
                 "* \"NOTIFYERRORS[=(bool)]\": if set to true, requests that the runtime",
                 "  provide a PMIx event whenever a job encounters an error — e.g., a",
                 "  process fails.  The event is to be delivered to each remaining",
                 "  process in the job. This option defaults to a true value if the",
                 "  option is given without a value.  See \"--help notifications\" for",
                 "  more detail as to the PMIx event codes available for capturing",
                 "  failure events.",
                 "* \"RECOVERABLE[=(bool)]\": if set to true, this indicates that the",
                 "  application wishes to consider the job as recoverable — i.e., the",
                 "  application is assuming responsibility for recovering from any",
                 "  process failure. This could include application-driven spawn of a",
                 "  substitute process or internal compensation for the missing process.",
                 "  This option defaults to a true value if the option is given without",
                 "  a value.",
                 "* \"AUTORESTART[=(bool)]\": if set to true, this requests that the",
                 "  runtime automatically restart failed processes up to \"max restarts\"",
                 "  number of times. This option defaults to a true value if the option",
                 "  is given without a value.",
                 "* \"CONTINUOUS[=(bool)]\": if set to true, this informs the runtime that",
                 "  the processes in this job are to run until explicitly terminated.",
                 "  Processes that fail are to be automatically restarted up to \"max",
                 "  restarts\" number of times. Notification of process failure is to be",
                 "  delivered to all processes in the application. This is the",
                 "  equivalent of specifying \"RECOVERABLE\", \"NOTIFYERRORS\", and",
                 "  \"AUTORESTART\" options except that the runtime, not the application,",
                 "  assumes responsibility for process recovery. This option defaults to",
                 "  a true value if the option is given without a value.",
                 "* \"MAX-RESTARTS=<int>\": indicates the maximum number of times a given",
                 "  process is to be restarted. This can be set at the application or",
                 "  job level (which will then apply to all applications in that job).",
                 "* \"EXEC-AGENT=<path>\" indicates the executable that shall be used to",
                 "  start an application process. The resulting command for starting an",
                 "  application process will be \"<path> app <app-argv>\". The path may",
                 "  contain its own command line arguments.",
                 "* \"DEFAULT-EXEC-AGENT\": directs the runtime to use the system default",
                 "  exec agent to start an application process. No value need be passed",
                 "  as this is not an option that can be set by default in PRRTE.",
                 "* \"OUTPUT-PROCTABLE[(=channel)]\": directs the runtime to report the",
                 "  convential debugger process table (includes PID and host location of",
                 "  each process in the application). Output is directed to stdout if",
                 "  the channel is \"-\", stderr if \"+\", or into the specified file",
                 "  otherwise. If no channel is specified, output will be directed to",
                 "  stdout.",
                 "* \"STOP-ON-EXEC\": directs the runtime to stop the application",
                 "  process(es) immediately upon exec'ing them. The directive will apply",
                 "  to all processes in the job.",
                 "* \"STOP-IN-INIT\": indicates that the runtime should direct the",
                 "  application process(es) to stop in \"PMIx_Init()\". The directive will",
                 "  apply to all processes in the job.",
                 "* \"STOP-IN-APP\": indicates that the runtime should direct application",
                 "  processes to stop at some application-defined place and notify they",
                 "  are ready-to-debug. The directive will apply to all processes in the",
                 "  job.",
                 "* \"TIMEOUT=<string>\": directs the runtime to terminate the job after",
                 "  it has executed for the specified time. Time is specified in colon-",
                 "  delimited format — e.g., \"01:20:13:05\" to indicate 1 day, 20 hours,",
                 "  13 minutes and 5 seconds. Time specified without colons will be",
                 "  assumed to have been given in seconds.",
                 "* \"SPAWN-TIMEOUT=<string>\": directs the runtime to terminate the job",
                 "  if job launch is not completed within the specified time. Time is",
                 "  specified in colon-delimited format — e.g., \"01:20:13:05\" to",
                 "  indicate 1 day, 20 hours, 13 minutes and 5 seconds.  Time specified",
                 "  without colons will be assumed to have been given in seconds.",
                 "* \"REPORT-STATE-ON-TIMEOUT[(=bool)]\": directs the runtime to provide a",
                 "  detailed report on job and application process state upon job",
                 "  timeout. This option defaults to a true value if the option is given",
                 "  without a value.",
                 "* \"GET-STACK-TRACES[(=bool)]\": requests that the runtime provide stack",
                 "  traces on all application processes still executing upon timeout.",
                 "  This option defaults to a true value if the option is given without",
                 "  a value.",
                 "* \"REPORT-CHILD-JOBS-SEPARATELY[(=bool)]\": directs the runtime to",
                 "  report the exit status of any child jobs spawned by the primary job",
                 "  separately. If false, then the final exit status reported will be",
                 "  zero if the primary job and all spawned jobs exit normally, or the",
                 "  first non-zero status returned by either primary or child jobs. This",
                 "  option defaults to a true value if the option is given without a",
                 "  value.",
                 "* \"AGGREGATE-HELP-MESSAGES[(=bool)]\": directs the runtime to aggregate",
                 "  help messages, reporting each unique help message once accompanied",
                 "  by the number of processes that reported it. This option defaults to",
                 "  a true value if the option is given without a value.",
                 "* \"FWD-ENVIRONMENT[(=bool)]\": directs the runtime to forward the",
                 "  entire local environment in support of the application. This option",
                 "  defaults to a true value if the option is given without a value.",
                 "The \"--runtime-options\" command line option has no qualifiers.",
                 "Note:",
                 "  Directives are case-insensitive.  \"FWD-ENVIRONMENT\" is the same as",
                 "  \"fwd-environment\".",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_25[] = {
    { .topic = "usage",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Usage: %s [OPTION]...",
                 "Start a PRTE Daemon",
                 "The following list of command line options are available. Note that",
                 "more detailed help for any option can be obtained by adding that",
                 "option to the help request as \"--help <option>\".",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | General Options                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"-h\" | \"--help\"      | This help message                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-h\" | \"--help       | Help for the specified option                 |",
                 "| <arg0>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-v\" | \"--verbose\"   | Enable typical debug options                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-V\" | \"--version\"   | Print version and exit                        |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Debug Options                                 |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--debug\"            | Top-level PRTE debug switch (default: false). |",
                 "|                      | This option will be deprecated, use \"--debug- |",
                 "|                      | devel\" instead.                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--debug-daemons-    | Enable debugging of any PRTE daemons used by  |",
                 "| file\"                | this application, storing output in files     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--leave-session-    | Do not daemonize the \"prted\"                  |",
                 "| attached\"            |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--test-suicide      | Suicide instead of clean abort after          |",
                 "| <arg0>\"              | specified delay                               |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | DVM Options                                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--pmixmca <key>     | Pass context-specific PMIx MCA parameters     |",
                 "| <value>\"             | (\"key\" is the parameter name; \"value\" is the  |",
                 "|                      | parameter value)                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--prtemca <key>     | Pass context-specific PRTE MCA parameters;    |",
                 "| <value>\"             | they are considered global if \"--gmca\" is not |",
                 "|                      | used and only one context is specified (\"key\" |",
                 "|                      | is the parameter name; \"value\" is the         |",
                 "|                      | parameter value)                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--dvm-master-uri    | Specify the URI of the DVM master, or the     |",
                 "| <uri>\"               | name of the file (specified as                |",
                 "|                      | \"file:filename\") that contains that info      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--parent-uri <uri>\" | Specify the URI of the prted acting as the    |",
                 "|                      | parent of this prted in a tree-based spawn    |",
                 "|                      | operation                                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--tree-spawn\"       | A tree-based spawn operation is in progress   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--bootstrap\"        | Self-construct the DVM based on a             |",
                 "|                      | configuration file                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--hetero-nodes\"     | The allocation contains multiple topologies,  |",
                 "|                      | so optimize the launch for that scenario. For |",
                 "|                      | example, the scheduler could be allocating    |",
                 "|                      | individual CPUs instead of entire nodes, thus |",
                 "|                      | effectively creating different topologies     |",
                 "|                      | (due to differing allocated CPUs) on each     |",
                 "|                      | node.                                         |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Specific Options                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--set-sid\"          | Direct the DVM daemons to separate from the   |",
                 "|                      | current session                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--system-server\"    | Start the DVM as the system server            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pubsub-server     | Contact information for external PRRTE        |",
                 "| <uri>\"               | publish/lookup data server                    |",
                 "+----------------------+-----------------------------------------------+",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "version",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "dvm-master-uri",
      .content = (const char *[]){
                 "Specify the URI of the DVM master, or the name of the file (specified",
                 "as \"file:filename\") that contains that info",
                 NULL}
    },

    { .topic = "hetero-nodes",
      .content = (const char *[]){
                 "The allocation contains multiple topologies, so optimize the launch for",
                 "that scenario. For example, the scheduler could be allocating individual",
                 "CPUs instead of entire nodes, thus effectively creating different topologies",
                 "(due to differing allocated CPUs) on each node.",
                 NULL}
    },

    { .topic = "test-suicide",
      .content = (const char *[]){
                 "Test DVM cleanup upon daemon failure by having one daemon suicide",
                 "after delay",
                 NULL}
    },

    { .topic = "system-server",
      .content = (const char *[]){
                 "Start the daemon as the system server on its node",
                 NULL}
    },

    { .topic = "set-sid",
      .content = (const char *[]){
                 "Direct the daemon to separate from the current session",
                 NULL}
    },

    { .topic = "prtemca",
      .content = (const char *[]){
                 "Pass a PRRTE MCA parameter.",
                 "Syntax: \"--prtemca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "pmixmca",
      .content = (const char *[]){
                 "Pass a PMIx MCA parameter",
                 "Syntax: \"--pmixmca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "leave-session-attached",
      .content = (const char *[]){
                 "Do not discard stdout/stderr of remote PRRTE daemons. The primary use",
                 "for this option is to ensure that the daemon output streams (i.e.,",
                 "stdout and stderr) remain open after launch, thus allowing the user to",
                 "see any daemon-generated error messages. Otherwise, the daemon will",
                 "\"daemonize\" itself upon launch, thereby closing its output streams.",
                 NULL}
    },

    { .topic = "parent-uri",
      .content = (const char *[]){
                 "Specify the URI of the prted acting as the parent of this prted in a",
                 "tree-based spawn operation",
                 NULL}
    },

    { .topic = "tree-spawn",
      .content = (const char *[]){
                 "A tree-based spawn operation is in progress",
                 NULL}
    },

    { .topic = "pubsub-server",
      .content = (const char *[]){
                 "Contact information for external PRRTE publish/lookup data server",
                 "%s",
                 NULL}
    },

    { .topic = "cwd",
      .content = (const char *[]){
                 "A dynamic operation (%s) was requested that requires us to obtain the",
                 "current working directory. Unfortunately, an error was returned when",
                 "we attempted to obtain it:",
                 "   error: %d",
                 "We are unable to complete the requested operation.",
                 NULL}
    },

    { .topic = "bad-key",
      .content = (const char *[]){
                 "A dynamic operation (%s) was requested that included an unrecognized",
                 "info key:",
                 "   group: %s",
                 "   key:   %s",
                 "The operation will continue, but may not behave completely as",
                 "expected.",
                 NULL}
    },

    { .topic = "noserver",
      .content = (const char *[]){
                 "A publish/lookup server was provided, but we were unable to connect to",
                 "it — please check the connection info and ensure the server is alive:",
                 "   Connection:  %s",
                 NULL}
    },

    { .topic = "both-file-and-dir-set",
      .content = (const char *[]){
                 "Both the \"output-directory\" and \"output-filename\" options have been",
                 "set:",
                 "   Directory:      %s",
                 "   Filename:       %s",
                 "Only one of these can be set — please fix the options and try again.",
                 NULL}
    },

    { .topic = "min-pmix-violation",
      .content = (const char *[]){
                 "PRRTE has detected that the PMIx library being used to run this",
                 "executable does not meet the minimum supported version:",
                 "   Min PMIx version: %0x Detected version: %0x",
                 "Please check your LD_LIBRARY_PATH and ensure we are pointed to a",
                 "version that meets the minimum requirement.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_26[] = {
    { .topic = "version",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "%s",
                 NULL}
    },

    { .topic = "usage",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Usage: %s [OPTION]...",
                 "Initiate an instance of the PMIx Reference RTE (PRRTE) DVM",
                 "The following list of command line options are available. Note that",
                 "more detailed help for any option can be obtained by adding that",
                 "option to the help request as \"--help <option>\".",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | General Options                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"-h\" | \"--help\"      | This help message                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-h\" | \"--help       | Help for the specified option                 |",
                 "| <arg0>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-v\" | \"--verbose\"   | Enable typical debug options                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-V\" | \"--version\"   | Print version and exit                        |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Debug Options                                 |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--debug-daemons\"    | Debug daemons — if not set, any \"verbose\"     |",
                 "|                      | settings will be limited to the prterun       |",
                 "|                      | itself to reduce clutter                      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--debug-daemons-    | Enable debugging of any PRRTE daemons used by |",
                 "| file\"                | this application, storing their verbose       |",
                 "|                      | output in files                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--display <arg0>\"   | Options for displaying information about the  |",
                 "|                      | allocation and job.                           |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--spawn-timeout     | Timeout the job if spawn takes more than the  |",
                 "| <seconds>\"           | specified number of seconds                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--timeout           | Timeout the job if execution is not complete  |",
                 "| <seconds>\"           | after the specified number of seconds         |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--get-stack-traces\" | Get stack traces of all application procs on  |",
                 "|                      | timeout                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--leave-session-    | Do not discard stdout/stderr of remote PRRTE  |",
                 "| attached\"            | daemons                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-state-on-  | Report all job and process states upon        |",
                 "| timeout\"             | timeout                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--stop-on-exec\"     | If supported, stop each specified process at  |",
                 "|                      | start of execution                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--stop-in-init\"     | Direct the specified processes to stop in     |",
                 "|                      | \"PMIx_Init\"                                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--stop-in-app\"      | Direct the specified processes to stop at an  |",
                 "|                      | application-controlled location               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--do-not-launch\"    | Perform all necessary operations to prepare   |",
                 "|                      | to launch the application, but do not         |",
                 "|                      | actually launch it (usually used to test      |",
                 "|                      | mapping patterns)                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--test-suicide      | Suicide instead of clean abort after          |",
                 "| <arg0>\"              | specified delay                               |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Output Options                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--output <arg0>\"    | Comma-delimited list of options that control  |",
                 "|                      | how output is generated.                      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-child-     | Return the exit status of the primary job     |",
                 "| jobs-separately\"     | only                                          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--xterm <ranks>\"    | Create a new xterm window for each of the     |",
                 "|                      | comma-delimited ranges of application process |",
                 "|                      | ranks                                         |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Input Options                                 |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--stdin <ranks>\"    | Specify application rank(s) to receive stdin  |",
                 "|                      | [integer ranks, \"rank\", \"all\", \"none\"]        |",
                 "|                      | (default: \"0\", indicating rank 0)             |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Placement Options                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--map-by <type>\"    | Mapping Policy for job                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--rank-by <type>\"   | Ranking Policy for job                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--bind-to <type>\"   | Binding policy for job.                       |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Launch Options                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--runtime-options   | Comma-delimited list of runtime directives    |",
                 "| <arg0>\"              | for the job (e.g., do not abort if a process  |",
                 "|                      | exits on non-zero status)                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-c\" | \"--np <num>\"  | Number of processes to run                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-n\" | \"--n <num>\"   | Number of processes to run                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-N\" | \"--npernode   | Run designated number of processes on each    |",
                 "| <num>\"               | node                                          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--app <filename>\"   | Provide an appfile; ignore all other command  |",
                 "|                      | line options                                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--personality       | Specify the personality to be used            |",
                 "| <name>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-H\" | \"--host       | List of hosts to invoke processes on          |",
                 "| <hosts>\"             |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--add-host <hosts>\" | List of hosts to add to the DVM prior to      |",
                 "|                      | launching the given app                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--hostfile <file>\"  | Provide a hostfile                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--machinefile       | Provide a hostfile (synonym for \"--hostfile\") |",
                 "| <file>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--path <path>\"      | PATH to be used to look for executables to    |",
                 "|                      | start processes                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--add-hostfile      | Provide a hostfile listing hosts to add to    |",
                 "| <file>\"              | the DVM prior to launching the given app      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pmixmca <key>     | Pass context-specific PMIx MCA parameters;    |",
                 "| <value>\"             | they are considered global if only one        |",
                 "|                      | context is specified (\"key\" is the parameter  |",
                 "|                      | name; \"value\" is the parameter value)         |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--gpmixmca <key>    | Pass global PMIx MCA parameters that are      |",
                 "| <value>\"             | applicable to all contexts (\"key\" is the      |",
                 "|                      | parameter name; \"value\" is the parameter      |",
                 "|                      | value)                                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--preload-files     | Preload the comma separated list of files to  |",
                 "| <files>\"             | the remote machines current working directory |",
                 "|                      | before starting the remote process.           |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-s\" | \"--preload-   | Preload the binary on the remote machine      |",
                 "| binary\"              | before starting the remote process.           |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--app-pmix-prefix <dir>\" | Prefix to be used by app procs to look   |",
                 "|                      | for their PMIx installation on remote nodes.  |",
                 "|                      | This is the location of the top-level         |",
                 "|                      | directory for the installation. In the        |",
                 "|                      | absence of providing an application-specific  |",
                 "|                      | prefix, the PMIx prefix (if given) used by    |",
                 "|                      | PRRTE's own executables will be applied       |",
                 "|                      | unless the \"--no-app-prefix\" directive is     |",
                 "|                      | given.                                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--no-app-prefix\"    | Do not provide a prefix directive to this     |",
                 "|                      | application.                                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pset <name>\"      | User-specified name assigned to the processes |",
                 "|                      | in their given application                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--set-cwd-to-       | Set the working directory of the started      |",
                 "| session-dir\"         | processes to their session directory          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--show-progress\"    | Output a brief periodic report on launch      |",
                 "|                      | progress                                      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--wd <dir>\"         | Synonym for \"--wdir\"                          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--wdir <dir>\"       | Set the working directory of the started      |",
                 "|                      | processes                                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-x <name>\"          | Export an environment variable, optionally    |",
                 "|                      | specifying a value (e.g., \"-x foo\" exports    |",
                 "|                      | the environment variable foo and takes its    |",
                 "|                      | value from the current environment; \"-x       |",
                 "|                      | foo=bar\" exports the environment variable     |",
                 "|                      | name foo and sets its value to \"bar\" in the   |",
                 "|                      | started processes; \"-x foo*\" exports all      |",
                 "|                      | current environmental variables starting with |",
                 "|                      | \"foo\")                                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--unset-env <name>\" | Unset the named environmental variable. Note  |",
                 "|                      | \"--unset-env foo*\" unsets all current         |",
                 "|                      | environmental variables starting with \"foo\"   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--append-env        | Append the named environment variable with    |",
                 "| <name[c]> <value>\"   | given value. The \"[c]\" must be appended to    |",
                 "|                      | the name to specify the separator to be used  |",
                 "|                      | when appending the value.                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--prepend-env       | Prepend the named environment variable with   |",
                 "| <name[c]> <value>\"   | given value. The \"[c]\" must be appended to    |",
                 "|                      | the name to specify the separator to be used  |",
                 "|                      | when prepending the value.                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--gpu-support <val>\"| Direct application to either enable (true) or |",
                 "|                      | disable (false) its internal library's GPU    |",
                 "|                      | support                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Specific Options                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--allow-run-as-     | Allow execution as root (**STRONGLY           |",
                 "| root\"                | DISCOURAGED**)                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--prtemca <key>     | Pass context-specific PRRTE MCA parameters to |",
                 "| <value>\"             | the DVM                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--forward-signals   | Comma-delimited list of additional signals    |",
                 "| <signals>\"           | (names or integers) to forward to application |",
                 "|                      | processes [\"none\" => forward nothing].        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--keepalive <arg0>\" | Pipe to monitor — DVM will terminate upon     |",
                 "|                      | closure                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--launch-agent      | Name of daemon executable used to start       |",
                 "| <exe>\"               | processes on remote nodes (default: \"prted\")  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--max-vm-size       | Number of daemons to start                    |",
                 "| <num>\"               |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--no-ready-msg\"     | Do not print a DVM ready message              |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--system-server\"    | Start prterun and its daemons as the system   |",
                 "|                      | server on their nodes                         |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--noprefix\"         | Disable automatic \"--prefix\" behavior         |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--prefix <dir>\"     | Prefix to be used to look for RTE executables |",
                 "|                      | AND their libraries on remote nodes. Note     |",
                 "|                      | that an assumption is made that the libraries |",
                 "|                      | will be located at the same subdirectory as   |",
                 "|                      | per the configuration options given when      |",
                 "|                      | PRRTE was built.                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pmix-prefix <dir>\" | Prefix to be used to look for the PMIx       |",
                 "|                      | library used by RTE executables on remote     |",
                 "|                      | nodes. This is the location of the top-level  |",
                 "|                      | directory for the installation.               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-pid        | Print out PID on stdout (\"-\"), stderr (\"+\"),  |",
                 "| <arg0>\"              | or a file [anything else]                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-uri        | Print out URI on stdout (\"-\"), stderr (\"+\"),  |",
                 "| <arg0>\"              | or a file [anything else]                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--set-sid\"          | Direct the DVM daemons to separate from the   |",
                 "|                      | current session                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--singleton <id>\"   | ID of the singleton process that started us   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--tmpdir <dir>\"     | Set the root for the session directory tree   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--tune <files>\"     | File(s) containing MCA params for tuning DVM  |",
                 "|                      | operations                                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--dvm <arg>\"        | Use a persistent DVM instead of instantiating |",
                 "|                      | independent runtime infrastructure. The       |",
                 "|                      | argument indicates the PID, URI, file         |",
                 "|                      | containing the URI, or namespace of the DVM.  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--hetero-nodes\"     | The allocation contains multiple topologies,  |",
                 "|                      | so optimize the launch for that scenario. For |",
                 "|                      | example, the scheduler could be allocating    |",
                 "|                      | individual CPUs instead of entire nodes, thus |",
                 "|                      | effectively creating different topologies     |",
                 "|                      | (due to differing allocated CPUs) on each     |",
                 "|                      | node.                                         |",
                 "+----------------------+-----------------------------------------------+",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "dvm",
      .content = (const char *[]){
                 "Utilize an existing persistent DVM instead of instantiating an",
                 "independent runtime infrastructure. This mimics the \"prun\" command,",
                 "but is provided as a convenience option for those wanting to embed the",
                 "\"prterun\" command in a script that can be optionally used to run",
                 "either independently or under a persistent DVM.",
                 "A required argument is passed to the \"--dvm\" directive to specify the",
                 "location of the DVM controller (e.g., \"--dvm pid:12345\") or by passing",
                 "the string \"search\" to instead search for an existing controller.",
                 "Supported options include:",
                 "* \"search\": directs the tool to search for available DVM controllers",
                 "  it is authorized to use, connecting to the first such candidate it",
                 "  finds.",
                 "* \"pid:<arg>\": provides the PID of the target DVM controller. This can",
                 "  be given as either the PID itself (arg = int) or the path to a file",
                 "  that contains the PID (arg = \"file:<path>\")",
                 "* \"file:<path>\": provides the path to a PMIx rendezvous file that is",
                 "  output by PMIx servers — the file contains all the required",
                 "  information for completing the connection",
                 "* \"uri:<arg>\": specifies the URI of the DVM controller, or the name of",
                 "  the file (specified as \"file:filename\") that contains that info",
                 "* \"ns:<arg>\": specifies the namespace of the DVM controller",
                 "* \"system\": exclusively find and use the system-level DVM controller",
                 "* \"system-first\": look for a system-level DVM controller, fall back to",
                 "  searching for an available DVM controller the command is authorized",
                 "  to use if a system-level controller is not found",
                 "Examples:",
                 "   prterun --dvm file:dvm_uri.txt --np 4 ./a.out",
                 "   prterun --dvm pid:12345 --np 4 ./a.out",
                 "   prterun --dvm uri:file:dvm_uri.txt --np 4 ./a.out",
                 "   prterun --dvm ns:prte-node1-2095 --np 4 ./a.out",
                 "   prterun --dvm pid:file:prte_pid.txt --np 4 ./a.out",
                 "   prterun --dvm search --np 4 ./a.out",
                 NULL}
    },

    { .topic = "hetero-nodes",
      .content = (const char *[]){
                 "The allocation contains multiple topologies, so optimize the launch for",
                 "that scenario. For example, the scheduler could be allocating individual",
                 "CPUs instead of entire nodes, thus effectively creating different topologies",
                 "(due to differing allocated CPUs) on each node.",
                 NULL}
    },

    { .topic = "prtemca",
      .content = (const char *[]){
                 "Pass a PRRTE MCA parameter.",
                 "Syntax: \"--prtemca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "pmixmca",
      .content = (const char *[]){
                 "Pass a PMIx MCA parameter",
                 "Syntax: \"--pmixmca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "gpmixmca",
      .content = (const char *[]){
                 "Syntax: \"--gpmixmca <key> <value>\"",
                 "where \"key\" is the parameter name and \"value\" is the parameter value.",
                 "The \"g\" prefix indicates that this PMIx parameter is to be applied to",
                 "_all_ application contexts and not just the one in which the directive",
                 "appears.",
                 NULL}
    },

    { .topic = "tune",
      .content = (const char *[]){
                 "Comma-delimited list of one or more files containing PRRTE and PMIx",
                 "MCA params for tuning DVM and/or application operations. Parameters in",
                 "the file will be treated as *generic* parameters and subject to the",
                 "translation rules/uncertainties.  See \"--help mca\" for more",
                 "information.",
                 "Syntax in the file is:",
                 "   param = value",
                 "with one parameter and its associated value per line. Empty lines and",
                 "lines beginning with the \"#\" character are ignored, as is any",
                 "whitespace around the \"=\" character.",
                 NULL}
    },

    { .topic = "system-server",
      .content = (const char *[]){
                 "Start prterun and its daemons as the system server on their nodes",
                 NULL}
    },

    { .topic = "set-sid",
      .content = (const char *[]){
                 "Direct the DVM (controller and daemons) to separate from the current",
                 "session",
                 NULL}
    },

    { .topic = "report-pid",
      .content = (const char *[]){
                 "Printout prterun's PID on stdout (\"-\"), stderr (\"+\"), or a file",
                 "(anything else).",
                 NULL}
    },

    { .topic = "report-uri",
      .content = (const char *[]){
                 "Printout prterun's URI on stdout (\"-\"), stderr (\"+\"), or a file",
                 "(anything else).",
                 NULL}
    },

    { .topic = "test-suicide",
      .content = (const char *[]){
                 "Test DVM cleanup upon daemon failure by having one daemon suicide",
                 "after delay",
                 NULL}
    },

    { .topic = "singleton",
      .content = (const char *[]){
                 "\"prterun\" is being started by a singleton process (i.e., one not",
                 "started by prterun) — the argument must be the PMIx ID of the",
                 "singleton process that started us",
                 NULL}
    },

    { .topic = "keepalive",
      .content = (const char *[]){
                 "Pipe for prterun to monitor — job will terminate upon closure",
                 NULL}
    },

    { .topic = "launch-agent",
      .content = (const char *[]){
                 "Name of daemon executable used to start processes on remote nodes",
                 "(default: \"prted\").",
                 "This is the executable prterun shall start on each remote node when",
                 "establishing the DVM.",
                 NULL}
    },

    { .topic = "max-vm-size",
      .content = (const char *[]){
                 "Maximum number of daemons to start",
                 NULL}
    },

    { .topic = "debug-daemons",
      .content = (const char *[]){
                 "Debug daemon output enabled. This is a somewhat limited stream of",
                 "information normally used to simply confirm that the daemons started.",
                 "Includes leaving the output streams open.",
                 NULL}
    },

    { .topic = "debug-daemons-file",
      .content = (const char *[]){
                 "Debug daemon output is enabled and all output from the daemons is",
                 "redirected into files with names of the form:",
                 "   output-prted-<daemon-nspace>-<nodename>.log",
                 "These names avoid conflict on shared file systems. The files are",
                 "located in the top-level session directory assigned to the DVM.",
                 "See the \"Session directory\" HTML documentation for additional details",
                 "about the PRRTE session directory.",
                 NULL}
    },

    { .topic = "leave-session-attached",
      .content = (const char *[]){
                 "Do not discard stdout/stderr of remote PRRTE daemons. The primary use",
                 "for this option is to ensure that the daemon output streams (i.e.,",
                 "stdout and stderr) remain open after launch, thus allowing the user to",
                 "see any daemon-generated error messages. Otherwise, the daemon will",
                 "\"daemonize\" itself upon launch, thereby closing its output streams.",
                 NULL}
    },

    { .topic = "tmpdir",
      .content = (const char *[]){
                 "Define the root location for the PRRTE session directory tree",
                 "See the \"Session directory\" HTML documentation for additional details",
                 "about the PRRTE session directory.",
                 NULL}
    },

    { .topic = "prefix",
      .content = (const char *[]){
                 "Prefix to be used to look for PRRTE executables. PRRTE automatically",
                 "sets the prefix for remote daemons if it was either configured with",
                 "the \"--enable-prte-prefix-by-default\" option OR prte itself was",
                 "executed with an absolute path to the prte command. This option",
                 "overrides those settings, if present, and forces use of the provided",
                 "path.",
                 NULL}
    },

    { .topic = "noprefix",
      .content = (const char *[]){
                 "Disable automatic \"--prefix\" behavior. PRRTE automatically sets the",
                 "prefix for remote daemons if it was either configured with the \"--",
                 "enable-prte-prefix-by-default\" option OR prte itself was executed with",
                 "an absolute path to the \"prte\" command. This option disables that",
                 "behavior.",
                 NULL}
    },

    { .topic = "pmix-prefix",
      .content = (const char *[]){
                 "Prefix to be used by a PRRTE executable to look for its PMIx installation",
                 "on remote nodes. This is the location of the top-level directory for the",
                 "installation. If the installation has not been moved, it would be the",
                 "value given to \"--prefix\" when the installation was configured.",
                 "Note that PRRTE cannot determine the exact name of the library subdirectory",
                 "under this location. For example, some systems will call it \"lib\" while others",
                 "call it \"lib64\". Accordingly, PRRTE will use the library subdirectory name",
                 "of the PMIx installation used to build PRRTE.",
                 NULL}
    },

    { .topic = "app-pmix-prefix",
      .content = (const char *[]){
                 "Prefix to be used by an app to look for its PMIx installation on remote",
                 "nodes. This is the location of the top-level directory for the installation.",
                 "If the installation has not been moved, it would be the value given to",
                 "\"--prefix\" when the installation was configured.",
                 "Note that PRRTE cannot determine the exact name of the library subdirectory",
                 "under this location. For example, some systems will call it \"lib\" while others",
                 "call it \"lib64\". Accordingly, PRRTE will use the library subdirectory name",
                 "of the PMIx installation used to build PRRTE.",
                 "In the absence of providing an application-specific prefix, the PMIx prefix",
                 "(if given) used by PRRTE's own executables will be applied unless the",
                 "\"--no-app-prefix\" directive is given.",
                 NULL}
    },

    { .topic = "no-app-prefix",
      .content = (const char *[]){
                 "Do not apply any prefix to this application. This is needed when a default",
                 "PMIx prefix has been given to PRRTE, but the application has been built",
                 "against a PMIx library that (a) is different from the one used by PRRTE,",
                 "and (b) was not moved. Otherwise, PRRTE will apply its default prefix to",
                 "the application.",
                 NULL}
    },

    { .topic = "x",
      .content = (const char *[]){
                 "Export an environment variable, optionally specifying a value. For",
                 "example:",
                 "* \"-x foo\" exports the environment variable \"foo\" and takes its value",
                 "  from the current environment.",
                 "* \"-x foo=bar\" exports the environment variable name \"foo\" and sets",
                 "  its value to \"bar\" in the started processes.",
                 "* \"-x foo*\" exports all current environmental variables starting with",
                 "  \"foo\".",
                 NULL}
    },

    { .topic = "unset-env",
      .content = (const char *[]){
                 "Unset the named environmental variable. Note \"--unset-env foo*\" unsets all",
                 "current environmental variables starting with \"foo\"",
                 NULL}
    },

    { .topic = "append-env",
      .content = (const char *[]){
                 "Append the named environment variable with the given value. The \"[c]\" must",
                 "be appended to the name to specify the separator to be used when appending",
                 "the value.",
                 "Example: \"--append-envar LD_LIBRARY_PATH[:] foo/lib\" will result in:",
                 "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:foo/lib",
                 NULL}
    },

    { .topic = "prepend-env",
      .content = (const char *[]){
                 "Prepend the named environment variable with the given value. The \"[c]\" must",
                 "be appended to the name to specify the separator to be used when appending",
                 "the value.",
                 "Example: \"--prepend-envar LD_LIBRARY_PATH[:] foo/lib\" will result in:",
                 "LD_LIBRARY_PATH=foo/lib:$LD_LIBRARY_PATH",
                 NULL}
    },

    { .topic = "forward-signals",
      .content = (const char *[]){
                 "Comma-delimited list of additional signals (names or integers) to",
                 "forward to application processes (\"none\" = forward nothing). Signals",
                 "provided by default include SIGTSTP, SIGUSR1, SIGUSR2, SIGABRT,",
                 "SIGALRM, and SIGCONT.",
                 NULL}
    },

    { .topic = "allow-run-as-root",
      .content = (const char *[]){
                 "Allow execution as root **(STRONGLY DISCOURAGED)**.",
                 "Running as root exposes the user to potentially catastrophic file",
                 "system corruption and damage — e.g., if the user accidentally points",
                 "the root of the session directory to a system required point, this",
                 "directory and all underlying elements will be deleted upon job",
                 "completion, thereby rendering the system inoperable.",
                 "It is recognized that some environments (e.g., containers) may require",
                 "operation as root, and that the user accepts the risks in those",
                 "scenarios. Accordingly, one can override PRRTE's run-as-root",
                 "protection by providing one of the following:",
                 "* The \"--allow-run-as-root\" command line directive",
                 "* Adding **BOTH** of the following environmental parameters:",
                 "     * \"PRTE_ALLOW_RUN_AS_ROOT=1\"",
                 "     * \"PRTE_ALLOW_RUN_AS_ROOT_CONFIRM=1\"",
                 "Again, we recommend this only be done if absolutely necessary.",
                 NULL}
    },

    { .topic = "report-child-jobs-separately",
      .content = (const char *[]){
                 "Return the exit status of the primary job only",
                 NULL}
    },

    { .topic = "timeout",
      .content = (const char *[]){
                 "Timeout the job if execution time exceeds the specified number of",
                 "seconds",
                 NULL}
    },

    { .topic = "report-state-on-timeout",
      .content = (const char *[]){
                 "Report all job and process states upon timeout",
                 NULL}
    },

    { .topic = "get-stack-traces",
      .content = (const char *[]){
                 "Get stack traces of all application procs on timeout",
                 NULL}
    },

    { .topic = "spawn-timeout",
      .content = (const char *[]){
                 "Timeout the job if spawn takes more than the specified number of",
                 "seconds",
                 NULL}
    },

    { .topic = "np",
      .content = (const char *[]){
                 "Specify number of application processes to be started",
                 NULL}
    },

    { .topic = "n",
      .content = (const char *[]){
                 "Specify number of application processes to be started",
                 NULL}
    },

    { .topic = "N",
      .content = (const char *[]){
                 "Specify number of application processes per node to be started",
                 NULL}
    },

    { .topic = "app",
      .content = (const char *[]){
                 "Provide an appfile; ignore all other command line options",
                 NULL}
    },

    { .topic = "xterm",
      .content = (const char *[]){
                 "Create a new xterm window and display output from the specified ranks",
                 "there.  Ranks are specified as a comma-delimited list of ranges —",
                 "e.g., \"1,3-6,9\", or as \"all\".",
                 NULL}
    },

    { .topic = "stop-on-exec",
      .content = (const char *[]){
                 "If supported, stop each process at start of execution",
                 NULL}
    },

    { .topic = "stop-in-init",
      .content = (const char *[]){
                 "Include the \"PMIX_DEBUG_STOP_IN_INIT\" attribute in the application's",
                 "job info directing that the specified ranks stop in PMIx_Init pending",
                 "release. Ranks are specified as a comma-delimited list of ranges —",
                 "e.g., \"1,3-6,9\", or as \"all\".",
                 NULL}
    },

    { .topic = "stop-in-app",
      .content = (const char *[]){
                 "Include the \"PMIX_DEBUG_STOP_IN_APP\" attribute in the application's",
                 "job info directing that the specified ranks stop at an application-",
                 "determined point pending release. Ranks are specified as a comma-",
                 "delimited list of ranges — e.g., \"1,3-6,9\", or as \"all\".",
                 NULL}
    },

    { .topic = "wdir",
      .content = (const char *[]){
                 "Set the working directory of the started processes",
                 NULL}
    },

    { .topic = "wd",
      .content = (const char *[]){
                 "Synonym for --wdir",
                 NULL}
    },

    { .topic = "set-cwd-to-session-dir",
      .content = (const char *[]){
                 "Set the working directory of the started processes to their session",
                 "directory",
                 NULL}
    },

    { .topic = "path",
      .content = (const char *[]){
                 "Path to be used to look for executables to start processes",
                 NULL}
    },

    { .topic = "show-progress",
      .content = (const char *[]){
                 "Output a brief periodic report on launch progress",
                 NULL}
    },

    { .topic = "pset",
      .content = (const char *[]){
                 "User-specified name assigned to the processes in their given",
                 "application",
                 NULL}
    },

    { .topic = "hostfile",
      .content = (const char *[]){
                 "PRRTE supports several levels of user-specified hostfiles based on an",
                 "established precedence order. Users can specify a hostfile that",
                 "contains a list of nodes to be used for the job, or can provide a",
                 "comma-delimited list of nodes to be used for that job via the \"--host\"",
                 "command line option.",
                 "The precedence order applied to these various options depends to some",
                 "extent on the local environment. The following table illustrates how",
                 "host and hostfile directives work together to define the set of hosts",
                 "upon which a DVM will execute the job in the absence of a resource",
                 "manager (RM):",
                 "+---------+------------+-----------------------------------------------+",
                 "| host    | hostfile   | Result                                        |",
                 "|=========|============|===============================================|",
                 "| unset   | unset      | The DVM will utilize all its available        |",
                 "|         |            | resources when mapping the job.               |",
                 "+---------+------------+-----------------------------------------------+",
                 "| set     | unset      | Host option defines resource list for the job |",
                 "+---------+------------+-----------------------------------------------+",
                 "| unset   | set        | Hostfile defines resource list for the job    |",
                 "+---------+------------+-----------------------------------------------+",
                 "| set     | set        | Hostfile defines resource list for the job,   |",
                 "|         |            | then host filters the list to define the      |",
                 "|         |            | final set of nodes to be used for the job     |",
                 "+---------+------------+-----------------------------------------------+",
                 "Hostfiles (sometimes called \"machine files\") are a combination of two",
                 "things:",
                 "1. A listing of hosts on which to launch processes.",
                 "2. Optionally, limit the number of processes which can be launched on",
                 "   each host.",
                 "Hostfile syntax consists of one node name on each line, optionally",
                 "including a designated number of \"slots\":",
                 "   # This is a comment line, and will be ignored",
                 "   node01  slots=10",
                 "   node13  slots=5",
                 "   node15",
                 "   node16",
                 "   node17  slots=3",
                 "   ...",
                 "Blank lines and lines beginning with a \"#\" are ignored.",
                 "A \"slot\" is the PRRTE term for an allocatable unit where we can launch",
                 "a process.  See the section on definition of the term \"slot\" for a",
                 "longer description of slots.",
                 "In the absence of the \"slot\" parameter, PRRTE will assign either the",
                 "number of slots to be the number of CPUs detected on the node or the",
                 "resource manager-assigned value if operating in the presence of an RM.",
                 "Important:",
                 "  If using a resource manager, the user-specified number of slots is",
                 "  capped by the RM-assigned value.",
                 "Relative host indexing",
                 "----------------------",
                 "Hostfile and \"--host\" specifications can also be made using relative",
                 "indexing. This allows a user to stipulate which hosts are to be used",
                 "for a given app context without specifying the particular host name,",
                 "but rather its relative position in the allocation.",
                 "This can probably best be understood through consideration of a few",
                 "examples. Consider the case where a DVM is comprised of a set of nodes",
                 "named \"foo1\", \"foo2\", \"foo3\", \"foo4\". The user wants the first app",
                 "context to have exclusive use of the first two nodes, and a second app",
                 "context to use the last two nodes. Of course, the user could printout",
                 "the allocation to find the names of the nodes allocated to them and",
                 "then use \"--host\" to specify this layout, but this is cumbersome and",
                 "would require hand-manipulation for every invocation.",
                 "A simpler method is to utilize PRRTE's relative indexing capability to",
                 "specify the desired layout. In this case, a command line containing:",
                 "   --host +n1,+n2 ./app1 : --host +n3,+n4 ./app2",
                 "would provide the desired pattern. The \"+\" syntax indicates that the",
                 "information is being provided as a relative index into the existing",
                 "allocation. Two methods of relative indexing are supported:",
                 "* \"+n#\": A relative index into the allocation referencing the \"#\"",
                 "  node. PRRTE will substitute the \"#\" node in the allocation",
                 "* \"+e[:#]\": A request for \"#\" empty nodes — i.e., PRRTE is to",
                 "  substitute this reference with nodes that have not yet been used by",
                 "  any other app_context. If the \":#\" is not provided, PRRTE will",
                 "  substitute the reference with all empty nodes. Note that PRRTE does",
                 "  track the empty nodes that have been assigned in this manner, so",
                 "  multiple uses of this option will result in assignment of unique",
                 "  nodes up to the limit of the available empty nodes. Requests for",
                 "  more empty nodes than are available will generate an error.",
                 "Relative indexing can be combined with absolute naming of hosts in any",
                 "arbitrary manner, and can be used in hostfiles as well as with the \"--",
                 "host\" command line option. In addition, any slot specification",
                 "provided in hostfiles will be respected — thus, a user can specify",
                 "that only a certain number of slots from a relative indexed host are",
                 "to be used for a given app context.",
                 "Another example may help illustrate this point. Consider the case",
                 "where the user has a hostfile containing:",
                 "   dummy1 slots=4",
                 "   dummy2 slots=4",
                 "   dummy3 slots=4",
                 "   dummy4 slots=4",
                 "   dummy5 slots=4",
                 "This may, for example, be a hostfile that describes a set of commonly-",
                 "used resources that the user wishes to execute applications against.",
                 "For this particular application, the user plans to map byslot, and",
                 "wants the first two ranks to be on the second node of any allocation,",
                 "the next ranks to land on an empty node, have one rank specifically on",
                 "\"dummy4\", the next rank to be on the second node of the allocation",
                 "again, and finally any remaining ranks to be on whatever empty nodes",
                 "are left. To accomplish this, the user provides a hostfile of:",
                 "   +n2 slots=2",
                 "   +e:1",
                 "   dummy4 slots=1",
                 "   +n2",
                 "   +e",
                 "The user can now use this information in combination with PRRTE's",
                 "sequential mapper to obtain their specific layout:",
                 "   <launcher> --hostfile dummyhosts --hostfile mylayout --prtemca rmaps seq ./my_app",
                 "which will result in:",
                 "   rank0 being mapped to dummy3",
                 "   rank1 to dummy1 as the first empty node",
                 "   rank2 to dummy4",
                 "   rank3 to dummy3",
                 "   rank4 to dummy2 and rank5 to dummy5 as the last remaining unused nodes",
                 "Note that the sequential mapper ignores the number of slots arguments",
                 "as it only maps one rank at a time to each node in the list.",
                 "If the default round-robin mapper had been used, then the mapping",
                 "would have resulted in:",
                 "* ranks 0 and 1 being mapped to dummy3 since two slots were specified",
                 "* ranks 2-5 on dummy1 as the first empty node, which has four slots",
                 "* rank6 on dummy4 since the hostfile specifies only a single slot from",
                 "  that node is to be used",
                 "* ranks 7 and 8 on dummy3 since only two slots remain available",
                 "* ranks 9-12 on dummy2 since it is the next available empty node and",
                 "  has four slots",
                 "* ranks 13-16 on dummy5 since it is the last remaining unused node and",
                 "  has four slots",
                 "Thus, the use of relative indexing can allow for complex mappings to",
                 "be ported across allocations, including those obtained from automated",
                 "resource managers, without the need for manual manipulation of scripts",
                 "and/or command lines.",
                 "See the \"Host specification\" HTML documentation for details about the",
                 "format and content of hostfiles.",
                 NULL}
    },

    { .topic = "machinefile",
      .content = (const char *[]){
                 "Provide a hostfile.  This option is a synonym for \"--hostfile\"; see",
                 "that option for more information.",
                 NULL}
    },

    { .topic = "add-hostfile",
      .content = (const char *[]){
                 "PRRTE allows a user to expand an existing DVM prior to launching an",
                 "application.  Users can specify a hostfile that contains a list of",
                 "nodes to be added to the DVM using normal hostfile syntax.",
                 "The list can include nodes that are already part of the DVM — in this",
                 "case, the number of slots available on those nodes will be set to the",
                 "new specification, or adjusted as directed:",
                 "   node01  slots=5",
                 "would direct that node01 be set to 5 slots, while",
                 "   node01 slots+=5",
                 "would add 5 slots to the current value for node01, and",
                 "   node01  slots-=5",
                 "would subtract 5 slots from the current value.",
                 "Slot adjustments for existing nodes will have no impact on currently",
                 "executing jobs, but will be applied to any new spawn requests. Nodes",
                 "contained in the add-hostfile specification are available for",
                 "immediate use by the accompanying application.",
                 "Users desiring to constrain the accompanying application to the newly",
                 "added nodes should also include the \"--hostfile\" command line",
                 "directive, giving the same hostfile as its argument:",
                 "   --add-hostfile <filename> --hostfile <filename>",
                 NULL}
    },

    { .topic = "host",
      .content = (const char *[]){
                 "Host syntax consists of a comma-delimited list of node names, each",
                 "entry optionally containing a \":N\" extension indicating the number of",
                 "slots to assign to that entry:",
                 "   --host node01:5,node02",
                 "In the absence of the slot extension, one slot will be assigned to the",
                 "node. Duplicate entries are aggregated and the number of slots",
                 "assigned to that node are summed together.",
                 "Note:",
                 "  A \"slot\" is the PRRTE term for an allocatable unit where we can",
                 "  launch a process. Thus, the number of slots equates to the maximum",
                 "  number of processes PRRTE may start on that node without",
                 "  oversubscribing it.",
                 "See the \"Host specification\" HTML documentation for details about the",
                 "format and content of hostfiles.",
                 NULL}
    },

    { .topic = "add-host",
      .content = (const char *[]){
                 "PRRTE allows a user to expand an existing DVM prior to launching an",
                 "application.  Users can specify a a comma-delimited list of node",
                 "names, each entry optionally containing a \":N\" extension indicating",
                 "the number of slots to assign to that entry:",
                 "   --host node01:5,node02",
                 "In the absence of the slot extension, one slot will be assigned to the",
                 "node. Duplicate entries are aggregated and the number of slots",
                 "assigned to that node are summed together.",
                 "Note:",
                 "  A \"slot\" is the PRRTE term for an allocatable unit where we can",
                 "  launch a process. Thus, the number of slots equates to the maximum",
                 "  number of processes PRRTE may start on that node without",
                 "  oversubscribing it.",
                 "The list can include nodes that are already part of the DVM — in this",
                 "case, the number of slots available on those nodes will be set to the",
                 "new specification, or adjusted as directed:",
                 "   --host node01:5,node02",
                 "would direct that node01 be set to 5 slots and node02 will have 1",
                 "slot, while",
                 "   --host node01:+5,node02",
                 "would add 5 slots to the current value for node01, and",
                 "   --host node01:-5,node02",
                 "would subtract 5 slots from the current value.",
                 "Slot adjustments for existing nodes will have no impact on currently",
                 "executing jobs, but will be applied to any new spawn requests. Nodes",
                 "contained in the add-host specification are available for immediate",
                 "use by the accompanying application.",
                 "Users desiring to constrain the accompanying application to the newly",
                 "added nodes should also include the \"--host\" command line directive,",
                 "giving the same hosts in its argument:",
                 "   --add-host node01:+5,node02 --host node01:5,node02",
                 "Note that the \"--host\" argument indicates the number of slots to",
                 "assign node01 for this spawn request, and not the number of slots",
                 "being added to the node01 allocation.",
                 NULL}
    },

    { .topic = "personality",
      .content = (const char *[]){
                 "Specify the personality to be used. This governs selection of the",
                 "plugin responsible for defining and parsing the command line,",
                 "harvesting and forwarding environmental variables, and providing",
                 "library-dependent support to the launched processes. Examples include",
                 "\"ompi\" for an application compiled with Open MPI, \"mpich\" for one",
                 "built against the MPICH library, or \"oshmem\" for an OpenSHMEM",
                 "application compiled against SUNY's reference library.",
                 NULL}
    },

    { .topic = "preload-files",
      .content = (const char *[]){
                 "Syntax: \"--preload-files <files>\"",
                 "Preload the comma separated list of files to the remote machines",
                 "current working directory before starting the remote process.",
                 NULL}
    },

    { .topic = "preload-binary",
      .content = (const char *[]){
                 "Syntax: \"--preload-binary\"",
                 "Preload the binary on the remote machine before starting the remote",
                 "process.",
                 NULL}
    },

    { .topic = "output",
      .content = (const char *[]){
                 "The \"output\" command line directive must be accompanied by a comma-",
                 "delimited list of case-insensitive options that control how output is",
                 "generated. The full directive need not be provided — only enough",
                 "characters are required to uniquely identify the directive. For",
                 "example, \"MERGE\" is sufficient to represent the \"MERGE-STDERR-TO-",
                 "STDOUT\" directive — while \"TAG\" can not be used to represent \"TAG-",
                 "DETAILED\" (though \"TAG-D\" would suffice).",
                 "Supported values include:",
                 "* \"TAG\" marks each output line with the \"[job,rank]<stream>:\" of the",
                 "  process that generated it",
                 "* \"TAG-DETAILED\" marks each output line with a detailed annotation",
                 "  containing \"[namespace,rank][hostname:pid]<stream>:\" of the process",
                 "  that generated it",
                 "* \"TAG-FULLNAME\" marks each output line with the",
                 "  \"[namespace,rank]<stream>:\" of the process that generated it",
                 "* \"TAG-FULLNAME\" marks each output line with the",
                 "  \"[namespace,rank]<stream>:\" of the process that generated it",
                 "* \"TIMESTAMP\" prefixes each output line with a \"[datetime]<stream>:\"",
                 "  stamp. Note that the timestamp will be the time when the line is",
                 "  output by the DVM and not the time when the source output it",
                 "* \"XML\" provides all output in a pseudo-XML format \"MERGE-STDERR-TO-",
                 "  STDOUT\" merges stderr into stdout",
                 "* \"DIR=DIRNAME\" redirects output from application processes into",
                 "  \"DIRNAME/job/rank/std[out,err,diag]\". The provided name will be",
                 "  converted to an absolute path",
                 "* \"FILE=FILENAME\" redirects output from application processes into",
                 "  \"filename.rank.\" The provided name will be converted to an absolute",
                 "  path",
                 "Supported qualifiers include \"NOCOPY\" (do not copy the output to the",
                 "stdout/err streams), and \"RAW\" (do not buffer the output into complete",
                 "lines, but instead output it as it is received).",
                 NULL}
    },

    { .topic = "stdin",
      .content = (const char *[]){
                 "Specify procs to receive stdin [integer ranks, \"all\", \"none\"]",
                 "(default: \"0\", indicating rank 0)",
                 NULL}
    },

    { .topic = "map-by",
      .content = (const char *[]){
                 "Processes are mapped based on one of the following directives as",
                 "applied at the job level:",
                 "* \"SLOT\" assigns procs to each node up to the number of available",
                 "  slots on that node before moving to the next node in the allocation",
                 "* \"HWTHREAD\" assigns a proc to each hardware thread on a node in a",
                 "  round-robin manner up to the number of available slots on that node",
                 "  before moving to the next node in the allocation",
                 "* \"CORE\" (default) assigns a proc to each core on a node in a round-",
                 "  robin manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"L1CACHE\" assigns a proc to each L1 cache on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"L2CACHE\" assigns a proc to each L2 cache on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"L3CACHE\" assigns a proc to each L3 cache on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"NUMA\" assigns a proc to each NUMA region on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"PACKAGE\" assigns a proc to each package on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"NODE\" assigns processes in a round-robin fashion to all nodes in",
                 "  the allocation, with the number assigned to each node capped by the",
                 "  number of available slots on that node",
                 "* \"SEQ\" (often accompanied by the file=<path> qualifier) assigns one",
                 "  process to each node specified in the file. The sequential file is",
                 "  to contain an entry for each desired process, one per line of the",
                 "  file.",
                 "* \"PPR:N\":resource maps N procs to each instance of the specified",
                 "  resource type in the allocation",
                 "* \"RANKFILE\" (often accompanied by the file=<path> qualifier) assigns",
                 "  one process to the node/resource specified in each entry of the",
                 "  file, one per line of the file.",
                 "* \"PE-LIST=a,b\" assigns procs to each node in the allocation based on",
                 "  the ORDERED qualifier. The list is comprised of comma-delimited",
                 "  ranges of CPUs to use for this job. If the ORDERED qualifier is not",
                 "  provided, then each node will be assigned procs up to the number of",
                 "  available slots, capped by the availability of the specified CPUs.",
                 "  If ORDERED is given, then one proc will be assigned to each of the",
                 "  specified CPUs, if available, capped by the number of slots on each",
                 "  node and the total number of specified processes. Providing the",
                 "  OVERLOAD qualifier to the \"bind-to\" option removes the check on",
                 "  availability of the CPU in both cases.",
                 "Any directive can include qualifiers by adding a colon (\":\") and any",
                 "combination of one or more of the following (delimited by colons) to",
                 "the \"--map-by\" option (except where noted):",
                 "* \"PE=n\" bind n CPUs to each process (can not be used in combination",
                 "  with rankfile or pe-list directives)",
                 "* \"SPAN\" load balance the processes across the allocation by treating",
                 "  the allocation as a single \"super-node\" (can not be used in",
                 "  combination with \"slot\", \"node\", \"seq\", \"ppr\", \"rankfile\", or \"pe-",
                 "  list\" directives)",
                 "* \"OVERSUBSCRIBE\" allow more processes on a node than processing",
                 "  elements",
                 "* \"NOOVERSUBSCRIBE\" means \"!OVERSUBSCRIBE\"",
                 "* \"NOLOCAL\" do not launch processes on the same node as \"prun\"",
                 "* \"HWTCPUS\" use hardware threads as CPU slots",
                 "* \"CORECPUS\" use cores as CPU slots (default)",
                 "* \"INHERIT\" indicates that a child job (i.e., one spawned from within",
                 "  an application) shall inherit the placement policies of the parent",
                 "  job that spawned it.",
                 "* \"NOINHERIT\" means \"`!INHERIT\"",
                 "* \"FILE=<path>\" (path to file containing sequential or rankfile",
                 "  entries).",
                 "* \"ORDERED\" only applies to the \"PE-LIST\" option to indicate that",
                 "  procs are to be bound to each of the specified CPUs in the order in",
                 "  which they are assigned (i.e., the first proc on a node shall be",
                 "  bound to the first CPU in the list, the second proc shall be bound",
                 "  to the second CPU, etc.)",
                 "Note:",
                 "  Directives and qualifiers are case-insensitive and can be shortened",
                 "  to the minimum number of characters to uniquely identify them. Thus,",
                 "  \"L1CACHE\" can be given as \"l1cache\" or simply as \"L1\".",
                 "The type of CPU (core vs hwthread) used in the mapping algorithm is",
                 "determined as follows:",
                 "* by user directive on the command line via the HWTCPUS qualifier to",
                 "  the \"--map-by\" directive",
                 "* by setting the \"rmaps_default_mapping_policy\" MCA parameter to",
                 "  include the \"HWTCPUS\" qualifier. This parameter sets the default",
                 "  value for a PRRTE DVM — qualifiers are carried across to DVM jobs",
                 "  started via \"prun\" unless overridden by the user's command line",
                 "* defaults to CORE in topologies where core CPUs are defined, and to",
                 "  hwthreads otherwise.",
                 "If your application uses threads, then you probably want to ensure",
                 "that you are either not bound at all (by specifying \"--bind-to none\"),",
                 "or bound to multiple cores using an appropriate binding level or",
                 "specific number of processing elements per application process via the",
                 "\"PE=#\" qualifier to the \"--map-by\" command line directive.",
                 "A more detailed description of the mapping, ranking, and binding",
                 "procedure can be obtained via the \"--help placement\" option.",
                 NULL}
    },

    { .topic = "rank-by",
      .content = (const char *[]){
                 "PRRTE automatically ranks processes for each job starting from zero.",
                 "Regardless of the algorithm used, rank assignments span applications",
                 "in the same job — i.e., a command line of",
                 "   -n 3 app1 : -n 2 app2",
                 "will result in \"app1\" having three processes ranked 0-2 and \"app2\"",
                 "having two processes ranked 3-4.",
                 "By default, process ranks are assigned in accordance with the mapping",
                 "directive — e.g., jobs that are mapped by-node will have the process",
                 "ranks assigned round-robin on a per-node basis. However, users can",
                 "override the default by specifying any of the following directives",
                 "using the \"--rank-by\" command line option:",
                 "* \"SLOT\" assigns ranks to each process on a node in the order in which",
                 "  the mapper assigned them. This is the default behavior, but is",
                 "  provided as an explicit option to allow users to override any",
                 "  alternative default specified in the environment. When mapping to a",
                 "  specific resource type, procs assigned to a given instance of that",
                 "  resource on a node will be ranked on a per-resource basis on that",
                 "  node before moving to the next node.",
                 "* \"NODE\" assigns ranks round-robin on a per-node basis",
                 "* \"FILL\" assigns ranks to procs mapped to a particular resource type",
                 "  on each node, filling all ranks on that resource before moving to",
                 "  the next resource on that node. For example, procs mapped by",
                 "  \"L1cache\" would have all procs on the first \"L1cache\" ranked",
                 "  sequentially before moving to the second \"L1cache\" on the node. Once",
                 "  all procs on the node have been ranked, ranking would continue on",
                 "  the next node.",
                 "* \"SPAN\" assigns ranks round-robin to procs mapped to a particular",
                 "  resource type, treating the collection of resource instances",
                 "  spanning the entire allocation as a single \"super node\" before",
                 "  looping around for the next pass. Thus, ranking would begin with the",
                 "  first proc on the first \"L1cache\" on the first node, then the next",
                 "  rank would be assigned to the first proc on the second \"L1cache\" on",
                 "  that node, proceeding across until the first proc had been ranked on",
                 "  all \"L1cache\" used by the job before circling around to rank the",
                 "  second proc on each object.",
                 "The \"rank-by\" command line option has no qualifiers.",
                 "Note:",
                 "  Directives are case-insensitive.  \"SPAN\" is the same as \"span\".",
                 "A more detailed description of the mapping, ranking, and binding",
                 "procedure can be obtained via the \"--help placement\" option.",
                 NULL}
    },

    { .topic = "bind-to",
      .content = (const char *[]){
                 "By default, processes are bound to individual CPUs (either COREs or",
                 "HWTHREADs, as defined by default or by user specification for the",
                 "job). On nodes that are OVERSUBSCRIBEd (i.e., where the number of",
                 "procs exceeds the number of assigned slots), the default is to not",
                 "bind the processes.",
                 "Note:",
                 "  Processes from prior jobs that are already executing on a node are",
                 "  not \"unbound\" when a new job mapping results in the node becoming",
                 "  oversubscribed.",
                 "Binding is performed to the first available specified object type",
                 "within the object where the process was mapped. In other words,",
                 "binding can only be done to the mapped object or to a resource located",
                 "beneath that object.",
                 "An object is considered completely consumed when the number of",
                 "processes bound to it equals the number of CPUs within it. Unbound",
                 "processes are not considered in this computation. Additional processes",
                 "cannot be mapped to consumed objects unless the \"OVERLOAD\" qualifier",
                 "is provided via the \"--bind-to\" command line option.",
                 "Note that directives and qualifiers are case-insensitive and can be",
                 "shortened to the minimum number of characters to uniquely identify",
                 "them. Thus, \"L1CACHE\" can be given as \"l1cache\" or simply as \"L1\".",
                 "Supported binding directives include:",
                 "* \"NONE\" does not bind the processes",
                 "* \"HWTHREAD\" binds each process to a single hardware thread/ This",
                 "  requires that hwthreads be treated as independent CPUs (i.e., that",
                 "  either the \"HWTCPUS\" qualifier be provided to the \"map-by\" option or",
                 "  that \"hwthreads\" be designated as CPUs by default).",
                 "* \"CORE\" binds each process to a single core. This can be done whether",
                 "  \"hwthreads\" or \"cores\" are being treated as independent CPUs",
                 "  provided that mapping is performed at the core or higher level.",
                 "* \"L1CACHE\" binds each process to all the CPUs in an \"L1\" cache.",
                 "* \"L2CACHE\" binds each process to all the CPUs in an \"L2\" cache",
                 "* \"L3CACHE\" binds each process to all the CPUs in an \"L3\" cache",
                 "* \"NUMA\" binds each process to all the CPUs in a \"NUMA\" region",
                 "* \"PACKAGE\" binds each process to all the CPUs in a \"PACKAGE\"",
                 "Any directive can include qualifiers by adding a colon (:) and any",
                 "combination of one or more of the following to the \"--bind-to\" option:",
                 "* \"OVERLOAD\" indicates that objects can have more processes bound to",
                 "  them than CPUs within them",
                 "* \"IF-SUPPORTED\" indicates that the job should continue to be launched",
                 "  and executed even if binding cannot be performed as requested.",
                 "* \"LIMIT=n\" limits the number of processes bound to each eligible",
                 "  representative of the specified type to the given number. For",
                 "  example, speifying \"--bind-to l3:limit=2\" would direct PRRTE",
                 "  to bind ranks to the L3caches, limiting the number of processes",
                 "  bound to each l3cache to two - i.e., bind 2 processes to a",
                 "  given l3cache, and then move on to the next.",
                 "Note:",
                 "  Directives and qualifiers are case-insensitive - e.g., \"OVERLOAD\"",
                 "  is the same as \"overload\".",
                 NULL}
    },

    { .topic = "runtime-options",
      .content = (const char *[]){
                 "The \"--runtime-options\" command line directive must be accompanied by",
                 "a comma-delimited list of case-insensitive options that control the",
                 "runtime behavior of the job. The full directive need not be provided —",
                 "only enough characters are required to uniquely identify the",
                 "directive.",
                 "Runtime options are typically \"true\" or \"false\", though this is not a",
                 "requirement on developers. Since the value of each option may need to",
                 "be set (e.g., to override a default set by MCA parameter), the syntax",
                 "of the command line directive includes the use of an \"=\" character to",
                 "allow inclusion of a value for the option. For example, one can set",
                 "the \"ABORT-NONZERO-STATUS\" option to \"true\" by specifying it as",
                 "\"ABORT-NONZERO-STATUS=1\". Note that boolean options can be set to",
                 "\"true\" using a non-zero integer or a case-insensitive string of the",
                 "word \"true\".  For the latter representation, the user need only",
                 "provide at least the \"T\" character. The same policy applies to setting",
                 "a boolean option to \"false\".",
                 "Note that a boolean option will default to \"true\" if provided without",
                 "a value. Thus, \"--runtime-options abort-nonzero\" is sufficient to set",
                 "the \"ABORT-NONZERO-STATUS\" option to \"true\".",
                 "Supported values include:",
                 "* \"ERROR-NONZERO-STATUS[=(bool)]\": if set to false, this directs the",
                 "  runtime to treat a process that exits with non-zero status as a",
                 "  normal termination.  If set to true, the runtime will consider such",
                 "  an occurrence as an error termination and take appropriate action —",
                 "  i.e., the job will be terminated unless a runtime option directs",
                 "  otherwise. This option defaults to a true value if the option is",
                 "  given without a value.",
                 "* \"DONOTLAUNCH\": directs the runtime to map but not launch the",
                 "  specified job. This is provided to help explore possible process",
                 "  placement patterns before actually starting execution. No value need",
                 "  be passed as this is not an option that can be set by default in",
                 "  PRRTE.",
                 "* \"SHOW-PROGRESS[=(bool)]\": requests that the runtime provide progress",
                 "  reports on its startup procedure — i.e., the launch of its daemons",
                 "  in support of a job. This is typically used to debug DVM startup on",
                 "  large systems.  This option defaults to a true value if the option",
                 "  is given without a value.",
                 "* \"NOTIFYERRORS[=(bool)]\": if set to true, requests that the runtime",
                 "  provide a PMIx event whenever a job encounters an error — e.g., a",
                 "  process fails.  The event is to be delivered to each remaining",
                 "  process in the job. This option defaults to a true value if the",
                 "  option is given without a value.  See \"--help notifications\" for",
                 "  more detail as to the PMIx event codes available for capturing",
                 "  failure events.",
                 "* \"RECOVERABLE[=(bool)]\": if set to true, this indicates that the",
                 "  application wishes to consider the job as recoverable — i.e., the",
                 "  application is assuming responsibility for recovering from any",
                 "  process failure. This could include application-driven spawn of a",
                 "  substitute process or internal compensation for the missing process.",
                 "  This option defaults to a true value if the option is given without",
                 "  a value.",
                 "* \"AUTORESTART[=(bool)]\": if set to true, this requests that the",
                 "  runtime automatically restart failed processes up to \"max restarts\"",
                 "  number of times. This option defaults to a true value if the option",
                 "  is given without a value.",
                 "* \"CONTINUOUS[=(bool)]\": if set to true, this informs the runtime that",
                 "  the processes in this job are to run until explicitly terminated.",
                 "  Processes that fail are to be automatically restarted up to \"max",
                 "  restarts\" number of times. Notification of process failure is to be",
                 "  delivered to all processes in the application. This is the",
                 "  equivalent of specifying \"RECOVERABLE\", \"NOTIFYERRORS\", and",
                 "  \"AUTORESTART\" options except that the runtime, not the application,",
                 "  assumes responsibility for process recovery. This option defaults to",
                 "  a true value if the option is given without a value.",
                 "* \"MAX-RESTARTS=<int>\": indicates the maximum number of times a given",
                 "  process is to be restarted. This can be set at the application or",
                 "  job level (which will then apply to all applications in that job).",
                 "* \"EXEC-AGENT=<path>\" indicates the executable that shall be used to",
                 "  start an application process. The resulting command for starting an",
                 "  application process will be \"<path> app <app-argv>\". The path may",
                 "  contain its own command line arguments.",
                 "* \"DEFAULT-EXEC-AGENT\": directs the runtime to use the system default",
                 "  exec agent to start an application process. No value need be passed",
                 "  as this is not an option that can be set by default in PRRTE.",
                 "* \"OUTPUT-PROCTABLE[(=channel)]\": directs the runtime to report the",
                 "  convential debugger process table (includes PID and host location of",
                 "  each process in the application). Output is directed to stdout if",
                 "  the channel is \"-\", stderr if \"+\", or into the specified file",
                 "  otherwise. If no channel is specified, output will be directed to",
                 "  stdout.",
                 "* \"STOP-ON-EXEC\": directs the runtime to stop the application",
                 "  process(es) immediately upon exec'ing them. The directive will apply",
                 "  to all processes in the job.",
                 "* \"STOP-IN-INIT\": indicates that the runtime should direct the",
                 "  application process(es) to stop in \"PMIx_Init()\". The directive will",
                 "  apply to all processes in the job.",
                 "* \"STOP-IN-APP\": indicates that the runtime should direct application",
                 "  processes to stop at some application-defined place and notify they",
                 "  are ready-to-debug. The directive will apply to all processes in the",
                 "  job.",
                 "* \"TIMEOUT=<string>\": directs the runtime to terminate the job after",
                 "  it has executed for the specified time. Time is specified in colon-",
                 "  delimited format — e.g., \"01:20:13:05\" to indicate 1 day, 20 hours,",
                 "  13 minutes and 5 seconds. Time specified without colons will be",
                 "  assumed to have been given in seconds.",
                 "* \"SPAWN-TIMEOUT=<string>\": directs the runtime to terminate the job",
                 "  if job launch is not completed within the specified time. Time is",
                 "  specified in colon-delimited format — e.g., \"01:20:13:05\" to",
                 "  indicate 1 day, 20 hours, 13 minutes and 5 seconds.  Time specified",
                 "  without colons will be assumed to have been given in seconds.",
                 "* \"REPORT-STATE-ON-TIMEOUT[(=bool)]\": directs the runtime to provide a",
                 "  detailed report on job and application process state upon job",
                 "  timeout. This option defaults to a true value if the option is given",
                 "  without a value.",
                 "* \"GET-STACK-TRACES[(=bool)]\": requests that the runtime provide stack",
                 "  traces on all application processes still executing upon timeout.",
                 "  This option defaults to a true value if the option is given without",
                 "  a value.",
                 "* \"REPORT-CHILD-JOBS-SEPARATELY[(=bool)]\": directs the runtime to",
                 "  report the exit status of any child jobs spawned by the primary job",
                 "  separately. If false, then the final exit status reported will be",
                 "  zero if the primary job and all spawned jobs exit normally, or the",
                 "  first non-zero status returned by either primary or child jobs. This",
                 "  option defaults to a true value if the option is given without a",
                 "  value.",
                 "* \"AGGREGATE-HELP-MESSAGES[(=bool)]\": directs the runtime to aggregate",
                 "  help messages, reporting each unique help message once accompanied",
                 "  by the number of processes that reported it. This option defaults to",
                 "  a true value if the option is given without a value.",
                 "* \"FWD-ENVIRONMENT[(=bool)]\": directs the runtime to forward the",
                 "  entire local environment in support of the application. This option",
                 "  defaults to a true value if the option is given without a value.",
                 "The \"--runtime-options\" command line option has no qualifiers.",
                 "Note:",
                 "  Directives are case-insensitive.  \"FWD-ENVIRONMENT\" is the same as",
                 "  \"fwd-environment\".",
                 NULL}
    },

    { .topic = "display",
      .content = (const char *[]){
                 "The \"display\" command line directive must be accompanied by a comma-",
                 "delimited list of case-insensitive options indicating what information",
                 "about the job and/or allocation is to be displayed. The full directive",
                 "need not be provided — only enough characters are required to uniquely",
                 "identify the directive. For example, \"ALL\" is sufficient to represent",
                 "the \"ALLOCATION\" directive — while \"MAP\" can not be used to represent",
                 "\"MAP-DEVEL\" (though \"MAP-D\" would suffice).",
                 "Supported values include:",
                 "* \"ALLOCATION\" displays the detected hosts and slot assignments for",
                 "  this job",
                 "* \"BINDINGS\" displays the resulting bindings applied to processes in",
                 "  this job",
                 "* \"MAP\" displays the resulting locations assigned to processes in this",
                 "  job",
                 "* \"MAP-DEVEL\" displays a more detailed report on the locations",
                 "  assigned to processes in this job that includes local and node",
                 "  ranks, assigned bindings, and other data",
                 "* \"TOPO=LIST\" displays the topology of each node in the semicolon-",
                 "  delimited list that is allocated to the job",
                 "* \"CPUS[=LIST]\" displays the available CPUs on the provided semicolon-",
                 "  delimited list of nodes (defaults to all nodes)",
                 "The display command line directive can include qualifiers by adding a",
                 "colon (\":\") and any combination of one or more of the following",
                 "(delimited by colons):",
                 "* \"PARSEABLE\" directs that the output be provided in a format that is",
                 "  easily parsed by machines. Note that \"PARSABLE\" is also accepted as",
                 "  a typical spelling for the qualifier.",
                 "Provided qualifiers will apply to *all* of the display directives.",
                 NULL}
    },

    { .topic = "do-not-launch",
      .content = (const char *[]){
                 "Perform all necessary operations to prepare to launch the application,",
                 "but do not actually launch it (usually used to test mapping patterns)",
                 NULL}
    },

    { .topic = "placement",
      .content = (const char *[]){
                 "Overview",
                 "--------",
                 "PRRTE provides a set of three controls for assigning process locations",
                 "and ranks:",
                 "1. Mapping: Assigns a default location to each process",
                 "2. Ranking: Assigns a unique integer rank value to each process",
                 "3. Binding: Constrains each process to run on specific processors",
                 "This section provides an overview of these three controls.  Unless",
                 "otherwise this behavior is shared by \"prun(1)\" (working with a PRRTE",
                 "DVM), and \"prterun(1)\". More detail about PRRTE process placement is",
                 "available in the following sections (using \"--help",
                 "placement-<section>\"):",
                 "* \"examples\": some examples of the interactions between mapping,",
                 "  ranking, and binding options.",
                 "* \"fundamentals\": provides deeper insight into PRRTE's mapping,",
                 "  ranking, and binding options.",
                 "* \"limits\": explains the difference between *overloading* and",
                 "  *oversubscribing* resources.",
                 "* \"diagnostics\": describes options for obtaining various diagnostic",
                 "  reports that aid the user in verifying and tuning the placement for",
                 "  a specific job.",
                 "* \"rankfiles\": explains the format and use of the rankfile mapper for",
                 "  specifying arbitrary process placements.",
                 "* \"deprecated\": a list of deprecated options and their new",
                 "  equivalents.",
                 "* \"all\": outputs all the placement help except for the \"deprecated\"",
                 "  section.",
                 "Quick Summary",
                 "=============",
                 "The two binaries that most influence process layout are \"prte(1)\" and",
                 "\"prun(1)\".  The \"prte(1)\" process discovers the allocation,",
                 "establishes a Distributed Virtual Machine by starting a \"prted(1)\"",
                 "daemon on each node of the allocation, and defines the efault",
                 "mapping/ranking/binding policies for all jobs.  The \"prun(1)\" process",
                 "defines the specific mapping/ranking/binding for a specific job. Most",
                 "of the command line controls are targeted to \"prun(1)\" since each job",
                 "has its own unique requirements.",
                 "\"prterun(1)\" is just a wrapper around \"prte(1)\" for a single job PRRTE",
                 "DVM. It is doing the job of both \"prte(1)\" and \"prun(1)\", and, as",
                 "such, accepts the sum all of their command line arguments. Any example",
                 "that uses \"prun(1)\" can substitute the use of \"prterun(1)\" except",
                 "where otherwise noted.",
                 "The \"prte(1)\" process attempts to automatically discover the nodes in",
                 "the allocation by querying supported resource managers. If a supported",
                 "resource manager is not present then \"prte(1)\" relies on a hostfile",
                 "provided by the user.  In the absence of such a hostfile it will run",
                 "all processes on the localhost.",
                 "If running under a supported resource manager, the \"prte(1)\" process",
                 "will start the daemon processes (\"prted(1)\") on the remote nodes using",
                 "the corresponding resource manager process starter. If no such starter",
                 "is available then \"ssh\" (or \"rsh\") is used.",
                 "Minus user direction, PRRTE will automatically map processes in a",
                 "round-robin fashion by CPU, binding each process to its own CPU. The",
                 "type of CPU used (core vs hwthread) is determined by (in priority",
                 "order):",
                 "* user directive on the command line via the HWTCPUS qualifier to the",
                 "  \"--map-by\" directive",
                 "* setting the \"rmaps_default_mapping_policy\" MCA parameter to include",
                 "  the \"HWTCPUS\" qualifier. This parameter sets the default value for a",
                 "  PRRTE DVM — qualifiers are carried across to DVM jobs started via",
                 "  \"prun\" unless overridden by the user's command line",
                 "* defaulting to \"CORE\" in topologies where core CPUs are defined, and",
                 "  to \"hwthreads\" otherwise.",
                 "By default, the ranks are assigned in accordance with the mapping",
                 "directive — e.g., jobs that are mapped by-node will have the process",
                 "ranks assigned round-robin on a per-node basis.",
                 "PRRTE automatically binds processes unless directed not to do so by",
                 "the user. Minus direction, PRRTE will bind individual processes to",
                 "their own CPU within the object to which they were mapped. Should a",
                 "node become oversubscribed during the mapping process, and if",
                 "oversubscription is allowed, all subsequent processes assigned to that",
                 "node will *not* be bound.",
                 "Definition of 'slot'",
                 "--------------------",
                 "The term \"slot\" is used extensively in the rest of this documentation.",
                 "A slot is an allocation unit for a process.  The number of slots on a",
                 "node indicate how many processes can potentially execute on that node.",
                 "By default, PRRTE will allow one process per slot.",
                 "If PRRTE is not explicitly told how many slots are available on a node",
                 "(e.g., if a hostfile is used and the number of slots is not specified",
                 "for a given node), it will determine a maximum number of slots for",
                 "that node in one of two ways:",
                 "1. Default behavior: By default, PRRTE will attempt to discover the",
                 "   number of processor cores on the node, and use that as the number",
                 "   of slots available.",
                 "2. When \"--use-hwthread-cpus\" is used: If \"--use-hwthread-cpus\" is",
                 "   specified on the command line, then PRRTE will attempt to discover",
                 "   the number of hardware threads on the node, and use that as the",
                 "   number of slots available.",
                 "This default behavior also occurs when specifying the \"--host\" option",
                 "with a single host.  Thus, the command:",
                 "   shell$ prun --host node1 ./a.out",
                 "launches a number of processes equal to the number of cores on node",
                 "\"node1\", whereas:",
                 "   shell$ prun --host node1 --use-hwthread-cpus ./a.out",
                 "launches a number of processes equal to the number of hardware threads",
                 "on \"node1\".",
                 "When PRRTE applications are invoked in an environment managed by a",
                 "resource manager (e.g., inside of a Slurm job), and PRRTE was built",
                 "with appropriate support for that resource manager, then PRRTE will be",
                 "informed of the number of slots for each node by the resource manager.",
                 "For example:",
                 "   shell$ prun ./a.out",
                 "launches one process for every slot (on every node) as dictated by the",
                 "resource manager job specification.",
                 "Also note that the one-process-per-slot restriction can be overridden",
                 "in unmanaged environments (e.g., when using hostfiles without a",
                 "resource manager) if oversubscription is enabled (by default, it is",
                 "disabled).  Most parallel applications and HPC environments do not",
                 "oversubscribe; for simplicity, the majority of this documentation",
                 "assumes that oversubscription is not enabled.",
                 "Slots are not hardware resources",
                 "================================",
                 "Slots are frequently incorrectly conflated with hardware resources. It",
                 "is important to realize that slots are an entirely different metric",
                 "than the number (and type) of hardware resources available.",
                 "Here are some examples that may help illustrate the difference:",
                 "1. More processor cores than slots: Consider a resource manager job",
                 "   environment that tells PRRTE that there is a single node with 20",
                 "   processor cores and 2 slots available.  By default, PRRTE will only",
                 "   let you run up to 2 processes.",
                 "   Meaning: you run out of slots long before you run out of processor",
                 "   cores.",
                 "2. More slots than processor cores: Consider a hostfile with a single",
                 "   node listed with a \"slots=50\" qualification.  The node has 20",
                 "   processor cores.  By default, PRRTE will let you run up to 50",
                 "   processes.",
                 "   Meaning: you can run many more processes than you have processor",
                 "   cores.",
                 "Definition of \"processor element\"",
                 "---------------------------------",
                 "By default, PRRTE defines that a \"processing element\" is a processor",
                 "core.  However, if \"--use-hwthread-cpus\" is specified on the command",
                 "line, then a \"processing element\" is a hardware thread.",
                 NULL}
    },

    { .topic = "placement-examples",
      .content = (const char *[]){
                 "Examples",
                 "--------",
                 "Listed here are the subset of command line options that will be used",
                 "in the process mapping/ranking/binding examples below.",
                 "Specifying Host Nodes",
                 "=====================",
                 "Use one of the following options to specify which hosts (nodes) within",
                 "the PRRTE DVM environment to run on.",
                 "   --host <host1,host2,...,hostN>",
                 "   # or",
                 "   --host <host1:X,host2:Y,...,hostN:Z>",
                 "* List of hosts on which to invoke processes. After each hostname a",
                 "  colon (\":\") followed by a positive integer can be used to specify",
                 "  the number of slots on that host (\":X\", \":Y\", and \":Z\"). The default",
                 "  is \"1\".",
                 "   --hostfile <hostfile>",
                 "* Provide a hostfile to use.",
                 "Process Mapping / Ranking / Binding Options",
                 "===========================================",
                 "* \"-c #\", \"-n #\", \"--n #\", \"--np <#>\": Run this many copies of the",
                 "  program on the given nodes. This option indicates that the specified",
                 "  file is an executable program and not an application context. If no",
                 "  value is provided for the number of copies to execute (i.e., neither",
                 "  the \"-np\" nor its synonyms are provided on the command line), \"prun\"",
                 "  will automatically execute a copy of the program on each process",
                 "  slot (see below for description of a \"process slot\"). This feature,",
                 "  however, can only be used in the SPMD model and will return an error",
                 "  (without beginning execution of the application) otherwise.",
                 "  Note:",
                 "    These options specify the number of processes to launch. None of",
                 "    the options imply a particular binding policy — e.g., requesting",
                 "    \"N\" processes for each package does not imply that the processes",
                 "    will be bound to the package.",
                 "* \"--map-by <object>\": Map to the specified object. Supported objects",
                 "  include:",
                 "  * \"slot\"",
                 "  * \"hwthread\"",
                 "  * \"core\" (default)",
                 "  * \"l1cache\"",
                 "  * \"l2cache\"",
                 "  * \"l3cache\"",
                 "  * \"numa\"",
                 "  * \"package\"",
                 "  * \"node\"",
                 "  * \"seq\"",
                 "  * \"ppr\"",
                 "  * \"rankfile\"",
                 "  * \"pe-list\"",
                 "  Any object can include qualifiers by adding a colon (\":\") and any",
                 "  colon-delimited combination of one or more of the following to the \"",
                 "  --map-by\" options:",
                 "  * \"PE=n\" bind \"n\" processing elements to each process (can not be",
                 "    used in combination with rankfile or pe-list directives)",
                 "    Error:",
                 "      JMS Several of the options below refer to \"pe-list\". Is this",
                 "      option supposed to be \"PE-LIST=n\", not \"PE=n\"?",
                 "  * \"SPAN\" load balance the processes across the allocation (cannot be",
                 "    used in combination with \"slot\", \"node\", \"seq\", \"ppr\", \"rankfile\",",
                 "    or \"pe-list\" directives)",
                 "  * \"OVERSUBSCRIBE\" allow more processes on a node than processing",
                 "    elements",
                 "  * \"NOOVERSUBSCRIBE\" means \"!OVERSUBSCRIBE\"",
                 "  * \"NOLOCAL\" do not launch processes on the same node as \"prun\"",
                 "  * \"HWTCPUS\" use hardware threads as CPU slots",
                 "  * \"CORECPUS\" use cores as CPU slots (default)",
                 "  * \"INHERIT\" indicates that a child job (i.e., one spawned from",
                 "    within an application) shall inherit the placement policies of the",
                 "    parent job that spawned it.",
                 "  * \"NOINHERIT\" means \"!INHERIT\"",
                 "  * \"FILE=<path>\" (path to file containing sequential or rankfile",
                 "    entries).",
                 "  * \"ORDERED\" only applies to the PE-LIST option to indicate that",
                 "    procs are to be bound to each of the specified CPUs in the order",
                 "    in which they are assigned (i.e., the first proc on a node shall",
                 "    be bound to the first CPU in the list, the second proc shall be",
                 "    bound to the second CPU, etc.)",
                 "  \"ppr\" policy example: \"--map-by ppr:N:<object>\" will launch \"N\"",
                 "  times the number of objects of the specified type on each node.",
                 "  Note:",
                 "    Directives and qualifiers are case-insensitive and can be",
                 "    shortened to the minimum number of characters to uniquely identify",
                 "    them. Thus, \"L1CACHE\" can be given as \"l1cache\" or simply as \"L1\".",
                 "* \"--rank-by <object>\": This assigns ranks in round-robin fashion",
                 "  according to the specified object. The default follows the mapping",
                 "  pattern. Supported rank-by objects include:",
                 "  * \"slot\"",
                 "  * \"node\"",
                 "  * \"fill\"",
                 "  * \"span\"",
                 "  There are no qualifiers for the \"--rank-by\" directive.",
                 "* \"--bind-to <object>\": This binds processes to the specified object.",
                 "  See defaults in Quick Summary.  Supported bind-to objects include:",
                 "  * \"none\"",
                 "  * \"hwthread\"",
                 "  * \"core\"",
                 "  * \"l1cache\"",
                 "  * \"l2cache\"",
                 "  * \"l3cache\"",
                 "  * \"numa\"",
                 "  * \"package\"",
                 "  Any object can include qualifiers by adding a colon (\":\") and any",
                 "  colon-delimited combination of one or more of the following to the \"",
                 "  --bind-to\" options:",
                 "  * \"overload-allowed\" allows for binding more than one process in",
                 "    relation to a CPU",
                 "  * \"if-supported\" if binding to that object is supported on this",
                 "    system.",
                 "Specifying Host Nodes",
                 "=====================",
                 "Host nodes can be identified on the command line with the \"--host\"",
                 "option or in a hostfile.",
                 "For example, assuming no other resource manager or scheduler is",
                 "involved:",
                 "   prun --host aa,aa,bb ./a.out",
                 "This launches two processes on node \"aa\" and one on \"bb\".",
                 "   prun --host aa ./a.out",
                 "This launches one process on node \"aa\".",
                 "   prun --host aa:5 ./a.out",
                 "This launches five processes on node \"aa\".",
                 "Or, consider the hostfile:",
                 "   $ cat myhostfile",
                 "   aa slots=2",
                 "   bb slots=2",
                 "   cc slots=2",
                 "Here, we list both the host names (\"aa\", \"bb\", and \"cc\") but also how",
                 "many \"slots\" there are for each. Slots indicate how many processes can",
                 "potentially execute on a node. For best performance, the number of",
                 "slots may be chosen to be the number of cores on the node or the",
                 "number of processor sockets.",
                 "If the hostfile does not provide slots information, the PRRTE DVM will",
                 "attempt to discover the number of cores (or hwthreads, if the",
                 "\":HWTCPUS\" qualifier to the \"--map-by\" option is set) and set the",
                 "number of slots to that value.",
                 "Examples using the hostfile above with and without the \"--host\"",
                 "option:",
                 "   prun --hostfile myhostfile ./a.out",
                 "This will launch two processes on each of the three nodes.",
                 "   prun --hostfile myhostfile --host aa ./a.out",
                 "This will launch two processes, both on node \"aa\".",
                 "   prun --hostfile myhostfile --host dd ./a.out",
                 "This will find no hosts to run on and abort with an error. That is,",
                 "the specified host \"dd\" is not in the specified hostfile.",
                 "When running under resource managers (e.g., SLURM, Torque, etc.), PRTE",
                 "will obtain both the hostnames and the number of slots directly from",
                 "the resource manger. The behavior of \"--host\" in that environment will",
                 "behave the same as if a hostfile was provided (since it is provided by",
                 "the resource manager).",
                 "Specifying Number of Processes",
                 "==============================",
                 "As we have just seen, the number of processes to run can be set using",
                 "the hostfile. Other mechanisms exist.",
                 "The number of processes launched can be specified as a multiple of the",
                 "number of nodes or processor sockets available. Consider the hostfile",
                 "below for the examples that follow.",
                 "   $ cat myhostfile",
                 "   aa",
                 "   bb",
                 "For example:",
                 "   prun --hostfile myhostfile --map-by ppr:2:package ./a.out",
                 "This launches processes 0-3 on node \"aa\" and process 4-7 on node \"bb\",",
                 "where \"aa\" and \"bb\" are both dual-package nodes. The \"--map-by",
                 "ppr:2:package\" option also turns on the \"--bind-to package\" option,",
                 "which is discussed in a later section.",
                 "   prun --hostfile myhostfile --map-by ppr:2:node ./a.out",
                 "This launches processes 0-1 on node \"aa\" and processes 2-3 on node",
                 "\"bb\".",
                 "   prun --hostfile myhostfile --map-by ppr:1:node ./a.out",
                 "This launches one process per host node.",
                 "Another alternative is to specify the number of processes with the \"--",
                 "np\" option. Consider now the hostfile:",
                 "   $ cat myhostfile",
                 "   aa slots=4",
                 "   bb slots=4",
                 "   cc slots=4",
                 "With this hostfile:",
                 "   prun --hostfile myhostfile --np 6 ./a.out",
                 "This will launch processes 0-3 on node \"aa\" and processes 4-5 on node",
                 "\"bb\".  The remaining slots in the hostfile will not be used since the",
                 "\"-np\" option indicated that only 6 processes should be launched.",
                 "Mapping Processes to Nodes Using Policies",
                 "=========================================",
                 "The examples above illustrate the default mapping of process processes",
                 "to nodes. This mapping can also be controlled with various \"prun\" /",
                 "\"prterun\" options that describe mapping policies.",
                 "   $ cat myhostfile",
                 "   aa slots=4",
                 "   bb slots=4",
                 "   cc slots=4",
                 "Consider the hostfile above, with \"--np 6\":",
                 "+---------------------------+---------------------------+---------------------------+---------------------------+",
                 "| Command                   | Ranks on \"aa\"             | Ranks on \"bb\"             | Ranks on \"cc\"             |",
                 "|===========================|===========================|===========================|===========================|",
                 "| \"prun\"                    | 0 1 2 3                   | 4 5                       |                           |",
                 "+---------------------------+---------------------------+---------------------------+---------------------------+",
                 "| \"prun --map-by node\"      | 0 3                       | 1 4                       | 2 5                       |",
                 "+---------------------------+---------------------------+---------------------------+---------------------------+",
                 "| \"prun --map-by            |                           | 0 2 4                     | 1 3 5                     |",
                 "| node:NOLOCAL\"             |                           |                           |                           |",
                 "+---------------------------+---------------------------+---------------------------+---------------------------+",
                 "The \"--map-by node\" option will load balance the processes across the",
                 "available nodes, numbering each process by node in a round-robin",
                 "fashion.",
                 "The \":NOLOCAL\" qualifier to \"--map-by\" prevents any processes from",
                 "being mapped onto the local host (in this case node \"aa\"). While",
                 "\"prun\" typically consumes few system resources, the \":NOLOCAL\"",
                 "qualifier can be helpful for launching very large jobs where \"prun\"",
                 "may actually need to use noticeable amounts of memory and/or",
                 "processing time.",
                 "Just as \"--np\" can specify fewer processes than there are slots, it",
                 "can also oversubscribe the slots. For example, with the same hostfile:",
                 "   prun --hostfile myhostfile --np 14 ./a.out",
                 "This will produce an error since the default \":NOOVERSUBSCRIBE\"",
                 "qualifier to \"--map-by\" prevents oversubscription.",
                 "To oversubscribe the nodes you can use the \":OVERSUBSCRIBE\" qualifier",
                 "to \"--map-by\":",
                 "   prun --hostfile myhostfile --np 14 --map-by :OVERSUBSCRIBE ./a.out",
                 "This will launch processes 0-5 on node \"aa\", 6-9 on \"bb\", and 10-13 on",
                 "\"cc\".",
                 "Limits to oversubscription can also be specified in the hostfile",
                 "itself with the \"max_slots\" field:",
                 "   $ cat myhostfile",
                 "   aa slots=4 max_slots=4",
                 "   bb         max_slots=8",
                 "   cc slots=4",
                 "The \"max_slots\" field specifies such a limit. When it does, the",
                 "\"slots\" value defaults to the limit. Now:",
                 "   prun --hostfile myhostfile --np 14 --map-by :OVERSUBSCRIBE ./a.out",
                 "This causes the first 12 processes to be launched as before, but the",
                 "remaining two processes will be forced onto node cc. The other two",
                 "nodes are protected by the hostfile against oversubscription by this",
                 "job.",
                 "Using the \":NOOVERSUBSCRIBE\" qualifier to \"--map-by\" option can be",
                 "helpful since the PRTE DVM currently does not get \"max_slots\" values",
                 "from the resource manager.",
                 "Of course, \"--np\" can also be used with the \"--host\" option. For",
                 "example,",
                 "   prun --host aa,bb --np 8 ./a.out",
                 "This will produce an error since the default \":NOOVERSUBSCRIBE\"",
                 "qualifier to \"--map-by\" prevents oversubscription.",
                 "   prun --host aa,bb --np 8 --map-by :OVERSUBSCRIBE ./a.out",
                 "This launches 8 processes. Since only two hosts are specified, after",
                 "the first two processes are mapped, one to \"aa\" and one to \"bb\", the",
                 "remaining processes oversubscribe the specified hosts evenly.",
                 "   prun --host aa:2,bb:6 --np 8 ./a.out",
                 "This launches 8 processes. Processes 0-1 on node \"aa\" since it has 2",
                 "slots and processes 2-7 on node \"bb\" since it has 6 slots.",
                 "And here is a MIMD example:",
                 "   prun --host aa --np 1 hostname : --host bb,cc --np 2 uptime",
                 "This will launch process 0 running \"hostname\" on node \"aa\" and",
                 "processes 1 and 2 each running \"uptime\" on nodes \"bb\" and \"cc\",",
                 "respectively.",
                 NULL}
    },

    { .topic = "placement-rankfiles",
      .content = (const char *[]){
                 "Rankfiles",
                 "---------",
                 "Another way to specify arbitrary mappings is with a rankfile, which",
                 "gives you detailed control over process binding as well.",
                 "Rankfiles are text files that specify detailed information about how",
                 "individual processes should be mapped to nodes, and to which",
                 "processor(s) they should be bound. Each line of a rankfile specifies",
                 "the location of one process. The general form of each line in the",
                 "rankfile is:",
                 "   rank <N>=<hostname> slot=<slot list>",
                 "For example:",
                 "   $ cat myrankfile",
                 "   rank 0=aa slot=10-12",
                 "   rank 1=bb slot=0,1,4",
                 "   rank 2=cc slot=1-2",
                 "   $ prun --host aa,bb,cc,dd --map-by rankfile:FILE=myrankfile ./a.out",
                 "Means that:",
                 "* Rank 0 runs on node aa, bound to logical cores 10-12.",
                 "* Rank 1 runs on node bb, bound to logical cores 0, 1, and 4.",
                 "* Rank 2 runs on node cc, bound to logical cores 1 and 2.",
                 "Similarly:",
                 "   $ cat myrankfile",
                 "   rank 0=aa slot=1:0-2",
                 "   rank 1=bb slot=0:0,1,4",
                 "   rank 2=cc slot=1-2",
                 "   $ prun --host aa,bb,cc,dd --map-by rankfile:FILE=myrankfile ./a.out",
                 "Means that:",
                 "* Rank 0 runs on node aa, bound to logical package 1, cores 10-12 (the",
                 "  0th through 2nd cores on that package).",
                 "* Rank 1 runs on node bb, bound to logical package 0, cores 0, 1, and",
                 "  4.",
                 "* Rank 2 runs on node cc, bound to logical cores 1 and 2.",
                 "The hostnames listed above are \"absolute,\" meaning that actual",
                 "resolvable hostnames are specified. However, hostnames can also be",
                 "specified as \"relative,\" meaning that they are specified in relation",
                 "to an externally-specified list of hostnames (e.g., by \"prun\"'s \"--",
                 "host\" argument, a hostfile, or a job scheduler).",
                 "The \"relative\" specification is of the form \"\"+n<X>\"\", where \"X\" is an",
                 "integer specifying the Xth hostname in the set of all available",
                 "hostnames, indexed from 0. For example:",
                 "   $ cat myrankfile",
                 "   rank 0=+n0 slot=10-12",
                 "   rank 1=+n1 slot=0,1,4",
                 "   rank 2=+n2 slot=1-2",
                 "   $ prun --host aa,bb,cc,dd --map-by rankfile:FILE=myrankfile ./a.out",
                 "All package/core slot locations are be specified as *logical* indexes.",
                 "You can use tools such as HWLOC's \"lstopo\" to find the logical indexes",
                 "of packages and cores.",
                 NULL}
    },

    { .topic = "placement-deprecated",
      .content = (const char *[]){
                 "Deprecated options",
                 "------------------",
                 "These deprecated options will be removed in a future release.",
                 "+----------------------+----------------------+--------------------------------+",
                 "| Deprecated Option    | Replacement          | Description                    |",
                 "|======================|======================|================================|",
                 "| \"--bind-to-core\"     | \"--bind-to core\"     | Bind processes to cores        |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--bind-to-socket\"   | \"--bind-to package\"  | Bind processes to processor    |",
                 "|                      |                      | sockets                        |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--bycore\"           | \"--map-by core\"      | Map processes by core          |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--bynode\"           | \"--map-by node\"      | Launch processes one per node, |",
                 "|                      |                      | cycling by node in a round-    |",
                 "|                      |                      | robin fashion. This spreads    |",
                 "|                      |                      | processes evenly among nodes   |",
                 "|                      |                      | and assigns ranks in a round-  |",
                 "|                      |                      | robin, \"by node\" manner.       |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--byslot\"           | \"--map-by slot\"      | Map and rank processes round-  |",
                 "|                      |                      | robin by slot                  |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--cpus-per-proc     | *--map-by <obj>:PE=  | Bind each process to the       |",
                 "| <#perproc>\"          | <#perproc>`*         | specified number of CPUs       |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--cpus-per-rank     | \"--map-by            | Alias for \"--cpus-per-proc\"    |",
                 "| <#perrank>\"          | <obj>:PE=<#perrank>\" |                                |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--display-          | \"--display ALLOC\"    | Display the detected resource  |",
                 "| allocation\"          |                      | allocation                     |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"-display-devel-map\" | \"--display MAP-      | Display a detailed process map |",
                 "|                      | DEVEL\"               | (mostly intended for           |",
                 "|                      |                      | developers) just before        |",
                 "|                      |                      | launch.                        |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--display-map\"      | \"--display MAP\"      | Display a table showing the    |",
                 "|                      |                      | mapped location of each        |",
                 "|                      |                      | process prior to launch.       |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--display-topo\"     | \"--display TOPO\"     | Display the topology as part   |",
                 "|                      |                      | of the process map (mostly     |",
                 "|                      |                      | intended for developers) just  |",
                 "|                      |                      | before launch.                 |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--do-not-launch\"    | \"--map-by            | Perform all necessary          |",
                 "|                      | :DONOTLAUNCH\"        | operations to prepare to       |",
                 "|                      |                      | launch the application, but do |",
                 "|                      |                      | not actually launch it         |",
                 "|                      |                      | (usually used to test mapping  |",
                 "|                      |                      | patterns).                     |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--do-not-resolve\"   | \"--map-by            | Do not attempt to resolve      |",
                 "|                      | :DONOTRESOLVE\"       | interfaces — usually used to   |",
                 "|                      |                      | determine proposed process     |",
                 "|                      |                      | placement/binding prior to     |",
                 "|                      |                      | obtaining an allocation.       |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"-N <num>\"           | \"--map-by            | Launch \"num\" processes per     |",
                 "|                      | prr:<num>:node\"      | node on all allocated nodes    |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--nolocal\"          | \"--map-by :NOLOCAL\"  | Do not run any copies of the   |",
                 "|                      |                      | launched application on the    |",
                 "|                      |                      | same node as \"prun\" is         |",
                 "|                      |                      | running. This option will      |",
                 "|                      |                      | override listing the           |",
                 "|                      |                      | \"localhost\" with \"--host\" or   |",
                 "|                      |                      | any other host-specifying      |",
                 "|                      |                      | mechanism.                     |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--nooversubscribe\"  | \"--map-by            | Do not oversubscribe any       |",
                 "|                      | :NOOVERSUBSCRIBE\"    | nodes; error (without starting |",
                 "|                      |                      | any processes) if the          |",
                 "|                      |                      | requested number of processes  |",
                 "|                      |                      | would cause oversubscription.  |",
                 "|                      |                      | This option implicitly sets    |",
                 "|                      |                      | \"max_slots\" equal to the       |",
                 "|                      |                      | \"slots\" value for each node.   |",
                 "|                      |                      | (Enabled by default).          |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--npernode          | \"--map-by            | On each node, launch this many |",
                 "| <#pernode>\"          | ppr:<#pernode>:node\" | processes                      |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--npersocket        | \"--map-by ppr:<#per  | On each node, launch this many |",
                 "| <#persocket>\"        | package>:package\"    | processes times the number of  |",
                 "|                      |                      | processor sockets on the node. |",
                 "|                      |                      | The \"--npersocket\" option also |",
                 "|                      |                      | turns on the \"-- bind-to       |",
                 "|                      |                      | socket\" option. The term       |",
                 "|                      |                      | \"socket\" has been globally     |",
                 "|                      |                      | replaced with \"package\".       |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--oversubscribe\"    | \"--map-by            | Nodes are allowed to be        |",
                 "|                      | :OVERSUBSCRIBE\"      | oversubscribed, even on a      |",
                 "|                      |                      | managed system, and            |",
                 "|                      |                      | overloading of processing      |",
                 "|                      |                      | elements.                      |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--pernode\"          | \"--map-by            | On each node, launch one       |",
                 "|                      | ppr:1:node\"          | process                        |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--ppr\"              | *--map-by            | Comma-separated list of number |",
                 "|                      | ppr:<list>`*         | of processes on a given        |",
                 "|                      |                      | resource type [default:        |",
                 "|                      |                      | \"none\"].                       |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--rankfile          | \"--map-by rankfile:  | Use a rankfile for             |",
                 "| <FILENAME>\"          | FILE=<FILENAME>\"     | mapping/ranking/binding        |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--report-bindings\"  | \"--display BINDINGS\" | Report any bindings for        |",
                 "|                      |                      | launched processes             |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--tag-output\"       | \"--output TAG\"       | Tag all output with            |",
                 "|                      |                      | \"[job,rank]\"                   |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--timestamp-output\" | \"--output TIMESTAMP\" | Timestamp all application      |",
                 "|                      |                      | process output                 |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--use-hwthread-     | \"--map-by :HWTCPUS\"  | Use hardware threads as        |",
                 "| cpus\"                |                      | independent CPUs               |",
                 "+----------------------+----------------------+--------------------------------+",
                 "| \"--xml\"              | \"--output XML\"       | Provide all output in XML      |",
                 "|                      |                      | format                         |",
                 "+----------------------+----------------------+--------------------------------+",
                 NULL}
    },

    { .topic = "placement-diagnostics",
      .content = (const char *[]){
                 "Diagnostics",
                 "-----------",
                 "PRRTE provides various diagnostic reports that aid the user in",
                 "verifying and tuning the mapping/ranking/binding for a specific job.",
                 "The \":REPORT\" qualifier to the \"--bind-to\" command line option can be",
                 "used to report process bindings.",
                 "As an example, consider a node with:",
                 "* 2 processor packages,",
                 "* 4 cores per package, and",
                 "* 8 hardware threads per core.",
                 "In each of the examples below the binding is reported in a human",
                 "readable format.",
                 "   $ prun --np 4 --map-by core --bind-to core:REPORT ./a.out",
                 "   [node01:103137] MCW rank 0 bound to package[0][core:0]",
                 "   [node01:103137] MCW rank 1 bound to package[0][core:1]",
                 "   [node01:103137] MCW rank 2 bound to package[0][core:2]",
                 "   [node01:103137] MCW rank 3 bound to package[0][core:3]",
                 "In the example above, processes are bound to successive cores on the",
                 "first package.",
                 "   $ prun --np 4 --map-by package --bind-to package:REPORT ./a.out",
                 "   [node01:103115] MCW rank 0 bound to package[0][core:0-9]",
                 "   [node01:103115] MCW rank 1 bound to package[1][core:10-19]",
                 "   [node01:103115] MCW rank 2 bound to package[0][core:0-9]",
                 "   [node01:103115] MCW rank 3 bound to package[1][core:10-19]",
                 "In the example above, processes are bound to all cores on successive",
                 "packages in a round-robin fashion.",
                 "   $ prun --np 4 --map-by package:PE=2 --bind-to core:REPORT ./a.out",
                 "   [node01:103328] MCW rank 0 bound to package[0][core:0-1]",
                 "   [node01:103328] MCW rank 1 bound to package[1][core:10-11]",
                 "   [node01:103328] MCW rank 2 bound to package[0][core:2-3]",
                 "   [node01:103328] MCW rank 3 bound to package[1][core:12-13]",
                 "The example above shows us that 2 cores have been bound per process.",
                 "The \":PE=2\" qualifier states that 2 CPUs underneath the package (which",
                 "would be cores in this case) are mapped to each process.",
                 "   $ prun --np 4 --map-by core:PE=2:HWTCPUS --bind-to :REPORT  hostname",
                 "   [node01:103506] MCW rank 0 bound to package[0][hwt:0-1]",
                 "   [node01:103506] MCW rank 1 bound to package[0][hwt:8-9]",
                 "   [node01:103506] MCW rank 2 bound to package[0][hwt:16-17]",
                 "   [node01:103506] MCW rank 3 bound to package[0][hwt:24-25]",
                 "The example above shows us that 2 hardware threads have been bound per",
                 "process.  In this case \"prun\" is directing the DVM to map by hardware",
                 "threads since we used the \":HWTCPUS\" qualifier. Without that qualifier",
                 "this command would return an error since by default the DVM will not",
                 "map to resources smaller than a core.  The \":PE=2\" qualifier states",
                 "that 2 processing elements underneath the core (which would be",
                 "hardware threads in this case) are mapped to each process.",
                 "   $ prun --np 4 --bind-to none:REPORT  hostname",
                 "   [node01:107126] MCW rank 0 is not bound (or bound to all available processors)",
                 "   [node01:107126] MCW rank 1 is not bound (or bound to all available processors)",
                 "   [node01:107126] MCW rank 2 is not bound (or bound to all available processors)",
                 "   [node01:107126] MCW rank 3 is not bound (or bound to all available processors)",
                 "Binding is turned off in the above example, as reported.",
                 NULL}
    },

    { .topic = "placement-fundamentals",
      .content = (const char *[]){
                 "Fundamentals",
                 "------------",
                 "The mapping of processes to nodes can be defined not just with general",
                 "policies but also, if necessary, using arbitrary mappings that cannot",
                 "be described by a simple policy. Supported directives, given on the",
                 "command line via the \"--map-by\" option, include:",
                 "* \"SEQ\": (often accompanied by the \"file=<path>\" qualifier) assigns",
                 "  one process to each node specified in the file. The sequential file",
                 "  is to contain an entry for each desired process, one per line of the",
                 "  file.",
                 "* \"RANKFILE\": (often accompanied by the \"file=<path>\" qualifier)",
                 "  assigns one process to the node/resource specified in each entry of",
                 "  the file, one per line of the file.",
                 "For example, using the hostfile below:",
                 "   $ cat myhostfile",
                 "   aa slots=4",
                 "   bb slots=4",
                 "   cc slots=4",
                 "The command below will launch three processes, one on each of nodes",
                 "\"aa\", \"bb\", and \"cc\", respectively. The slot counts don't matter; one",
                 "process is launched per line on whatever node is listed on the line.",
                 "   $ prun --hostfile myhostfile --map-by seq ./a.out",
                 "Impact of the ranking option is best illustrated by considering the",
                 "following hostfile and test cases where each node contains two",
                 "packages (each package with two cores). Using the \"--map-by",
                 "ppr:2:package\" option, we map two processes onto each package and",
                 "utilize the \"--rank-by\" option as show below:",
                 "   $ cat myhostfile",
                 "   aa",
                 "   bb",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| Command                           | Ranks on \"aa\"                     | Ranks on \"bb\"                     |",
                 "|===================================|===================================|===================================|",
                 "| \"--rank-by core\"                  | 0 1 ! 2 3                         | 4 5 ! 6 7                         |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"--rank-by package\"               | 0 2 ! 1 3                         | 4 6 ! 5 7                         |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"--rank-by package:SPAN\"          | 0 4 ! 1 5                         | 2 6 ! 3 7                         |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "Ranking by slot provides the identical result as ranking by core in",
                 "this case — a simple progression of ranks across each node. Ranking by",
                 "package does a round-robin ranking across packages within each node",
                 "until all processes have been assigned a rank, and then progresses to",
                 "the next node.  Adding the \":SPAN\" qualifier to the ranking directive",
                 "causes the ranking algorithm to treat the entire allocation as a",
                 "single entity — thus, the process ranks are assigned across all",
                 "packages before circling back around to the beginning.",
                 "The binding operation restricts the process to a subset of the CPU",
                 "resources on the node.",
                 "The processors to be used for binding can be identified in terms of",
                 "topological groupings — e.g., binding to an l3cache will bind each",
                 "process to all processors within the scope of a single L3 cache within",
                 "their assigned location. Thus, if a process is assigned by the mapper",
                 "to a certain package, then a \"--bind-to l3cache\" directive will cause",
                 "the process to be bound to the processors that share a single L3 cache",
                 "within that package.",
                 "To help balance loads, the binding directive uses a round-robin",
                 "method, binding a process to the first available specified object type",
                 "within the object where the process was mapped. For example, consider",
                 "the case where a job is mapped to the package level, and then bound to",
                 "core. Each package will have multiple cores, so if multiple processes",
                 "are mapped to a given package, the binding algorithm will assign each",
                 "process located to a package to a unique core in a round-robin manner.",
                 "Binding can only be done to the mapped object or to a resource located",
                 "within that object.",
                 "An object is considered completely consumed when the number of",
                 "processes bound to it equals the number of CPUs within it. Unbound",
                 "processes are not considered in this computation. Additional processes",
                 "cannot be mapped to consumed objects unless the OVERLOAD qualifier is",
                 "provided via the \"--bind-to\" command line option.",
                 "Default process mapping/ranking/binding policies can also be set with",
                 "MCA parameters, overridden by the command line options when provided.",
                 "MCA parameters can be set on the \"prte\" command line when starting the",
                 "DVM (or in the \"prterun\" command line for a single-execution job), but",
                 "also in a system or user \"mca-params.conf\" file or as environment",
                 "variables, as described in the MCA section below. Some examples",
                 "include:",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"prun\" option                     | MCA parameter key                 | Value                             |",
                 "|===================================|===================================|===================================|",
                 "| \"--map-by core\"                   | \"rmaps_default_mapping_policy\"    | \"core\"                            |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"--map-by package\"                | \"rmaps_default_mapping_policy\"    | \"package\"                         |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"--rank-by core\"                  | \"rmaps_default_ranking_policy\"    | \"core\"                            |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"--bind-to core\"                  | \"hwloc_default_binding_policy\"    | \"core`\"                           |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"--bind-to package\"               | \"hwloc_default_binding_policy\"    | \"package\"                         |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 "| \"--bind-to none\"                  | \"hwloc_default_binding_policy\"    | \"none\"                            |",
                 "+-----------------------------------+-----------------------------------+-----------------------------------+",
                 NULL}
    },

    { .topic = "placement-limits",
      .content = (const char *[]){
                 "Overloading and Oversubscribing",
                 "-------------------------------",
                 "This section explores the difference between the terms \"overloading\"",
                 "and \"oversubscribing\". Users are often confused by the difference",
                 "between these two scenarios. As such, this section provides a number",
                 "of scenarios to help illustrate the differences.",
                 "* \"--map-by :OVERSUBSCRIBE\" allow more processes on a node than",
                 "  allocated",
                 "* \"--bind-to <object>:overload-allowed\" allows for binding more than",
                 "  one process in relation to a CPU",
                 "The important thing to remember with *oversubscribing* is that it can",
                 "be defined separately from the actual number of CPUs on a node. This",
                 "allows the mapper to place more or fewer processes per node than CPUs.",
                 "By default, PRRTE uses cores to determine slots in the absence of such",
                 "information provided in the hostfile or by the resource manager",
                 "(except in the case of the \"--host\" as described in the section on",
                 "that command line option.",
                 "The important thing to remember with *overloading* is that it is",
                 "defined as binding more processes than CPUs. By default, PRRTE uses",
                 "cores as a means of counting the number of CPUs. However, the user can",
                 "adjust this. For example when using the \":HWTCPUS\" qualifier to the \"",
                 "--map-by\" option PRRTE will use hardware threads as a means of",
                 "counting the number of CPUs.",
                 "For the following examples consider a node with:",
                 "* 2 processor packages,",
                 "* 10 cores per package, and",
                 "* 8 hardware threads per core.",
                 "Consider the node from above with the hostfile below:",
                 "   $ cat myhostfile",
                 "   node01 slots=32",
                 "   node02 slots=32",
                 "The \"slots\" token tells PRRTE that it can place up to 32 processes",
                 "before *oversubscribing* the node.",
                 "If we run the following:",
                 "   prun --np 34 --hostfile myhostfile --map-by core",
                 "       --bind-to core hostname",
                 "It will return an error at the binding time indicating an",
                 "*overloading* scenario.",
                 "The mapping mechanism assigns 32 processes to \"node01\" matching the",
                 "\"slots\" specification in the hostfile. The binding mechanism will bind",
                 "the first 20 processes to unique cores leaving it with 12 processes",
                 "that it cannot bind without overloading one of the cores (putting more",
                 "than one process on the core).",
                 "Using the \"overload-allowed\" qualifier to the \"--bind-to core\" option",
                 "tells PRRTE that it may assign more than one process to a core.",
                 "If we run the following:",
                 "   prun --np 34 --hostfile myhostfile --map-by core",
                 "       --bind-to core:overload-allowed hostname",
                 "This will run correctly placing 32 processes on \"node01\", and 2",
                 "processes on \"node02\". On \"node01\" two processes are bound to cores",
                 "0-11 accounting for the overloading of those cores.",
                 "Alternatively, we could use hardware threads to give binding a lower",
                 "level CPU to bind to without overloading.",
                 "If we run the following:",
                 "   prun --np 34 --hostfile myhostfile --map-by core:HWTCPUS",
                 "       --bind-to hwthread hostname",
                 "This will run correctly placing 32 processes on \"node01\", and 2",
                 "processes on \"node02\". On \"node01\" two processes are mapped to cores",
                 "0-11 but bound to different hardware threads on those cores (the",
                 "logical first and second hardware thread). Thus no hardware threads",
                 "are overloaded at binding time.",
                 "In both of the examples above the node is not oversubscribed at",
                 "mapping time because the hostfile set the oversubscription limit to",
                 "\"slots=32\" for each node. It is only after we exceed that limit that",
                 "PRRTE will throw an oversubscription error.",
                 "Consider next if we ran the following:",
                 "   prun --np 66 --hostfile myhostfile",
                 "       --map-by core:HWTCPUS --bind-to hwthread hostname",
                 "This will return an error at mapping time indicating an",
                 "oversubscription scenario. The mapping mechanism will assign all of",
                 "the available slots (64 across 2 nodes) and be left two processes to",
                 "map. The only way to map those processes is to exceed the number of",
                 "available slots putting the job into an oversubscription scenario.",
                 "You can force PRRTE to oversubscribe the nodes by using the",
                 "\":OVERSUBSCRIBE\" qualifier to the \"--map-by\" option as seen in the",
                 "example below:",
                 "   prun --np 66 --hostfile myhostfile",
                 "       --map-by core:HWTCPUS:OVERSUBSCRIBE --bind-to hwthread hostname",
                 "This will run correctly placing 34 processes on \"node01\" and 32 on",
                 "\"node02\".  Each process is bound to a unique hardware thread.",
                 "Overloading vs. Oversubscription: Package Example",
                 "=================================================",
                 "Let's extend these examples by considering the package level. Consider",
                 "the same node as before, but with the hostfile below:",
                 "   $ cat myhostfile",
                 "   node01 slots=22",
                 "   node02 slots=22",
                 "The lowest level CPUs are \"cores\" and we have 20 total (10 per",
                 "package).",
                 "If we run:",
                 "   prun --np 20 --hostfile myhostfile --map-by package",
                 "       --bind-to package:REPORT hostname",
                 "Then 10 processes are mapped to each package, and bound at the package",
                 "level.  This is not overloading since we have 10 CPUs (cores)",
                 "available in the package at the hardware level.",
                 "However, if we run:",
                 "   prun --np 21 --hostfile myhostfile --map-by package",
                 "       --bind-to package:REPORT hostname",
                 "Then 11 processes are mapped to the first package and 10 to the second",
                 "package.  At binding time we have an overloading scenario because",
                 "there are only 10 CPUs (cores) available in the package at the",
                 "hardware level. So the first package is overloaded.",
                 "Overloading vs. Oversubscription: Hardware Threads Example",
                 "==========================================================",
                 "Similarly, if we consider hardware threads.",
                 "Consider the same node as before, but with the hostfile below:",
                 "   $ cat myhostfile",
                 "   node01 slots=165",
                 "   node02 slots=165",
                 "The lowest level CPUs are \"hwthreads\" (because we are going to use the",
                 "\":HWTCPUS\" qualifier) and we have 160 total (80 per package).",
                 "If we re-run (from the package example) and add the \":HWTCPUS\"",
                 "qualifier:",
                 "   prun --np 21 --hostfile myhostfile --map-by package:HWTCPUS",
                 "       --bind-to package:REPORT hostname",
                 "Without the \":HWTCPUS\" qualifier this would be overloading (as we saw",
                 "previously). The mapper places 11 processes on the first package and",
                 "10 to the second package. The processes are still bound to the package",
                 "level. However, with the \":HWTCPUS\" qualifier, it is not overloading",
                 "since we have 80 CPUs (hwthreads) available in the package at the",
                 "hardware level.",
                 "Alternatively, if we run:",
                 "   prun --np 161 --hostfile myhostfile --map-by package:HWTCPUS",
                 "       --bind-to package:REPORT hostname",
                 "Then 81 processes are mapped to the first package and 80 to the second",
                 "package.  At binding time we have an overloading scenario because",
                 "there are only 80 CPUs (hwthreads) available in the package at the",
                 "hardware level.  So the first package is overloaded.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_27[] = {
    { .topic = "version",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "%s",
                 NULL}
    },

    { .topic = "usage",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Usage: %s [OPTION]...",
                 "Submit job to the PMIx Reference RTE",
                 "The following list of command line options are available. Note that",
                 "more detailed help for any option can be obtained by adding that",
                 "option to the help request as \"--help <option>\".",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | General Options                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"-h\" | \"--help\"      | This help message                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-h\" | \"--help       | Help for the specified option                 |",
                 "| <arg0>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-v\" | \"--verbose\"   | Enable typical debug options                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-V\" | \"--version\"   | Print version and exit                        |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Debug Options                                 |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--display <arg0>\"   | Comma-delimited list of options for           |",
                 "|                      | displaying information about the allocation   |",
                 "|                      | and job. Allowed values: \"allocation\",        |",
                 "|                      | \"bind\", \"map\", \"map- devel\", \"topo\".          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--timeout           | Timeout the job after the specified number of |",
                 "| <seconds>\"           | seconds                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--spawn-timeout     | Timeout the job if spawn takes more than the  |",
                 "| <seconds>\"           | specified number of seconds                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--get-stack-traces\" | Get stack traces of all application procs on  |",
                 "|                      | timeout                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-state-on-  | Report all job and process states upon        |",
                 "| timeout\"             | timeout                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--stop-on-exec\"     | If supported, stop each specified process at  |",
                 "|                      | start of execution                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--stop-in-init\"     | Direct the specified processes to stop in     |",
                 "|                      | \"PMIx_Init\"                                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--stop-in-app\"      | Direct the specified processes to stop at an  |",
                 "|                      | application-controlled location               |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Output Options                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--output <args>\"    | Comma-delimited list of options that control  |",
                 "|                      | how output is generated. Allowed values:      |",
                 "|                      | \"tag\", \"tag-detailed\", \"tag-fullname\",        |",
                 "|                      | \"timestamp\", \"xml\", \"merge-stderr-to-stdout\", |",
                 "|                      | \"dir=DIRNAME\", \"file=filename\". The \"dir\"     |",
                 "|                      | option redirects output from application      |",
                 "|                      | processes into                                |",
                 "|                      | \"DIRNAME/job/rank/std[out,err,diag]\". The     |",
                 "|                      | file option redirects output from application |",
                 "|                      | processes into \"filename.rank\". In both       |",
                 "|                      | cases, the provided name will be converted to |",
                 "|                      | an absolute path.  Supported qualifiers       |",
                 "|                      | include \"NOCOPY\" (do not copy the output to   |",
                 "|                      | the stdout/stderr streams).                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-child-     | Return the exit status of the primary job     |",
                 "| jobs-separately\"     | only                                          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--xterm <ranks>\"    | Create a new xterm window and display output  |",
                 "|                      | from the specified ranks there                |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Input Options                                 |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--stdin <ranks>\"    | Specify procs to receive stdin [\"rank\",       |",
                 "|                      | \"all\", \"none`, or comma- delimited list of    |",
                 "|                      | integers] (default: ``0\", indicating rank 0)  |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Placement Options                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--map-by <type>\"    | Mapping Policy for job                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--rank-by <type>\"   | Ranking Policy for job                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--bind-to <type>\"   | Binding policy for job                        |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Launch Options                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--runtime-options   | Comma-delimited list of runtime directives    |",
                 "| <arg0>\"              | for the job (e.g., do not abort if a process  |",
                 "|                      | exits on non-zero status)                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-c\" | \"--np         | Number of processes to run                    |",
                 "| <num_procs>\"         |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-n\" | \"--n          | Number of processes to run                    |",
                 "| <num_procs>\"         |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-N <num_procs>\"     | Number of processes to run per node           |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--app <filename>\"   | Provide an appfile; ignore all other command  |",
                 "|                      | line options                                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-H\" | \"--host       | List of hosts to invoke processes on          |",
                 "| <hosts>\"             |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--hostfile          | Provide a hostfile                            |",
                 "| <filename>\"          |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--machinefile       | Provide a hostfile (synonym for \"--hostfile\") |",
                 "| <filename>\"          |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--path <path>\"      | PATH to be used to look for executables to    |",
                 "|                      | start processes                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pmixmca <key>     | Pass context-specific PMIx MCA parameters;    |",
                 "| <value>\"             | they are considered global if only one        |",
                 "|                      | context is specified (\"key\" is the parameter  |",
                 "|                      | name; \"value\" is the parameter value)         |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--gpmixmca <key>    | Pass global PMIx MCA parameters that are      |",
                 "| <value>\"             | applicable to all contexts (\"key\" is the      |",
                 "|                      | parameter name; \"value\" is the parameter      |",
                 "|                      | value)                                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--app-pmix-prefix <dir>\" | Prefix to be used by app procs to look   |",
                 "|                      | for their PMIx installation on remote nodes.  |",
                 "|                      | This is the location of the top-level         |",
                 "|                      | directory for the installation. In the        |",
                 "|                      | absence of providing an application-specific  |",
                 "|                      | prefix, the PMIx prefix (if given) used by    |",
                 "|                      | PRRTE's own executables will be applied       |",
                 "|                      | unless the \"--no-app-prefix\" directive is     |",
                 "|                      | given.                                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--no-app-prefix\"    | Do not provide a prefix directive to this     |",
                 "|                      | application.                                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--tune <filename>\"  | File(s) containing MCA params for tuning      |",
                 "|                      | operations                                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--preload-files     | Preload the comma separated list of files to  |",
                 "| <filenames>\"         | the remote machines current working directory |",
                 "|                      | before starting the remote process.           |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pset <name>\"      | User-specified name assigned to the processes |",
                 "|                      | in their given application                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--rankfile          | Name of file to specify explicit task mapping |",
                 "| <filename>\"          |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-s\" | \"--preload-   | Preload the binary on the remote machine      |",
                 "| binary\"              | before starting the remote process.           |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--set-cwd-to-       | Set the working directory of the started      |",
                 "| session-dir\"         | processes to their session directory          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--show-progress\"    | Output a brief periodic report on launch      |",
                 "|                      | progress                                      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--wd <dir>\"         | Synonym for \"--wdir\"                          |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--wdir <dir>\"       | Set the working directory of the started      |",
                 "|                      | processes                                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-x <name>\"          | Export an environment variable, optionally    |",
                 "|                      | specifying a value (e.g., \"-x foo\" exports    |",
                 "|                      | the environment variable foo and takes its    |",
                 "|                      | value from the current environment; \"-x       |",
                 "|                      | foo=bar\" exports the environment variable     |",
                 "|                      | name foo and sets its value to \"bar\" in the   |",
                 "|                      | started processes; \"-x foo*\" exports all      |",
                 "|                      | current environmental variables starting with |",
                 "|                      | \"foo\")                                        |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--gpu-support <val>\"| Direct application to either enable (true) or |",
                 "|                      | disable (false) its internal library's GPU    |",
                 "|                      | support                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "+----------------------+-----------------------------------------------+",
                 "|                      | Specific Options                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--do-not-connect\"   | Do not connect to a server                    |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--dvm-uri <uri>\"    | Specify the URI of the DVM master, or the     |",
                 "|                      | name of the file (specified as                |",
                 "|                      | \"file:filename\") that contains that info      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--namespace <name>\" | Namespace of the daemon to which we should    |",
                 "|                      | connect                                       |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pid <pid>\"        | PID of the daemon to which we should connect  |",
                 "|                      | (integer PID or \"file:<filename>\" for file    |",
                 "|                      | containing the PID                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--system-server-    | First look for a system server and connect to |",
                 "| first\"               | it if found                                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--system-server-    | Connect only to a system-level server         |",
                 "| only\"                |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--tmpdir <dir>\"     | Set the root for the session directory tree   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--wait-to-connect   | Delay specified number of seconds before      |",
                 "| <seconds>`\"          | trying to connect                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--num-connect-      | Max number of times to try to connect         |",
                 "| retries <num>`\"      |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--personality       | Specify the personality to be used            |",
                 "| <name>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-pid        | Print out PID on stdout (\"-\"), stderr (\"+\"),  |",
                 "| <arg0>\"              | or a file [anything else]                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--report-uri        | Print out URI on stdout (\"-\"), stderr (\"+\"),  |",
                 "| <arg0>\"              | or a file [anything else]                     |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--allow-run-as-     | Allow execution as root (**STRONGLY           |",
                 "| root\"                | DISCOURAGED**)                                |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--forward-signals   | Comma-delimited list of additional signals    |",
                 "| <signals>\"           | (names or integers) to forward to application |",
                 "|                      | processes [\"none\" => forward nothing].        |",
                 "|                      | Signals provided by default include           |",
                 "|                      | \"SIGTSTP\", \"SIGUSR1\", \"SIGUSR2\", \"SIGABRT\",   |",
                 "|                      | \"SIGALRM\", and \"SIGCONT\"                      |",
                 "+----------------------+-----------------------------------------------+",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "dvm-uri",
      .content = (const char *[]){
                 "Specify the URI of the DVM master, or the name of the file (specified",
                 "as \"file:filename\") that contains that info",
                 NULL}
    },

    { .topic = "num-connect-retries",
      .content = (const char *[]){
                 "Max number of times to try to connect to the specified server (int)",
                 NULL}
    },

    { .topic = "pid",
      .content = (const char *[]){
                 "PID of the daemon to which we should connect (integer PID or",
                 "\"file:<filename>\" for file containing the PID",
                 NULL}
    },

    { .topic = "namespace",
      .content = (const char *[]){
                 "Namespace of the daemon we are to connect to (char*)",
                 NULL}
    },

    { .topic = "system-server-first",
      .content = (const char *[]){
                 "First look for a system server and connect to it if found",
                 NULL}
    },

    { .topic = "system-server-only",
      .content = (const char *[]){
                 "Connect only to a system-level server - abort if one is not found",
                 NULL}
    },

    { .topic = "tmpdir",
      .content = (const char *[]){
                 "Define the root location for the PRRTE session directory tree",
                 "See the \"Session directory\" HTML documentation for additional details",
                 "about the PRRTE session directory.",
                 NULL}
    },

    { .topic = "wait-to-connect",
      .content = (const char *[]){
                 "Delay specified number of seconds before trying to connect",
                 NULL}
    },

    { .topic = "hostfile",
      .content = (const char *[]){
                 "PRRTE supports several levels of user-specified hostfiles based on an",
                 "established precedence order. Users can specify a hostfile that",
                 "contains a list of nodes to be used for the job, or can provide a",
                 "comma-delimited list of nodes to be used for that job via the \"--host\"",
                 "command line option.",
                 "The precedence order applied to these various options depends to some",
                 "extent on the local environment. The following table illustrates how",
                 "host and hostfile directives work together to define the set of hosts",
                 "upon which a DVM will execute the job in the absence of a resource",
                 "manager (RM):",
                 "+---------+------------+-----------------------------------------------+",
                 "| host    | hostfile   | Result                                        |",
                 "|=========|============|===============================================|",
                 "| unset   | unset      | The DVM will utilize all its available        |",
                 "|         |            | resources when mapping the job.               |",
                 "+---------+------------+-----------------------------------------------+",
                 "| set     | unset      | Host option defines resource list for the job |",
                 "+---------+------------+-----------------------------------------------+",
                 "| unset   | set        | Hostfile defines resource list for the job    |",
                 "+---------+------------+-----------------------------------------------+",
                 "| set     | set        | Hostfile defines resource list for the job,   |",
                 "|         |            | then host filters the list to define the      |",
                 "|         |            | final set of nodes to be used for the job     |",
                 "+---------+------------+-----------------------------------------------+",
                 "Hostfiles (sometimes called \"machine files\") are a combination of two",
                 "things:",
                 "1. A listing of hosts on which to launch processes.",
                 "2. Optionally, limit the number of processes which can be launched on",
                 "   each host.",
                 "Hostfile syntax consists of one node name on each line, optionally",
                 "including a designated number of \"slots\":",
                 "   # This is a comment line, and will be ignored",
                 "   node01  slots=10",
                 "   node13  slots=5",
                 "   node15",
                 "   node16",
                 "   node17  slots=3",
                 "   ...",
                 "Blank lines and lines beginning with a \"#\" are ignored.",
                 "A \"slot\" is the PRRTE term for an allocatable unit where we can launch",
                 "a process.  See the section on definition of the term \"slot\" for a",
                 "longer description of slots.",
                 "In the absence of the \"slot\" parameter, PRRTE will assign either the",
                 "number of slots to be the number of CPUs detected on the node or the",
                 "resource manager-assigned value if operating in the presence of an RM.",
                 "Important:",
                 "  If using a resource manager, the user-specified number of slots is",
                 "  capped by the RM-assigned value.",
                 "Relative host indexing",
                 "----------------------",
                 "Hostfile and \"--host\" specifications can also be made using relative",
                 "indexing. This allows a user to stipulate which hosts are to be used",
                 "for a given app context without specifying the particular host name,",
                 "but rather its relative position in the allocation.",
                 "This can probably best be understood through consideration of a few",
                 "examples. Consider the case where a DVM is comprised of a set of nodes",
                 "named \"foo1\", \"foo2\", \"foo3\", \"foo4\". The user wants the first app",
                 "context to have exclusive use of the first two nodes, and a second app",
                 "context to use the last two nodes. Of course, the user could printout",
                 "the allocation to find the names of the nodes allocated to them and",
                 "then use \"--host\" to specify this layout, but this is cumbersome and",
                 "would require hand-manipulation for every invocation.",
                 "A simpler method is to utilize PRRTE's relative indexing capability to",
                 "specify the desired layout. In this case, a command line containing:",
                 "   --host +n1,+n2 ./app1 : --host +n3,+n4 ./app2",
                 "would provide the desired pattern. The \"+\" syntax indicates that the",
                 "information is being provided as a relative index into the existing",
                 "allocation. Two methods of relative indexing are supported:",
                 "* \"+n#\": A relative index into the allocation referencing the \"#\"",
                 "  node. PRRTE will substitute the \"#\" node in the allocation",
                 "* \"+e[:#]\": A request for \"#\" empty nodes — i.e., PRRTE is to",
                 "  substitute this reference with nodes that have not yet been used by",
                 "  any other app_context. If the \":#\" is not provided, PRRTE will",
                 "  substitute the reference with all empty nodes. Note that PRRTE does",
                 "  track the empty nodes that have been assigned in this manner, so",
                 "  multiple uses of this option will result in assignment of unique",
                 "  nodes up to the limit of the available empty nodes. Requests for",
                 "  more empty nodes than are available will generate an error.",
                 "Relative indexing can be combined with absolute naming of hosts in any",
                 "arbitrary manner, and can be used in hostfiles as well as with the \"--",
                 "host\" command line option. In addition, any slot specification",
                 "provided in hostfiles will be respected — thus, a user can specify",
                 "that only a certain number of slots from a relative indexed host are",
                 "to be used for a given app context.",
                 "Another example may help illustrate this point. Consider the case",
                 "where the user has a hostfile containing:",
                 "   dummy1 slots=4",
                 "   dummy2 slots=4",
                 "   dummy3 slots=4",
                 "   dummy4 slots=4",
                 "   dummy5 slots=4",
                 "This may, for example, be a hostfile that describes a set of commonly-",
                 "used resources that the user wishes to execute applications against.",
                 "For this particular application, the user plans to map byslot, and",
                 "wants the first two ranks to be on the second node of any allocation,",
                 "the next ranks to land on an empty node, have one rank specifically on",
                 "\"dummy4\", the next rank to be on the second node of the allocation",
                 "again, and finally any remaining ranks to be on whatever empty nodes",
                 "are left. To accomplish this, the user provides a hostfile of:",
                 "   +n2 slots=2",
                 "   +e:1",
                 "   dummy4 slots=1",
                 "   +n2",
                 "   +e",
                 "The user can now use this information in combination with PRRTE's",
                 "sequential mapper to obtain their specific layout:",
                 "   <launcher> --hostfile dummyhosts --hostfile mylayout --map-by seq ./my_app",
                 "which will result in:",
                 "   rank0 being mapped to dummy3",
                 "   rank1 to dummy1 as the first empty node",
                 "   rank2 to dummy4",
                 "   rank3 to dummy3",
                 "   rank4 to dummy2 and rank5 to dummy5 as the last remaining unused nodes",
                 "Note that the sequential mapper ignores the number of slots arguments",
                 "as it only maps one rank at a time to each node in the list.",
                 "If the default round-robin mapper had been used, then the mapping",
                 "would have resulted in:",
                 "* ranks 0 and 1 being mapped to dummy3 since two slots were specified",
                 "* ranks 2-5 on dummy1 as the first empty node, which has four slots",
                 "* rank6 on dummy4 since the hostfile specifies only a single slot from",
                 "  that node is to be used",
                 "* ranks 7 and 8 on dummy3 since only two slots remain available",
                 "* ranks 9-12 on dummy2 since it is the next available empty node and",
                 "  has four slots",
                 "* ranks 13-16 on dummy5 since it is the last remaining unused node and",
                 "  has four slots",
                 "Thus, the use of relative indexing can allow for complex mappings to",
                 "be ported across allocations, including those obtained from automated",
                 "resource managers, without the need for manual manipulation of scripts",
                 "and/or command lines.",
                 "See the \"Host specification\" HTML documentation for details about the",
                 "format and content of hostfiles.",
                 NULL}
    },

    { .topic = "machinefile",
      .content = (const char *[]){
                 "Provide a hostfile.  This option is a synonym for \"--hostfile\"; see",
                 "that option for more information.",
                 NULL}
    },

    { .topic = "host",
      .content = (const char *[]){
                 "Host syntax consists of a comma-delimited list of node names, each",
                 "entry optionally containing a \":N\" extension indicating the number of",
                 "slots to assign to that entry:",
                 "   --host node01:5,node02",
                 "In the absence of the slot extension, one slot will be assigned to the",
                 "node. Duplicate entries are aggregated and the number of slots",
                 "assigned to that node are summed together.",
                 "Note:",
                 "  A \"slot\" is the PRRTE term for an allocatable unit where we can",
                 "  launch a process. Thus, the number of slots equates to the maximum",
                 "  number of processes PRRTE may start on that node without",
                 "  oversubscribing it.",
                 NULL}
    },

    { .topic = "np",
      .content = (const char *[]){
                 "Specify number of application processes to be started",
                 NULL}
    },

    { .topic = "report-pid",
      .content = (const char *[]){
                 "Printout PID on stdout [-], stderr [+], or a file [anything else]",
                 NULL}
    },

    { .topic = "report-uri",
      .content = (const char *[]){
                 "Printout URI on stdout [-], stderr [+], or a file [anything else]",
                 NULL}
    },

    { .topic = "map-by",
      .content = (const char *[]){
                 "Processes are mapped based on one of the following directives as",
                 "applied at the job level:",
                 "* \"SLOT\" assigns procs to each node up to the number of available",
                 "  slots on that node before moving to the next node in the allocation",
                 "* \"HWTHREAD\" assigns a proc to each hardware thread on a node in a",
                 "  round-robin manner up to the number of available slots on that node",
                 "  before moving to the next node in the allocation",
                 "* \"CORE\" (default) assigns a proc to each core on a node in a round-",
                 "  robin manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"L1CACHE\" assigns a proc to each L1 cache on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"L2CACHE\" assigns a proc to each L2 cache on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"L3CACHE\" assigns a proc to each L3 cache on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"NUMA\" assigns a proc to each NUMA region on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"PACKAGE\" assigns a proc to each package on a node in a round-robin",
                 "  manner up to the number of available slots on that node before",
                 "  moving to the next node in the allocation",
                 "* \"NODE\" assigns processes in a round-robin fashion to all nodes in",
                 "  the allocation, with the number assigned to each node capped by the",
                 "  number of available slots on that node",
                 "* \"SEQ\" (often accompanied by the file=<path> qualifier) assigns one",
                 "  process to each node specified in the file. The sequential file is",
                 "  to contain an entry for each desired process, one per line of the",
                 "  file.",
                 "* \"PPR:N\":resource maps N procs to each instance of the specified",
                 "  resource type in the allocation",
                 "* \"RANKFILE\" (often accompanied by the file=<path> qualifier) assigns",
                 "  one process to the node/resource specified in each entry of the",
                 "  file, one per line of the file.",
                 "* \"PE-LIST=a,b\" assigns procs to each node in the allocation based on",
                 "  the ORDERED qualifier. The list is comprised of comma-delimited",
                 "  ranges of CPUs to use for this job. If the ORDERED qualifier is not",
                 "  provided, then each node will be assigned procs up to the number of",
                 "  available slots, capped by the availability of the specified CPUs.",
                 "  If ORDERED is given, then one proc will be assigned to each of the",
                 "  specified CPUs, if available, capped by the number of slots on each",
                 "  node and the total number of specified processes. Providing the",
                 "  OVERLOAD qualifier to the \"bind-to\" option removes the check on",
                 "  availability of the CPU in both cases.",
                 "Any directive can include qualifiers by adding a colon (\":\") and any",
                 "combination of one or more of the following (delimited by colons) to",
                 "the \"--map-by\" option (except where noted):",
                 "* \"PE=n\" bind n CPUs to each process (can not be used in combination",
                 "  with rankfile or pe-list directives)",
                 "* \"SPAN\" load balance the processes across the allocation by treating",
                 "  the allocation as a single \"super-node\" (can not be used in",
                 "  combination with \"slot\", \"node\", \"seq\", \"ppr\", \"rankfile\", or \"pe-",
                 "  list\" directives)",
                 "* \"OVERSUBSCRIBE\" allow more processes on a node than processing",
                 "  elements",
                 "* \"NOOVERSUBSCRIBE\" means \"!OVERSUBSCRIBE\"",
                 "* \"NOLOCAL\" do not launch processes on the same node as \"prun\"",
                 "* \"HWTCPUS\" use hardware threads as CPU slots",
                 "* \"CORECPUS\" use cores as CPU slots (default)",
                 "* \"INHERIT\" indicates that a child job (i.e., one spawned from within",
                 "  an application) shall inherit the placement policies of the parent",
                 "  job that spawned it.",
                 "* \"NOINHERIT\" means \"`!INHERIT\"",
                 "* \"FILE=<path>\" (path to file containing sequential or rankfile",
                 "  entries).",
                 "* \"ORDERED\" only applies to the \"PE-LIST\" option to indicate that",
                 "  procs are to be bound to each of the specified CPUs in the order in",
                 "  which they are assigned (i.e., the first proc on a node shall be",
                 "  bound to the first CPU in the list, the second proc shall be bound",
                 "  to the second CPU, etc.)",
                 "Note:",
                 "  Directives and qualifiers are case-insensitive and can be shortened",
                 "  to the minimum number of characters to uniquely identify them. Thus,",
                 "  \"L1CACHE\" can be given as \"l1cache\" or simply as \"L1\".",
                 "The type of CPU (core vs hwthread) used in the mapping algorithm is",
                 "determined as follows:",
                 "* by user directive on the command line via the HWTCPUS qualifier to",
                 "  the \"--map-by\" directive",
                 "* by setting the \"rmaps_default_mapping_policy\" MCA parameter to",
                 "  include the \"HWTCPUS\" qualifier. This parameter sets the default",
                 "  value for a PRRTE DVM — qualifiers are carried across to DVM jobs",
                 "  started via \"prun\" unless overridden by the user's command line",
                 "* defaults to CORE in topologies where core CPUs are defined, and to",
                 "  hwthreads otherwise.",
                 "If your application uses threads, then you probably want to ensure",
                 "that you are either not bound at all (by specifying \"--bind-to none\"),",
                 "or bound to multiple cores using an appropriate binding level or",
                 "specific number of processing elements per application process via the",
                 "\"PE=#\" qualifier to the \"--map-by\" command line directive.",
                 "A more detailed description of the mapping, ranking, and binding",
                 "procedure can be obtained via the \"--help placement\" option.",
                 NULL}
    },

    { .topic = "rank-by",
      .content = (const char *[]){
                 "PRRTE automatically ranks processes for each job starting from zero.",
                 "Regardless of the algorithm used, rank assignments span applications",
                 "in the same job — i.e., a command line of",
                 "   -n 3 app1 : -n 2 app2",
                 "will result in \"app1\" having three processes ranked 0-2 and \"app2\"",
                 "having two processes ranked 3-4.",
                 "By default, process ranks are assigned in accordance with the mapping",
                 "directive — e.g., jobs that are mapped by-node will have the process",
                 "ranks assigned round-robin on a per-node basis. However, users can",
                 "override the default by specifying any of the following directives",
                 "using the \"--rank-by\" command line option:",
                 "* \"SLOT\" assigns ranks to each process on a node in the order in which",
                 "  the mapper assigned them. This is the default behavior, but is",
                 "  provided as an explicit option to allow users to override any",
                 "  alternative default specified in the environment. When mapping to a",
                 "  specific resource type, procs assigned to a given instance of that",
                 "  resource on a node will be ranked on a per-resource basis on that",
                 "  node before moving to the next node.",
                 "* \"NODE\" assigns ranks round-robin on a per-node basis",
                 "* \"FILL\" assigns ranks to procs mapped to a particular resource type",
                 "  on each node, filling all ranks on that resource before moving to",
                 "  the next resource on that node. For example, procs mapped by",
                 "  \"L1cache\" would have all procs on the first \"L1cache\" ranked",
                 "  sequentially before moving to the second \"L1cache\" on the node. Once",
                 "  all procs on the node have been ranked, ranking would continue on",
                 "  the next node.",
                 "* \"SPAN\" assigns ranks round-robin to procs mapped to a particular",
                 "  resource type, treating the collection of resource instances",
                 "  spanning the entire allocation as a single \"super node\" before",
                 "  looping around for the next pass. Thus, ranking would begin with the",
                 "  first proc on the first \"L1cache\" on the first node, then the next",
                 "  rank would be assigned to the first proc on the second \"L1cache\" on",
                 "  that node, proceeding across until the first proc had been ranked on",
                 "  all \"L1cache\" used by the job before circling around to rank the",
                 "  second proc on each object.",
                 "The \"rank-by\" command line option has no qualifiers.",
                 "Note:",
                 "  Directives are case-insensitive.  \"SPAN\" is the same as \"span\".",
                 "A more detailed description of the mapping, ranking, and binding",
                 "procedure can be obtained via the \"--help placement\" option.",
                 NULL}
    },

    { .topic = "bind-to",
      .content = (const char *[]){
                 "By default, processes are bound to individual CPUs (either COREs or",
                 "HWTHREADs, as defined by default or by user specification for the",
                 "job). On nodes that are OVERSUBSCRIBEd (i.e., where the number of",
                 "procs exceeds the number of assigned slots), the default is to not",
                 "bind the processes.",
                 "Note:",
                 "  Processes from prior jobs that are already executing on a node are",
                 "  not \"unbound\" when a new job mapping results in the node becoming",
                 "  oversubscribed.",
                 "Binding is performed to the first available specified object type",
                 "within the object where the process was mapped. In other words,",
                 "binding can only be done to the mapped object or to a resource located",
                 "beneath that object.",
                 "An object is considered completely consumed when the number of",
                 "processes bound to it equals the number of CPUs within it. Unbound",
                 "processes are not considered in this computation. Additional processes",
                 "cannot be mapped to consumed objects unless the \"OVERLOAD\" qualifier",
                 "is provided via the \"--bind-to\" command line option.",
                 "Note that directives and qualifiers are case-insensitive and can be",
                 "shortened to the minimum number of characters to uniquely identify",
                 "them. Thus, \"L1CACHE\" can be given as \"l1cache\" or simply as \"L1\".",
                 "Supported binding directives include:",
                 "* \"NONE\" does not bind the processes",
                 "* \"HWTHREAD\" binds each process to a single hardware thread/ This",
                 "  requires that hwthreads be treated as independent CPUs (i.e., that",
                 "  either the \"HWTCPUS\" qualifier be provided to the \"map-by\" option or",
                 "  that \"hwthreads\" be designated as CPUs by default).",
                 "* \"CORE\" binds each process to a single core. This can be done whether",
                 "  \"hwthreads\" or \"cores\" are being treated as independent CPUs",
                 "  provided that mapping is performed at the core or higher level.",
                 "* \"L1CACHE\" binds each process to all the CPUs in an \"L1\" cache.",
                 "* \"L2CACHE\" binds each process to all the CPUs in an \"L2\" cache",
                 "* \"L3CACHE\" binds each process to all the CPUs in an \"L3\" cache",
                 "* \"NUMA\" binds each process to all the CPUs in a \"NUMA\" region",
                 "* \"PACKAGE\" binds each process to all the CPUs in a \"PACKAGE\"",
                 "Any directive can include qualifiers by adding a colon (:) and any",
                 "combination of one or more of the following to the \"--bind-to\" option:",
                 "* \"OVERLOAD\" indicates that objects can have more processes bound to",
                 "  them than CPUs within them",
                 "* \"IF-SUPPORTED\" indicates that the job should continue to be launched",
                 "  and executed even if binding cannot be performed as requested.",
                 "* \"LIMIT=n\" limits the number of processes bound to each eligible",
                 "  representative of the specified type to the given number. For",
                 "  example, speifying \"--bind-to l3:limit=2\" would direct PRRTE",
                 "  to bind ranks to the L3caches, limiting the number of processes",
                 "  bound to each l3cache to two - i.e., bind 2 processes to a",
                 "  given l3cache, and then move on to the next.",
                 "Note:",
                 "  Directives and qualifiers are case-insensitive. \"OVERLOAD\" is the",
                 "  same as \"overload\".",
                 NULL}
    },

    { .topic = "runtime-options",
      .content = (const char *[]){
                 "The \"--runtime-options\" command line directive must be accompanied by",
                 "a comma-delimited list of case-insensitive options that control the",
                 "runtime behavior of the job. The full directive need not be provided —",
                 "only enough characters are required to uniquely identify the",
                 "directive.",
                 "Runtime options are typically \"true\" or \"false\", though this is not a",
                 "requirement on developers. Since the value of each option may need to",
                 "be set (e.g., to override a default set by MCA parameter), the syntax",
                 "of the command line directive includes the use of an \"=\" character to",
                 "allow inclusion of a value for the option. For example, one can set",
                 "the \"ABORT-NONZERO-STATUS\" option to \"true\" by specifying it as",
                 "\"ABORT-NONZERO-STATUS=1\". Note that boolean options can be set to",
                 "\"true\" using a non-zero integer or a case-insensitive string of the",
                 "word \"true\".  For the latter representation, the user need only",
                 "provide at least the \"T\" character. The same policy applies to setting",
                 "a boolean option to \"false\".",
                 "Note that a boolean option will default to \"true\" if provided without",
                 "a value. Thus, \"--runtime-options abort-nonzero\" is sufficient to set",
                 "the \"ABORT-NONZERO-STATUS\" option to \"true\".",
                 "Supported values include:",
                 "* \"ERROR-NONZERO-STATUS[=(bool)]\": if set to false, this directs the",
                 "  runtime to treat a process that exits with non-zero status as a",
                 "  normal termination.  If set to true, the runtime will consider such",
                 "  an occurrence as an error termination and take appropriate action —",
                 "  i.e., the job will be terminated unless a runtime option directs",
                 "  otherwise. This option defaults to a true value if the option is",
                 "  given without a value.",
                 "* \"DONOTLAUNCH\": directs the runtime to map but not launch the",
                 "  specified job. This is provided to help explore possible process",
                 "  placement patterns before actually starting execution. No value need",
                 "  be passed as this is not an option that can be set by default in",
                 "  PRRTE.",
                 "* \"SHOW-PROGRESS[=(bool)]\": requests that the runtime provide progress",
                 "  reports on its startup procedure — i.e., the launch of its daemons",
                 "  in support of a job. This is typically used to debug DVM startup on",
                 "  large systems.  This option defaults to a true value if the option",
                 "  is given without a value.",
                 "* \"NOTIFYERRORS[=(bool)]\": if set to true, requests that the runtime",
                 "  provide a PMIx event whenever a job encounters an error — e.g., a",
                 "  process fails.  The event is to be delivered to each remaining",
                 "  process in the job. This option defaults to a true value if the",
                 "  option is given without a value.  See \"--help notifications\" for",
                 "  more detail as to the PMIx event codes available for capturing",
                 "  failure events.",
                 "* \"RECOVERABLE[=(bool)]\": if set to true, this indicates that the",
                 "  application wishes to consider the job as recoverable — i.e., the",
                 "  application is assuming responsibility for recovering from any",
                 "  process failure. This could include application-driven spawn of a",
                 "  substitute process or internal compensation for the missing process.",
                 "  This option defaults to a true value if the option is given without",
                 "  a value.",
                 "* \"AUTORESTART[=(bool)]\": if set to true, this requests that the",
                 "  runtime automatically restart failed processes up to \"max restarts\"",
                 "  number of times. This option defaults to a true value if the option",
                 "  is given without a value.",
                 "* \"CONTINUOUS[=(bool)]\": if set to true, this informs the runtime that",
                 "  the processes in this job are to run until explicitly terminated.",
                 "  Processes that fail are to be automatically restarted up to \"max",
                 "  restarts\" number of times. Notification of process failure is to be",
                 "  delivered to all processes in the application. This is the",
                 "  equivalent of specifying \"RECOVERABLE\", \"NOTIFYERRORS\", and",
                 "  \"AUTORESTART\" options except that the runtime, not the application,",
                 "  assumes responsibility for process recovery. This option defaults to",
                 "  a true value if the option is given without a value.",
                 "* \"MAX-RESTARTS=<int>\": indicates the maximum number of times a given",
                 "  process is to be restarted. This can be set at the application or",
                 "  job level (which will then apply to all applications in that job).",
                 "* \"EXEC-AGENT=<path>\" indicates the executable that shall be used to",
                 "  start an application process. The resulting command for starting an",
                 "  application process will be \"<path> app <app-argv>\". The path may",
                 "  contain its own command line arguments.",
                 "* \"DEFAULT-EXEC-AGENT\": directs the runtime to use the system default",
                 "  exec agent to start an application process. No value need be passed",
                 "  as this is not an option that can be set by default in PRRTE.",
                 "* \"OUTPUT-PROCTABLE[(=channel)]\": directs the runtime to report the",
                 "  convential debugger process table (includes PID and host location of",
                 "  each process in the application). Output is directed to stdout if",
                 "  the channel is \"-\", stderr if \"+\", or into the specified file",
                 "  otherwise. If no channel is specified, output will be directed to",
                 "  stdout.",
                 "* \"STOP-ON-EXEC\": directs the runtime to stop the application",
                 "  process(es) immediately upon exec'ing them. The directive will apply",
                 "  to all processes in the job.",
                 "* \"STOP-IN-INIT\": indicates that the runtime should direct the",
                 "  application process(es) to stop in \"PMIx_Init()\". The directive will",
                 "  apply to all processes in the job.",
                 "* \"STOP-IN-APP\": indicates that the runtime should direct application",
                 "  processes to stop at some application-defined place and notify they",
                 "  are ready-to-debug. The directive will apply to all processes in the",
                 "  job.",
                 "* \"TIMEOUT=<string>\": directs the runtime to terminate the job after",
                 "  it has executed for the specified time. Time is specified in colon-",
                 "  delimited format — e.g., \"01:20:13:05\" to indicate 1 day, 20 hours,",
                 "  13 minutes and 5 seconds. Time specified without colons will be",
                 "  assumed to have been given in seconds.",
                 "* \"SPAWN-TIMEOUT=<string>\": directs the runtime to terminate the job",
                 "  if job launch is not completed within the specified time. Time is",
                 "  specified in colon-delimited format — e.g., \"01:20:13:05\" to",
                 "  indicate 1 day, 20 hours, 13 minutes and 5 seconds.  Time specified",
                 "  without colons will be assumed to have been given in seconds.",
                 "* \"REPORT-STATE-ON-TIMEOUT[(=bool)]\": directs the runtime to provide a",
                 "  detailed report on job and application process state upon job",
                 "  timeout. This option defaults to a true value if the option is given",
                 "  without a value.",
                 "* \"GET-STACK-TRACES[(=bool)]\": requests that the runtime provide stack",
                 "  traces on all application processes still executing upon timeout.",
                 "  This option defaults to a true value if the option is given without",
                 "  a value.",
                 "* \"REPORT-CHILD-JOBS-SEPARATELY[(=bool)]\": directs the runtime to",
                 "  report the exit status of any child jobs spawned by the primary job",
                 "  separately. If false, then the final exit status reported will be",
                 "  zero if the primary job and all spawned jobs exit normally, or the",
                 "  first non-zero status returned by either primary or child jobs. This",
                 "  option defaults to a true value if the option is given without a",
                 "  value.",
                 "* \"AGGREGATE-HELP-MESSAGES[(=bool)]\": directs the runtime to aggregate",
                 "  help messages, reporting each unique help message once accompanied",
                 "  by the number of processes that reported it. This option defaults to",
                 "  a true value if the option is given without a value.",
                 "* \"FWD-ENVIRONMENT[(=bool)]\": directs the runtime to forward the",
                 "  entire local environment in support of the application. This option",
                 "  defaults to a true value if the option is given without a value.",
                 "The \"--runtime-options\" command line option has no qualifiers.",
                 "Note:",
                 "  Directives are case-insensitive.  \"FWD-ENVIRONMENT\" is the same as",
                 "  \"fwd-environment\".",
                 NULL}
    },

    { .topic = "display",
      .content = (const char *[]){
                 "The \"display\" command line directive must be accompanied by a comma-",
                 "delimited list of case-insensitive options indicating what information",
                 "about the job and/or allocation is to be displayed. The full directive",
                 "need not be provided — only enough characters are required to uniquely",
                 "identify the directive. For example, \"ALL\" is sufficient to represent",
                 "the \"ALLOCATION\" directive — while \"MAP\" can not be used to represent",
                 "\"MAP-DEVEL\" (though \"MAP-D\" would suffice).",
                 "Supported values include:",
                 "* \"ALLOCATION\" displays the detected hosts and slot assignments for",
                 "  this job",
                 "* \"BINDINGS\" displays the resulting bindings applied to processes in",
                 "  this job",
                 "* \"MAP\" displays the resulting locations assigned to processes in this",
                 "  job",
                 "* \"MAP-DEVEL\" displays a more detailed report on the locations",
                 "  assigned to processes in this job that includes local and node",
                 "  ranks, assigned bindings, and other data",
                 "* \"TOPO=LIST\" displays the topology of each node in the semicolon-",
                 "  delimited list that is allocated to the job",
                 "* \"CPUS[=LIST]\" displays the available CPUs on the provided semicolon-",
                 "  delimited list of nodes (defaults to all nodes)",
                 "The display command line directive can include qualifiers by adding a",
                 "colon (\":\") and any combination of one or more of the following",
                 "(delimited by colons):",
                 "* \"PARSEABLE\" directs that the output be provided in a format that is",
                 "  easily parsed by machines. Note that \"PARSABLE\" is also accepted as",
                 "  a typical spelling for the qualifier.",
                 "Provided qualifiers will apply to *all* of the display directives.",
                 NULL}
    },

    { .topic = "output",
      .content = (const char *[]){
                 "The \"output\" command line directive must be accompanied by a comma-",
                 "delimited list of case-insensitive options that control how output is",
                 "generated. The full directive need not be provided — only enough",
                 "characters are required to uniquely identify the directive. For",
                 "example, \"MERGE\" is sufficient to represent the \"MERGE-STDERR-TO-",
                 "STDOUT\" directive — while \"TAG\" can not be used to represent \"TAG-",
                 "DETAILED\" (though \"TAG-D\" would suffice).",
                 "Supported values include:",
                 "* \"TAG\" marks each output line with the \"[job,rank]<stream>:\" of the",
                 "  process that generated it",
                 "* \"TAG-DETAILED\" marks each output line with a detailed annotation",
                 "  containing \"[namespace,rank][hostname:pid]<stream>:\" of the process",
                 "  that generated it",
                 "* \"TAG-FULLNAME\" marks each output line with the",
                 "  \"[namespace,rank]<stream>:\" of the process that generated it",
                 "* \"TAG-FULLNAME\" marks each output line with the",
                 "  \"[namespace,rank]<stream>:\" of the process that generated it",
                 "* \"TIMESTAMP\" prefixes each output line with a \"[datetime]<stream>:\"",
                 "  stamp. Note that the timestamp will be the time when the line is",
                 "  output by the DVM and not the time when the source output it",
                 "* \"XML\" provides all output in a pseudo-XML format \"MERGE-STDERR-TO-",
                 "  STDOUT\" merges stderr into stdout",
                 "* \"DIR=DIRNAME\" redirects output from application processes into",
                 "  \"DIRNAME/job/rank/std[out,err,diag]\". The provided name will be",
                 "  converted to an absolute path",
                 "* \"FILE=FILENAME\" redirects output from application processes into",
                 "  \"filename.rank.\" The provided name will be converted to an absolute",
                 "  path",
                 "Supported qualifiers include \"NOCOPY\" (do not copy the output to the",
                 "stdout/err streams), and \"RAW\" (do not buffer the output into complete",
                 "lines, but instead output it as it is received).",
                 NULL}
    },

    { .topic = "rankfile",
      .content = (const char *[]){
                 "Name of file to specify explicit task mapping",
                 "NOTE: deprecated in favor of \"--map-by rankfile:file=<filename>\"",
                 NULL}
    },

    { .topic = "personality",
      .content = (const char *[]){
                 "Specify the personality to be used",
                 NULL}
    },

    { .topic = "pmixmca",
      .content = (const char *[]){
                 "Pass a PMIx MCA parameter",
                 "Syntax: \"--pmixmca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "prun:executable-not-specified",
      .content = (const char *[]){
                 "No executable was specified on the %s command line.",
                 "Aborting.",
                 NULL}
    },

    { .topic = "prun:call-failed",
      .content = (const char *[]){
                 "%s encountered a %s call failure.  This should not happen, and usually",
                 "indicates an error within the operating system itself. Specifically,",
                 "the following error occurred:",
                 "   %s",
                 "The only other available information that may be helpful is the errno",
                 "that was returned: %d.",
                 NULL}
    },

    { .topic = "prun:proc-ordered-abort",
      .content = (const char *[]){
                 "%s has exited due to process rank %lu with PID %lu on node %s calling",
                 "\"abort\". This may have caused other processes in the application to be",
                 "terminated by signals sent by %s (as reported here).",
                 NULL}
    },

    { .topic = "prun:proc-exit-no-sync",
      .content = (const char *[]){
                 "%s has exited due to process rank %lu with PID %lu on node %s exiting",
                 "improperly. There are three reasons this could occur:",
                 "1. this process did not call \"init\" before exiting, but others in the",
                 "job did. This can cause a job to hang indefinitely while it waits for",
                 "all processes to call \"init\". By rule, if one process calls \"init\",",
                 "then ALL processes must call \"init\" prior to termination.",
                 "2. this process called \"init\", but exited without calling \"finalize\".",
                 "By rule, all processes that call \"init\" MUST call \"finalize\" prior to",
                 "exiting or it will be considered an \"abnormal termination\"",
                 "3. this process called \"MPI_Abort\" or \"prte_abort\" and the mca",
                 "parameter prte_create_session_dirs is set to false. In this case, the",
                 "run-time cannot detect that the abort call was an abnormal",
                 "termination. Hence, the only error message you will receive is this",
                 "one.",
                 "This may have caused other processes in the application to be",
                 "terminated by signals sent by %s (as reported here).",
                 "You can avoid this message by specifying -quiet on the %s command",
                 "line.",
                 NULL}
    },

    { .topic = "prun:proc-aborted",
      .content = (const char *[]){
                 "%s noticed that process rank %lu with PID %lu on node %s exited on",
                 "signal %d.",
                 NULL}
    },

    { .topic = "prun:proc-aborted-strsignal",
      .content = (const char *[]){
                 "%s noticed that process rank %lu with PID %lu on node %s exited on",
                 "signal %d (%s).",
                 NULL}
    },

    { .topic = "prun:sys-limit-pipe",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it encountered an",
                 "error:",
                 "Error: system limit exceeded on number of pipes that can be open",
                 "   Node: %s",
                 "when attempting to start process rank %lu.",
                 "This can be resolved by setting the mca parameter",
                 "opal_set_max_sys_limits to 1, increasing your limit descriptor setting",
                 "(using limit or ulimit commands), asking the system administrator for",
                 "that node to increase the system limit, or by rearranging your",
                 "processes to place fewer of them on that node.",
                 NULL}
    },

    { .topic = "prun:sys-limit-files",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it encountered an",
                 "error:",
                 "Error: system limit exceeded on number of files that can be open",
                 "   Node: %s",
                 "when attempting to start process rank %lu.",
                 "This can be resolved by setting the mca parameter",
                 "opal_set_max_sys_limits to 1, increasing your limit descriptor setting",
                 "(using limit or ulimit commands), asking the system administrator for",
                 "that node to increase the system limit, or by rearranging your",
                 "processes to place fewer of them on that node.",
                 NULL}
    },

    { .topic = "prun:pipe-setup-failure",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it encountered an",
                 "error:",
                 "Error: pipe function call failed when setting up I/O forwarding",
                 "subsystem",
                 "   Node: %s",
                 "while attempting to start process rank %lu.",
                 NULL}
    },

    { .topic = "prun:sys-limit-children",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it encountered an",
                 "error:",
                 "Error: system limit exceeded on number of processes that can be",
                 "started",
                 "   Node: %s",
                 "when attempting to start process rank %lu.",
                 "This can be resolved by either asking the system administrator for",
                 "that node to increase the system limit, or by rearranging your",
                 "processes to place fewer of them on that node.",
                 NULL}
    },

    { .topic = "prun:failed-term-attrs",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it encountered an",
                 "error:",
                 "Error: reading tty attributes function call failed while setting up",
                 "I/O forwarding system",
                 "   Node: %s",
                 "while attempting to start process rank %lu.",
                 NULL}
    },

    { .topic = "prun:wdir-not-found",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it could not find",
                 "the specified working directory:",
                 "   Working directory: %s",
                 "   Node: %s",
                 "while attempting to start process rank %lu.",
                 NULL}
    },

    { .topic = "prun:wdir-not-accessible",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it lacks",
                 "permissions to change to the specified working directory:",
                 "   Working directory: %s",
                 "   Node: %s",
                 "while attempting to start process rank %lu.",
                 NULL}
    },

    { .topic = "prun:exe-not-found",
      .content = (const char *[]){
                 "%s was unable to find the specified executable file, and therefore did",
                 "not launch the job.  This error was first reported for process rank",
                 "%lu; it may have occurred for other processes as well.",
                 "NOTE: A common cause for this error is misspelling a %s command",
                 "   line parameter option (remember that %s interprets the first",
                 "   unrecognized command line token as the executable).",
                 "   Node:       %s",
                 "   Executable: %s",
                 NULL}
    },

    { .topic = "prun:exe-not-accessible",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it lacked",
                 "permissions to execute an executable:",
                 "   Executable: %s",
                 "   Node: %s",
                 "while attempting to start process rank %lu.",
                 NULL}
    },

    { .topic = "prun:pipe-read-failure",
      .content = (const char *[]){
                 "%s was unable to launch the specified application as it encountered an",
                 "error:",
                 "Error: reading from a pipe function call failed while spawning a local",
                 "process",
                 "   Node: %s",
                 "while attempting to start process rank %lu.",
                 NULL}
    },

    { .topic = "prun:proc-failed-to-start",
      .content = (const char *[]){
                 "%s was unable to start the specified application as it encountered an",
                 "error:",
                 "   Error code: %d",
                 "   Error name: %s",
                 "   Node: %s",
                 "when attempting to start process rank %lu.",
                 NULL}
    },

    { .topic = "prun:proc-failed-to-start-no-status",
      .content = (const char *[]){
                 "%s was unable to start the specified application as it encountered an",
                 "error on node %s. More information may be available above.",
                 NULL}
    },

    { .topic = "prun:ompi-server-filename-bad",
      .content = (const char *[]){
                 "%s was unable to parse the filename where contact info for the prte-",
                 "server was to be found. The option we were given was:",
                 "   --prte-server %s",
                 "This appears to be missing the required ':' following the keyword",
                 "\"file\". Please remember that the correct format for this command line",
                 "option is:",
                 "   --prte-server file:path-to-file",
                 "where path-to-file can be either relative to the cwd or absolute.",
                 NULL}
    },

    { .topic = "prun:ompi-server-filename-missing",
      .content = (const char *[]){
                 "%s was unable to parse the filename where contact info for the prte-",
                 "server was to be found. The option we were given was:",
                 "   --prte-server %s",
                 "This appears to be missing a filename following the ':'. Please",
                 "remember that the correct format for this command line option is:",
                 "   --prte-server file:path-to-file",
                 "where path-to-file can be either relative to the cwd or absolute.",
                 NULL}
    },

    { .topic = "prun:ompi-server-filename-access",
      .content = (const char *[]){
                 "%s was unable to access the filename where contact info for the prte-",
                 "server was to be found. The option we were given was:",
                 "   --prte-server %s",
                 "Please remember that the correct format for this command line option",
                 "is:",
                 "   --prte-server file:path-to-file",
                 "where path-to-file can be either relative to the cwd or absolute, and",
                 "that you must have read access permissions to that file.",
                 NULL}
    },

    { .topic = "prun:ompi-server-file-bad",
      .content = (const char *[]){
                 "%s was unable to read the prte-server's contact info from the given",
                 "filename. The filename we were given was:",
                 "FILE: %s",
                 "Please remember that the correct format for this command line option",
                 "is:",
                 "--prte-server file:path-to-file",
                 "where path-to-file can be either relative to the cwd or absolute, and",
                 "that the file must have a single line in it that contains the PRTE uri",
                 "for the prte-server. Note that this is *not* a standard uri, but a",
                 "special format used internally by PRTE for communications. It can best",
                 "be generated by simply directing the prte-server to put its uri in a",
                 "file, and then giving %s that filename.",
                 NULL}
    },

    { .topic = "prun:multiple-paffinity-schemes",
      .content = (const char *[]){
                 "Multiple processor affinity schemes were specified (can only specify",
                 "one):",
                 "   Slot list: %s",
                 "   prte_paffinity_alone:  true",
                 "Please specify only the one desired method.",
                 NULL}
    },

    { .topic = "prun:invalid-node-rank",
      .content = (const char *[]){
                 "An invalid node rank was obtained - this is probably something that",
                 "should be reported to the PRRTE developers.",
                 NULL}
    },

    { .topic = "prun:invalid-local-rank",
      .content = (const char *[]){
                 "An invalid local rank was obtained - this is probably something that",
                 "should be reported to the PRRTE developers.",
                 NULL}
    },

    { .topic = "prun:invalid-phys-cpu",
      .content = (const char *[]){
                 "An invalid physical processor id was returned when attempting to set",
                 "processor affinity - please check to ensure that your system supports",
                 "such functionality. If so, then this is probably something that should",
                 "be reported to the PRRTE developers.",
                 NULL}
    },

    { .topic = "prun:topo-not-supported",
      .content = (const char *[]){
                 "An attempt was made to bind a process to a specific hardware topology",
                 "mapping (e.g., binding to a package) but the operating system does not",
                 "support such topology-aware actions.  Talk to your local system",
                 "administrator to find out if your system can support topology-aware",
                 "functionality (e.g., Linux Kernels newer than v2.6.18).",
                 "Systems that do not support processor topology-aware functionality",
                 "cannot use \"bind to package\" and other related functionality.",
                 "   Local host:        %s",
                 "   Action attempted:  %s %s",
                 "   Application name:  %s",
                 NULL}
    },

    { .topic = "prun:not-enough-resources",
      .content = (const char *[]){
                 "Not enough %s were found on the local host to meet the requested",
                 "binding action:",
                 "   Local host:        %s",
                 "   Action requested:  %s",
                 "   Application name:  %s",
                 "Please revise the request and try again.",
                 NULL}
    },

    { .topic = "prun:invalid-slot-list-range",
      .content = (const char *[]){
                 "A slot list was provided that exceeds the boundaries on available",
                 "resources:",
                 "   Local host: %s",
                 "   Slot list:  %s",
                 "Please check your boundaries and try again.",
                 NULL}
    },

    { .topic = "prun:proc-comm-failed",
      .content = (const char *[]){
                 "A critical communication path was lost to:",
                 "   My name:      %s",
                 "   Process name: %s",
                 "   Node:         %s",
                 NULL}
    },

    { .topic = "prun:proc-mem-exceeded",
      .content = (const char *[]){
                 "A process exceeded memory limits:",
                 "   Process name: %s",
                 "   Node:         %s",
                 NULL}
    },

    { .topic = "prun:proc-stalled",
      .content = (const char *[]){
                 "One or more processes appear to have stalled - a monitored file failed",
                 "to show the required activity.",
                 NULL}
    },

    { .topic = "prun:proc-sensor-exceeded",
      .content = (const char *[]){
                 "One or more processes have exceeded a specified sensor limit, but no",
                 "further info is available.",
                 NULL}
    },

    { .topic = "prun:proc-heartbeat-failed",
      .content = (const char *[]){
                 "%s failed to receive scheduled heartbeat communications from a remote",
                 "process:",
                 "   Process name: %s",
                 "   Node:         %s",
                 NULL}
    },

    { .topic = "prun:non-zero-exit",
      .content = (const char *[]){
                 "%s detected that one or more processes exited with non-zero status,",
                 "thus causing the job to be terminated. The first process to do so was:",
                 "   Process name: %s",
                 "   Exit code:    %d",
                 NULL}
    },

    { .topic = "prun:negative-nprocs",
      .content = (const char *[]){
                 "%s has detected that one or more applications was given a negative",
                 "number of processes to run:",
                 "   Application:  %s",
                 "   Num procs:    %d",
                 "Please correct this value and try again.",
                 NULL}
    },

    { .topic = "prun:stop-on-exec",
      .content = (const char *[]){
                 "%s was unable to stop the executable at first instruction:",
                 "   Error:     %s",
                 "   Nodename:  %s",
                 "   Rank:      %lu",
                 NULL}
    },

    { .topic = "prun:executable-incorrectly-given",
      .content = (const char *[]){
                 "The %s command was given with an application specified. %s is only",
                 "used to start the persistent DVM - it cannot be used with an",
                 "application.",
                 NULL}
    },

    { .topic = "bad-option-input",
      .content = (const char *[]){
                 "%s was given an option that expected a string argument:",
                 "   option: %s",
                 "   argument: %s",
                 "   expected: %s",
                 "Please correct the option and try again.",
                 NULL}
    },

    { .topic = "file-open-error",
      .content = (const char *[]){
                 "%s was unable to open the specified file provided as an option:",
                 "   option: %s",
                 "   argument: %s",
                 "   file: %s",
                 "Please correct the option and try again.",
                 NULL}
    },

    { .topic = "bad-file",
      .content = (const char *[]){
                 "%s was unable to read the necessary info from the provided file:",
                 "   option: %s",
                 "   argument: %s",
                 "   file: %s",
                 "Please correct the option or the file and try again.",
                 NULL}
    },

    { .topic = "bad-dvm-option",
      .content = (const char *[]){
                 "The --dvm <arg> option was provided, but the argument is one not",
                 "recognized:",
                 "   arg: %s",
                 "Please see \"%s --help dvm\" for a list of recognized options and",
                 "examples",
                 NULL}
    },

    { .topic = "appfile-failure",
      .content = (const char *[]){
                 "The --app <arg> option was provided, but the specified file was not",
                 "found or could not be opened:",
                 "   file: %s",
                 "Please correct the option and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_28[] = {
    { .topic = "usage",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Usage: %s [OPTION]...",
                 "Terminate an instance of the PMIx Reference RTE (PRRTE) DVM",
                 "* General Options",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"-h\" | \"--help\"      | This help message                             |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-h\" | \"--help       | Help for the specified option                 |",
                 "| <arg0>\"              |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-v\" | \"--verbose\"   | Enable typical debug options                  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"-V\" | \"--version\"   | Print version and exit                        |",
                 "+----------------------+-----------------------------------------------+",
                 "* Specific Options",
                 "+----------------------+-----------------------------------------------+",
                 "| Option               | Description                                   |",
                 "|======================|===============================================|",
                 "| \"--pmixmca <key>     | Pass context-specific PMIx MCA parameters     |",
                 "| <value>\"             | (\"key\" is the parameter name; \"value\" is the  |",
                 "|                      | parameter value)                              |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--dvm-uri <uri>\"    | Specify the URI of the DVM master, or the     |",
                 "|                      | name of the file (specified as                |",
                 "|                      | \"file:filename\") that contains that info      |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--num-connect-      | Max number of times to try to connect (int)   |",
                 "| retries <num>\"       |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--pid <pid>`\"       | PID of the daemon to which we should connect  |",
                 "|                      | (integer PID or \"file:<filename>\" for file    |",
                 "|                      | containing the PID                            |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--namespace <name>\" | Namespace of the daemon we are to connect to  |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--system-server-    | First look for a system server and connect to |",
                 "| first\"               | it if found                                   |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--system-server-    | Connect only to a system-level server         |",
                 "| only\"                |                                               |",
                 "+----------------------+-----------------------------------------------+",
                 "| \"--wait-to-connect   | Delay specified number of seconds before      |",
                 "| <seconds>\"           | trying to connect                             |",
                 "+----------------------+-----------------------------------------------+",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "version",
      .content = (const char *[]){
                 "%s (%s) %s",
                 "Report bugs to %s",
                 NULL}
    },

    { .topic = "dvm-uri",
      .content = (const char *[]){
                 "Specify the URI of the DVM master, or the name of the file (specified",
                 "as \"file:<filename>\") that contains that info",
                 NULL}
    },

    { .topic = "num-connect-retries",
      .content = (const char *[]){
                 "Max number of times to try to connect to the specified server (int)",
                 NULL}
    },

    { .topic = "pid",
      .content = (const char *[]){
                 "PID of the daemon to which we should connect (integer PID or",
                 "\"file:<filename>\" for file containing the PID",
                 NULL}
    },

    { .topic = "namespace",
      .content = (const char *[]){
                 "Namespace of the daemon we are to connect to (char*)",
                 NULL}
    },

    { .topic = "system-server-first",
      .content = (const char *[]){
                 "First look for a system server and connect to it if found",
                 NULL}
    },

    { .topic = "system-server-only",
      .content = (const char *[]){
                 "Connect only to a system-level server - abort if one is not found",
                 NULL}
    },

    { .topic = "wait-to-connect",
      .content = (const char *[]){
                 "Delay specified number of seconds before trying to connect",
                 NULL}
    },

    { .topic = "pmixmca",
      .content = (const char *[]){
                 "Pass a PMIx MCA parameter",
                 "Syntax: \"--pmixmca <key> <value>\", where \"key\" is the parameter name",
                 "and \"value\" is the parameter value.",
                 NULL}
    },

    { .topic = "no-args",
      .content = (const char *[]){
                 "The %s command does not accept arguments other than those specifically",
                 "defined by the command. The following were not recognized:",
                 "   Args: %s",
                 "Please see \"%s --help\" for a description of all accepted command",
                 "options.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_29[] = {
    { .topic = "normal-termination-but",
      .content = (const char *[]){
                 "While %s job %s terminated normally, %d %s. Further examination may be required.",
                 NULL}
    },

    { .topic = "bad-combination",
      .content = (const char *[]){
                 "The runtime option NOTIFYERRORS was set to true. This requests that the",
                 "runtime provide a PMIx event whenever a job encounters an error - e.g., a",
                 "process fails. The event is to be delivered to each remaining process in",
                 "the job. However, this only can be done if the job is not to be terminated",
                 "in the event of an error. The following runtime options govern that",
                 "behavior:",
                 "    RECOVERABLE[=(bool)] if set to true, this indicates that the application",
                 "    wishes to consider the job as recoverable - i.e., the application is",
                 "    assuming responsibility for recovering from any process failure. This",
                 "    could include application-driven spawn of a substitute process or",
                 "    internal compensation for the missing process. This option defaults to",
                 "    a true value if the option is given without a value.",
                 "    CONTINUOUS[=(bool)] if set to true, this informs the runtime that the",
                 "    processes in this job are to run until explicitly terminated. Processes",
                 "    that fail are to be automatically restarted up to \"max restarts\"",
                 "    number of times. Notification of process failure is to be delivered",
                 "    to all processes in the application. This is the equivalent of specifying",
                 "    RECOVERABLE, NOTIFYERRORS, and AUTORESTART options except that the runtime,",
                 "    not the application, assumes responsibility for process recovery. This",
                 "    option defaults to a true value if the option is given without a value.",
                 "You must specify one of the above in combination with NOTIFYERRORS in order",
                 "to receive notifications of errors. Please correct the situation and try again.",
                 NULL}
    },

    { .topic = "child-term",
      .content = (const char *[]){
                 "At least one child job is being terminated due to termination of",
                 "its parent:",
                 "  Parent: %s",
                 "  Child:  %s",
                 "This behavior is controlled by setting the PMIX_SPAWN_CHILD_SEP attribute",
                 "in the job info provided at time of spawn for the child job. When set to",
                 "\"true\", the runtime will \"separate\" the child from its parent and allow",
                 "it to continue execution after parent termination. Note that this is only",
                 "true for parents that normally terminate - abnormal termination will always",
                 "result in a complete teardown of all child jobs.",
                 "In the absence of the attribute, the runtime will default to the \"true\"",
                 "behavior.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_30[] = {
    { .topic = "static-and-dynamic",
      .content = (const char *[]){
                 "Both static and dynamic port ranges were specified for the",
                 "out-of-band (OOB) communication subsystem:",
                 "Static ports:   %s",
                 "Dynamic ports:  %s",
                 "Only one can be specified. Please choose either static or",
                 "dynamic ports and try again.",
                 NULL}
    },

    { .topic = "include-exclude",
      .content = (const char *[]){
                 "Both TCP interface include and exclude lists were specified:",
                 "  Include: %s",
                 "  Exclude: %s",
                 "Only one of these can be given.",
                 NULL}
    },

    { .topic = "not-parseable",
      .content = (const char *[]){
                 "The specified network is not parseable. Since we cannot determine",
                 "your desired intent, we cannot establish a TCP socket for out-of-band",
                 "communications and will therefore abort. Please correct the network",
                 "specification and retry.",
                 NULL}
    },

    { .topic = "invalid if_inexclude",
      .content = (const char *[]){
                 "WARNING: An invalid value was given for oob_tcp_if_%s.  This",
                 "value will be ignored.",
                 "  Local host: %s",
                 "  Value:      %s",
                 "  Message:    %s",
                 NULL}
    },

    { .topic = "accept failed",
      .content = (const char *[]){
                 "WARNING: The accept(3) system call failed on a TCP socket.  While this",
                 "should generally never happen on a well-configured HPC system, the",
                 "most common causes when it does occur are:",
                 "  * The process ran out of file descriptors",
                 "  * The operating system ran out of file descriptors",
                 "  * The operating system ran out of memory",
                 "Your PRTE job will likely hang until the failure resason is fixed",
                 "(e.g., more file descriptors and/or memory becomes available), and may",
                 "eventually timeout / abort.",
                 "  Local host:     %s",
                 "  Errno:          %d (%s)",
                 "  Probable cause: %s",
                 NULL}
    },

    { .topic = "privilege failure",
      .content = (const char *[]){
                 "An attempt was made to initiate a TCP connection from an",
                 "unprivileged source while we are operating at privileged",
                 "levels.",
                 "  Local host:      %s",
                 "  Listening port:  %d",
                 "  Remote host:     %s",
                 "  Remote port:    %d",
                 "The connection was rejected.",
                 NULL}
    },

    { .topic = "version mismatch",
      .content = (const char *[]){
                 "PRTE detected a mismatch in versions between two processes.  This",
                 "typically means that you executed \"mpirun\" (or \"mpiexec\") from one",
                 "version of PRTE on on node, but your default path on one of the",
                 "other nodes upon which you launched found a different version of Open",
                 "MPI.",
                 "PRTE only supports running exactly the same version between all",
                 "processes in a single job.",
                 "This will almost certainly cause unpredictable behavior, and may end",
                 "up aborting your job.",
                 "  Local host:             %s",
                 "  Local process name:     %s",
                 "  Local PRTE version: %s",
                 "  Peer host:              %s",
                 "  Peer process name:      %s",
                 "  Peer PRTE version:  %s",
                 NULL}
    },

    { .topic = "no-listeners",
      .content = (const char *[]){
                 "No sockets were able to be opened on the available protocols",
                 "(IPv4 and/or IPv6). Please check your network and retry.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_31[] = {
    { .topic = "prte_init:startup:internal-failure",
      .content = (const char *[]){
                 "It looks like \"prte_init()\" failed for some reason. There are many",
                 "reasons that can cause PRRTE to fail during \"prte_init()\", some of",
                 "which are due to configuration or environment problems.  This failure",
                 "appears to be an internal failure — here's some additional information",
                 "(which may only be relevant to a PRRTE developer):",
                 "   %s failed",
                 "   --> Returned value %s (%d) instead of PRTE_SUCCESS",
                 NULL}
    },

    { .topic = "prte:session:dir:prohibited",
      .content = (const char *[]){
                 "The specified location for the temporary directories required by PRTE",
                 "is on the list of prohibited locations:",
                 "   Location given: %s",
                 "   Prohibited locations: %s",
                 "If you believe this is in error, please contact your system",
                 "administrator to have the list of prohibited locations changed.",
                 "Otherwise, please identify a different location to be used (use \"-h\"",
                 "to see the cmd line option), or simply let the system pick a default",
                 "location.",
                 NULL}
    },

    { .topic = "failed-to-uncompress",
      .content = (const char *[]){
                 "A compressed message was received that could not be decompressed. This",
                 "is most likely due to a missing libz library on the receiving node:",
                 "   node:  %s",
                 "Please ensure that the \"libz\" library is present on all compute nodes.",
                 NULL}
    },

    { .topic = "bootstrap-not-found",
      .content = (const char *[]){
                 "Bootstrap startup was requested, but the required configuration file",
                 "was not found on at least one node:",
                 "   node: %s",
                 "   file: %s",
                 "Please ensure the file has been installed in the correct location on",
                 "every node included in this PRRTE DVM.",
                 NULL}
    },

    { .topic = "bootstrap-missing-field-name",
      .content = (const char *[]){
                 "Bootstrap startup was requested, but the required configuration file",
                 "on at least one node is missing the field name on an entry:",
                 "   node: %s",
                 "   file: %s",
                 "   line: %s",
                 "Please correct the line.",
                 NULL}
    },

    { .topic = "bootstrap-missing-value",
      .content = (const char *[]){
                 "Bootstrap startup was requested, but the required configuration file",
                 "on at least one node is missing a value on an entry:",
                 "   node: %s",
                 "   file: %s",
                 "   line: %s",
                 "Please correct the line.",
                 NULL}
    },

    { .topic = "bootstrap-missing-entry",
      .content = (const char *[]){
                 "Bootstrap startup was requested, but the required configuration file",
                 "on at least one node is missing a required entry:",
                 "   node:   %s",
                 "   file:   %s",
                 "   entry:  %s",
                 "Please provide the missing information.",
                 NULL}
    },

    { .topic = "bootstrap-bad-nodelist",
      .content = (const char *[]){
                 "Bootstrap startup was requested, but we were unable to parse the regex",
                 "of participating nodes on at least one node:",
                 "   node:   %s",
                 "   file:   %s",
                 "   regex:  %s",
                 "   error:  %s",
                 "Please fix the error and try again.",
                 NULL}
    },

    { .topic = "prte:session:dir:shared",
      .content = (const char *[]){
                 "PRTE has detected that the head of the session directory tree (where",
                 "scratch files and shared memory backing storage will be placed)",
                 "resides on a shared file system:",
                 "   Directory: %s",
                 "   File system type: %s",
                 "For performance reasons, it is strongly recommended that the session",
                 "directory be located on a local file system. This can be controlled by",
                 "setting the system temporary directory to be used by PRTE using either",
                 "the TMPDIR envar or the \"prte_tmpdir_base\" MCA param.",
                 "If you need the temporary directory to be different on remote nodes",
                 "from the local one where %s is running (e.g., when a login node is",
                 "being employed), then you can set the local temporary directory using",
                 "the \"prte_local_tmpdir_base\" MCA param and the one to be used on all",
                 "other nodes using the \"prte_remote_tmpdir_base\" param.",
                 "This is only a warning advisory and your job will continue. You can",
                 "disable this warning in the future by setting the",
                 "\"prte_silence_shared_fs\" MCA param to \"1\".",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_32[] = {
    { .topic = "not-all-mapped-alloc",
      .content = (const char *[]){
                 "At least one of the requested hosts is not included in the current",
                 "allocation.",
                 "   Missing requested host: %s",
                 "Please check your allocation or your request.",
                 NULL}
    },

    { .topic = "dash-host:relative-node-not-found",
      .content = (const char *[]){
                 "A relative host was specified, but was not found. The requested host",
                 "was specified with \"--host\" as:",
                 "   Index: %d",
                 "   Syntax given: %s",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = "dash-host:relative-node-out-of-bounds",
      .content = (const char *[]){
                 "A relative host was specified, but the index given is beyond the",
                 "number of hosts in the current allocation:",
                 "   Index: %d",
                 "   #hosts: %d",
                 "You could obtain a larger allocation or reduce the relative host",
                 "index.",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = "dash-host:invalid-relative-node-syntax",
      .content = (const char *[]){
                 "A relative host was improperly specified — the value provided was.",
                 "   --host: %s",
                 "You may have forgotten to preface a node with \"N\" or \"n\", or used the",
                 "\"e\" or \"E\" to indicate empty nodes.",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = "dash-host:not-enough-empty",
      .content = (const char *[]){
                 "The requested number of empty hosts was not available — the system was",
                 "short by %d hosts.  Please recheck your allocation.",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_33[] = {
    { .topic = "stacktrace signal override",
      .content = (const char *[]){
                 "PRTE was inserting a signal handler for signal %d but noticed that",
                 "there is already a non-default handler installed.  PRTE's handler was",
                 "therefore not installed; your job will continue.  This warning message",
                 "will only be displayed once, even if PRTE encounters this situation",
                 "again.",
                 "To avoid displaying this warning message, you can either not install",
                 "the error handler for signal %d or you can have PRTE not try to",
                 "install its own signal handler for this signal by setting the",
                 "\"prte_signals\" MCA parameter.",
                 "   Signal: %d",
                 "   Current prte_signal value: %s",
                 NULL}
    },

    { .topic = "stacktrace bad signal",
      .content = (const char *[]){
                 "PRTE was inserting a signal handler but was given an invalid signal",
                 "number:",
                 "   Signal string: %s",
                 "   Bad value:     %s",
                 "The given value must be an integer within the signal number range.",
                 "Please correct the value and try again.",
                 NULL}
    },

    { .topic = "malformed-uri",
      .content = (const char *[]){
                 "PRTE has detected a malformed URI:",
                 "   URI:  %s",
                 "Accepted values follow IETF RFC3986, e.g.",
                 "\"file://192.168.1.1/over/there\"",
                 NULL}
    },

    { .topic = "relative-path",
      .content = (const char *[]){
                 "When creating a URI, all files must be specified in absolute paths:",
                 "   Value provided: %s",
                 "Please update your application to provide the full path to the file.",
                 NULL}
    },

    { .topic = "sys-limit-failed",
      .content = (const char *[]){
                 "Per request, PRTE attempted to set a system resource limit to a given",
                 "value:",
                 "   Resource:  %s",
                 "   Limit:     %s",
                 "The system has refused to allow this operation. This is likely due to",
                 "a permission limitation, or specifying an unsupported value. Please",
                 "check the system or remove the request and try again.",
                 NULL}
    },

    { .topic = "sys-limit-unrecognized",
      .content = (const char *[]){
                 "PRTE received a request to set a system resource limit. Sadly, OMPI",
                 "does not recognize or currently support the specified resource:",
                 "   Resource:  %s",
                 "   Limit:     %s",
                 "Please correct the request and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

static pmix_show_help_entry_t ini_entries_34[] = {
    { .topic = "no-hostfile",
      .content = (const char *[]){
                 "PRTE was unable to open the hostfile:",
                 "   %s",
                 "Check to make sure the path and filename are correct.",
                 NULL}
    },

    { .topic = "port",
      .content = (const char *[]){
                 "PRTE detected a bad parameter in the hostfile:",
                 "   %s",
                 "The port parameter is less than 0:",
                 "   port=%d",
                 NULL}
    },

    { .topic = "slots",
      .content = (const char *[]){
                 "PRTE detected a bad parameter in the hostfile:",
                 "   %s",
                 "The slots parameter is less than 0:",
                 "   slots=%d",
                 NULL}
    },

    { .topic = "max_slots",
      .content = (const char *[]){
                 "PRTE detected a bad parameter in the hostfile:",
                 "   %s",
                 "The max_slots parameter is less than 0:",
                 "   max_slots=%d",
                 NULL}
    },

    { .topic = "max_slots_lt",
      .content = (const char *[]){
                 "PRTE detected a bad parameter in the hostfile:",
                 "   %s",
                 "The max_slots parameter is less than the slots parameter:",
                 "   slots=%d",
                 "   max_slots=%d",
                 NULL}
    },

    { .topic = "parse_error_string",
      .content = (const char *[]){
                 "PRTE detected a parse error in the hostfile:",
                 "   %s",
                 "It occured on line number %d on token %d:",
                 "   %s",
                 NULL}
    },

    { .topic = "parse_error_int",
      .content = (const char *[]){
                 "PRTE detected a parse error in the hostfile:",
                 "   %s",
                 "It occured on line number %d on token %d:",
                 "   %d",
                 NULL}
    },

    { .topic = "parse_error",
      .content = (const char *[]){
                 "PRTE detected a parse error in the hostfile:",
                 "   %s",
                 "It occured on line number %d on token %d.",
                 NULL}
    },

    { .topic = "not-all-mapped-alloc",
      .content = (const char *[]){
                 "Some of the requested hosts are not included in the current",
                 "allocation.",
                 "The requested hosts were in this hostfile:",
                 "      %s",
                 "Please verify that you have specified the allocated resources properly",
                 "in the provided hostfile.",
                 NULL}
    },

    { .topic = "hostfile:relative-syntax",
      .content = (const char *[]){
                 "A relative host was specified, but no prior allocation has been made.",
                 "Thus, there is no way to determine the proper host to be used.",
                 "   hostfile entry: %s",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = "hostfile:relative-node-not-found",
      .content = (const char *[]){
                 "A relative host was specified, but was not found. The requested host",
                 "was specified as:",
                 "   Index: %d",
                 "   Syntax given: %s",
                 "This is most likely due to the relative index being out of bounds. You",
                 "could obtain a larger allocation or reduce the relative host index.",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = "hostfile:invalid-relative-node-syntax",
      .content = (const char *[]){
                 "A relative host was improperly specified — the value provided was.",
                 "   hostfile entry: %s",
                 "You may have forgotten to preface a node with \"N\" or \"n\", or used the",
                 "\"e\" or \"E\" to indicate empty nodes.",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = "hostfile:not-enough-empty",
      .content = (const char *[]){
                 "The requested number of empty hosts was not available — the system was",
                 "short by %d hosts.  Please recheck your allocation.",
                 "Re-run this command with \"--help hosts\" for further information.",
                 NULL}
    },

    { .topic = "hostfile:extra-node-not-found",
      .content = (const char *[]){
                 "A hostfile was provided that contains at least one node not present in",
                 "the allocation:",
                 "   hostfile:  %s",
                 "   node:      %s",
                 "If you are operating in a resource-managed environment, then only",
                 "nodes that are in the allocation can be used in the hostfile. You may",
                 "find relative node syntax to be a useful alternative to specifying",
                 "absolute node names; re-run this command with \"--help hosts\" for",
                 "further information.",
                 NULL}
    },

    { .topic = "slots-given",
      .content = (const char *[]){
                 "A hostfile was provided that contains multiple definitions of the slot",
                 "count for at least one node:",
                 "   hostfile:  %s",
                 "   node:      %s",
                 "You can either list a node multiple times, once for each slot, or you",
                 "can provide a single line that contains \"slot=N\". Mixing the two",
                 "methods is not supported.",
                 "Please correct the hostfile and try again.",
                 NULL}
    },

    { .topic = NULL, .content = NULL }
};

pmix_show_help_file_t prte_show_help_data[] = {
    { "help-prte-hwloc-base.txt", ini_entries_0},
    { "help-errmgr-base.txt", ini_entries_1},
    { "help-ess-base.txt", ini_entries_2},
    { "help-prte-odls-base.txt", ini_entries_3},
    { "help-prte-odls-default.txt", ini_entries_4},
    { "help-plm-base.txt", ini_entries_5},
    { "help-plm-lsf.txt", ini_entries_6},
    { "help-plm-pals.txt", ini_entries_7},
    { "help-plm-slurm.txt", ini_entries_8},
    { "help-plm-ssh.txt", ini_entries_9},
    { "help-plm-tm.txt", ini_entries_10},
    { "help-ras-base.txt", ini_entries_11},
    { "help-ras-gridengine.txt", ini_entries_12},
    { "help-ras-lsf.txt", ini_entries_13},
    { "help-ras-pbs.txt", ini_entries_14},
    { "help-ras-slurm.txt", ini_entries_15},
    { "help-prte-rmaps-base.txt", ini_entries_16},
    { "help-prte-rmaps-ppr.txt", ini_entries_17},
    { "help-rmaps_rank_file.txt", ini_entries_18},
    { "help-prte-rmaps-rr.txt", ini_entries_19},
    { "help-prte-rmaps-seq.txt", ini_entries_20},
    { "help-schizo-base.txt", ini_entries_21},
    { "help-schizo-ompi.txt", ini_entries_22},
    { "help-prte-info.txt", ini_entries_23},
    { "help-prte.txt", ini_entries_24},
    { "help-prted.txt", ini_entries_25},
    { "help-prterun.txt", ini_entries_26},
    { "help-prun.txt", ini_entries_27},
    { "help-pterm.txt", ini_entries_28},
    { "help-state-base.txt", ini_entries_29},
    { "help-oob-tcp.txt", ini_entries_30},
    { "help-prte-runtime.txt", ini_entries_31},
    { "help-dash-host.txt", ini_entries_32},
    { "help-prte-util.txt", ini_entries_33},
    { "help-hostfile.txt", ini_entries_34},
    { NULL, NULL }
};
