;;
;; Licensed to the Apache Software Foundation (ASF) under one
;; or more contributor license agreements.  See the NOTICE file
;; distributed with this work for additional information
;; regarding copyright ownership.  The ASF licenses this file
;; to you under the Apache License, Version 2.0 (the
;; "License"); you may not use this file except in compliance
;; with the License.  You may obtain a copy of the License at
;; 
;;   http://www.apache.org/licenses/LICENSE-2.0
;; 
;; Unless required by applicable law or agreed to in writing,
;; software distributed under the License is distributed on an
;; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
;; KIND, either express or implied.  See the License for the
;; specific language governing permissions and limitations
;; under the License.
;;


  +----------+          +----------+          +----------+
  |QDR.A     |          |QDR.B     |          |QDR.C     |
  |port:     |          |port:     |          |port:     |
  | 20001    |--------->| 20002    |--------->| 20003    |
  |          |          |          |          |          |
  |          |          |          |          |          |
  +----------+          +----------+          +----------+

 * The direction of the arrow shows the direction of the connection setup
   Connector --> Listener
