docs: static JmsDestinationImpl getJMSReplyToInternal(JsJmsMessage _msg, List<SIDestinationAddress> rrp, SICoreConnection _siConn) throws JMSException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "getJMSReplyToInternal", new Object[] { _msg, rrp, _siConn });
  
          JmsDestinationImpl tempReplyTo = null;
  
          // Case a) - check for JMS specific data in compressed byte form.
          byte[] replyURIBytes = _msg.getJmsReplyTo();
  
          if (replyURIBytes != null) {
              tempReplyTo = (JmsDestinationImpl) JmsInternalsFactory.getMessageDestEncodingUtils().getDestinationFromMsgRepresentation(replyURIBytes);
          }
  
          if (tempReplyTo == null) {
              // Cases b) & c) both depend on there being a reverse routing path, otherwise
              // there is no replyTo.
  
              // lookup the name of the dest in the reverse routing path
              SIDestinationAddress sida = null;
  
              if (rrp.size() > 0) {
  
                  // The last element of the RRP becomes the reply to destination
                  int lastDestInRRP = rrp.size() - 1;
                  sida = rrp.get(lastDestInRRP);
  
                  // Case b) - if we have a live connection, we can use that to query the dest type
                  if (_siConn != null) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                          SibTr.debug(tc, "Determine reply dest type using SICoreConnection");
                      try {
  
                          // get the destination configuration & type
                          DestinationConfiguration destConfig = _siConn.getDestinationConfiguration(sida);
                          DestinationType destType = destConfig.getDestinationType();
  
                          if (destType == DestinationType.TOPICSPACE) {
                              tempReplyTo = new JmsTopicImpl();
                          }
                          else {
                              tempReplyTo = new JmsQueueImpl();
                          }
                      } catch (SIException sice) {
                          // No FFDC code needed
                          // d246604 Trace exceptions, but don't throw on. Fall back to
                          // case c) below.
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                              SibTr.debug(tc, "failed to look up dest type because of " + sice);
                              SibTr.debug(tc, "detail ", sice);
                          }
                      }
                  }
  
                  // Case c) - Guess based on the discriminator
                  if (tempReplyTo == null) {
                      // 239238 - make a stab at determining whether it's a queue or topic
                      // reply destination based on the reply disciminator.
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                          SibTr.debug(tc, "Guess reply dest type using reply discriminator");
  
                      String replyDiscrim = _msg.getReplyDiscriminator();
                      if ((replyDiscrim == null) || ("".equals(replyDiscrim))) {
                          tempReplyTo = new JmsQueueImpl();
                      }
                      else {
                          tempReplyTo = new JmsTopicImpl();
                      }
                  }
              }
          }
  
          // Now fill in the fields that were hidden in the reply header.
          if (tempReplyTo != null) {
              populateReplyToFromHeader(tempReplyTo, _msg, rrp);
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "getJMSReplyToInternal", tempReplyTo);
          return tempReplyTo;
      }