diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ee5cb0a361f537ecfd6425fa02fe71fcf566e163..ba3f81e434b808caac7e8e5df6cc7ad950baa71d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,7 +19,10 @@ config-u-18_04:
   stage: config
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
+    - git clone https://gitlab.ikp.kit.edu/AirShowerPhysics/corsika-data.git    
     - mkdir build
     - cd build
     - cmake .. -DCMAKE_BUILD_TYPE=Debug -DWITH_PYTHIA=ON
@@ -27,6 +30,7 @@ config-u-18_04:
     expire_in: 1 day
     paths:
        - build
+       - corsika-data
 
 # job/stage to just prepare cmake
 config-clang-8:
@@ -34,7 +38,10 @@ config-clang-8:
   stage: config
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_BUILDS_DIR}/AirShowerPhysics/corsika/corsika-data/"
   script:
+    - git clone https://gitlab.ikp.kit.edu/AirShowerPhysics/corsika-data.git
     - mkdir build
     - cd build
     - cmake .. -DCMAKE_BUILD_TYPE=Debug -DWITH_PYTHIA=ON
@@ -42,6 +49,7 @@ config-clang-8:
     expire_in: 1 day
     paths:
        - build
+       - corsika-data
 
 # normal pipeline for each commit
 build-test-u-18_04: 
@@ -51,6 +59,8 @@ build-test-u-18_04:
   stage: build_test
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
     - cd build
     - cmake --build . -- -j4
@@ -73,6 +83,8 @@ build-test-clang-8:
   stage: build_test
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
     - cd build
     - cmake --build . -- -j4
@@ -95,6 +107,8 @@ release-u-18_04:
   stage: optional
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
     - cd build
     - cmake .. -DCMAKE_BUILD_TYPE=Release
@@ -119,6 +133,8 @@ release-clang-8:
   stage: optional
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
     - cd build
     - cmake .. -DCMAKE_BUILD_TYPE=Release
@@ -143,6 +159,8 @@ release-clang-8:
   stage: optional
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
     - cd build
     - cmake .. -DCMAKE_BUILD_TYPE=Coverage
@@ -176,6 +194,8 @@ documentation:
   stage: optional
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
     - cd build
     - cmake --build . --target doxygen -- -j4
@@ -196,6 +216,8 @@ sanity:
   stage: optional
   tags:
     - corsika
+  variables:
+    CORSIKA_DATA: "${CI_PROJECT_DIR}/corsika-data/"
   script:
     - cd build
     - cmake .. -DWITH_CORSIKA_SANITIZERS_ENABLED=ON
diff --git a/Processes/CMakeLists.txt b/Processes/CMakeLists.txt
index 758b430e677109de684eaa52f081c6a74bd09c3d..9ca109dee4bbef7442de84944047730ffa0ba98c 100644
--- a/Processes/CMakeLists.txt
+++ b/Processes/CMakeLists.txt
@@ -4,6 +4,7 @@ add_subdirectory (NullModel)
 add_subdirectory (TrackingLine) 
 # hadron interaction models
 add_subdirectory (Sibyll)
+add_subdirectory (QGSJetII)
 if (PYTHIA8_FOUND)
   add_subdirectory (Pythia)
 endif (PYTHIA8_FOUND)
diff --git a/Processes/QGSJetII/CMakeLists.txt b/Processes/QGSJetII/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fbffc94be2a8f822e76232476ad9083006c32aaa
--- /dev/null
+++ b/Processes/QGSJetII/CMakeLists.txt
@@ -0,0 +1,132 @@
+set(Python_ADDITIONAL_VERSIONS 3)
+find_package(PythonInterp 3 REQUIRED)
+
+if (NOT DEFINED ENV{CORSIKA_DATA})
+  message (WARNING "WARNING: download corsika-data repository from gitlab for needed data tables, and set CORSIKA_DATA path!")
+endif ()
+
+add_custom_command (
+  OUTPUT  ${PROJECT_BINARY_DIR}/Processes/QGSJetII/Generated.inc
+  COMMAND ${PROJECT_SOURCE_DIR}/Processes/QGSJetII/code_generator.py 
+          ${PROJECT_BINARY_DIR}/Framework/Particles/particle_db.pkl
+          ${PROJECT_SOURCE_DIR}/Processes/QGSJetII/qgsjet-II-04-codes.dat
+  DEPENDS code_generator.py
+          qgsjet-II-04-codes.dat
+          ${PROJECT_BINARY_DIR}/Framework/Particles/particle_db.pkl
+  WORKING_DIRECTORY
+          ${PROJECT_BINARY_DIR}/Processes/QGSJetII/
+  COMMENT "Generate conversion tables for particle codes QGSJetII <-> CORSIKA"
+  VERBATIM
+  )
+  
+set (
+  MODEL_SOURCES
+  ParticleConversion.cc
+  Interaction.cc
+  qgsjet-II-04.f
+  qgsjet-II-04.cc
+  )
+
+set (
+  MODEL_HEADERS
+  ParticleConversion.h
+  qgsjet-II-04.h
+  QGSJetIIStack.h
+  QGSJetIIFragmentsStack.h
+  Interaction.h
+  ${PROJECT_BINARY_DIR}/Processes/QGSJetII/Generated.inc
+  )
+
+set (
+  MODEL_NAMESPACE
+  corsika/process/qgsjetII
+  )
+
+add_library (ProcessQGSJetII STATIC ${MODEL_SOURCES})
+CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessQGSJetII ${MODEL_NAMESPACE} ${MODEL_HEADERS})
+
+# ....................................................
+# since Generated.inc is an automatically produced file in the build directory,
+# create a symbolic link into the source tree, so that it can be found and edited more easily
+# this is not needed for the build to succeed! .......
+add_custom_command (
+  OUTPUT  ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc
+  COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_BINARY_DIR}/include/corsika/process/qgsjetII/Generated.inc ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc
+  COMMENT "Generate link in source-dir: ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc"
+  )
+add_custom_target (SourceDirLinkQgsII DEPENDS ${PROJECT_BINARY_DIR}/Processes/QGSJetII/Generated.inc)
+add_dependencies (ProcessQGSJetII SourceDirLinkQgsII)
+# .....................................................
+
+
+
+set_target_properties (
+  ProcessQGSJetII
+  PROPERTIES
+  VERSION ${PROJECT_VERSION}
+  SOVERSION 1
+  )
+
+# target dependencies on other libraries (also the header onlys)
+target_link_libraries (
+  ProcessQGSJetII
+  CORSIKAprocesssequence
+  CORSIKAparticles
+  CORSIKAutilities
+  CORSIKAunits
+  CORSIKAthirdparty
+  CORSIKAgeometry
+  CORSIKAenvironment
+  )
+
+target_include_directories (
+  ProcessQGSJetII 
+  INTERFACE 
+  $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
+  $<INSTALL_INTERFACE:include/include>
+  )
+
+install (
+  TARGETS ProcessQGSJetII
+  LIBRARY DESTINATION lib
+  ARCHIVE DESTINATION lib
+  )
+
+# install(
+#    FILES qgsdat-II-04 sectnu-II-04 DESTINATION etc/data
+# )
+
+
+# --------------------
+# code unit testing
+CORSIKA_ADD_TEST(testQGSJetII
+  SOURCES
+  testQGSJetII.cc
+  ${MODEL_HEADERS}
+)
+
+target_link_libraries (
+  testQGSJetII
+  ProcessQGSJetII
+  CORSIKAsetup
+  CORSIKArandom
+  CORSIKAgeometry
+  CORSIKAunits
+  CORSIKAtesting
+  )
+
+# also provide QGSJetII large data tables for testing in build tree (links)
+# -> changed that to use environment variable "${CORSIKA_DATA}/QGSJetII"
+# add_custom_command (
+#  OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/qgsdat-II-04 ${CMAKE_CURRENT_BINARY_DIR}/sectnu-II-04
+#  COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/qgsdat-II-04 ${CMAKE_CURRENT_BINARY_DIR}/qgsdat-II-04
+#  COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/sectnu-II-04 ${CMAKE_CURRENT_BINARY_DIR}/sectnu-II-04
+#  COMMENT "Generate link in source-dir: qgsjet-II-04"
+#  )
+
+# add_custom_target (QGSJetDataLink DEPENDS
+#  ${CMAKE_CURRENT_BINARY_DIR}/qgsdat-II-04
+#  ${CMAKE_CURRENT_BINARY_DIR}/sectnu-II-04
+#  )
+
+# add_dependencies (testQGSJetII QGSJetDataLink)
diff --git a/Processes/QGSJetII/Interaction.cc b/Processes/QGSJetII/Interaction.cc
new file mode 100644
index 0000000000000000000000000000000000000000..d9b4c3cea53a6479330992d0bc195d6c838ac418
--- /dev/null
+++ b/Processes/QGSJetII/Interaction.cc
@@ -0,0 +1,389 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#include <corsika/process/qgsjetII/Interaction.h>
+
+#include <corsika/environment/Environment.h>
+#include <corsika/environment/NuclearComposition.h>
+#include <corsika/geometry/QuantityVector.h>
+#include <corsika/geometry/FourVector.h>
+#include <corsika/process/qgsjetII/ParticleConversion.h>
+#include <corsika/process/qgsjetII/QGSJetIIFragmentsStack.h>
+#include <corsika/process/qgsjetII/QGSJetIIStack.h>
+#include <corsika/process/qgsjetII/qgsjet-II-04.h>
+#include <corsika/setup/SetupStack.h>
+#include <corsika/setup/SetupTrajectory.h>
+#include <corsika/utl/COMBoost.h>
+
+#include <sstream>
+#include <string>
+#include <tuple>
+
+using std::cout;
+using std::endl;
+using std::ostringstream;
+using std::string;
+using std::tuple;
+
+using namespace corsika;
+using namespace corsika::setup;
+using SetupParticle = setup::Stack::StackIterator;
+using SetupProjectile = setup::StackView::StackIterator;
+using Track = Trajectory;
+
+namespace corsika::process::qgsjetII {
+
+  Interaction::Interaction(const string& dataPath)
+      : data_path_(dataPath) {
+    if (dataPath == "") {
+      if (std::getenv("CORSIKA_DATA")) {
+        data_path_ = string(std::getenv("CORSIKA_DATA")) + "/QGSJetII/";
+        cout << "Searching for QGSJetII data tables in " << data_path_ << endl;
+      }
+    }
+  }
+
+  Interaction::~Interaction() { cout << "QgsjetII::Interaction n=" << count_ << endl; }
+
+  void Interaction::Init() {
+
+    using random::RNGManager;
+
+    // initialize QgsjetII
+    if (!initialized_) {
+      qgset_();
+      datadir DIR(data_path_);
+      qgaini_(DIR.data);
+      initialized_ = true;
+    }
+  }
+
+  units::si::CrossSectionType Interaction::GetCrossSection(
+      const particles::Code beamId, const particles::Code targetId,
+      const units::si::HEPEnergyType Elab, const unsigned int Abeam,
+      const unsigned int targetA) const {
+    using namespace units::si;
+    double sigProd = std::numeric_limits<double>::infinity();
+
+    if (process::qgsjetII::CanInteract(beamId)) {
+
+      const int iBeam = process::qgsjetII::GetQgsjetIIXSCode(beamId);
+      int iTarget = 1;
+      if (particles::IsNucleus(targetId)) {
+        iTarget = targetA;
+        if (iTarget > maxMassNumber_ || iTarget <= 0) {
+          std::ostringstream txt;
+          txt << "QgsjetII target outside range. iTarget=" << iTarget;
+          throw std::runtime_error(txt.str().c_str());
+        }
+      }
+      int iProjectile = 1;
+      if (particles::IsNucleus(beamId)) {
+        iProjectile = Abeam;
+        if (iProjectile > maxMassNumber_ || iProjectile <= 0)
+          throw std::runtime_error("QgsjetII target outside range. ");
+      }
+
+      cout << "QgsjetII::GetCrossSection Elab=" << Elab << " iBeam=" << iBeam
+           << " iProjectile=" << iProjectile << " iTarget=" << iTarget << endl;
+      sigProd = qgsect_(Elab / 1_GeV, iBeam, iProjectile, iTarget);
+      cout << "QgsjetII::GetCrossSection sigProd=" << sigProd << endl;
+    }
+
+    return sigProd * 1_mb;
+  }
+
+  template <>
+  units::si::GrammageType Interaction::GetInteractionLength(
+      SetupParticle const& vP) const {
+
+    using namespace units;
+    using namespace units::si;
+    using namespace geometry;
+
+    // coordinate system, get global frame of reference
+    CoordinateSystem& rootCS =
+        RootCoordinateSystem::GetInstance().GetRootCoordinateSystem();
+
+    const particles::Code corsikaBeamId = vP.GetPID();
+
+    // beam particles for qgsjetII : 1, 2, 3 for p, pi, k
+    // read from cross section code table
+    const bool kInteraction = process::qgsjetII::CanInteract(corsikaBeamId);
+
+    // FOR NOW: assume target is at rest
+    MomentumVector pTarget(rootCS, {0_GeV, 0_GeV, 0_GeV});
+
+    // total momentum and energy
+    HEPEnergyType Elab = vP.GetEnergy();
+
+    cout << "Interaction: LambdaInt: \n"
+         << " input energy: " << vP.GetEnergy() / 1_GeV << endl
+         << " beam can interact:" << kInteraction << endl
+         << " beam pid:" << vP.GetPID() << endl;
+
+    if (kInteraction) {
+
+      int Abeam = 0;
+      if (particles::IsNucleus(vP.GetPID())) Abeam = vP.GetNuclearA();
+
+      // get target from environment
+      /*
+        the target should be defined by the Environment,
+        ideally as full particle object so that the four momenta
+        and the boosts can be defined..
+      */
+
+      auto const* currentNode = vP.GetNode();
+      const auto& mediumComposition =
+          currentNode->GetModelProperties().GetNuclearComposition();
+
+      si::CrossSectionType weightedProdCrossSection = mediumComposition.WeightedSum(
+          [=](particles::Code targetID) -> si::CrossSectionType {
+            int targetA = 0;
+            if (corsika::particles::IsNucleus(targetID))
+              targetA = particles::GetNucleusA(targetID);
+            return GetCrossSection(corsikaBeamId, targetID, Elab, Abeam, targetA);
+          });
+
+      cout << "Interaction: "
+           << "IntLength: weighted CrossSection (mb): " << weightedProdCrossSection / 1_mb
+           << endl;
+
+      // calculate interaction length in medium
+      GrammageType const int_length = mediumComposition.GetAverageMassNumber() *
+                                      units::constants::u / weightedProdCrossSection;
+      cout << "Interaction: "
+           << "interaction length (g/cm2): " << int_length / (0.001_kg) * 1_cm * 1_cm
+           << endl;
+
+      return int_length;
+    }
+
+    return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm);
+  }
+
+  /**
+     In this function QGSJETII is called to produce one event. The
+     event is copied (and boosted) into the shower lab frame.
+   */
+
+  template <>
+  process::EProcessReturn Interaction::DoInteraction(SetupProjectile& vP) {
+
+    using namespace units;
+    using namespace utl;
+    using namespace units::si;
+    using namespace geometry;
+
+    const auto corsikaBeamId = vP.GetPID();
+    cout << "ProcessQgsjetII: "
+         << "DoInteraction: " << corsikaBeamId << " interaction? "
+         << process::qgsjetII::CanInteract(corsikaBeamId) << endl;
+
+    if (process::qgsjetII::CanInteract(corsikaBeamId)) {
+
+      const CoordinateSystem& rootCS =
+          RootCoordinateSystem::GetInstance().GetRootCoordinateSystem();
+
+      // position and time of interaction, not used in QgsjetII
+      Point pOrig = vP.GetPosition();
+      TimeType tOrig = vP.GetTime();
+
+      // define target
+      // for QgsjetII is always a single nucleon
+      // FOR NOW: target is always at rest
+      const auto targetEnergyLab = 0_GeV + constants::nucleonMass;
+      const auto targetMomentumLab = MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV);
+      const FourVector PtargLab(targetEnergyLab, targetMomentumLab);
+
+      // define projectile
+      HEPEnergyType const projectileEnergyLab = vP.GetEnergy();
+      auto const projectileMomentumLab = vP.GetMomentum();
+
+      int beamA = 0;
+      if (particles::IsNucleus(corsikaBeamId)) beamA = vP.GetNuclearA();
+
+      cout << "Interaction: ebeam lab: " << projectileEnergyLab / 1_GeV << endl
+           << "Interaction: pbeam lab: " << projectileMomentumLab.GetComponents() / 1_GeV
+           << endl;
+      cout << "Interaction: etarget lab: " << targetEnergyLab / 1_GeV << endl
+           << "Interaction: ptarget lab: " << targetMomentumLab.GetComponents() / 1_GeV << endl;
+
+      cout << "Interaction: position of interaction: " << pOrig.GetCoordinates() << endl;
+      cout << "Interaction: time: " << tOrig << endl;
+
+      // sample target mass number
+      auto const* currentNode = vP.GetNode();
+      auto const& mediumComposition =
+          currentNode->GetModelProperties().GetNuclearComposition();
+      // get cross sections for target materials
+      /*
+        Here we read the cross section from the interaction model again,
+        should be passed from GetInteractionLength if possible
+       */
+      auto const& compVec = mediumComposition.GetComponents();
+      std::vector<si::CrossSectionType> cross_section_of_components(compVec.size());
+
+      for (size_t i = 0; i < compVec.size(); ++i) {
+        auto const targetId = compVec[i];
+        int targetA = 0;
+        if (corsika::particles::IsNucleus(targetId))
+          targetA = particles::GetNucleusA(targetId);
+        const auto sigProd =
+            GetCrossSection(corsikaBeamId, targetId, projectileEnergyLab, beamA, targetA);
+        cross_section_of_components[i] = sigProd;
+      }
+
+      const auto targetCode =
+          mediumComposition.SampleTarget(cross_section_of_components, fRNG);
+      cout << "Interaction: target selected: " << targetCode << endl;
+
+      int targetQgsCode = -1;
+      if (particles::IsNucleus(targetCode))
+        targetQgsCode = particles::GetNucleusA(targetCode);
+      if (targetCode == particles::Proton::GetCode()) targetQgsCode = 1;
+      cout << "Interaction: target qgsjetII code/A: " << targetQgsCode << endl;
+      if (targetQgsCode > maxMassNumber_ || targetQgsCode < 1)
+        throw std::runtime_error("QgsjetII target outside range.");
+
+      int projQgsCode = 1;
+      if (particles::IsNucleus(corsikaBeamId)) projQgsCode = vP.GetNuclearA();
+      cout << "Interaction: projectile qgsjetII code/A: " << projQgsCode << " "
+           << corsikaBeamId << endl;
+      if (projQgsCode > maxMassNumber_ || projQgsCode < 1)
+        throw std::runtime_error("QgsjetII target outside range.");
+
+      // beam id for qgsjetII
+      int kBeam = 2; // default: proton Shouldn't we randomize neutron/proton for nuclei?
+      if (corsikaBeamId != particles::Code::Nucleus) {
+        kBeam = process::qgsjetII::ConvertToQgsjetIIRaw(corsikaBeamId);
+        // from conex
+        if (kBeam == 0) { // replace pi0 or rho0 with pi+/pi-
+          static int select = 1;
+          kBeam = select;
+          select *= -1;
+        }
+        // replace lambda by neutron
+        if (kBeam == 6)
+          kBeam = 3;
+        else if (kBeam == -6)
+          kBeam = -3;
+        // else if (abs(kBeam)>6) -> throw
+      }
+
+      cout << "Interaction: "
+           << " DoInteraction: E(GeV):" << projectileEnergyLab / 1_GeV << endl;
+      count_++;
+      qgini_(projectileEnergyLab / 1_GeV, kBeam, projQgsCode, targetQgsCode);
+      // this is from CRMC, is this REALLY needed ???
+      qgini_(projectileEnergyLab / 1_GeV, kBeam, projQgsCode, targetQgsCode);
+      qgconf_();
+      
+      // bookkeeping
+      MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV});
+      HEPEnergyType Elab_final = 0_GeV;
+
+      // to read the secondaries
+      // define rotation to and from CoM frame
+      // CoM frame definition in QgsjetII projectile: +z
+      auto const& originalCS = projectileMomentumLab.GetCoordinateSystem();
+      geometry::CoordinateSystem const zAxisFrame =
+	originalCS.RotateToZ(projectileMomentumLab);
+      
+      // fragments
+      QGSJetIIFragmentsStack qfs;
+      for (auto& fragm : qfs) {
+        particles::Code idFragm = particles::Code::Nucleus;
+        int A = fragm.GetFragmentSize();
+        int Z = 0;
+        switch (A) {
+          case 1: { // proton/neutron
+            idFragm = particles::Code::Proton;
+
+	    auto momentum = geometry::Vector(
+					     zAxisFrame,
+					     corsika::geometry::QuantityVector<hepmomentum_d>{0.0_GeV, 0.0_GeV,
+						 sqrt((projectileEnergyLab + particles::Proton::GetMass()) *
+						      (projectileEnergyLab - particles::Proton::GetMass()))});
+	    
+	    auto const energy = sqrt(momentum.squaredNorm() + square(particles::GetMass(idFragm)));	    
+	    momentum.rebase(originalCS); // transform back into standard lab frame
+	    std::cout << "secondary fragment> id=" << idFragm << " p=" << momentum.GetComponents() << std::endl;
+            auto pnew = vP.AddSecondary(
+                tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
+                      geometry::Point, units::si::TimeType>{
+		  idFragm, energy, momentum, pOrig, tOrig});
+            Plab_final += pnew.GetMomentum();
+            Elab_final += pnew.GetEnergy();
+          } break;
+          case 2: // deuterium
+            Z = 1;
+            break;
+          case 3: // tritium
+            Z = 1;
+            break;
+          case 4: // helium
+            Z = 2;
+            break;
+          default: // nucleus
+          {
+            Z = int(A / 2.15 + 0.7);
+          }
+        }
+
+        if (idFragm == particles::Code::Nucleus) {
+	    auto momentum = geometry::Vector(
+					     zAxisFrame,
+					     geometry::QuantityVector<hepmomentum_d>{0.0_GeV, 0.0_GeV,
+						 sqrt((projectileEnergyLab + constants::nucleonMass * A) *
+						      (projectileEnergyLab - constants::nucleonMass * A))});
+	    
+	    auto const energy = sqrt(momentum.squaredNorm() + square(constants::nucleonMass*A));	    
+	    momentum.rebase(originalCS); // transform back into standard lab frame
+	    std::cout << "secondary fragment> id=" << idFragm << " p=" << momentum.GetComponents() << " A=" << A << " Z=" << Z << std::endl;
+            auto pnew = vP.AddSecondary(
+                tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
+		geometry::Point, units::si::TimeType, unsigned short, unsigned short>{
+		  idFragm, energy, momentum, pOrig, tOrig, A, Z});
+            Plab_final += pnew.GetMomentum();
+            Elab_final += pnew.GetEnergy();
+        }
+      }
+
+      // secondaries
+      QGSJetIIStack qs;
+      for (auto& psec : qs) {
+
+        auto momentum = psec.GetMomentum(zAxisFrame);
+        auto const energy = psec.GetEnergy();
+
+	momentum.rebase(originalCS); // transform back into standard lab frame
+	std::cout << "secondary fragment> id=" << process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()) << " p=" << momentum.GetComponents() << std::endl;
+	auto pnew = vP.AddSecondary(
+				    tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
+				    geometry::Point, units::si::TimeType>{
+		  process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()), energy, momentum, pOrig, tOrig});
+	Plab_final += pnew.GetMomentum();
+	Elab_final += pnew.GetEnergy();
+      }
+      cout << "conservation (all GeV): Ecm_final= n/a" /* << Ecm_final / 1_GeV*/ << endl
+           << "Elab_final=" << Elab_final / 1_GeV
+           << ", Plab_final=" << (Plab_final / 1_GeV).GetComponents()
+           << ", N_wounded,targ="
+           << QGSJetIIFragmentsStackData::GetWoundedNucleonsTarget()
+           << ", N_wounded,proj="
+           << QGSJetIIFragmentsStackData::GetWoundedNucleonsProjectile()
+           << ", N_fragm,proj=" << qfs.GetSize() << endl;
+    }
+    return process::EProcessReturn::eOk;
+  }
+
+} // namespace corsika::process::qgsjetII
diff --git a/Processes/QGSJetII/Interaction.h b/Processes/QGSJetII/Interaction.h
new file mode 100644
index 0000000000000000000000000000000000000000..3ae93106c50286fed7f9a06631e85b47e292d302
--- /dev/null
+++ b/Processes/QGSJetII/Interaction.h
@@ -0,0 +1,66 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#ifndef _corsika_process_qgsjetII_interaction_h_
+#define _corsika_process_qgsjetII_interaction_h_
+
+#include <corsika/particles/ParticleProperties.h>
+#include <corsika/process/InteractionProcess.h>
+#include <corsika/random/RNGManager.h>
+#include <corsika/units/PhysicalUnits.h>
+
+#include <string>
+
+namespace corsika::process::qgsjetII {
+
+  class Interaction : public corsika::process::InteractionProcess<Interaction> {
+
+    std::string data_path_;
+    int count_ = 0;
+    bool initialized_ = false;
+
+  public:
+    Interaction(const std::string& dataPath = "");
+    ~Interaction();
+
+    void Init();
+
+    bool WasInitialized() { return initialized_; }
+    int GetMaxTargetMassNumber() const { return maxMassNumber_; }
+    bool IsValidTarget(corsika::particles::Code TargetId) const {
+      return (corsika::particles::GetNucleusA(TargetId) < maxMassNumber_) &&
+             corsika::particles::IsNucleus(TargetId);
+    }
+
+    corsika::units::si::CrossSectionType GetCrossSection(
+        const corsika::particles::Code, const corsika::particles::Code,
+        const corsika::units::si::HEPEnergyType, const unsigned int Abeam = 0,
+        const unsigned int Atarget = 0) const;
+
+    template <typename TParticle>
+    corsika::units::si::GrammageType GetInteractionLength(TParticle const&) const;
+
+    /**
+       In this function QGSJETII is called to produce one event. The
+       event is copied (and boosted) into the shower lab frame.
+     */
+
+    template <typename TProjectile>
+    corsika::process::EProcessReturn DoInteraction(TProjectile&);
+
+  private:
+    corsika::random::RNG& fRNG =
+        corsika::random::RNGManager::GetInstance().GetRandomStream("qgran");
+    const int maxMassNumber_ = 208;
+  };
+
+} // namespace corsika::process::qgsjetII
+
+#endif
diff --git a/Processes/QGSJetII/ParticleConversion.cc b/Processes/QGSJetII/ParticleConversion.cc
new file mode 100644
index 0000000000000000000000000000000000000000..266ebc5567671acc0616a7a84f83f2201ddbb15f
--- /dev/null
+++ b/Processes/QGSJetII/ParticleConversion.cc
@@ -0,0 +1,14 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#include <corsika/particles/ParticleProperties.h>
+#include <corsika/process/qgsjetII/ParticleConversion.h>
+
+using namespace corsika::process::qgsjetII;
diff --git a/Processes/QGSJetII/ParticleConversion.h b/Processes/QGSJetII/ParticleConversion.h
new file mode 100644
index 0000000000000000000000000000000000000000..1a89658666deda150d5131c6bc0c01e06951174a
--- /dev/null
+++ b/Processes/QGSJetII/ParticleConversion.h
@@ -0,0 +1,56 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#ifndef _include_processes_qgsjetII_particles_h_
+#define _include_processes_qgsjetII_particles_h_
+
+#include <corsika/particles/ParticleProperties.h>
+
+#include <string>
+
+namespace corsika::process::qgsjetII {
+
+  enum class QgsjetIICode : int8_t;
+  using QgsjetIICodeIntType = std::underlying_type<QgsjetIICode>::type;
+
+#include <corsika/process/qgsjetII/Generated.inc>
+
+  QgsjetIICode constexpr ConvertToQgsjetII(corsika::particles::Code pCode) {
+    return static_cast<QgsjetIICode>(
+        corsika2qgsjetII[static_cast<corsika::particles::CodeIntType>(pCode)]);
+  }
+
+  corsika::particles::Code constexpr ConvertFromQgsjetII(QgsjetIICode pCode) {
+    auto const pCodeInt = static_cast<QgsjetIICodeIntType>(pCode);
+    auto const corsikaCode = qgsjetII2corsika[pCodeInt - minQgsjetII];
+    if (corsikaCode == corsika::particles::Code::Unknown) {
+      throw std::runtime_error(std::string("QGSJETII/CORSIKA conversion of pCodeInt=")
+                                   .append(std::to_string(pCodeInt))
+                                   .append(" impossible"));
+    }
+    return corsikaCode;
+  }
+
+  int constexpr ConvertToQgsjetIIRaw(corsika::particles::Code pCode) {
+    return static_cast<int>(ConvertToQgsjetII(pCode));
+  }
+
+  int constexpr GetQgsjetIIXSCode(corsika::particles::Code pCode) {
+    if (pCode == corsika::particles::Code::Nucleus) return 2;
+    return corsika2qgsjetIIXStype[static_cast<corsika::particles::CodeIntType>(pCode)];
+  }
+
+  bool constexpr CanInteract(corsika::particles::Code pCode) {
+    return (GetQgsjetIIXSCode(pCode) > 0) && (ConvertToQgsjetIIRaw(pCode) <= 5);
+  }
+
+} // namespace corsika::process::qgsjetII
+
+#endif
diff --git a/Processes/QGSJetII/QGSJetIIFragmentsStack.h b/Processes/QGSJetII/QGSJetIIFragmentsStack.h
new file mode 100644
index 0000000000000000000000000000000000000000..7704c19fc058ea82198b7a0462467624b5de1c3a
--- /dev/null
+++ b/Processes/QGSJetII/QGSJetIIFragmentsStack.h
@@ -0,0 +1,80 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#ifndef _include_qgsjetIIfragmentsstack_h_
+#define _include_qgsjetIIfragmentsstack_h_
+
+#include <corsika/geometry/RootCoordinateSystem.h>
+#include <corsika/geometry/Vector.h>
+#include <corsika/process/qgsjetII/ParticleConversion.h>
+#include <corsika/process/qgsjetII/qgsjet-II-04.h>
+#include <corsika/stack/Stack.h>
+#include <corsika/units/PhysicalUnits.h>
+
+namespace corsika::process::qgsjetII {
+
+  class QGSJetIIFragmentsStackData {
+
+  public:
+    void Init();
+    void Dump() const {}
+
+    void Clear() {
+      qgarr13_.nsf = 0;
+      qgarr55_.nwt = 0;
+    }
+    unsigned int GetSize() const { return qgarr13_.nsf; }
+    unsigned int GetCapacity() const { return iapmax; }
+
+    static unsigned int GetWoundedNucleonsTarget() { return qgarr55_.nwt; }
+    static unsigned int GetWoundedNucleonsProjectile() { return qgarr55_.nwp; }
+
+    int GetFragmentSize(const unsigned int i) const { return qgarr13_.iaf[i]; }
+    void SetFragmentSize(const unsigned int i, const int v) { qgarr13_.iaf[i] = v; }
+
+    void Copy(const unsigned int i1, const unsigned int i2) {
+      qgarr13_.iaf[i2] = qgarr13_.iaf[i1];
+    }
+
+    void Swap(const unsigned int i1, const unsigned int i2) {
+      std::swap(qgarr13_.iaf[i1], qgarr13_.iaf[i2]);
+    }
+
+    void IncrementSize() { qgarr13_.nsf++; }
+    void DecrementSize() {
+      if (qgarr13_.nsf > 0) { qgarr13_.nsf--; }
+    }
+  };
+
+  template <typename StackIteratorInterface>
+  class FragmentsInterface : public corsika::stack::ParticleBase<StackIteratorInterface> {
+
+    using corsika::stack::ParticleBase<StackIteratorInterface>::GetStackData;
+    using corsika::stack::ParticleBase<StackIteratorInterface>::GetIndex;
+
+  public:
+    void SetParticleData(const int vSize) { SetFragmentSize(vSize); }
+
+    void SetParticleData(FragmentsInterface<StackIteratorInterface>& /*parent*/,
+                         const int vSize) {
+      SetFragmentSize(vSize);
+    }
+
+    void SetFragmentSize(const int v) { GetStackData().SetFragmentSize(GetIndex(), v); }
+
+    double GetFragmentSize() const { return GetStackData().GetFragmentSize(GetIndex()); }
+  };
+
+  typedef corsika::stack::Stack<QGSJetIIFragmentsStackData, FragmentsInterface>
+      QGSJetIIFragmentsStack;
+
+} // end namespace corsika::process::qgsjetII
+
+#endif
diff --git a/Processes/QGSJetII/QGSJetIIStack.h b/Processes/QGSJetII/QGSJetIIStack.h
new file mode 100644
index 0000000000000000000000000000000000000000..70288ef4e3c0ee1ffeea5978b0e11e77c70fdc57
--- /dev/null
+++ b/Processes/QGSJetII/QGSJetIIStack.h
@@ -0,0 +1,135 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#ifndef _include_qgsjetIIstack_h_
+#define _include_qgsjetIIstack_h_
+
+#include <corsika/geometry/CoordinateSystem.h>
+#include <corsika/geometry/Vector.h>
+#include <corsika/process/qgsjetII/ParticleConversion.h>
+#include <corsika/process/qgsjetII/qgsjet-II-04.h>
+#include <corsika/stack/Stack.h>
+#include <corsika/units/PhysicalUnits.h>
+
+namespace corsika::process::qgsjetII {
+
+  typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector;
+
+  class QGSJetIIStackData {
+
+  public:
+    void Init();
+    void Dump() const {}
+
+    void Clear() {
+      qgarr12_.nsp = 0;
+      qgarr13_.nsf = 0;
+      qgarr55_.nwt = 0;
+    }
+    unsigned int GetSize() const { return qgarr12_.nsp; }
+    unsigned int GetCapacity() const { return nptmax; }
+
+    void SetId(const unsigned int i, const int v) { qgarr14_.ich[i] = v; }
+    void SetEnergy(const unsigned int i, const corsika::units::si::HEPEnergyType v) {
+      using namespace corsika::units::si;
+      qgarr14_.esp[i][0] = v / 1_GeV;
+    }
+
+    void SetMomentum(const unsigned int i, const MomentumVector& v) {
+      using namespace corsika::units::si;
+      auto tmp = v.GetComponents();
+      qgarr14_.esp[i][2] = tmp[0] / 1_GeV;
+      qgarr14_.esp[i][3] = tmp[1] / 1_GeV;
+      qgarr14_.esp[i][1] = tmp[2] / 1_GeV;
+    }
+
+    int GetId(const unsigned int i) const { return qgarr14_.ich[i]; }
+    corsika::units::si::HEPEnergyType GetEnergy(const int i) const {
+      using namespace corsika::units::si;
+      return qgarr14_.esp[i][0] * 1_GeV;
+    }
+    MomentumVector GetMomentum(const unsigned int i, const corsika::geometry::CoordinateSystem& CS) const {
+      using namespace corsika::units::si;
+      geometry::QuantityVector<hepmomentum_d> components = {qgarr14_.esp[i][2] * 1_GeV,
+                                                  qgarr14_.esp[i][3] * 1_GeV,
+                                                  qgarr14_.esp[i][1] * 1_GeV};
+      return MomentumVector(CS, components);
+    }
+
+    void Copy(const unsigned int i1, const unsigned int i2) {
+      qgarr14_.ich[i2] = qgarr14_.ich[i1];
+      for (unsigned int i = 0; i < 4; ++i) qgarr14_.esp[i2][i] = qgarr14_.esp[i1][i];
+    }
+
+    void Swap(const unsigned int i1, const unsigned int i2) {
+      std::swap(qgarr14_.ich[i1], qgarr14_.ich[i2]);
+      for (unsigned int i = 0; i < 4; ++i)
+        std::swap(qgarr14_.esp[i1][i], qgarr14_.esp[i2][i]);
+    }
+
+    void IncrementSize() { qgarr12_.nsp++; }
+    void DecrementSize() {
+      if (qgarr12_.nsp > 0) { qgarr12_.nsp--; }
+    }
+  };
+
+  template <typename StackIteratorInterface>
+  class ParticleInterface : public corsika::stack::ParticleBase<StackIteratorInterface> {
+
+    using corsika::stack::ParticleBase<StackIteratorInterface>::GetStackData;
+    using corsika::stack::ParticleBase<StackIteratorInterface>::GetIndex;
+
+  public:
+    void SetParticleData(const int vID, 
+                         const corsika::units::si::HEPEnergyType vE,
+                         const MomentumVector& vP,
+                         const corsika::units::si::HEPMassType vM) {
+      SetPID(vID);
+      SetEnergy(vE);
+      SetMomentum(vP);
+    }
+
+    void SetParticleData(ParticleInterface<StackIteratorInterface>& /*parent*/,
+                         const int vID, 
+                         const corsika::units::si::HEPEnergyType vE,
+                         const MomentumVector& vP,
+                         const corsika::units::si::HEPMassType vM) {
+      SetPID(vID);
+      SetEnergy(vE);
+      SetMomentum(vP);
+    }
+
+    void SetEnergy(const corsika::units::si::HEPEnergyType v) {
+      GetStackData().SetEnergy(GetIndex(), v);
+    }
+
+    corsika::units::si::HEPEnergyType GetEnergy() const {
+      return GetStackData().GetEnergy(GetIndex());
+    }
+
+    void SetPID(const int v) { GetStackData().SetId(GetIndex(), v); }
+
+    corsika::process::qgsjetII::QgsjetIICode GetPID() const {
+      return static_cast<corsika::process::qgsjetII::QgsjetIICode>(
+          GetStackData().GetId(GetIndex()));
+    }
+
+    MomentumVector GetMomentum(const corsika::geometry::CoordinateSystem& CS) const { return GetStackData().GetMomentum(GetIndex(), CS); }
+
+    void SetMomentum(const MomentumVector& v) {
+      GetStackData().SetMomentum(GetIndex(), v);
+    }
+  };
+
+  typedef corsika::stack::Stack<QGSJetIIStackData, ParticleInterface> QGSJetIIStack;
+
+} // end namespace corsika::process::qgsjetII
+
+#endif
diff --git a/Processes/QGSJetII/code_generator.py b/Processes/QGSJetII/code_generator.py
new file mode 100755
index 0000000000000000000000000000000000000000..3b7113ec513e28fcb823fb1693cf83f6a6b6d545
--- /dev/null
+++ b/Processes/QGSJetII/code_generator.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+
+# (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+#
+# See file AUTHORS for a list of contributors.
+#
+# This software is distributed under the terms of the GNU General Public
+# Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+# the license.
+
+
+import pickle, sys, itertools
+
+
+
+# loads the pickled particle_db (which is an OrderedDict)
+def load_particledb(filename):
+    with open(filename, "rb") as f:
+        particle_db = pickle.load(f)
+    return particle_db
+
+
+
+# 
+def read_qgsjetII_codes(filename, particle_db):
+    with open(filename) as f:
+        for line in f:
+            line = line.strip()
+            if len(line)==0 or line[0] == '#':
+                continue
+            line = line.split('#')[0]
+            print (line)
+            identifier, model_code, xsType = line.split()
+            try:
+                particle_db[identifier]["qgsjetII_code"] = int(model_code)
+                particle_db[identifier]["qgsjetII_xsType"] = int(xsType)
+            except KeyError as e:
+                raise Exception("Identifier '{:s}' not found in particle_db".format(identifier))
+
+
+            
+
+# generates the enum to access qgsjetII particles by readable names
+def generate_qgsjetII_enum(particle_db):
+    output = "enum class QgsjetIICode : int8_t {\n"
+    for identifier, pData in particle_db.items():
+        if pData.get('qgsjetII_code') != None:
+            output += "  {:s} = {:d},\n".format(identifier, pData['qgsjetII_code'])
+    output += "};\n"
+    return output
+
+
+
+# generates the look-up table to convert corsika codes to qgsjetII codes
+def generate_corsika2qgsjetII(particle_db):    
+    string = "std::array<QgsjetIICodeIntType, {:d}> constexpr corsika2qgsjetII = {{\n".format(len(particle_db))
+    for identifier, pData in particle_db.items():
+        modelCode = pData.get("qgsjetII_code", 0)
+        string += "  {:d}, // {:s}\n".format(modelCode, identifier if modelCode else identifier + " (not implemented in QGSJETII)")
+    string += "};\n"
+    return string
+    
+
+
+# generates the look-up table to convert corsika codes to qgsjetII codes
+def generate_corsika2qgsjetII_xsType(particle_db):    
+    string = "std::array<int, {:d}> constexpr corsika2qgsjetIIXStype = {{\n".format(len(particle_db))
+    for identifier, pData in particle_db.items():
+        modelCodeXS = pData.get("qgsjetII_xsType", -1)
+        string += "  {:d}, // {:s}\n".format(modelCodeXS, identifier if modelCodeXS else identifier + " (not implemented in QGSJETII)")
+    string += "};\n"
+    return string
+
+
+# generates the look-up table to convert qgsjetII codes to corsika codes    
+def generate_qgsjetII2corsika(particle_db) :
+    minID = 0
+    for identifier, pData in particle_db.items() :
+        if 'qgsjetII_code' in pData:
+            minID = min(minID, pData['qgsjetII_code'])
+
+    string = "QgsjetIICodeIntType constexpr minQgsjetII = {:d};\n\n".format(minID)
+
+    pDict = {}
+    for identifier, pData in particle_db.items() :
+        if 'qgsjetII_code' in pData:
+            model_code = pData['qgsjetII_code'] - minID
+            pDict[model_code] = identifier
+    
+    nPart = max(pDict.keys()) - min(pDict.keys()) + 1
+    string += "std::array<corsika::particles::Code, {:d}> constexpr qgsjetII2corsika = {{\n".format(nPart)
+    
+    for iPart in range(nPart) :
+        identifier = pDict.get(iPart, "Unknown")
+        qgsID = iPart + minID
+        string += "  corsika::particles::Code::{:s}, // {:d} \n".format(identifier, qgsID)
+    
+    string += "};\n"
+    return string
+
+if __name__ == "__main__":
+    if len(sys.argv) != 3:
+        print("usage: {:s} <particle_db.pkl> <qgsjetII_codes.dat>".format(sys.argv[0]), file=sys.stderr)
+        sys.exit(1)
+        
+    print("code_generator.py for QGSJETII")
+    
+    particle_db = load_particledb(sys.argv[1])
+    read_qgsjetII_codes(sys.argv[2], particle_db)
+    
+    with open("Generated.inc", "w") as f:
+        print("// this file is automatically generated\n// edit at your own risk!\n", file=f)
+        print(generate_qgsjetII_enum(particle_db), file=f)
+        print(generate_corsika2qgsjetII(particle_db), file=f)
+        print(generate_qgsjetII2corsika(particle_db), file=f)
+        print(generate_corsika2qgsjetII_xsType(particle_db), file=f)
diff --git a/Processes/QGSJetII/qgsjet-II-04-codes.dat b/Processes/QGSJetII/qgsjet-II-04-codes.dat
new file mode 100644
index 0000000000000000000000000000000000000000..df7e1f62306fc3585530b8f250edd2d13bba2523
--- /dev/null
+++ b/Processes/QGSJetII/qgsjet-II-04-codes.dat
@@ -0,0 +1,53 @@
+# input file for particle conversion to/from QGSJet
+# the format of this file is: "corsika-identifier" "qgsjet-id" "hadron-class for x-section"
+
+# class 0 (cannot interact)
+Electron    11 0
+Positron   -11 0
+
+# class 1
+Pi0          0 1
+PiPlus       1 1
+PiMinus     -1 1
+# in crmc: all particles from 100 to 999 ???
+Eta         10 1
+# Eta        -10 1 there is no anti-eta
+Rho0        19 1
+
+# class 2
+#Nucleus      40 2
+Neutron      3 2
+AntiNeutron -3 2 
+Proton       2 2
+AntiProton  -2 2 
+# in crmc: 1000 to 9999 ???
+Lambda0      6 2
+Lambda0Bar  -6 2
+LambdaCPlus  9 2
+LambdaCMinusBar -9 2
+
+# class 3
+K0Long      -5 3
+K0           5 3 
+K0Bar       -5 3 
+K0Short      5 3
+# ambiguity between the K0/b and K0s/l
+KPlus        4 3
+KMinus      -4 3
+
+# class 4
+D0           8 4
+D0Bar        8 4
+DPlus        7 4
+DMinus      -7 4
+#DS+/- (340)
+#etac (440)
+#j/psi (441)
+#h_1c0
+#psi'
+#Xi_0c0
+#Xi_1c0
+#Xi_2c0
+
+
+
diff --git a/Processes/QGSJetII/qgsjet-II-04.cc b/Processes/QGSJetII/qgsjet-II-04.cc
new file mode 100644
index 0000000000000000000000000000000000000000..d7c307d39e0404cac894999665232de05e06bc24
--- /dev/null
+++ b/Processes/QGSJetII/qgsjet-II-04.cc
@@ -0,0 +1,39 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#include <corsika/process/qgsjetII/qgsjet-II-04.h>
+
+#include <corsika/random/RNGManager.h>
+
+#include <iostream>
+#include <random>
+
+datadir::datadir(const std::string& dir) {
+  if (dir.length() > 130) {
+    std::cerr << "QGSJetII error, will cut datadir \"" << dir
+              << "\" to 130 characters: " << std::endl;
+  }
+  int i = 0;
+  for (i = 0; i < std::min(130, int(dir.length())); ++i) data[i] = dir[i];
+  data[i + 0] = ' ';
+  data[i + 1] = '\0';
+}
+
+double qgran_(int&) {
+  static corsika::random::RNG& rng =
+      corsika::random::RNGManager::GetInstance().GetRandomStream("qgran");
+
+  std::uniform_real_distribution<double> dist;
+  return dist(rng);
+}
+
+void lzmaopenfile_(const char*, int) {}
+void lzmaclosefile_() {}
+void lzmafillarray_(const double&, const int&) {}
diff --git a/Processes/QGSJetII/qgsjet-II-04.f b/Processes/QGSJetII/qgsjet-II-04.f
new file mode 100644
index 0000000000000000000000000000000000000000..40b2a4ccbc8da8506f5a6bafec36f190bec9b7bb
--- /dev/null
+++ b/Processes/QGSJetII/qgsjet-II-04.f
@@ -0,0 +1,17733 @@
+C======================================================================C
+C                                                                      C
+C     QQQ        GGG      SSSS    JJJJJJJ   EEEEEEE   TTTTTTT     I I  C
+C    Q   Q      G   G    S    S         J   E            T        I I  C
+C   Q     Q    G         S              J   E            T        I I  C
+C   Q     Q    G   GGG    SSSS          J   EEEEE        T    ==  I I  C
+C   Q   Q Q    G     G        S         J   E            T        I I  C
+C    Q   Q      G   G    S    S    J   J    E            T        I I  C
+C     QQQQQ      GGG      SSSS      JJJ     EEEEEEE      T        I I  C
+C                                                                      C
+C                                                                      C
+C----------------------------------------------------------------------C
+C                                                                      C
+C                  QUARK - GLUON - STRING - JET - II MODEL             C
+C                                                                      C
+C                HIGH ENERGY HADRON INTERACTION PROGRAM                C
+C                                                                      C
+C                                  BY                                  C
+C                                                                      C
+C                           S. OSTAPCHENKO                             C
+C                                                                      C
+C Institute for Physics, Norwegian University for Science & Tech       C
+C D.V. Skobeltsyn Institute of Nuclear Physics, Moscow State UniversityC
+C                  e-mail: sergei@tf.phys.ntnu.no                      C
+C----------------------------------------------------------------------C
+C         Publication to be cited when using this program:             C
+C         S. Ostapchenko, Phys. Rev. D 83 (2011) 014018                C
+C----------------------------------------------------------------------C
+C                        LIST OF MODIFICATIONS                         C
+C                                                                      C
+C (Any modification of this program has to be approved by the author)  C
+C                                                                      C
+C 24.01.2005 - beta-version completed (qgsjet-II-01)                   C
+C 12.04.2005 - final version (qgsjet-II-02)                            C
+C 12.12.2005 - technical update -  version II-03:                      C
+C    improved treatment of Pomeron cuts (all "net" cuts included);     C
+C    improved treatment of nuclear config. (more consistent diffr.);   C
+C    "baryon junction" mechanism included (motivated by RHIC data);    C
+C    better parameter calibration, e.g. including RHIC data            C
+C 21.02.2006 - some commons enlarged to avoid frequent rejects  D.H.   C
+C 26.04.2006 - reduce unnecessary looping in qgsha              D.H.   C
+C                                                                      C
+C 01.10.2010 - new version  (qgsjet-II-04, not released):              C
+C   treating all enhanced diagrams (incuding 'Pomeron loops');         C
+C   calibration to LHC data on multiparticle production;               C
+C   a number of cosmetic improvements,                                 C
+C   e.g. more efficient simulation procedure (a factor of ~10 win)     C
+C                                                                      C
+C 26.06.2012 - final version (qgsjet-II-04):                           C
+C additional parameter retuning applied                                C
+C (mainly to TOTEM data on total/elastic pp cross sections);           C
+C remnant treatment for pion-hadron/nucleus collisions improved        C
+C                                                                      C
+C 18.03.2013 - small corrections for A-p cross-section calculation     C
+C 09.04.2013 - diffractive flag correction (no physics change)         C
+C 30.09.2013 - small bug correction to avoid rare momentum inbalance   C
+C              (no physics change)                                     C
+C                                                                      C
+C                 last modification:  09.04.2013                       C
+C                 Version qgsjet-II-04 (for CONEX)                     C
+C                                                                      C
+C small corrections to adapt to CORSIKA : 25.07.2012 by T.Pierog       C
+C=======================================================================
+
+
+
+c=============================================================================
+      subroutine qgset
+c-----------------------------------------------------------------------------
+c common model parameters setting
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      character*7 ty
+      character*2 tyq
+      parameter(iapmax=208)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr3/  rmin,emax,eev
+      common /qgarr6/  pi,bm,amws
+      common /qgarr7/  xa(iapmax,3),xb(iapmax,3),b
+      common /qgarr8/  wwm,be(4),dc(5),deta,almpt,ptdif,ptndi
+      common /qgarr10/ am0,amn,amk,amc,amlamc,amlam,ameta,ammu
+      common /qgarr11/ b10
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr21/ dmmin(3),wex(3),dmres(3),wdres(3)
+      common /qgarr28/ arr(5)
+      common /qgarr26/ factk,fqscal
+      common /qgarr41/ ty(6)
+      common /qgarr42/ tyq(16)
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /opt/     jopt
+      common /qgdebug/ debug
+      common /qgsIInex1/xan(iapmax,3),xbn(iapmax,3)  !used to link with nexus
+     *,bqgs,bmaxqgs,bmaxnex,bminnex
+
+      moniou=6             !output channel for debugging
+      debug=0              !debugging level
+                           !(0 - no debugging, 1 - very geheral,
+                           !2 - more detailed, 3 - all function calls,
+                           !4 - all returned values, 5 - technical)
+      if(debug.ge.1)write (moniou,210)
+
+      bqgs=0.d0            !used to link with nexus
+      bmaxqgs=0.d0         !used to link with nexus
+      bmaxnex=-1.d0        !used to link with nexus
+      bminnex=0.d0         !used to link with nexus
+
+      jopt=1               !parameter option
+
+      if(jopt.eq.1)then       !tunable parameters
+c soft Pomeron parameters
+       dels=.165d0            !overcriticality
+       alfp=.135d0            !trajectory slope
+       sigs=1.01d0            !soft parton cross section
+c coupling to DGLAP
+       qt0=3.d0               !q**2 cutoff
+       betp=2.2d0             !gluon distribution hardness for soft Pomeron
+       dgqq=.16d0             !sea quark/gluon relative weight
+c multi-Pomeron vertex parameters
+       r3p=.0076d0            !triple-Pomeron coupling (/4/pi)
+       g3p=.35d0              !factor for multu-Pomeron couplings
+       sgap=exp(1.5d0)        !minimal rap-gap between 3P-vertices
+c Pomeron-hadron coupling
+       rq(1,1)=1.d0           !pion: vertex slope for 1st diffr. eigenst.
+       rq(2,1)=.15d0          !pion: vertex slope for 2nd diffr. eigenst.
+       cd(1,1)=1.75d0         !pion: relat. strenth for 1st diffr. eigenst.
+       rq(1,2)=2.52d0         !proton: vertex slope for 1st diffr. eigenst.
+       rq(2,2)=.2d0           !proton: vertex slope for 2nd diffr. eigenst.
+       cd(1,2)=1.58d0         !proton: relat. strenth for 1st diffr. eigenst.
+       rq(1,3)=.75d0          !kaon: vertex slope for 1st diffr. eigenst.
+       rq(2,3)=.15d0          !kaon: vertex slope for 2nd diffr. eigenst.
+       cd(1,3)=1.75d0         !kaon: relat. strenth for 1st diffr. eigenst.
+
+c parameters for soft/hard fragmentation:
+
+       qtf=.15d0              !q**2 cutoff for timelike cascades
+       almpt=1.5d0            !string fragmentation parameter
+       wwm=1.d0               !switching to 2-particle string decay (threshold)
+c leading state exponents
+       ahl(1)=0.d0            !pion
+       ahl(2)=1.3d0           !proton
+       ahl(3)=-0.5            !kaon
+c remnant excitation probabilities
+       wex(1)=.5d0            !pion
+       wex(2)=.4d0            !proton
+       wex(3)=.5d0            !kaon
+c dc(i) - relative probabilities for qq~(qqq~q~)-pair creation from vacuum
+       dc(1)=.077d0           !udu~d~
+       dc(2)=.08d0            !ss~
+       dc(4)=.4d0             !ss~ (intrinsic)
+c be(i) - parameters for pt-distributions
+       be(1)=.225d0           !uu~(dd~)
+       be(2)=.43d0            !qqq~q~
+       be(3)=.48d0            !ss~
+       ptdif=.15d0            !diffractive momentum transfer
+       ptndi=.19d0            !non-diffractive momentum transfer
+
+c parameters for nuclear spectator part fragmentation:
+
+       rmin=3.35d0    !coupling radius squared (fm^2)
+       emax=.11d0     !relative critical energy ( / <E_ex>, <E_ex>~12.5 MeV )
+       eev=.25d0      !relative evaporation energy ( / <E_ex>, <E_ex>~12.5 MeV )
+
+      else
+       stop'wrong option!!!'
+      endif
+
+      do i=1,3         !relative strenth of 2nd diffr. eigenst. [2-CD(1,icz)]
+       cd(2,i)=2.d0-cd(1,i)
+      enddo
+
+!other parameters and constants:
+
+      spmax=1.d11             !max energy squared for tabulations
+      delh=0.25d0             !effective exponent for weighting (technical)
+      epsxmn=.01d0            !pt-resolution scale (technical)
+      alm=.04d0               !lambda_qcd squared
+      factk=1.5d0             !k-factor value
+      fqscal=4.d0             !factor for fact. scale (Mf^2=p_t^2/fqscal)
+      deta=.11111d0           !ratio of etas production to all pions (1/9)
+      dc(3)=.000d0            !to switch off charmed particles set to 0.000
+      dc(5)=.0d0              !to switch off charmed particles set to 0.000
+c weigts for diffractive eigenstates
+      cc(1,1)=.5d0            !pion
+      cc(2,1)=.5d0
+      cc(1,2)=.5d0            !proton
+      cc(2,2)=.5d0
+      cc(1,3)=.5d0            !kaon
+      cc(2,3)=.5d0
+c auxiliary constants
+      b10=.43876194d0         !initial value of the pseudorandom sequence
+      pi=3.1416d0             !pi-value
+      amws=.523d0             !diffusive radius for saxon-wood density
+c regge intercepts for the uu~, qqq~q~, us~, uc~ trajectories
+      arr(1)=0.5d0            !qq~-trajectory
+      arr(2)=-0.5d0           !qqq~q~-trajectory
+      arr(3)=0.d0             !us~-trajectory
+c lowest resonance masses for low-mass excitations
+      dmmin(1)=.76d0          !rho
+      dmmin(2)=1.23d0         !delta
+      dmmin(3)=.89d0          !K*
+c mass and width for resonance contribution to low mass diffraction
+      dmres(1)=1.23d0         !pion
+      dmres(2)=1.44d0         !proton
+      dmres(3)=1.27d0         !kaon
+      wdres(1)=.3d0           !pion
+      wdres(2)=.3d0           !proton
+      wdres(3)=.1d0           !kaon
+c proton, kaon, pion, d-meson, lambda, lambda_c, eta masses
+      amn=0.93827999
+      amk=.496d0
+      am0=.14d0
+      amc=1.868d0
+      amlam=1.116d0
+      amlamc=2.27d0
+      ameta=.548d0
+      ammu=.1057d0
+c initial particle classes
+      ty(1)='pion   '
+      ty(2)='nucleon'
+      ty(3)='kaon   '
+c parton types
+      tyq(1)='DD'
+      tyq(2)='UU'
+      tyq(3)='C '
+      tyq(4)='S '
+      tyq(5)='UD'
+      tyq(6)='D '
+      tyq(7)='U '
+      tyq(8)='g '
+      tyq(9)='u '
+      tyq(10)='d '
+      tyq(11)='ud'
+      tyq(12)='s '
+      tyq(13)='c '
+      tyq(14)='uu'
+      tyq(15)='dd'
+      if(debug.ge.2)write (moniou,202)
+
+210   format(2x,'qgset - common model parameters setting')
+202   format(2x,'qgset - end')
+      return
+      end
+
+c=============================================================================
+      subroutine qgaini( DATDIR )
+c-----------------------------------------------------------------------------
+c common initialization procedure
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      CHARACTER DATDIR*(132)
+      real qggamfun
+      integer debug
+      character *7 ty
+      logical lcalc
+      parameter(iapmax=208)
+      dimension mij(40,40,4),nij(40,40,4),cs1(40,40,160)
+     *,evs(40,100,3,2),ixemax(40,3,2),gz0(5),gz1(3)
+     *,qfan0(11,14),qfan2(11,11,3),fann(14)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr10/ am(7),ammu
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr24/ qpomr(11,11,216,12,2)
+      common /qgarr25/ ahv(3)
+      common /qgarr26/ factk,fqscal
+      common /qgarr27/ qlegi(51,11,2,3,7),qfanu(51,11,11,6,2)
+     *,qfanc(51,11,11,39,18),qdfan(21,11,11,2,3),qrev(11,11,66,219,2)
+      common /qgarr28/ arr(5)
+      common /qgarr29/ cstot(40,40,160)
+      common /qgarr30/ cs0(40,40,160)
+      common /qgarr31/ csborn(40,160)
+      common /qgarr33/ fsud(10,2)
+      common /qgarr34/ qrt(10,101,2)
+      common /qgarr35/ qlegc0(51,10,11,6,8),qlegc(51,10,11,11,30)
+      common /qgarr38/ qpomc(11,100,11,11,48)
+      common /qgarr39/ qpomi(51,11,15),qpomis(51,11,11,11,9)
+      common /qgarr41/ ty(6)
+      common /qgarr43/ moniou
+      common /qgarr47/ gsect(10,5,6)
+      common /qgarr48/ qgsasect(10,6,6)
+      common /qgarr51/ epsxmn
+      common /qgarr52/ evk(40,40,100,3,2)
+c auxiliary common blocks to calculate hadron-nucleus cross-sections
+      common /arr1/   trnuc(56),twsnuc(56),twbnuc(56)
+      common /arr3/   x1(7),a1(7)
+      common /opt/    jopt
+      common /qgdebug/debug
+      character*500 fnIIdat,fnIIncs                        !used to link with nexus
+      common /version/ version                             !used to link with nexus
+      common/qgsIIfname/fnIIdat, fnIIncs, ifIIdat, ifIIncs !used to link with nexus
+      common/qgsIInfname/ nfnIIdat, nfnIIncs               !used to link with nexus
+      common/producetab/ producetables              !used to link with CRMC
+      logical producetables
+
+      if(debug.ge.1)write (moniou,210)
+      version = 204
+
+c-------------------------------------------------
+      write(*,100)
+ 100  format(' ',
+     *           '====================================================',
+     *     /,' ','|                                                  |',
+     *     /,' ','|         QUARK GLUON STRING JET -II MODEL         |',
+     *     /,' ','|                                                  |',
+     *     /,' ','|         HADRONIC INTERACTION MONTE CARLO         |',
+     *     /,' ','|                        BY                        |',
+     *     /,' ','|                 S. OSTAPCHENKO                   |',
+     *     /,' ','|                                                  |',
+     *     /,' ','|             e-mail: sergei@tf.phys.ntnu.no       |',
+     *     /,' ','|                                                  |',
+     *     /,' ','|                   Version II-04                  |',
+     *     /,' ','|                                                  |',
+     *     /,' ','| Publication to be cited when using this program: |',
+     *     /,' ','| S.Ostapchenko, PRD 83 (2011) 014018              |',
+     *     /,' ','|                                                  |',
+     *     /,' ','| last modification:  09.04.2013                   |',
+     *     /,' ','|                                                  |',
+     *     /,' ','| Any modification has to be approved by the author|',
+     *     /,' ','====================================================',
+     *     /)
+
+
+c-----------------------------------------------------------------------------
+c normalization of parton density in the soft pomeron
+      rr=qggamfun(real(2.d0+betp-dels))/qggamfun(real(1.d0-dels))
+     */qggamfun(real(1.d0+betp))/4.d0/pi
+
+      ahv(1)=.383d0+.624d0*dlog(dlog(qt0/.204d0**2)
+     */dlog(.26d0/.204d0**2))
+      ahv(3)=ahv(1)
+      sq=dlog(dlog(qt0/.232d0**2)/dlog(.23d0/.232d0**2))
+      ahv(2)=2.997d0+.753d0*sq-.076d0*sq*sq
+c valence quark momentum share
+      qnorm1=0.d0
+      do i=1,7
+      do m=1,2
+       tp=1.d0-(.5d0+x1(i)*(m-1.5d0))**(2.d0/3.d0)
+       xp=1.d0-tp**(1.d0/(1.d0+ahv(1)))
+       qnorm1=qnorm1+a1(i)*(qggrv(xp,qt0,1,1)+qggrv(xp,qt0,1,2))
+     * /dsqrt(1.d0-tp)
+      enddo
+      enddo
+      qnorm1=qnorm1/(1.d0+ahv(1))/3.d0
+      qnorm2=0.d0
+      do i=1,7
+      do m=1,2
+       tp=1.d0-(.5d0+x1(i)*(m-1.5d0))**(2.d0/3.d0)
+       xp=1.d0-tp**(1.d0/(1.d0+ahv(2)))
+       qnorm2=qnorm2+a1(i)*(qggrv(xp,qt0,2,1)+qggrv(xp,qt0,2,2))
+     * /dsqrt(1.d0-tp)
+      enddo
+      enddo
+      qnorm2=qnorm2/(1.d0+ahv(2))/3.d0
+c fp(i) - pomeron vertex constant (i=icz)
+      fp(2)=(1.d0-qnorm2)*(2.d0+ahl(2))*(1.d0+ahl(2))
+
+      gnorm=0.d0
+      seanrm=0.d0
+      do i=1,7
+      do m=1,2
+       xxg=(.5d0+x1(i)*(m-1.5d0))**(1.d0/(1.d0-dels))
+       gnorm=gnorm+a1(i)*qgftld(xxg,2)
+       seanrm=seanrm+a1(i)*qgftle(xxg,2)
+      enddo
+      enddo
+      gnorm=gnorm/(1.d0-dels)*fp(2)*rr*2.d0*pi
+      seanrm=seanrm/(1.d0-dels)*fp(2)*rr*2.d0*pi
+      if(debug.ge.1)write (moniou,*)'rr,fp,norm,qnorm2,gnorm,seanrm'
+     *,rr,fp(2),qnorm2+gnorm+seanrm,qnorm2,gnorm,seanrm
+
+      do icz=1,3,2
+       fp(icz)=(1.d0-qnorm1)*(2.d0+ahl(icz))*(1.d0+ahl(icz))
+       gnorm=0.d0
+       seanrm=0.d0
+       do i=1,7
+       do m=1,2
+        xxg=(.5d0+x1(i)*(m-1.5d0))**(1.d0/(1.d0-dels))
+        gnorm=gnorm+a1(i)*qgftld(xxg,icz)
+        seanrm=seanrm+a1(i)*qgftle(xxg,icz)
+       enddo
+       enddo
+       gnorm=gnorm/(1.d0-dels)*fp(icz)*rr*2.d0*pi
+       seanrm=seanrm/(1.d0-dels)*fp(icz)*rr*2.d0*pi
+
+       if(debug.ge.1)write (moniou,*)'fp,norm,qnorm1,gnorm,seanrm'
+     * ,fp(icz),qnorm1+gnorm+seanrm,qnorm1,gnorm,seanrm
+      enddo
+
+      do icz=1,3
+       gsoft(icz)=fp(icz)*fp(2)*sigs*4.d0*.0389d0
+     * *qggamfun(real(1.d0+dels))**2*qggamfun(real(1.d0+ahl(icz)))
+     * *qggamfun(real(1.d0+ahl(2)))/qggamfun(real(2.d0+dels+ahl(icz)))
+     * /qggamfun(real(2.d0+dels+ahl(2)))
+      enddo
+
+c-----------------------------------------------------------------------------
+c reading cross sections from the file
+      if(ifIIdat.ne.1)then
+       inquire(file=DATDIR(1:INDEX(DATDIR,' ')-1)//'qgsdat-II-04'
+     *        ,exist=lcalc)
+      else
+       inquire(file=fnIIdat(1:nfnIIdat),exist=lcalc)       !used to link with nexus
+      endif
+      lzmaUse=0
+      if(lcalc)then
+         if(ifIIdat.ne.1)then
+            open(1,file=DATDIR(1:INDEX(DATDIR,' ')-1)//'qgsdat-II-04'
+     *           ,status='old')
+         else                   !used to link with nexus
+            if (LEN(fnIIdat).gt.6.and.
+     *           fnIIdat(nfnIIdat-4:nfnIIdat) .eq. ".lzma") then
+               lzmaUse=1
+               call LzmaOpenFile(fnIIdat(1:nfnIIdat))
+            else
+               open(ifIIdat,file=fnIIdat(1:nfnIIdat),status='old')
+            endif
+         endif
+
+       if (lzmaUse.ne.0) then
+
+          if(debug.ge.0)write (moniou,214) 'qgsdat-II-04.lzma'
+
+          call LzmaFillArray(csborn,size(csborn))
+          call LzmaFillArray(cs0,size(cs0))
+          call LzmaFillArray(cstot,size(cstot))
+          call LzmaFillArray(evk,size(evk))
+          call LzmaFillArray(qpomi,size(qpomi))
+          call LzmaFillArray(qpomis,size(qpomis))
+          call LzmaFillArray(qlegi,size(qlegi))
+          call LzmaFillArray(qfanu,size(qfanu))
+          call LzmaFillArray(qfanc,size(qfanc))
+          call LzmaFillArray(qdfan,size(qdfan))
+          call LzmaFillArray(qpomr,size(qpomr))
+          call LzmaFillArray(gsect,size(gsect))
+          call LzmaFillArray(qlegc0,size(qlegc0))
+          call LzmaFillArray(qlegc,size(qlegc))
+          call LzmaFillArray(qpomc,size(qpomc))
+          call LzmaFillArray(fsud,size(fsud))
+          call LzmaFillArray(qrt,size(qrt))
+          call LzmaFillArray(qrev,size(qrev))
+          call LzmaFillArray(fsud,size(fsud))
+          call LzmaFillArray(qrt,size(qrt))
+          call LzmaCloseFile()
+       else
+          if(debug.ge.0)write (moniou,214) 'qgsdat-II-04'
+          read (1,*)csborn,cs0,cstot,evk,qpomi,qpomis,qlegi,qfanu,qfanc
+     *         ,qdfan,qpomr,gsect,qlegc0,qlegc,qpomc,fsud,qrt,qrev,fsud,
+     *         qrt
+          close(1)
+       endif
+
+       if(debug.ge.0)write (moniou,*)'done'
+       goto 10
+      elseif(.not.producetables)then
+        write(moniou,*) "Missing QGSDAT-II-04 file !"
+        write(moniou,*) "Please correct the defined path ",
+     &"or force production ..."
+        stop
+      endif
+
+c--------------------------------------------------
+c qcd evolution and qcd ladder cross sections
+c--------------------------------------------------
+      if(debug.ge.0)write (moniou,201)
+      do i=1,40
+      do m=1,3
+      do k=1,2
+       ixemax(i,m,k)=99
+      do j=1,40
+      do l=1,100
+       evk(i,j,l,m,k)=0.d0
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+
+      n=1
+1     n=n+1
+      do m=1,3
+      do k=1,2
+       if(m.ne.3.or.k.ne.1)then
+        do i=1,39
+         if(ixemax(i,m,k).gt.0)then
+          qi=spmax**((i-1)/39.d0)
+          qq=qi*(spmax/qi)**(1.d0/39.d0)
+          do l=1,99
+           if(l.le.37)then
+            xx=.1d0/(.1d0*spmax)**((37.d0-l)/36.d0)
+           elseif(l.le.69)then
+            xx=.1d0+.8d0*(l-37.d0)/32.d0
+           else
+            xx=1.d0-.1d0*(10.d0*epsxmn)**((l-69.d0)/31.d0)
+           endif
+
+           ev=qgev(qi,qq,qq,xx,m,k)/qgfap(xx,m,k)
+           if(m.eq.1.and.k.eq.1.or.m.ne.1.and.k.ne.1)then
+            evs(i,l,m,k)=dlog(1.d0+ev*4.5d0*qgsudx(qi,m)/qgsudx(qq,m)
+     *      /dlog(dlog(qq/alm)/dlog(qi/alm)))
+           else
+            evs(i,l,m,k)=dlog(1.d0+ev/.3d0*(dlog(epsxmn)+.75d0)
+     *      /(qgsudx(qq,1)/qgsudx(qi,1)-qgsudx(qq,2)/qgsudx(qi,2)))
+           endif
+          enddo
+         endif
+        enddo
+       endif
+      enddo
+      enddo
+
+      jec=0
+      do m=1,3
+      do k=1,2
+       if(m.ne.3.or.k.ne.1)then
+        do i=1,39
+         if(ixemax(i,m,k).gt.0)then
+          qi=spmax**((i-1)/39.d0)
+          qq=qi*(spmax/qi)**(1.d0/39.d0)
+          imx=ixemax(i,m,k)
+          do l=imx,1,-1
+           if(l.le.37)then
+            xx=.1d0/(.1d0*spmax)**((37.d0-l)/36.d0)
+           elseif(l.le.69)then
+            xx=.1d0+.8d0*(l-37.d0)/32.d0
+           else
+            xx=1.d0-.1d0*(10.d0*epsxmn)**((l-69.d0)/31.d0)
+           endif
+
+           if(abs(evs(i,l,m,k)-evk(i,2,l,m,k)).gt.1.d-3)then
+            evk(i,2,l,m,k)=evs(i,l,m,k)
+            jec=1
+           elseif(ixemax(i,m,k).eq.l)then
+            ixemax(i,m,k)=l-1
+           endif
+          enddo
+         endif
+        enddo
+       endif
+      enddo
+      enddo
+
+      do i=1,39
+       qi=spmax**((i-1)/39.d0)
+       qj=qi*(spmax/qi)**(1.d0/39.d0)
+       qq=qi*(spmax/qi)**(2.d0/39.d0)
+       do l=99,1,-1
+        if(l.le.37)then
+         xx=.1d0/(.1d0*spmax)**((37.d0-l)/36.d0)
+        elseif(l.le.69)then
+         xx=.1d0+.8d0*(l-37.d0)/32.d0
+        else
+         xx=1.d0-.1d0*(10.d0*epsxmn)**((l-69.d0)/31.d0)
+        endif
+        do m=1,3
+        do k=1,2
+         if(m.ne.3.or.k.ne.1)then
+          ev=(qgev(qi,qj,qq,xx,m,k)
+     *    +qgevi(qi,qj,xx,m,k)*qgsudx(qq,k)/qgsudx(qj,k)
+     *    +qgevi(qj,qq,xx,m,k)*qgsudx(qj,m)/qgsudx(qi,m))/qgfap(xx,m,k)
+          if(m.eq.1.and.k.eq.1.or.m.ne.1.and.k.ne.1)then
+           evk(i,3,l,m,k)=dlog(ev*4.5d0*qgsudx(qi,m)/qgsudx(qq,m)
+     *     /dlog(dlog(qq/alm)/dlog(qi/alm)))
+          else
+           evk(i,3,l,m,k)=dlog(ev/.3d0*(dlog(epsxmn)+.75d0)
+     *     /(qgsudx(qq,1)/qgsudx(qi,1)-qgsudx(qq,2)/qgsudx(qi,2)))
+          endif
+         endif
+        enddo
+        enddo
+       enddo
+      enddo
+      if(jec.ne.0)goto 1
+
+      do i=1,39
+       qi=spmax**((i-1)/39.d0)
+      do j=4,40
+       qj=qi*(spmax/qi)**((j-2)/39.d0)
+       qq=qi*(spmax/qi)**((j-1)/39.d0)
+       do l=99,1,-1
+        if(l.le.37)then
+         xx=.1d0/(.1d0*spmax)**((37.d0-l)/36.d0)
+        elseif(l.le.69)then
+         xx=.1d0+.8d0*(l-37.d0)/32.d0
+        else
+         xx=1.d0-.1d0*(10.d0*epsxmn)**((l-69.d0)/31.d0)
+        endif
+        do m=1,3
+        do k=1,2
+         if(m.ne.3.or.k.ne.1)then
+          ev=(qgev(qi,qj,qq,xx,m,k)
+     *    +qgevi(qi,qj,xx,m,k)*qgsudx(qq,k)/qgsudx(qj,k)
+     *    +qgevi(qj,qq,xx,m,k)*qgsudx(qj,m)/qgsudx(qi,m))/qgfap(xx,m,k)
+          if(m.eq.1.and.k.eq.1.or.m.ne.1.and.k.ne.1)then
+           evk(i,j,l,m,k)=dlog(ev*4.5d0*qgsudx(qi,m)/qgsudx(qq,m)
+     *     /dlog(dlog(qq/alm)/dlog(qi/alm)))
+          else
+           evk(i,j,l,m,k)=dlog(ev/.3d0*(dlog(epsxmn)+.75d0)
+     *     /(qgsudx(qq,1)/qgsudx(qi,1)-qgsudx(qq,2)/qgsudx(qi,2)))
+          endif
+         endif
+        enddo
+        enddo
+       enddo
+      enddo
+      enddo
+
+c--------------------------------------------------
+c qcd ladder cross sections
+      do i=1,40
+       qi=(spmax/4.d0/fqscal)**((i-1)/39.d0)  !q^2 cutoff for born process
+       s2min=qi*4.d0*fqscal          !energy threshold for 2->2 subprocess
+      do m=1,2                                !parton types (1-g, 2-q)
+      do l=1,2                                !parton types (1-g, 2-q)
+       l1=2*l-1
+      do k=1,40
+       sk=s2min*(spmax/s2min)**((k-1)/39.d0)  !c.m. energy squared
+       k1=k+40*(m-1)+80*(l-1)
+       csborn(i,k1)=dlog(qgborn(qi,qi,sk,m-1,l1-1)) !born cross-section (2->2)
+       if(.not.(csborn(i,k1).ge.0.d0.or.csborn(i,k1).lt.0.d0))stop
+      enddo
+      enddo
+      enddo
+      enddo
+
+      do i=1,40
+       qi=(spmax/4.d0/fqscal)**((i-1)/39.d0)
+      do j=1,40
+       qj=qi*(spmax/4.d0/fqscal/qi)**((j-1)/39.d0)
+       s2min=qj*4.d0*fqscal
+       smin=s2min/(1.d0-epsxmn)
+      do m=1,2
+      do l=1,2
+       l1=2*l-1
+       ml=m+2*l-2
+      do k=1,40
+       sk=s2min*(spmax/s2min)**((k-1)/39.d0)
+       k1=k+40*(m-1)+80*(l-1)
+
+       tmin=qj*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qj*fqscal/sk)))
+       sjtot=qgjett(qi,qj,sk,m-1,l-1)
+       sjord1=qgjeto(qi,qj,sk,m-1,l-1)
+       sjord2=qgjeto(qj,qi,sk,l-1,m-1)
+       born=qgborn(qi,qj,sk,m-1,l1-1)
+       if(k.eq.1.or.j.eq.40.or.i.eq.40.or.sk.le.smin)then
+        cstot(i,j,k1)=dlog(born)
+        cs0(i,j,k1)=cstot(i,j,k1)
+       else
+        cstot(i,j,k1)=dlog(born+(sjtot+sjord1+sjord2)
+     *  /(1.d0/tmin-2.d0/sk))
+        cs0(i,j,k1)=dlog(born+sjord1/(1.d0/tmin-2.d0/sk))
+       endif
+       if(.not.(cstot(i,j,k1).ge.0.d0.or.cstot(i,j,k1).lt.0.d0))stop
+       if(.not.(cs0(i,j,k1).ge.0.d0.or.cs0(i,j,k1).lt.0.d0))stop
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      goto 3
+
+c--------------------------------------------------
+c alternative calculation (not used)
+      do i=1,40
+       qi=(spmax/4.d0/fqscal)**((i-1)/39.d0)
+      do j=1,40
+       qj=qi*(spmax/4.d0/fqscal/qi)**((j-1)/39.d0)
+       s2min=qj*4.d0*fqscal
+      do m=1,2
+      do l=1,2
+       l1=2*l-1
+       ml=m+2*l-2
+      do k=1,40
+       sk=s2min*(spmax/s2min)**((k-1)/39.d0)
+       k1=k+40*(m-1)+80*(l-1)
+       cstot(i,j,k1)=dlog(qgborn(qi,qj,sk,m-1,l1-1))
+       cs0(i,j,k1)=cstot(i,j,k1)
+       mij(i,j,ml)=2
+       nij(i,j,ml)=2
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+
+      n=2                             !number of ladder rungs considered
+2     if(debug.ge.1)write (moniou,202)n,mij(1,1,1),nij(1,1,1)
+      do i=1,39
+       qi=(spmax/4.d0/fqscal)**((i-1)/39.d0)       !q^2 for upper parton
+      do j=1,39
+       qj=qi*(spmax/4.d0/fqscal/qi)**((j-1)/39.d0) !q^2 for downer parton
+       s2min=qj*4.d0*fqscal                !energy threshold for 2->2 subprocess
+       smin=s2min/(1.d0-epsxmn)            !energy threshold for 2->3 subprocess
+      do m=1,2                                     !parton types (1-g, 2-q)
+      do l=1,2                                     !parton types (1-g, 2-q)
+       l1=2*l-1
+       ml=m+2*l-2
+       kmin=nij(i,j,ml)                  !lowest energy bin for another rung
+       if(kmin.le.40)then
+        do k=kmin,40
+         sk=s2min*(spmax/s2min)**((k-1)/39.d0)
+         if(sk.le.smin)then
+          nij(i,j,ml)=nij(i,j,ml)+1
+         else
+          k1=k+40*(m-1)+80*(l-1)
+          tmin=qj*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qj*fqscal/sk)))
+          cs1(i,j,k1)=dlog(qgjet1(qi,qj,sk,s2min,m,l)
+     *    /(1.d0/tmin-2.d0/sk)+qgborn(qi,qj,sk,m-1,l1-1))
+         endif
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+      enddo
+
+      do i=1,39
+       qi=(spmax/4.d0/fqscal)**((i-1)/39.d0)
+      do j=1,39
+       qj=qi*(spmax/4.d0/fqscal/qi)**((j-1)/39.d0)
+       s2min=qj*4.d0*fqscal
+      do m=1,2
+      do l=1,2
+       ml=m+2*l-2
+       kmin=nij(i,j,ml)
+       if(kmin.le.40)then
+        do k=40,kmin,-1
+         sk=s2min*(spmax/s2min)**((k-1)/39.d0)
+         tmin=qj*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qj*fqscal/sk)))
+         k1=k+40*(m-1)+80*(l-1)
+         if(abs(cs1(i,j,k1)-cs0(i,j,k1)).gt.1.d-2)then
+          cs0(i,j,k1)=cs1(i,j,k1)
+         elseif(k.eq.nij(i,j,ml))then
+          nij(i,j,ml)=nij(i,j,ml)+1
+         endif
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+      enddo
+
+      do i=1,39
+       qi=(spmax/4.d0/fqscal)**((i-1)/39.d0)
+      do j=1,39
+       qj=qi*(spmax/4.d0/fqscal/qi)**((j-1)/39.d0)
+       s2min=qj*4.d0*fqscal         !min energy squared for 2->2 subprocess
+       smin=s2min/(1.d0-epsxmn)     !min energy squared for 2->3 subprocess
+      do m=1,2
+      do l=1,2
+       ml=m+2*l-2
+       kmin=mij(i,j,ml)             !min energy bin for more ladder rungs
+       if(kmin.le.40)then
+        do k=kmin,40
+         sk=s2min*(spmax/s2min)**((k-1)/39.d0)
+         if(sk.le.smin)then
+          mij(i,j,ml)=mij(i,j,ml)+1
+         else
+          k1=k+40*(m-1)+80*(l-1)
+          tmin=qj*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qj*fqscal/sk)))
+          cs1(i,j,k1)=dlog((qgjet(qi,qj,sk,s2min,m,l)
+     *    +qgjit1(qj,qi,sk,l,m))/(1.d0/tmin-2.d0/sk))
+         endif
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+      enddo
+
+c--------------------------------------------------
+c check convergence
+      do i=1,39
+       qi=(spmax/4.d0/fqscal)**((i-1)/39.d0)
+      do j=1,39
+       qj=qi*(spmax/4.d0/fqscal/qi)**((j-1)/39.d0)
+       s2min=qj*4.d0*fqscal
+      do m=1,2
+      do l=1,2
+       ml=m+2*l-2
+       kmin=mij(i,j,ml)             !min energy bin for more ladder rungs
+       if(kmin.le.40)then
+        do k=40,kmin,-1
+         sk=s2min*(spmax/s2min)**((k-1)/39.d0)
+         tmin=qj*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qj*fqscal/sk)))
+         k1=k+40*(m-1)+80*(l-1)
+         if(abs(cs1(i,j,k1)-cstot(i,j,k1)).gt.1.d-2)then
+          cstot(i,j,k1)=cs1(i,j,k1)
+         elseif(k.eq.mij(i,j,ml))then
+          mij(i,j,ml)=mij(i,j,ml)+1
+         endif
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+      enddo
+
+      n=n+1                         !one more rung
+      do i=1,39
+      do j=1,39
+      do l=1,4
+       if(mij(i,j,l).le.40.or.nij(i,j,l).le.40)goto 2
+      enddo
+      enddo
+      enddo
+
+3     if(debug.ge.2)write (moniou,205)
+c-------------------------------------------------
+c itermediate Pomeron
+      if(debug.ge.1)write (moniou,210)
+      s2min=4.d0*fqscal*qt0
+      do iy=1,51
+       sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+       rp=alfp*log(sy)*4.d0*.0389d0
+      do iz=1,11
+       if(iz.gt.6)then
+        z=.2d0*(iz-6)
+        b=sqrt(-log(z)*rp)
+       else
+        b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+        z=exp(-b*b/rp)
+       endif
+
+       qpomi(iy,iz,1)=dlog(qgpint(sy,b*b)
+     * /sy**dels/sigs/z*rp/4.d0/.0389d0+1.d0)
+      enddo
+      enddo
+
+c-------------------------------------------------
+c loop contribution
+      do iy=1,51
+       sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+       rp=alfp*log(sy)*4.d0*.0389d0
+      do iz=1,11
+       if(iz.gt.6)then
+        z=.2d0*(iz-6)
+        b=sqrt(-log(z)*rp)
+       else
+        b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+        z=exp(-b*b/rp)
+       endif
+      do iqq=2,4
+       qpomi(iy,iz,iqq)=qpomi(iy,iz,1)
+      enddo
+      enddo
+      enddo
+
+      do iy=2,51
+       sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+       rp=alfp*log(sy)*4.d0*.0389d0
+       do iz=1,11
+       do iqq=2,4
+        qpomi(iy,iz,iqq)=qpomi(iy-1,iz,iqq)
+       enddo
+       enddo
+       n=0
+4      n=n+1
+       nrep=0
+       do iz=1,11
+        if(iz.gt.6)then
+         z=.2d0*(iz-6)
+         b=sqrt(-log(z)*rp)
+        else
+         b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+         z=exp(-b*b/rp)
+        endif
+        call qgloop(sy,b*b,fann,1)
+        do iqq=1,3
+         if(fann(iqq).gt.0.d0)then
+          qfan0(iz,iqq)=dlog(fann(iqq)/z/sigs/sy**dels*rp/g3p**2
+     *    /4.d0/.0389d0)
+         elseif(iy.gt.2)then
+          qfan0(iz,iqq)=min(2.d0*qpomi(iy-1,iz,iqq+1)
+     *    -qpomi(iy-2,iz,iqq+1),qpomi(iy-1,iz,iqq+1))
+         else
+          stop'loop<0: iy=2'
+         endif
+         if(qfan0(iz,iqq).lt.-20.d0)then
+          qfan0(iz,iqq)=-20.d0
+         endif
+         if(abs(qfan0(iz,iqq)-qpomi(iy,iz,iqq+1)).gt.1.d-3)nrep=1
+        enddo
+       enddo
+       do iz=1,11
+        if(iz.gt.6)then
+         z=.2d0*(iz-6)
+         b=sqrt(-log(z)*rp)
+        else
+         b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+         z=exp(-b*b/rp)
+        endif
+       do iqq=2,4
+        qpomi(iy,iz,iqq)=qfan0(iz,iqq-1)
+        if(.not.(qpomi(iy,iz,iqq).le.0.d0
+     *  .or.qpomi(iy,iz,iqq).gt.0.d0))stop'qpom-nan'
+       enddo
+       enddo
+       if(nrep.eq.1.and.n.lt.100)goto 4
+      enddo
+
+c-------------------------------------------------
+c cut loops
+      do iy=1,51
+      do iz=1,11
+       do iqq=5,7
+        qpomi(iy,iz,iqq)=qpomi(iy,iz,iqq-3)
+       enddo
+       qpomi(iy,iz,8)=qpomi(iy,iz,2)
+       do iqq=9,10
+        qpomi(iy,iz,iqq)=qpomi(iy,iz,iqq-7)
+        qpomi(iy,iz,iqq+2)=qpomi(iy,iz,iqq-7)
+       enddo
+       do iqq=13,15
+        qpomi(iy,iz,iqq)=qpomi(iy,iz,iqq-11)
+       enddo
+      enddo
+      enddo
+
+      do iy=2,51
+       sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+       rp=alfp*log(sy)*4.d0*.0389d0
+       do iz=1,11
+       do iqq=5,15
+        qpomi(iy,iz,iqq)=qpomi(iy-1,iz,iqq)
+       enddo
+       enddo
+       n=0
+5      n=n+1
+       nrep=0
+       do iz=1,11
+        if(iz.gt.6)then
+         z=.2d0*(iz-6)
+         b=sqrt(-log(z)*rp)
+        else
+         b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+         z=exp(-b*b/rp)
+        endif
+        call qgloop(sy,b*b,fann,2)
+        do iqq=4,14
+         if(fann(iqq).gt.0.d0)then
+          qfan0(iz,iqq)=dlog(fann(iqq)/z/sigs/sy**dels*rp/g3p**2
+     *    /4.d0/.0389d0)
+         elseif(iy.gt.2)then
+          qfan0(iz,iqq)=min(2.d0*qpomi(iy-1,iz,iqq+1)
+     *    -qpomi(iy-2,iz,iqq+1),qpomi(iy-1,iz,iqq+1))
+         else
+          stop'loop<0: iy=2'
+         endif
+         if(qfan0(iz,iqq).lt.-20.d0)then
+          qfan0(iz,iqq)=-20.d0
+         endif
+         if(abs(qfan0(iz,iqq)-qpomi(iy,iz,iqq+1)).gt.1.d-3)nrep=1
+        enddo
+       enddo
+       do iz=1,11
+        if(iz.gt.6)then
+         z=.2d0*(iz-6)
+         b=sqrt(-log(z)*rp)
+        else
+         b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+         z=exp(-b*b/rp)
+        endif
+       do iqq=5,15
+        qpomi(iy,iz,iqq)=qfan0(iz,iqq-1)
+        if(.not.(qpomi(iy,iz,iqq).le.0.d0
+     *  .or.qpomi(iy,iz,iqq).gt.0.d0))stop'qpomi-nan'
+       enddo
+       enddo
+       if(nrep.eq.1.and.n.lt.50)goto 5
+      enddo
+
+c-------------------------------------------------
+c cut loops with proj/targ screening corrections
+      do iv=1,11
+       vvx=dble(iv-1)/10.d0
+      do iv1=1,11
+       vvxt=dble(iv1-1)/10.d0
+
+       do iz=1,11
+        do iqq=1,8
+         qpomis(1,iz,iv,iv1,iqq)=0.d0
+        enddo
+        qpomis(1,iz,iv,iv1,1)=qpomi(1,iz,1)
+        qpomis(1,iz,iv,iv1,4)=qpomi(1,iz,1)
+       enddo
+
+       do iy=2,51
+        sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+        rp=alfp*log(sy)*4.d0*.0389d0
+        do iz=1,11
+        do iqq=1,8
+         qpomis(iy,iz,iv,iv1,iqq)=qpomis(iy-1,iz,iv,iv1,iqq)
+        enddo
+        enddo
+
+        n=0
+6       n=n+1
+        nrep=0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          b=sqrt(-log(z)*rp)
+         else
+          b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+          z=exp(-b*b/rp)
+         endif
+         call qgloos(sy,b*b,vvx,vvxt,fann)
+         vi=qgpini(sy,b*b,0.d0,0.d0,2)
+         vic=min(vi,qgpini(sy,b*b,0.d0,0.d0,8))
+         vicng=min(vic,qgpini(sy,b*b,0.d0,0.d0,11))
+         do iqq=1,8
+          if(fann(iqq).gt.0.d0)then
+           if(iqq.eq.1.or.iqq.eq.4)then
+            qfan0(iz,iqq)=dlog(fann(iqq)/z/sigs/sy**dels*rp/g3p**2
+     *      /4.d0/.0389d0)
+           elseif(iqq.eq.3)then
+            qfan0(iz,iqq)=dlog(fann(iqq)/(.5d0*max(0.d0,1.d0
+     *      -exp(-2.d0*vic)*(1.d0+2.d0*vic))+vicng*exp(-2.d0*vic)))
+           elseif(iqq.gt.6)then
+            qfan0(iz,iqq)=dlog(fann(iqq)*2.d0/((1.d0-exp(-vi))**2
+     *      +(exp(2.d0*(vi-vic))-1.d0)*exp(-2.d0*vi)))
+           else
+            qfan0(iz,iqq)=dlog(fann(iqq)/(1.d0-exp(-vi)))
+           endif
+          elseif(iy.gt.2)then
+           qfan0(iz,iqq)=min(2.d0*qpomis(iy-1,iz,iv,iv1,iqq)
+     *     -qpomis(iy-2,iz,iv,iv1,iqq),qpomis(iy-1,iz,iv,iv1,iqq))
+          else
+           qfan0(iz,iqq)=qpomis(iy-1,iz,iv,iv1,iqq)
+          endif
+          if(iqq.gt.5)qfan0(iz,iqq)=min(qfan0(iz,iqq),qfan0(iz,iqq-1))
+          qfan0(iz,iqq)=max(qfan0(iz,iqq),-20.d0)
+          if(abs(qfan0(iz,iqq)-qpomis(iy,iz,iv,iv1,iqq)).gt.1.d-3)
+     *    nrep=1
+         enddo
+        enddo
+
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          b=sqrt(-log(z)*rp)
+         else
+          b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+          z=exp(-b*b/rp)
+         endif
+         do iqq=1,8
+          qpomis(iy,iz,iv,iv1,iqq)=qfan0(iz,iqq)
+          if(iqq.eq.1.or.iqq.eq.4)then
+           dpx=exp(qpomis(iy,iz,iv,iv1,iqq))*g3p**2*sigs
+     *     *sy**dels*z/rp*4.d0*.0389d0
+          else
+           dpx=exp(qpomis(iy,iz,iv,iv1,iqq))
+          endif
+         enddo
+        enddo
+        if(nrep.eq.1.and.n.lt.50)goto 6
+       enddo
+      enddo
+      enddo
+
+c-------------------------------------------------
+c integrated Pomeron leg eikonals
+      if(debug.ge.1)write (moniou,212)
+      do icz=1,3
+      do icdp=1,2
+       if(cd(icdp,icz).ne.0.d0)then
+        do iy=1,51
+         sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+         rp=(rq(icdp,icz)+alfp*log(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          b=sqrt(-log(z)*rp)
+         else
+          b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+          z=exp(-b*b/rp)
+         endif
+
+         qxl=qgleg(sy,b*b,icdp,icz)
+         qlegi(iy,iz,icdp,icz,1)=log(qxl/z)
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+c-------------------------------------------------
+c loop-legs
+      do icz=1,3
+      do icdp=1,2
+       if(cd(icdp,icz).ne.0.d0)then
+        do iy=1,51
+         sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+         rp=(rq(icdp,icz)+alfp*log(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          b=sqrt(-log(z)*rp)
+         else
+          b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+          z=exp(-b*b/rp)
+         endif
+         if(iy.eq.1)then
+          do iqq=2,7
+           qlegi(iy,iz,icdp,icz,iqq)=qlegi(iy,iz,icdp,icz,1)
+          enddo
+         else
+          call qglool(sy,b*b,icdp,icz,fann)
+          do iqq=2,7
+           if(fann(iqq-1).gt.0.d0)then
+            qlegi(iy,iz,icdp,icz,iqq)=log(fann(iqq-1)/z)
+           else
+            qlegi(iy,iz,icdp,icz,iqq)=2.d0*qlegi(iy-1,iz,icdp,icz,iqq)
+     *      -qlegi(iy-2,iz,icdp,icz,iqq)
+           endif
+           qlegi(iy,iz,icdp,icz,iqq)=max(qlegi(iy,iz,icdp,icz,iqq)
+     *     ,-20.d0)
+           if(.not.(qlegi(iy,iz,icdp,icz,iqq).le.0.d0
+     *     .or.qlegi(iy,iz,icdp,icz,iqq).gt.0.d0))stop'leg-nan'
+          enddo
+         endif
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+c-------------------------------------------------
+c uncut fan-contributions
+      if(debug.ge.1)write (moniou,213)
+      do icz=1,3
+      do iv=1,11
+       vvx=dble(iv-1)/10.d0
+      do icdp=1,2
+       if(cd(icdp,icz).ne.0.d0)then
+        do iy=1,51
+        do iz=1,11
+        do iqq=1,2
+         qfanu(iy,iz,iv,icdp+2*(icz-1),iqq)=qlegi(iy,iz,icdp,icz,iqq+1)
+        enddo
+        enddo
+        enddo
+
+        do iy=2,51
+         sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+         rp=(rq(icdp,icz)+alfp*dlog(sy))*4.d0*.0389d0
+         do iz=1,11
+         do iqq=1,2
+          qfanu(iy,iz,iv,icdp+2*(icz-1),iqq)
+     *    =qfanu(iy-1,iz,iv,icdp+2*(icz-1),iqq)
+         enddo
+         enddo
+
+         n=1
+7        n=n+1
+         nrep=0
+         do iz=1,11
+          if(iz.gt.6)then
+           z=.2d0*dble(iz-6)
+           b=dsqrt(-dlog(z)*rp)
+          else
+           b=dsqrt(-rp*(dlog(0.2d0)+2.d0*dble(iz-7)))
+           z=dexp(-b*b/rp)
+          endif
+          call qgfan(sy,b*b,vvx,icdp,icz,fann)
+          do iqq=1,2
+           if(fann(iqq).gt.0.d0)then
+            qfan0(iz,iqq)=dlog(fann(iqq)/z)
+           else
+            qfan0(iz,iqq)=min(qfanu(iy-1,iz,iv,icdp+2*(icz-1),iqq)
+     *      ,2.d0*qfanu(iy-1,iz,iv,icdp+2*(icz-1),iqq)
+     *      -qfanu(iy-2,iz,iv,icdp+2*(icz-1),iqq))
+           endif
+           qfan0(iz,iqq)=max(qfan0(iz,iqq),-20.d0)
+           if(abs(qfan0(iz,iqq)-qfanu(iy,iz,iv,icdp+2*(icz-1),iqq))
+     *     .gt.1.d-3)nrep=1
+          enddo
+         enddo
+
+         do iz=1,11
+         do iqq=1,2
+          qfanu(iy,iz,iv,icdp+2*(icz-1),iqq)=qfan0(iz,iqq)
+         enddo
+         enddo
+         if(nrep.eq.1)goto 7
+
+         do iz=1,11
+         do iqq=1,2
+          if(iz.gt.6)then
+           z=.2d0*dble(iz-6)
+           b=dsqrt(-dlog(z)*rp)
+          else
+           b=dsqrt(-rp*(dlog(0.2d0)+2.d0*dble(iz-7)))
+           z=dexp(-b*b/rp)
+          endif
+          if(.not.(qfanu(iy,iz,iv,icdp+2*(icz-1),iqq).le.0.d0
+     *    .or.qfanu(iy,iz,iv,icdp+2*(icz-1),iqq).gt.0.d0))stop'fan-nn'
+         enddo
+         enddo
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+
+c-------------------------------------------------
+c cut fan contributions
+      if(debug.ge.1)write (moniou,215)
+      do icz=1,3                                !hadron class
+      do icdp=1,2                                 !diffractive eigenstate
+       if(cd(icdp,icz).ne.0.d0)then
+c vvx,vvxp,vvxpl - screening corrections from targ. and nuclear proj. fans
+        do iv=1,11
+         vvx=dble(iv-1)/10.d0
+        do iv1=1,1+5*(icz-1)*(3-icz)
+         vvxp=dble(iv1-1)/5.d0
+        do iv2=1,1+5*(icz-1)*(3-icz)
+         vvxpl=vvx*dble(iv2-1)/5.d0
+        do iy=1,51                                !initialization
+        do iz=1,11
+         do iqq=1,9
+          qfanc(iy,iz,iv,icz+(icz-1)*(3-icz)*(iv1+1+6*(iv2-1)),icdp
+     *    +2*(iqq-1))=qfanu(iy,iz,iv,icdp+2*(icz-1),1)
+         enddo
+        enddo
+        enddo
+
+        do iy=2,51
+         sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+         rp=(rq(icdp,icz)+alfp*dlog(sy))*4.d0*.0389d0
+         do iz=1,11
+         do iqq=1,9
+          qfanc(iy,iz,iv,icz+(icz-1)*(3-icz)*(iv1+1+6*(iv2-1)),icdp
+     *    +2*(iqq-1))=qfanc(iy-1,iz,iv,icz+(icz-1)*(3-icz)*(iv1+1
+     *    +6*(iv2-1)),icdp+2*(iqq-1))
+         enddo
+         enddo
+
+         n=1
+8        n=n+1                          !number of t-channel iterations
+         nrep=0
+         do iz=1,11
+          if(iz.gt.6)then
+           z=.2d0*dble(iz-6)
+           b=dsqrt(-dlog(z)*rp)
+          else
+           b=dsqrt(-rp*(dlog(0.2d0)+2.d0*dble(iz-7)))
+           z=dexp(-b*b/rp)
+          endif
+          call qgfanc(sy,b*b,vvx,vvxp,vvxpl,icdp,icz,fann)
+          fann(7)=min(fann(7),fann(8))
+          do iqq=1,9
+           if(fann(iqq).gt.0.d0)then
+            qfan0(iz,iqq)=dlog(fann(iqq)/z)
+           else
+            qfan0(iz,iqq)=min(2.d0*qfanc(iy-1,iz,iv,icz
+     *      +(icz-1)*(3-icz)*(iv1+1+6*(iv2-1)),icdp+2*(iqq-1))
+     *      -qfanc(iy-2,iz,iv,icz+(icz-1)*(3-icz)*(iv1+1+6*(iv2-1))
+     *      ,icdp+2*(iqq-1)),qfanc(iy-1,iz,iv,icz
+     *      +(icz-1)*(3-icz)*(iv1+1+6*(iv2-1)),icdp+2*(iqq-1)))
+           endif
+           qfan0(iz,iqq)=max(qfan0(iz,iqq),-20.d0)
+          enddo
+         enddo
+
+         do iz=1,11
+         do iqq=1,9
+          if(abs(qfan0(iz,iqq)-qfanc(iy,iz,iv,icz+(icz-1)*(3-icz)
+     *    *(iv1+1+6*(iv2-1)),icdp+2*(iqq-1))).gt.1.d-3)nrep=1
+          qfanc(iy,iz,iv,icz+(icz-1)*(3-icz)*(iv1+1+6*(iv2-1))
+     *    ,icdp+2*(iqq-1))=qfan0(iz,iqq)
+         enddo
+         enddo
+         if(nrep.eq.1.and.n.lt.50)goto 8
+
+         do iz=1,11
+          if(iz.gt.6)then
+           z=.2d0*dble(iz-6)
+           b=dsqrt(-dlog(z)*rp)
+          else
+           b=dsqrt(-rp*(dlog(0.2d0)+2.d0*dble(iz-7)))
+           z=dexp(-b*b/rp)
+          endif
+         do iqq=1,9
+          if(.not.(qfanc(iy,iz,iv,icz+(icz-1)*(3-icz)*(iv1+1+6*(iv2-1))
+     *    ,icdp+2*(iqq-1)).le.0.d0.or.qfanc(iy,iz,iv,icz+(icz-1)
+     *    *(3-icz)*(iv1+1+6*(iv2-1)),icdp+2*(iqq-1)).gt.0.d0))
+     *    stop'fanc-nan'
+         enddo
+         enddo
+        enddo
+        enddo
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+c-------------------------------------------------
+c zigzag fans
+      do icz=1,3                                  !hadron class
+      do icdp=1,2                                 !diffractive eigenstate
+       if(cd(icdp,icz).ne.0.d0)then
+        do iy=1,11
+         sy=sgap**2*(spmax/sgap**2)**((iy-1)/10.d0)
+         rp=(rq(icdp,icz)+alfp*dlog(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*dble(iz-6)
+          bb=-dlog(z)*rp
+         else
+          bb=-rp*(dlog(0.2d0)+2.d0*dble(iz-7))
+          z=dexp(-bb/rp)
+         endif
+        do iv=1,11
+         vvxt0=dble(iv-1)/10.d0
+        do iv1=1,6
+         vvxt=vvxt0+(1.d0-vvxt0)*dble(iv1-1)/5.d0
+        do iv2=1,1+5*(icz-1)*(3-icz)
+         vvxpt=dble(iv2-1)/5.d0
+        do iv3=1,1+5*(icz-1)*(3-icz)
+         vvxp0=vvxpt*dble(iv3-1)/5.d0
+        do iv4=1,1+5*(icz-1)*(3-icz)
+         vvxpl=dble(iv4-1)/5.d0
+
+         dfan=qgrev(sy,bb,vvxt0,vvxt,vvxpt,vvxp0,vvxpl,icdp,icz)
+         if(dfan.gt.0.d0)then
+          qrev(iy,iz,iv+11*(iv1-1),icz+(icz-1)*(3-icz)
+     *    *(iv2+1+6*(iv3-1)+36*(iv4-1)),icdp)=dlog(dfan/z)
+         else
+          qrev(iy,iz,iv+11*(iv1-1),icz+(icz-1)*(3-icz)*(iv2+1
+     *    +6*(iv3-1)+36*(iv4-1)),icdp)=2.d0*qrev(iy-1,iz,iv+11*(iv1-1)
+     *    ,icz+(icz-1)*(3-icz)*(iv2+1+6*(iv3-1)+36*(iv4-1)),icdp)
+     *    -qrev(iy-2,iz,iv+11*(iv1-1),icz+(icz-1)*(3-icz)*(iv2+1
+     *    +6*(iv3-1)+36*(iv4-1)),icdp)
+         endif
+         qrev(iy,iz,iv+11*(iv1-1),icz+(icz-1)*(3-icz)*(iv2+1+6*(iv3-1)
+     *   +36*(iv4-1)),icdp)=max(qrev(iy,iz,iv+11*(iv1-1),icz
+     *   +(icz-1)*(3-icz)*(iv2+1+6*(iv3-1)+36*(iv4-1)),icdp),-20.d0)
+
+         if(.not.(qrev(iy,iz,iv+11*(iv1-1),icz+(icz-1)*(3-icz)
+     *   *(iv2+1+6*(iv3-1)+36*(iv4-1)),icdp).le.0.d0.or.qrev(iy,iz
+     *   ,iv+11*(iv1-1),icz+(icz-1)*(3-icz)*(iv2+1+6*(iv3-1)
+     *   +36*(iv4-1)),icdp).gt.0.d0))stop'fanc-nan'
+        enddo
+        enddo
+        enddo
+        enddo
+        enddo
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+c-------------------------------------------------
+c diffractive fans
+      icz=2
+      do icdp=1,2
+       if(cd(icdp,icz).ne.0.d0)then
+        do iy=1,21
+         xpomr=(1.d5/sgap**2)**(-dble(iy-1)/20.d0)/sgap**2
+          rp=(rq(icdp,icz)-alfp*dlog(xpomr))*2.d0*.0389d0
+         if(iy.gt.1)then
+          do iy1=1,11
+          do iz=1,11
+          do iqq=1,3
+           qdfan(iy,iy1,iz,icdp,iqq)=qdfan(iy-1,iy1,iz,icdp,iqq)
+          enddo
+          enddo
+          enddo
+         endif
+
+         n=0
+9        n=n+1
+         nrep=0
+         do iy1=1,11
+          xpomr1=(xpomr*sgap**2)**(dble(11-iy1)/10.d0)/sgap
+         do iz=1,11
+          if(iz.gt.6)then
+           z=.2d0*dble(iz-6)
+           b=dsqrt(-dlog(z)*rp)
+          else
+           b=dsqrt(-rp*(dlog(0.2d0)+2.d0*dble(iz-7)))
+           z=dexp(-b*b/rp)
+          endif
+          call qgdfan(xpomr,xpomr1,b*b,icdp,fann,n)
+          do iqq=1,3
+           if(fann(iqq).gt.0.d0)then
+            qfan2(iy1,iz,iqq)=dlog(fann(iqq)/z)
+           else
+            qfan2(iy1,iz,iqq)=qfan2(iy1-1,iz,iqq)
+           endif
+           if(n.gt.1.and.abs(qfan2(iy1,iz,iqq)
+     *     -qdfan(iy,iy1,iz,icdp,iqq)).gt.1.d-3)nrep=1
+          enddo
+         enddo
+         enddo
+
+         do iy1=1,11
+         do iz=1,11
+         do iqq=1,3
+          qdfan(iy,iy1,iz,icdp,iqq)=qfan2(iy1,iz,iqq)
+         enddo
+         enddo
+         enddo
+         if((n.eq.1.or.nrep.eq.1).and.iy.gt.1)goto 9
+
+         do iy1=1,11
+          xpomr1=(xpomr*sgap**2)**(dble(11-iy1)/10.d0)/sgap
+          do iz=1,11
+           if(iz.gt.6)then
+            z=.2d0*dble(iz-6)
+            b=dsqrt(-dlog(z)*rp)
+           else
+            b=dsqrt(-rp*(dlog(0.2d0)+2.d0*dble(iz-7)))
+            z=dexp(-b*b/rp)
+           endif
+           do iqq=1,3
+            if(iqq.ne.3)then
+             dpx=dexp(qdfan(iy,iy1,iz,icdp,iqq))*z
+            else
+             dpx=dexp(qdfan(iy,iy1,iz,icdp,iqq))*z
+     *       *dlog(xpomr1/xpomr/sgap)
+            endif
+            if(.not.(qdfan(iy,iy1,iz,icdp,iqq).le.0.d0
+     *      .or.qdfan(iy,iy1,iz,icdp,iqq).gt.0.d0))stop'qdfan-nan'
+           enddo
+          enddo
+         enddo
+        enddo
+       endif
+      enddo
+
+c-------------------------------------------------
+c integrated Pomeron eikonals
+      do icz=1,3
+      do icdp=1,2
+      do icdt=1,2
+       if(cd(icdp,icz).ne.0.d0.and.cd(icdt,2).ne.0.d0)then
+        do iy=1,11
+         e0n=10.d0**iy
+         sy=2.d0*e0n*am(2)+am(2)**2+am(icz)**2
+         rp=(rq(icdp,icz)+rq(icdt,2)+alfp*log(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          b=sqrt(-log(z)*rp)
+         else
+          b=sqrt(-rp*(log(0.2d0)+2.d0*(iz-7)))
+          z=exp(-b*b/rp)
+         endif
+
+         vsoft=gsoft(icz)*sy**dels/rp*cd(icdp,icz)*cd(icdt,2)
+         vgg=qgfsh(sy,b*b,icdp,icdt,icz,0)
+         vqg=qgfsh(sy,b*b,icdp,icdt,icz,1)
+         vgq=qgfsh(sy,b*b,icdp,icdt,icz,2)
+         vqq=qghard(sy,b*b,icdp,icdt,icz)
+
+         qxp=vsoft*z+vgg+vqg+vgq+vqq
+         do iv=1,6
+          vvx=(iv-1)/5.d0
+         do iv1=1,1+5*(icz-1)*(3-icz)
+          vvxp=(iv1-1)/5.d0
+         do iv2=1,6
+          vvxt=(iv2-1)/5.d0
+
+          v3p=qg3pom(sy,b,vvx,vvxp,vvxt,icdp,icdt,icz)
+          v1p=qgpcut(sy,b,vvx,vvxp,vvxt,icdp,icdt,icz)
+          qxp1=qxp+v3p
+          qxpc=qxp+v1p
+          if(qxp1.gt.0.d0)then
+           qpomr(iy,iz,iv+6*(iv1-1)+36*(iv2-1)
+     *     ,icdp+2*(icdt-1)+4*(icz-1),1)=log(qxp1/z)
+          else
+           qpomr(iy,iz,iv+6*(iv1-1)+36*(iv2-1),icdp+2*(icdt-1)
+     *     +4*(icz-1),1)=min(2.d0*qpomr(iy-1,iz,iv+6*(iv1-1)
+     *     +36*(iv2-1),icdp+2*(icdt-1)+4*(icz-1),1)-qpomr(iy-2,iz
+     *     ,iv+6*(iv1-1)+36*(iv2-1),icdp+2*(icdt-1)+4*(icz-1),1)
+     *     ,qpomr(iy-1,iz,iv+6*(iv1-1)+36*(iv2-1)
+     *     ,icdp+2*(icdt-1)+4*(icz-1),1))
+          endif
+          if(qxpc.gt.0.d0)then
+           qpomr(iy,iz,iv+6*(iv1-1)+36*(iv2-1)
+     *     ,icdp+2*(icdt-1)+4*(icz-1),2)=log(qxpc/z)
+          else
+           qpomr(iy,iz,iv+6*(iv1-1)+36*(iv2-1),icdp+2*(icdt-1)
+     *     +4*(icz-1),2)=min(2.d0*qpomr(iy-1,iz,iv+6*(iv1-1)
+     *     +36*(iv2-1),icdp+2*(icdt-1)+4*(icz-1),2)-qpomr(iy-2,iz
+     *     ,iv+6*(iv1-1)+36*(iv2-1),icdp+2*(icdt-1)+4*(icz-1),2)
+     *     ,qpomr(iy-1,iz,iv+6*(iv1-1)+36*(iv2-1)
+     *     ,icdp+2*(icdt-1)+4*(icz-1),2))
+          endif
+
+          do iqq=1,2
+           qpomr(iy,iz,iv+6*(iv1-1)+36*(iv2-1),icdp+2*(icdt-1)
+     *     +4*(icz-1),iqq)=max(qpomr(iy,iz,iv+6*(iv1-1)+36*(iv2-1)
+     *     ,icdp+2*(icdt-1)+4*(icz-1),iqq),-20.d0)
+
+           if(.not.(qpomr(iy,iz,iv+6*(iv1-1)+36*(iv2-1),icdp+2*(icdt-1)
+     *     +4*(icz-1),iqq).le.0.d0.or.qpomr(iy,iz,iv+6*(iv1-1)
+     *     +36*(iv2-1),icdp+2*(icdt-1)+4*(icz-1),iqq).gt.0.d0))
+     *     stop'qpomr-nan'
+          enddo
+         enddo
+         enddo
+         enddo
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+
+c-------------------------------------------------
+c interaction cross sections
+      ia(1)=1
+      do iy=1,10
+       e0n=10.d0**iy                               !interaction energy
+       scm=2.d0*e0n*am(2)+am(2)**2+am(icz)**2
+
+       do iiz=1,3
+        icz=iiz                                    !hadron class
+        rp=(rq(1,icz)+rq(1,2)+alfp*log(scm))*4.d0*.0389d0 !slope (in fm^2)
+        g0=pi*rp*10.d0                  !factor for cross-sections (in mb)
+
+        do iia=1,6
+         if(iia.le.4)then
+          ia(2)=4**(iia-1)                         !target mass number
+         elseif(iia.eq.5)then
+          ia(2)=14
+         else
+          ia(2)=40
+         endif
+         if(debug.ge.1)write (moniou,206)e0n,ty(icz),ia(2)
+c-------------------------------------------------
+c nuclear densities
+         if(ia(2).lt.10)then                       !light nuclei - gaussian
+          rnuc(2)=.9d0*float(ia(2))**.3333         !nuclear radius
+          wsnuc(2)=amws                            !not used
+          wbnuc(2)=0.d0                            !not used
+         elseif(ia(2).le.56)then                   !3-parameter Fermi
+          rnuc(2)=trnuc(ia(2))                     !nuclear radius
+          wsnuc(2)=twsnuc(ia(2))                   !diffuseness
+          wbnuc(2)=twbnuc(ia(2))                   !'wine-bottle' parameter
+         else                                      !2-parameter Fermi
+c rnuc - wood-saxon density radius (fit to the data of murthy et al.)
+          rnuc(2)=1.19d0*dble(ia(2))**(1.d0/3.d0)
+     *    -1.38d0*dble(ia(2))**(-1.d0/3.d0)        !nuclear radius
+          wsnuc(2)=amws                            !diffuseness
+          wbnuc(2)=0.d0                            !not used
+         endif
+
+         if(ia(2).eq.1)then               !hadron-proton interaction
+          call qgfz(0.d0,gz0,0,0)
+          gtot=gz0(1)                     !total cross-section
+          gin=(gz0(2)+gz0(3)+gz0(4))*.5d0 !inelastic cross section
+          bel=gz0(5)                      !elastic scattering slope
+          gel=gtot-gin                    !elastic cross section
+          gdp=gz0(3)*.5d0     !projectile low mass diffr. (+double LMD)
+          gdt=gz0(4)*.5d0                 !target low mass diffraction
+          if(iy.le.10)gsect(iy,icz,iia)=log(gin)
+
+          if(debug.ge.1)write (moniou,225)gtot,gin,gel,gdp,gdt,bel
+         else                             !hadron-nucleus interaction
+          bm=rnuc(2)+dlog(29.d0)*wsnuc(2) !for numerical integration
+          anorm=qganrm(rnuc(2),wsnuc(2),wbnuc(2))*rp !density normalization
+          call qggau(gz1)                 !integration over b<bm
+          call qggau1(gz1)                !integration over b>bm
+          gin=gz1(1)+gz1(2)+gz1(3)        !inelastic cross section
+          if(iy.le.10)gsect(iy,icz,iia)=log(gin*10.d0)
+
+          if(debug.ge.1)write (moniou,224)
+     *    gin*10.d0,gz1(3)*10.d0,gz1(2)*10.d0
+         endif
+         if(.not.(gsect(iy,icz,iia).le.0.d0
+     *   .or.gsect(iy,icz,iia).gt.0.d0))stop'qpomr-nan'
+        enddo
+       enddo
+      enddo
+
+c-------------------------------------------------
+c cut Pomeron leg eikonals
+      if(debug.ge.1)write (moniou,223)
+      do icz=1,3                                    !hadron class
+      do icdp=1,2
+       if(cd(icdp,icz).ne.0.d0)then
+        do iy=1,51
+         sy=sgap**2*(spmax/sgap**2)**((iy-1)/50.d0)
+         rp=(rq(icdp,icz)+alfp*log(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          bb=-log(z)*rp                             !impact parameter^2
+         else
+          bb=-rp*(log(0.2d0)+2.d0*(iz-7))
+          z=exp(-bb/rp)
+         endif
+        do ix=1,10
+         if(ix.le.5)then
+          xp=.2d0*(5.d0*sgap/sy)**((6-ix)/5.d0)     !Pomeron LC+ momentum
+         else
+          xp=.2d0*(ix-5)
+         endif
+         sys=xp*sy
+
+         vs=qgls(sys,xp,bb,icdp,icz)
+         vg=qglsh(sys,xp,bb,icdp,icz,0)
+         if(xp.lt..99d0)then
+          vq=qglsh(sys,xp,bb,icdp,icz,1)
+     *    /dsqrt(xp)*(1.d0-xp)**(ahv(icz)-ahl(icz))
+         else
+          vq=0.d0
+         endif
+         qlegc0(iy,ix,iz,icdp+2*(icz-1),1)=dlog((vs+vg+vq)/vs)
+         qlegc0(iy,ix,iz,icdp+2*(icz-1),2)=dlog((vs+vg)/vs)
+        enddo
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+      do icz=1,3                                    !hadron class
+      do icdp=1,2
+       if(cd(icdp,icz).ne.0.d0)then
+        do iy=1,51
+         sy=sgap**2*(spmax/sgap**2)**((iy-1)/50.d0)
+         rp=(rq(icdp,icz)+alfp*log(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          bb=-log(z)*rp                             !impact parameter^2
+         else
+          bb=-rp*(log(0.2d0)+2.d0*(iz-7))
+          z=exp(-bb/rp)
+         endif
+        do ix=1,10
+         if(ix.le.5)then
+          xp=.2d0*(5.d0*sgap/sy)**((6-ix)/5.d0)     !Pomeron LC+ momentum
+         else
+          xp=.2d0*(ix-5)
+         endif
+         sys=xp*sy
+
+         do iqq=1,3
+          call qgloolc(sys,xp,bb,icdp,icz,iqq,fann(2*iqq-1)
+     *    ,fann(2*iqq))
+         enddo
+         do iqq=1,6
+          if(fann(iqq).gt.0.d0)then
+           qlegc0(iy,ix,iz,icdp+2*(icz-1),iqq+2)
+     *     =dlog(fann(iqq)/qgls(sys,xp,bb,icdp,icz))
+          else
+           qlegc0(iy,ix,iz,icdp+2*(icz-1),iqq+2)
+     *     =min(2.d0*qlegc0(iy-1,ix,iz,icdp+2*(icz-1),iqq+2)
+     *     -qlegc0(iy-2,ix,iz,icdp+2*(icz-1),iqq+2)
+     *     ,qlegc0(iy-1,ix,iz,icdp+2*(icz-1),iqq+2))
+          endif
+          qlegc0(iy,ix,iz,icdp+2*(icz-1),iqq+2)
+     *     =max(qlegc0(iy,ix,iz,icdp+2*(icz-1),iqq+2),-20.d0)
+         enddo
+        enddo
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+      do icz=1,3                                    !hadron class
+      do icdp=1,2                                   !diffr. eigenstate
+       if(cd(icdp,icz).ne.0.d0)then
+        do iv=1,11
+         vvx=dble(iv-1)/10.d0
+         do iy=1,51                                 !initialization
+         do ix=1,10
+         do iz=1,11
+          do iqq=1,3
+           qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *     =qlegc0(iy,ix,iz,icdp+2*(icz-1),2*iqq+1)
+          enddo
+         enddo
+         enddo
+         enddo
+
+         do iy=2,51
+          sy=sgap**2*(spmax/sgap**2)**((iy-1)/50.d0)
+          rp=(rq(icdp,icz)+alfp*log(sy))*4.d0*.0389d0
+
+          do ix=1,10
+          do iz=1,11
+          do iqq=1,3
+           qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *     =qlegc(iy-1,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+          enddo
+          enddo
+          enddo
+
+          n=1
+43        n=n+1                          !number of t-channel iterations
+          nrep=0
+          do iz=1,11
+           if(iz.gt.6)then
+            z=.2d0*(iz-6)
+            bb=-log(z)*rp                           !impact parameter^2
+           else
+            bb=-rp*(log(0.2d0)+2.d0*(iz-7))
+            z=exp(-bb/rp)
+           endif
+          do ix=1,10
+           if(ix.le.5)then
+            xp=.2d0*(5.d0*sgap/sy)**((6-ix)/5.d0)   !Pomeron LC+ momentum
+           else
+            xp=.2d0*(ix-5)
+           endif
+           sys=xp*sy
+
+           do iqq=1,3
+            fann(iqq)=qglscr(sys,xp,bb,vvx,icdp,icz,iqq)
+            if(fann(iqq).gt.0.d0)then
+             qfan2(ix,iz,iqq)=dlog(fann(iqq)/qgls(sys,xp,bb,icdp,icz))
+            elseif(iy.gt.2)then
+             qfan2(ix,iz,iqq)
+     *       =min(2.d0*qlegc(iy-1,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *       -qlegc(iy-2,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *       ,qlegc(iy-1,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1)))
+            else
+             qfan2(ix,iz,iqq)
+     *       =qlegc(iy-1,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+            endif
+            qfan2(ix,iz,iqq)=max(qfan2(ix,iz,iqq),-20.d0)
+            if(abs(qfan2(ix,iz,iqq)-qlegc(iy,ix,iv,iz
+     *      ,icdp+2*(icz-1)+6*(iqq-1))).gt.1.d-3)nrep=1
+           enddo
+          enddo
+          enddo
+
+          do iz=1,11
+           if(iz.gt.6)then
+            z=.2d0*(iz-6)
+            bb=-log(z)*rp                           !impact parameter
+           else
+            bb=-rp*(log(0.2d0)+2.d0*(iz-7))
+            z=exp(-bb/rp)
+           endif
+          do ix=1,10
+           if(ix.le.5)then
+            xp=.2d0*(5.d0*sgap/sy)**((6-ix)/5.d0)   !Pomeron LC+ momentum
+           else
+            xp=.2d0*(ix-5)
+           endif
+           sys=xp*sy
+
+          do iqq=1,3
+           qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))=qfan2(ix,iz,iqq)
+
+           if(.not.(qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1)).le.0.d0
+     *     .or.qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1)).gt.0.d0))
+     *     stop'qlegc-nan'
+          enddo
+          enddo
+          enddo
+          if(nrep.eq.1.and.n.lt.50)goto 43
+         enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+c soft pre-evolution
+      do icz=1,3                                    !hadron class
+      do icdp=1,2                                   !diffr. eigenstate
+       if(cd(icdp,icz).ne.0.d0)then
+        do iv=1,11
+         vvx=dble(iv-1)/10.d0
+        do iy=1,51
+         sy=sgap*(spmax/sgap)**((iy-1)/50.d0)
+         rp=(rq(icdp,icz)+alfp*log(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          bb=-log(z)*rp                             !impact parameter
+         else
+          bb=-rp*(log(0.2d0)+2.d0*(iz-7))
+          z=exp(-bb/rp)
+         endif
+        do ix=1,10
+         if(ix.le.5)then
+          xp=.2d0*(sgap/sy)**((6-ix)/5.d0)          !Pomeron LC+ momentum
+         else
+          xp=.2d0*(ix-5)
+         endif
+         sys=xp*sy
+
+         if(iy.eq.1)then
+          qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+18)=0.d0
+          qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+24)=0.d0
+         else
+          do iqq=4,5
+           fann(iqq)=qglh(sys,xp,bb,vvx,icdp,icz,iqq-4)
+           if(fann(iqq).gt.0.d0)then
+            qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *      =dlog(fann(iqq))
+           elseif(iy.gt.2)then
+            qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *      =min(2.d0*qlegc(iy-1,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *      -qlegc(iy-2,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *      ,qlegc(iy-1,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1)))
+           else
+            qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *      =qlegc(iy-1,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+           endif
+           qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1))
+     *     =max(qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1)),-20.d0)
+
+           if(.not.(qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1)).le.0.d0
+     *     .or.qlegc(iy,ix,iv,iz,icdp+2*(icz-1)+6*(iqq-1)).gt.0.d0))
+     *     stop'qlegc-nan'
+          enddo
+         endif
+        enddo
+        enddo
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+
+c-------------------------------------------------
+c cut Pomeron eikonals
+      if(debug.ge.1)write (moniou,226)
+      do icz=1,3                                    !proj. class
+      do icdp=1,2
+      do icdt=1,2
+       if(cd(icdp,icz).ne.0.d0.and.cd(icdt,2).ne.0.d0)then
+        do iy=1,11
+         sy=sgap**2*(spmax/sgap**2)**((iy-1)/10.d0)
+         rp=(rq(icdp,icz)+rq(icdt,2)+alfp*log(sy))*4.d0*.0389d0
+        do iz=1,11
+         if(iz.gt.6)then
+          z=.2d0*(iz-6)
+          bb=-log(z)*rp                             !impact parameter^2
+         else
+          bb=-rp*(log(0.2d0)+2.d0*(iz-7))
+          z=exp(-bb/rp)
+         endif
+        do iv=1,11
+         vvx=(iv-1)/10.d0                           !relative scr. strenth
+
+        do ix1=1,10
+         if(ix1.le.5)then
+          xp=.2d0*(5.d0*sgap/sy)**((6-ix1)/5.d0)    !Pomeron LC+ momentum
+         else
+          xp=.2d0*(ix1-5)
+         endif
+        do ix2=1,10
+         if(ix2.le.5)then
+          xm=.2d0*(sgap/sy/xp)**((6-ix2)/5.d0)      !Pomeron LC- momentum
+         else
+          xm=.2d0*(ix2-5)
+         endif
+         sys=xp*xm*sy
+
+         do iqq=1,4
+          vv=qgcutp(sys,xp,xm,bb,vvx,icdp,icdt,icz,iqq)
+          if(vv.gt.0.d0)then
+           qpomc(iy,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)+4*(icz-1)
+     *     +12*(iqq-1))=dlog(vv/z)
+          elseif(iy.gt.2)then
+           qpomc(iy,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)+4*(icz-1)
+     *     +12*(iqq-1))=min(2.d0*qpomc(iy-1,ix1+10*(ix2-1),iz,iv
+     *     ,icdp+2*(icdt-1)+4*(icz-1)+12*(iqq-1))-qpomc(iy-2
+     *     ,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)+4*(icz-1)+12*(iqq-1))
+     *     ,qpomc(iy-1,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)+4*(icz-1)
+     *     +12*(iqq-1)))
+          else
+           qpomc(iy,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)+4*(icz-1)
+     *     +12*(iqq-1))=qpomc(iy-1,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)
+     *     +4*(icz-1)+12*(iqq-1))
+          endif
+           qpomc(iy,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)+4*(icz-1)
+     *     +12*(iqq-1))=max(qpomc(iy,ix1+10*(ix2-1),iz,iv,icdp
+     *     +2*(icdt-1)+4*(icz-1)+12*(iqq-1)),-20.d0)
+
+          if(.not.(qpomc(iy,ix1+10*(ix2-1),iz,iv,icdp+2*(icdt-1)+4*(icz
+     *    -1)+12*(iqq-1)).le.0.d0.or.qpomc(iy,ix1+10*(ix2-1),iz,iv,icdp
+     *    +2*(icdt-1)+4*(icz-1)+12*(iqq-1)).gt.0.d0))stop'qpomc-nan'
+         enddo
+        enddo
+        enddo
+        enddo
+        enddo
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+
+c-----------------------------------------------------------------------------
+c timelike Sudakov formfactor
+      if(debug.ge.1)write (moniou,221)
+      do m=1,2                     !parton type (1-g, 2-q)
+       fsud(1,m)=0.d0
+      do k=2,10
+       qmax=qtf*4.d0**(1.d0+k)     !effective virtuality (qt**2/z**2/(1-z)**2)
+       fsud(k,m)=qgsudt(qmax,m)
+      enddo
+      enddo
+c-----------------------------------------------------------------------------
+c effective virtuality (used for inversion in timelike branching)
+      if(debug.ge.1)write (moniou,222)
+      do m=1,2                     !parton type (1-g, 2-q)
+      do k=1,10
+       qlmax=1.38629d0*(k-1)
+       qrt(k,1,m)=0.d0
+       qrt(k,101,m)=qlmax
+      do i=1,99                    !bins in Sudakov formfactor
+       if(k.eq.1)then
+        qrt(k,i+1,m)=0.d0
+       else
+        qrt(k,i+1,m)=qgroot(qlmax,.01d0*i,m)
+       endif
+      enddo
+      enddo
+      enddo
+
+c-----------------------------------------------------------------------------
+c writing cross sections to the file
+      if(debug.ge.1)write (moniou,220)
+      if(ifIIdat.ne.1)then
+       open(1,file=DATDIR(1:INDEX(DATDIR,' ')-1)//'qgsdat-II-04'
+     * ,status='unknown')
+      else                                              !used to link with nexus
+       open(ifIIdat,file=fnIIdat(1:nfnIIdat),status='unknown')
+      endif
+      write (1,*)csborn,cs0,cstot,evk,qpomi,qpomis,qlegi,qfanu,qfanc
+     *,qdfan,qpomr,gsect,qlegc0,qlegc,qpomc,fsud,qrt,qrev,fsud,qrt
+      close(1)
+
+10    continue
+c-----------------------------------------------------------------------------
+c nuclear cross sections
+      if(ifIIncs.ne.2)then
+       inquire(file=DATDIR(1:INDEX(DATDIR,' ')-1)//'sectnu-II-04'
+     * ,exist=lcalc)
+      else                                                  !ctp
+       inquire(file=fnIIncs(1:nfnIIncs),exist=lcalc)
+      endif
+
+      if(lcalc)then
+       if(debug.ge.0)write (moniou,207)
+       if(ifIIncs.ne.2)then
+        open(2,file=DATDIR(1:INDEX(DATDIR,' ')-1)//'sectnu-II-04'
+     *  ,status='old')
+       else                                                  !ctp
+        open(ifIIncs,file=fnIIncs(1:nfnIIncs),status='old')
+       endif
+       read (2,*)qgsasect
+       close(2)
+
+      elseif(.not.producetables)then
+        write(moniou,*) "Missing sectnu-II-04 file !"
+        write(moniou,*) "Please correct the defined path ",
+     &"or force production ..."
+        stop
+
+      else
+       niter=5000                   !number of iterations
+       do ie=1,10
+        e0n=10.d0**ie               !interaction energy (per nucleon)
+       do iia1=1,6
+        iap=2**iia1                 !proj. mass number
+       do iia2=1,6
+        if(iia2.le.4)then
+         iat=4**(iia2-1)            !targ. mass number
+        elseif(iia2.eq.5)then
+         iat=14
+        else
+         iat=40
+        endif
+        if(debug.ge.1)write (moniou,208)e0n,iap,iat
+
+        call qgini(e0n,2,iap,iat)
+        call qgcrossc(niter,gtot,gprod,gabs,gdd,gqel,gcoh)
+        if(debug.ge.1)write (moniou,209)gtot,gprod,gabs,gdd,gqel,gcoh
+        qgsasect(ie,iia1,iia2)=log(gprod)
+       enddo
+       enddo
+       enddo
+       if(ifIIncs.ne.2)then
+        open(2,file=DATDIR(1:INDEX(DATDIR,' ')-1)//'sectnu-II-04'
+     *  ,status='unknown')
+       else                                                  !ctp
+        open(ifIIncs,file=fnIIncs(1:nfnIIncs),status='unknown')
+       endif
+       write (2,*)qgsasect
+       close(2)
+      endif
+
+      if(debug.ge.3)write (moniou,218)
+201   format(2x,'qgaini: hard cross sections calculation')
+202   format(2x,'qgaini: number of rungs considered:',i2
+     */4x,'starting energy bin for ordered and general ladders:',3i4)
+205   format(2x,'qgaini: pretabulation of the interaction eikonals')
+206   format(2x,'qgaini: initial particle energy:',e10.3,2x
+     *,'its type:',a7,2x,'target mass number:',i2)
+207   format(2x,'qgaini: nuclear cross sections readout from the file'
+     *,' sectnu-II-04')
+208   format(2x,'qgaini: initial nucleus energy:',e10.3,2x
+     *,'projectile mass:',i2,2x,'target mass:',i2)
+209   format(2x,'gtot',d10.3,'  gprod',d10.3,'  gabs',d10.3
+     */2x,'gdd',d10.3,'  gqel',d10.3,' gcoh',d10.3)
+210   format(2x,'qgaini - main initialization procedure')
+212   format(2x,'qgaini: integrated Pomeron leg eikonals')
+213   format(2x,'qgaini: integrated fan contributions')
+214   format(2x,'qgaini: cross sections readout from the file: ', A,2x)
+c     *,' qgsdat-II-04')
+215   format(2x,'qgaini: integrated cut fan contributions')
+c216   format(2x,'qgaini: integrated cut Pomeron eikonals')
+218   format(2x,'qgaini - end')
+220   format(2x,'qgaini: cross sections are written to the file'
+     *,' qgsdat-II-04')
+221   format(2x,'qgaini: timelike Sudakov formfactor')
+222   format(2x,'qgaini: effective virtuality for inversion')
+223   format(2x,'qgaini: cut Pomeron leg eikonals')
+224   format(2x,'qgaini: hadron-nucleus cross sections:'
+     */4x,'gin=',e10.3,2x,'gdifr_targ=',e10.3,2x
+     *,'gdifr_proj=',e10.3)
+225   format(2x,'qgaini: hadron-proton cross sections:'
+     */4x,'gtot=',e10.3,2x,'gin=',e10.3,2x,'gel=',e10.3/4x
+     *,'gdifrp=',e10.3,2x,'gdifrt=',e10.3,2x,'b_el=',e10.3,2x)
+226   format(2x,'qgaini: cut Pomeron eikonals (semi-hard)')
+      return
+      end
+
+c=============================================================================
+      subroutine qgini(e0n,icp0,iap,iat)
+c-----------------------------------------------------------------------------
+c additional initialization procedure
+c e0n  - interaction energy (per hadron/nucleon),
+c icp0 - hadron type (+-1 - pi+-, +-2 - p(p~), +-3 - n(n~),
+c                     +-4 - K+-, +-5 - K_l/s),
+c iap  - projectile mass number (1 - for a hadron),
+c iat  - target mass number
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr4/  ey0(3)
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr7/  xa(iapmax,3),xb(iapmax,3),b
+      common /qgarr10/ am(7),ammu
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr43/ moniou
+      common /arr1/    trnuc(56),twsnuc(56),twbnuc(56)
+      common /qgdebug/ debug
+      common /qgsIInex1/xan(iapmax,3),xbn(iapmax,3)  !used to link with nexus
+     *,bqgs,bmaxqgs,bmaxnex,bminnex
+
+      if(debug.ge.1)write (moniou,201)icp0,iap,iat,e0n
+      icp=icp0
+      ia(1)=iap
+      ia(2)=iat
+
+      icz=iabs(icp)/2+1  !!!!!particle class (1 - pion, 2 - nucleon, 3 - kaon)
+
+      scm=2.d0*e0n*am(2)+am(2)**2+am(icz)**2   !c.m. energy squared
+      ey0(1)=dsqrt(scm)/(e0n+am(2)+dsqrt(e0n-am(icz))
+     **dsqrt(e0n+am(icz)))                     !Lorentz boost to lab. frame
+      ey0(2)=1.d0
+      ey0(3)=1.d0
+      wp0=dsqrt(scm)                           !initial LC+ mometum
+      wm0=wp0                                  !initial LC- mometum
+
+c-------------------------------------------------
+c nuclear radii and weights for nuclear configurations - procedure qggea
+      do i=1,2
+       if(ia(i).lt.10.and.ia(i).ne.1)then      !gaussian density
+        rnuc(i)=.9d0*float(ia(i))**.3333       !nuclear radius
+        if(ia(i).eq.2)rnuc(i)=3.16d0
+c rnuc -> rnuc * a / (a-1) - to use van-hove method (in qggea)
+        rnuc(i)=rnuc(i)*dsqrt(2.d0*ia(i)/(ia(i)-1.d0))
+                           !rnuc -> rnuc*a/(a-1) - to use Van-Hove method
+      elseif(ia(i).ne.1)then
+        if(ia(i).le.56)then                    !3-parameter Fermi
+         rnuc(i)=trnuc(ia(i))                  !nuclear radius
+         wsnuc(i)=twsnuc(ia(i))                !diffuseness
+         wbnuc(i)=twbnuc(ia(i))                !'wine-bottle' parameter
+        else
+         rnuc(i)=1.19*float(ia(i))**(1./3.)-1.38*float(ia(i))**(-1./3.)
+         wsnuc(i)=amws                         !diffuseness
+         wbnuc(i)=0.d0
+        endif
+        cr1(i)=1.d0+3.d0/rnuc(i)*wsnuc(i)+6.d0/(rnuc(i)/wsnuc(i))**2
+     *  +6.d0/(rnuc(i)/wsnuc(i))**3
+        cr2(i)=3.d0/rnuc(i)*wsnuc(i)
+        cr3(i)=3.d0/rnuc(i)*wsnuc(i)+6.d0/(rnuc(i)/wsnuc(i))**2
+       endif
+      enddo
+
+      if(ia(1).ne.1.and.ia(2).ne.1)then      !primary nucleus       !so18032013-beg
+       bm=rnuc(1)+rnuc(2)+5.d0*max(wsnuc(1),wsnuc(2))
+     &   +dsqrt(alfp*log(scm))                               !b-cutoff
+      elseif(ia(2).ne.1)then                 !hadron-nucleus
+       bm=rnuc(2)+5.d0*wsnuc(2)+dsqrt(rq(1,2)+alfp*log(scm)) !b-cutoff
+      elseif(ia(1).ne.1)then                 !nucleus-proton
+       bm=rnuc(1)+5.d0*wsnuc(1)+dsqrt(rq(1,2)+alfp*log(scm)) !b-cutoff
+      else                                   !hadron-proton
+       bm=3.d0*dsqrt((rq(1,icz)+rq(1,2)+alfp*log(scm))*4.d0*.0398d0)
+      endif                                                         !so18032013-end
+
+      bmaxqgs=bm                                      !used to link with nexus
+
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qgini - miniinitialization: particle type icp0=',
+     *i2,2x,'projectile mass number iap=',i2/4x,
+     *'target mass number iat=',i2,' interaction energy e0n=',e10.3)
+202   format(2x,'qgini - end')
+      return
+      end
+
+c=============================================================================
+      double precision function qgpint(sy,bb)
+c-----------------------------------------------------------------------------
+c qgpint - interm. Pomeron eikonal
+c sy  - pomeron mass squared,
+c bb  - impact parameter squared
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)sy,bb
+
+      qgpint=0.d0
+      s2min=4.d0*fqscal*qt0
+      xmin=s2min/sy
+      if(xmin.ge.1.d0)return
+
+      xmin=xmin**(delh-dels)
+c numerical integration over z1
+      do i=1,7
+      do m=1,2
+       z1=(.5d0*(1.d0+xmin-(2*m-3)*x1(i)*(1.d0-xmin)))
+     * **(1.d0/(delh-dels))
+       ww=z1*sy
+       sjqq=qgjit(qt0,qt0,ww,2,2)  !inclusive qq cross-section
+       sjqg=qgjit(qt0,qt0,ww,1,2)  !inclusive qg cross-section
+       sjgg=qgjit(qt0,qt0,ww,1,1)  !inclusive gg cross-section
+
+       st2=0.d0
+       do j=1,7
+       do k=1,2
+        xx=.5d0*(1.d0+x1(j)*(2*k-3))
+        xp=z1**xx
+        xm=z1/xp
+        glu1=qgppdi(xp,0)
+        sea1=qgppdi(xp,1)
+        glu2=qgppdi(xm,0)
+        sea2=qgppdi(xm,1)
+        st2=st2+a1(j)*(glu1*glu2*sjgg+(glu1*sea2+glu2*sea1)*sjqg
+     *  +sea1*sea2*sjqq)
+       enddo
+       enddo
+       rh=-alfp*dlog(z1)
+       qgpint=qgpint-a1(i)*dlog(z1)/z1**delh*st2
+     * *exp(-bb/(4.d0*.0389d0*rh))/rh
+      enddo
+      enddo
+      qgpint=qgpint*(1.d0-xmin)/(delh-dels)*factk*rr**2/2.d0*pi
+
+      if(debug.ge.3)write (moniou,202)qgpint
+201   format(2x,'qgpint - interm. Pomeron eikonal:'
+     */4x,'sy=',e10.3,2x,'bb=',e10.3)
+202   format(2x,'qgpint=',e10.3)
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgpini(sy,bb,vvx,vvxt,iqq)
+c-----------------------------------------------------------------------
+c qgpini - intermediate gg-Pomeron eikonal
+c sy   - pomeron mass squared,
+c bb   - impact parameter squared,
+c vvx  - total / projectile screening factor,
+c vvxt - target screening factor
+c vvx  - total/projectile screening factor:
+c vvx  = 0                                                    (iqq=1,...15)
+c vvx  = 1 - exp[-2*sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]  (iqq=16)
+c vvx  = 1 + exp[-2*sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]
+c          - exp[-2*sum_{i} chi_proj(i)-sum_j chi_targ(j)]
+c          - exp[-sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]    (iqq=17 uncut)
+c vvx  = 1 - exp[-sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]    (iqq=17,...19)
+c vvx  = 1 - exp[-sum_{i} chi_proj(i)]                        (iqq=20,...23)
+c vvxt - target screening factor:
+c vvxt = 0                                                    (iqq=1,...19)
+c vvxt = 1 - exp[-sum_j chi_targ(j)]                          (iqq=20,...23)
+c uncut eikonals:
+c iqq=0  - single soft Pomeron
+c iqq=1  - single Pomeron
+c iqq=2  - general loop contribution
+c iqq=3  - single Pomeron end on one side
+c iqq=4  - single Pomeron ends on both sides
+c cut eikonals:
+c iqq=5  - single cut Pomeron
+c iqq=6  - single cut Pomeron with single end
+c iqq=7  - single cut Pomeron with 2 single ends
+c iqq=8  - any cuts except the complete rap-gap
+c iqq=9  - single cut Pomeron end at one side
+c iqq=10 - single cut Pomeron end at one side and single Pomeron on the other
+c iqq=11 - no rap-gap at one side
+c iqq=12 - no rap-gap at one side and single Pomeron on the other
+c iqq=13 - single cut soft Pomeron
+c iqq=14 - single cut soft Pomeron with single end
+c iqq=15 - single cut soft Pomeron with 2 single ends
+c  with proj/targ screening corrections:
+c iqq=16 - single cut Pomeron
+c iqq=17 - uncut / cut end / loop sequence
+c iqq=18 - no rap-gap at the end
+c iqq=19 - single cut Pomeron end
+c iqq=20 - diffractive cut, Puu
+c iqq=21 - diffractive cut, Puu-Puc
+c iqq=22 - diffractive cut, Pcc
+c iqq=23 - diffractive cut, Pcc+Pcu
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wz(3),wi(3),wj(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr20/ spmax
+      common /qgarr26/ factk,fqscal
+      common /qgarr39/ qpomi(51,11,15),qpomis(51,11,11,11,9)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qgpini=0.d0
+      pinm=0.d0
+      s2min=4.d0*fqscal*qt0
+      rp=alfp*dlog(sy)*4.d0*.0389d0
+      z=exp(-bb/rp)
+      if(iqq.le.1.and.(sy.le.s2min.or.iqq.eq.0))goto 1
+
+      yl=log(sy/sgap)/log(spmax/sgap)*50.d0+1.d0
+      k=max(1,int(1.00001d0*yl-1.d0))
+      k=min(k,49)
+      wk(2)=yl-k
+      if(yl.le.2.d0)then
+       iymax=2
+       wk(1)=1.d0-wk(2)
+      else
+       wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+       wk(1)=1.d0-wk(2)+wk(3)
+       wk(2)=wk(2)-2.d0*wk(3)
+       iymax=3
+      endif
+
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-dlog(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      if(iqq.le.15)then
+       iqr=iqq
+       if(sy.le.sgap**2.and.iqq.le.12)iqr=1
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgpini=qgpini+qpomi(k2,l2,iqr)*wk(k1)*wz(l1)
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do k1=1,iymax
+         k2=k+k1-1
+         pinm=pinm+qpomi(k2,1,iqr)*wk(k1)
+        enddo
+        qgpini=min(qgpini,pinm)
+       endif
+
+      else
+       vi=vvx*10.d0+1.d0
+       i=max(1,int(vi))
+       i=min(i,9)
+       wi(2)=vi-i
+       wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+       wi(1)=1.d0-wi(2)+wi(3)
+       wi(2)=wi(2)-2.d0*wi(3)
+
+       if(iqq.le.19)then
+        do i1=1,3
+         i2=i+i1-1
+        do l1=1,izmax
+         l2=jz+l1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         qgpini=qgpini+qpomis(k2,l2,i2,1,iqq-15)*wk(k1)*wz(l1)*wi(i1)
+        enddo
+        enddo
+        enddo
+        if(zz.lt.1.d0)then
+         do i1=1,3
+          i2=i+i1-1
+         do k1=1,iymax
+          k2=k+k1-1
+          pinm=pinm+qpomis(k2,1,i2,1,iqq-15)*wk(k1)*wi(i1)
+         enddo
+         enddo
+         qgpini=min(qgpini,pinm)
+        endif
+
+       else
+        vj=vvxt*10.d0+1.d0
+        j=max(1,int(vj))
+        j=min(j,9)
+        wj(2)=vj-j
+        wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+        wj(1)=1.d0-wj(2)+wj(3)
+        wj(2)=wj(2)-2.d0*wj(3)
+        jmax=3
+
+        do j1=1,jmax
+         j2=j+j1-1
+        do i1=1,3
+         i2=i+i1-1
+        do l1=1,izmax
+         l2=jz+l1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         qgpini=qgpini+qpomis(k2,l2,i2,j2,iqq-15)
+     *   *wk(k1)*wz(l1)*wi(i1)*wj(j1)
+        enddo
+        enddo
+        enddo
+        enddo
+        if(zz.lt.1.d0)then
+         do j1=1,jmax
+          j2=j+j1-1
+         do i1=1,3
+          i2=i+i1-1
+         do k1=1,iymax
+          k2=k+k1-1
+          pinm=pinm+qpomis(k2,1,i2,j2,iqq-15)*wk(k1)*wi(i1)*wj(j1)
+         enddo
+         enddo
+         enddo
+         qgpini=min(qgpini,pinm)
+        endif
+       endif
+      endif
+1     qgpini=exp(qgpini)
+      if(iqq.le.16.or.iqq.eq.19)qgpini=qgpini
+     **sy**dels*sigs*g3p**2*z/rp*4.d0*.0389d0
+      return
+      end
+
+c=============================================================================
+      double precision function qgleg(sy,bb,icdp,icz)
+c-----------------------------------------------------------------------------
+c qgleg - integrated Pomeron leg eikonal
+c sy  - pomeron mass squared,
+c bb  - impact parameter squared,
+c icz - hadron class
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr25/ ahv(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)sy,bb,icz
+
+      qgleg=0.d0
+      if(sy.lt.1.001d0)then
+       tmin=1.d0
+      else
+       tmin=(1.d0-(1.d0-1.d0/sy)**(1.+ahl(icz)))**(1.+dels)
+      endif
+      if(debug.ge.3)write (moniou,203)tmin
+      do i1=1,7
+      do m1=1,2
+       tp=1.d0-(.5d0*(1.d0+tmin)+x1(i1)*(m1-1.5d0)*(1.d0-tmin))
+     * **(1./(1.+dels))
+       if(tp.gt.1.d-9)then
+        xp=1.d0-tp**(1.d0/(1.d0+ahl(icz)))
+       else
+        xp=1.d0
+       endif
+
+       ws=qgls(xp*sy,xp,bb,icdp,icz)
+       wg=qglsh(xp*sy,xp,bb,icdp,icz,0)
+       wq=qglsh(xp*sy,xp,bb,icdp,icz,1)/dsqrt(xp)
+     * *(1.d0-xp)**(ahv(icz)-ahl(icz))
+
+       qgleg=qgleg+a1(i1)*(ws+wg+wq)/(1.d0-tp)**dels
+      enddo
+      enddo
+      qgleg=qgleg/2.d0/(1.+ahl(icz))/(1.d0+dels)
+
+      if(debug.ge.3)write (moniou,202)qgleg
+201   format(2x,'qgleg - Pomeron leg eikonal:'
+     */4x,'s=',e10.3,2x,'b^2=',e10.3,2x,'icz=',i1)
+202   format(2x,'qgleg=',e10.3)
+203   format(2x,'qgleg:',2x,'tmin=',e10.3)
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qglegi(sy,bb,icdp,icz,iqq)
+c-----------------------------------------------------------------------
+c qglegi - integrated Pomeron leg eikonal
+c sy   - pomeron mass squared,
+c bb   - impact parameter squared,
+c icdp - diffractive state for the hadron,
+c icz  - hadron class
+c iqq=1 - single leg Pomeron
+c iqq=2 - all loops
+c iqq=3 - single Pomeron end
+c iqq=4 - single cut Pomeron
+c iqq=5 - single cut Pomeron with single Pomeron end
+c iqq=6 - single cut Pomeron end
+c iqq=7 - no rap-gap at the end
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wz(3)
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr27/ qlegi(51,11,2,3,7),qfanu(51,11,11,6,2)
+     *,qfanc(51,11,11,39,18),qdfan(21,11,11,2,3),qrev(11,11,66,219,2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qglegi=0.d0
+      xlegm=0.d0
+      rp=(rq(icdp,icz)+alfp*log(sy))*4.d0*.0389d0
+      z=exp(-bb/rp)
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-dlog(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      yl=log(sy/sgap)/log(spmax/sgap)*50.d0+1.d0
+      k=max(1,int(yl))
+      k=min(k,49)
+      wk(2)=yl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+      iymax=3
+
+      iqr=iqq
+      if(sy.le.sgap**2)iqr=1
+      do l1=1,izmax
+       l2=jz+l1-1
+      do k1=1,iymax
+       k2=k+k1-1
+       qglegi=qglegi+qlegi(k2,l2,icdp,icz,iqr)*wk(k1)*wz(l1)
+      enddo
+      enddo
+      if(zz.lt.1.d0)then
+       do k1=1,iymax
+        k2=k+k1-1
+        xlegm=xlegm+qlegi(k2,1,icdp,icz,iqr)*wk(k1)
+       enddo
+       qglegi=min(qglegi,xlegm)
+      endif
+      qglegi=exp(qglegi)*z
+     **(1.d0-(1.d0-(1.d0-1.d0/sy)**(1.+ahl(icz)))**(1.+dels))
+      return
+      end
+
+c=============================================================================
+      double precision function qgls(sy,xp,bb,icdp,icz)
+c-----------------------------------------------------------------------------
+c qgls - soft pomeron leg eikonal
+c sy   - pomeron mass squared,
+c xp   - pomeron light cone momentum,
+c bb   - impact parameter squared,
+c icdp - diffractive state for the connected hadron,
+c icz  - hadron class
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)sy,bb,icz
+
+      rp=rq(icdp,icz)+alfp*log(sy/xp)
+      qgls=sy**dels*fp(icz)*g3p*sigs/rp*exp(-bb/(4.d0*.0389d0*rp))
+     **cd(icdp,icz)
+
+      if(debug.ge.3)write (moniou,202)qgls
+201   format(2x,'qgls - soft pomeron leg eikonal:'
+     */4x,'sy=',e10.3,2x,'b^2=',e10.3,2x,'icz=',i1)
+202   format(2x,'qgls=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qglsh(sy,xp,bb,icdp,icz,iqq)
+c-----------------------------------------------------------------------------
+c qglsh - unintegrated Pomeron leg eikonal
+c sy  - pomeron mass squared,
+c xp  - light cone momentum share,
+c bb  - impact parameter squared,
+c icz - hadron class
+c iqq=0 - gluon/sea quark contribution,
+c iqq=1 - valence quark contribution
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr25/ ahv(3)
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)sy,bb,icz
+
+      qglsh=0.d0
+      s2min=4.d0*fqscal*qt0
+      if(sy.lt.1.001d0*s2min)return
+
+      xmin=(s2min/sy)**(delh-dels)
+c numerical integration over zh
+      do i1=1,7
+      do m1=1,2
+       zh=(.5d0*(1.d0+xmin-(2*m1-3)*x1(i1)*(1.d0-xmin)))
+     * **(1.d0/(delh-dels))
+       ww=zh*sy         !c.m. energy squared for hard interaction
+       sjqq=qgjit(qt0,qt0,ww,2,2)
+       sjqg=qgjit(qt0,qt0,ww,1,2)
+       sjgg=qgjit(qt0,qt0,ww,1,1)
+       if(debug.ge.3)write (moniou,203)ww,sjqq+sjqg+sjgg
+
+       if(iqq.eq.0)then
+        stg=0.d0
+        do i2=1,7
+        do m2=1,2
+         xx=.5d0*(1.d0+x1(i2)*(2*m2-3))
+         xph=zh**xx
+         xmh=zh/xph
+         glu1=qgppdi(xph,0)
+         sea1=qgppdi(xph,1)
+         glu2=qgppdi(xmh,0)
+         sea2=qgppdi(xmh,1)
+         rh=rq(icdp,icz)-alfp*dlog(zh*xp)
+
+         stsum=(glu1*glu2*sjgg+(glu1*sea2+glu2*sea1)*sjqg
+     *   +sea1*sea2*sjqq)*exp(-bb/(4.d0*.0389d0*rh))/rh
+         stg=stg+a1(i2)*stsum
+        enddo
+        enddo
+        qglsh=qglsh-a1(i1)*dlog(zh)/zh**delh*stg
+
+       elseif(iqq.eq.1)then
+        xmh=zh
+        glu2=qgppdi(xmh,0)
+        sea2=qgppdi(xmh,1)
+        rh=rq(icdp,icz)-alfp*dlog(zh)
+
+        stq=(glu2*sjqg+sea2*sjqq)*exp(-bb/(4.d0*.0389d0*rh))/rh
+        qglsh=qglsh+a1(i1)/zh**delh*stq
+     *  *(qggrv(xp,qt0,icz,1)+qggrv(xp,qt0,icz,2))/dsqrt(xp)
+       endif
+      enddo
+      enddo
+      if(iqq.eq.0)then
+       qglsh=qglsh*rr**2*(1.d0-xmin)/(delh-dels)*fp(icz)*g3p*factk
+     * /2.d0*pi*cd(icdp,icz)
+      elseif(iqq.eq.1)then
+       qglsh=qglsh*rr*(1.d0-xmin)/(delh-dels)*g3p*factk/4.d0
+     * *cd(icdp,icz)
+      endif
+
+      if(debug.ge.3)write (moniou,202)qglsh
+201   format(2x,'qglsh - unintegrated Pomeron leg eikonal:'
+     */4x,'s=',e10.3,2x,'b^2=',e10.3,2x,'icz=',i1)
+202   format(2x,'qglsh=',e10.3)
+203   format(2x,'qglsh:',2x,'s_hard=',e10.3,2x,'sigma_hard=',e10.3)
+      return
+      end
+
+c------------------------------------------------------------------------
+      subroutine qgloop(sy,bb,fann,jj)
+c-----------------------------------------------------------------------
+c qgloop - intermediate Pomeron eikonal with loops
+c sy   - pomeron mass squared,
+c bb   - impact parameter squared,
+c jj=1 - uncut loops (iqq=1,...3)
+c jj=2 - cut loops (iqq=4,...11)
+c iqq=1  - general loop contribution
+c iqq=2  - single Pomeron end on one side
+c iqq=3  - single Pomeron ends on both sides
+c iqq=4  - single cut Pomeron
+c iqq=5  - single cut Pomeron with single end
+c iqq=6  - single cut Pomeron with 2 single ends
+c iqq=7  - any cuts except the complete rap-gap
+c iqq=8  - single cut Pomeron at one side
+c iqq=9  - single cut Pomeron at one side and single Pomeron on the other
+c iqq=10 - no rap-gap at one side
+c iqq=11 - no rap-gap at one side and single Pomeron on the other
+c iqq=12 - single cut soft Pomeron
+c iqq=13 - single cut soft Pomeron with single end
+c iqq=14 - single cut soft Pomeron with 2 single ends
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension fann(14)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      do iqq=1,14
+       fann(iqq)=0.d0
+      enddo
+      if(sy.le.sgap**2)goto 1
+      do ix1=1,7
+      do mx1=1,2
+       xpomr=(sy/sgap**2)**(-.5d0-x1(ix1)*(mx1-1.5d0))/sgap
+       rp=-alfp*log(xpomr)*4.d0*.0389d0
+       rp1=alfp*log(xpomr*sy)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+      do ix2=1,7
+      do mx2=1,2
+       z=.5d0+x1(ix2)*(mx2-1.5d0)
+       bb0=-rp2*log(z)
+      do ix3=1,7
+      do mx3=1,2
+       phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+       bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+       bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+
+       vi=qgpini(xpomr*sy,bb1,0.d0,0.d0,1)
+       vit=min(vi,qgpini(xpomr*sy,bb1,0.d0,0.d0,2))
+       v1i0=qgpini(1.d0/xpomr,bb2,0.d0,0.d0,4)
+       v1i1=min(v1i0,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,3))
+       v1i=min(v1i1,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,2))
+       if(jj.eq.1)then
+        do iqq=1,3
+         if(iqq.eq.1)then
+          dpx=vi*(min(0.d0,1.d0-exp(-v1i)-v1i)+v1i-v1i1)
+     *    +min(0.d0,1.d0-exp(-vit)-vit)*(1.d0-exp(-v1i))
+         elseif(iqq.eq.2)then
+          dpx=vi*(min(0.d0,1.d0-exp(-v1i)-v1i)+v1i-v1i1)
+         elseif(iqq.eq.3)then
+          dpx=vi*(v1i1-v1i0)
+         else
+          dpx=0.d0
+         endif
+         fann(iqq)=fann(iqq)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+        enddo
+
+       else
+        v1ic0=min(v1i0,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,7))
+        v1ic1=min(v1ic0,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,6))
+        v1ic=min(v1ic1,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,5))
+        v1icn=min(v1i,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,8))
+        vict=min(vit,qgpini(xpomr*sy,bb1,0.d0,0.d0,5))
+        victn=min(vit,qgpini(xpomr*sy,bb1,0.d0,0.d0,8))
+        victg=min(victn,qgpini(xpomr*sy,bb1,0.d0,0.d0,11))
+        vict1=min(victg,qgpini(xpomr*sy,bb1,0.d0,0.d0,9))
+
+        vis=min(vi,qgpini(xpomr*sy,bb1,0.d0,0.d0,0))
+        v1ic0s=min(v1ic0,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,15))
+        v1ic1s=min(v1ic0s,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,14))
+        v1ics=min(v1ic1s,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,13))
+        victs=min(vict,qgpini(xpomr*sy,bb1,0.d0,0.d0,13))
+        do iqq=4,14
+         if(iqq.eq.4)then
+          dpx=vi*(v1ic*exp(-2.d0*v1icn)-v1ic1)
+     *    +vict*(exp(-2.d0*victn)-1.d0)*v1ic*exp(-2.d0*v1icn)
+         elseif(iqq.eq.5)then
+          dpx=vi*(v1ic*exp(-2.d0*v1icn)-v1ic1)
+         elseif(iqq.eq.6)then
+          dpx=vi*(v1ic1-v1ic0)
+         elseif(iqq.eq.7)then
+          dpx=vi*(min(0.d0,1.d0-exp(-v1i)-v1i)+v1i-v1i1)
+     *    +.5d0*min(0.d0,1.d0-exp(-vit)-vit)*(1.d0-exp(-2.d0*v1icn))
+     *    +.5d0*min(0.d0,1.d0-exp(-2.d0*victn)-2.d0*victn)
+     *    *max(0.d0,1.d0-exp(-v1i)-.5d0*(1.d0-exp(-2.d0*v1icn)))
+         elseif(iqq.eq.8)then
+          dpx=vi*(min(0.d0,1.d0-exp(-v1i)-v1i)+v1i-v1i1)
+     *    +vict1*(exp(-2.d0*victn)-1.d0)*(1.d0-exp(-v1i))
+         elseif(iqq.eq.9)then
+          dpx=vi*(v1i1-v1i0)
+     *    +vict1*(exp(-2.d0*victn)-1.d0)*v1i1
+         elseif(iqq.eq.10)then
+          dpx=vi*(min(0.d0,1.d0-exp(-v1i)-v1i)+v1i-v1i1)
+     *    +(.5d0*max(0.d0,1.d0-exp(-2.d0*victn)-2.d0*victn
+     *    *exp(-2.d0*victn))+victg*(exp(-2.d0*victn)-1.d0))
+     *    *(1.d0-exp(-v1i))
+         elseif(iqq.eq.11)then
+          dpx=vi*(v1i1-v1i0)
+     *    +(.5d0*max(0.d0,1.d0-exp(-2.d0*victn)-2.d0*victn
+     *    *exp(-2.d0*victn))+victg*(exp(-2.d0*victn)-1.d0))*v1i1
+         elseif(iqq.eq.12)then
+          dpx=vis*(v1ics*exp(-2.d0*v1icn)-v1ic1s)
+     *    +victs*(exp(-2.d0*victn)-1.d0)*v1ics*exp(-2.d0*v1icn)
+         elseif(iqq.eq.13)then
+          dpx=vis*(v1ics*exp(-2.d0*v1icn)-v1ic1s)
+         elseif(iqq.eq.14)then
+          dpx=vis*(v1ic1s-v1ic0s)
+         else
+          dpx=0.d0
+         endif
+         fann(iqq)=fann(iqq)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+        enddo
+       endif
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+1     dpin=qgpini(sy,bb,0.d0,0.d0,1)
+      do iqq=1,11
+       fann(iqq)=fann(iqq)*log(sy/sgap**2)/8.d0*pi*r3p/.0389d0/g3p**3
+     * +dpin
+      enddo
+      dpins=min(dpin,qgpini(sy,bb,0.d0,0.d0,0))
+      do iqq=12,14
+       fann(iqq)=fann(iqq)*log(sy/sgap**2)/8.d0*pi*r3p/.0389d0/g3p**3
+     * +dpins
+      enddo
+      return
+      end
+
+c------------------------------------------------------------------------
+      subroutine qgloos(sy,bb,vvx,vvxt,fann)
+c-----------------------------------------------------------------------
+c qgloos - intermediate Pomeron eikonal with screening corrections
+c sy   - pomeron mass squared,
+c bb   - impact parameter squared,
+c vvx  - total/projectile screening factor:
+c vvx  = 1 - exp[-2*sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]  (iqq=1)
+c vvx  = 1 + exp[-2*sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]
+c          - exp[-2*sum_{i} chi_proj(i)-sum_j chi_targ(j)]
+c          - exp[-sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]    (iqq=2 uncut)
+c vvx  = 1 - exp[-sum_{i} chi_proj(i)-2*sum_j chi_targ(j)]    (iqq=2,...4)
+c vvx  = 1 - exp[-sum_{i} chi_proj(i)]                        (iqq=5,...8)
+c vvxt - target screening factor:
+c vvxt = 0                                                    (iqq=1,...4)
+c vvxt = 1 - exp[-sum_j chi_targ(j)]                          (iqq=5,...8)
+c iqq=1  - single cut Pomeron
+c iqq=2  - uncut / cut end / loop sequence
+c iqq=3  - no rap-gap at the end
+c iqq=4  - single cut Pomeron end
+c iqq=5  - diffractive cut, Puu
+c iqq=6  - diffractive cut, Puu-Puc
+c iqq=7  - diffractive cut, Pcc
+c iqq=8  - diffractive cut, Pcc+Pcu
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension fann(14)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      do iqq=1,8
+       fann(iqq)=0.d0
+      enddo
+      if(sy.le.sgap**2)goto 1
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr=(sy/sgap**2)**(-.5d0-x1(ix1)*(mx1-1.5d0))/sgap
+       rp=-alfp*log(xpomr)*4.d0*.0389d0
+       rp1=alfp*log(xpomr*sy)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+      do ix2=1,7
+      do mx2=1,2
+       z=.5d0+x1(ix2)*(mx2-1.5d0)
+       bb0=-rp2*log(z)
+      do ix3=1,7
+      do mx3=1,2
+       phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+       bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+       bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+
+       vit=qgpini(xpomr*sy,bb1,0.d0,0.d0,2)
+       vicn=min(vit,qgpini(xpomr*sy,bb1,0.d0,0.d0,8))
+       vicng=min(vicn,qgpini(xpomr*sy,bb1,0.d0,0.d0,11))
+       vicpe=min(vicng,qgpini(xpomr*sy,bb1,0.d0,0.d0,9))
+       vic1=min(vicpe,qgpini(xpomr*sy,bb1,0.d0,0.d0,5))
+
+       viu=qgpini(1.d0/xpomr,bb2,0.d0,0.d0,2)
+       v1icn=min(viu,qgpini(1.d0/xpomr,bb2,0.d0,0.d0,8))
+       v1i=qgpini(1.d0/xpomr,bb2,vvx,0.d0,16)*exp(-2.d0*v1icn)
+       vi=qgpini(1.d0/xpomr,bb2,vvx,0.d0,17)*(1.d0-exp(-viu))
+       vduu=qgpini(1.d0/xpomr,bb2,vvx,vvxt,20)*(1.d0-exp(-viu))
+       vduc=max(0.d0,vduu-qgpini(1.d0/xpomr,bb2,vvx,vvxt,21)
+     * *(1.d0-exp(-viu)))
+       vdcc=qgpini(1.d0/xpomr,bb2,vvx,vvxt,22)*((1.d0-exp(-viu))**2
+     * +(exp(2.d0*(viu-v1icn))-1.d0)*exp(-2.d0*viu))/2.d0
+       vdcu=max(0.d0,qgpini(1.d0/xpomr,bb2,vvx,vvxt,23)
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*(viu-v1icn))-1.d0)
+     * *exp(-2.d0*viu))/2.d0-vdcc)
+
+       do iqq=1,8
+        if(iqq.eq.1)then       !single cut Pomeron
+         dpx=-vvx*v1i*vic1*exp(-2.d0*vicn)
+        elseif(iqq.eq.2)then   !uncut / cut end / loop sequence
+         dpx=-(1.d0-exp(-vit))*vi*vvx
+        elseif(iqq.eq.3)then   !no rap-gap at the end
+         dpx=-(.5d0*max(0.d0,1.d0-exp(-2.d0*vicn)*(1.d0+2.d0*vicn))
+     *   +vicng*exp(-2.d0*vicn))*vi*vvx
+        elseif(iqq.eq.4)then   !single cut Pomeron end
+         dpx=-vicpe*exp(-2.d0*vicn)*vi*vvx
+        elseif(iqq.eq.5)then   !Puu
+         dpx=(1.d0-exp(-vit))
+     *   *(vduu*((1.d0-vvx)*(1.d0-vvxt)*(1.d0-vvx*vvxt)-1.d0)
+     *   -vdcu*(1.d0-vvx)**2*(1.d0-vvxt)*vvxt)
+        elseif(iqq.eq.6)then   !Puu-Puc
+         dpx=(1.d0-exp(-vit))
+     *   *((vduu-vduc)*((1.d0-vvx)*(1.d0-vvxt)*(1.d0-vvx*vvxt)-1.d0)
+     *   -(vdcc+vdcu)*(1.d0-vvx)**2*(1.d0-vvxt)*vvxt)
+        elseif(iqq.eq.7)then   !Pcc
+         dpx=.5d0*((1.d0-exp(-vit))**2
+     *   +(exp(2.d0*(vit-vicn))-1.d0)*exp(-2.d0*vit))
+     *   *(vdcc*((1.d0-vvx)**2*(1.d0-vvxt)**2-1.d0)
+     *   -vduc*(1.d0-vvx)*(1.d0-vvxt)**2*vvx)
+        elseif(iqq.eq.8)then   !Pcc+Pcu
+         dpx=.5d0*((1.d0-exp(-vit))**2
+     *   +(exp(2.d0*(vit-vicn))-1.d0)*exp(-2.d0*vit))
+     *   *((vdcc+vdcu)*((1.d0-vvx)**2*(1.d0-vvxt)**2-1.d0)
+     *   +(vduu-vduc)*(1.d0-vvx)*(1.d0-vvxt)**2*vvx)
+        else
+         dpx=0.d0
+        endif
+        fann(iqq)=fann(iqq)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+       enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+1     vit=qgpini(sy,bb,0.d0,0.d0,2)
+      vicn=min(vit,qgpini(sy,bb,0.d0,0.d0,8))
+      vicng=min(vicn,qgpini(sy,bb,0.d0,0.d0,11))
+      vicpe=min(vicng,qgpini(sy,bb,0.d0,0.d0,9))
+      vic1=min(vicpe,qgpini(sy,bb,0.d0,0.d0,5))
+      do iqq=1,8
+       fann(iqq)=fann(iqq)*log(sy/sgap**2)/8.d0*pi*r3p/.0389d0/g3p**3
+       if(iqq.eq.1)then
+        fann(iqq)=fann(iqq)*exp(2.d0*vicn)+vic1
+       elseif(iqq.eq.3)then
+        fann(iqq)=fann(iqq)+vicng*exp(-2.d0*vicn)
+     *  +.5d0*max(0.d0,1.d0-exp(-2.d0*vicn)*(1.d0+2.d0*vicn))
+       elseif(iqq.eq.4)then
+        fann(iqq)=fann(iqq)*exp(2.d0*vicn)+vicpe
+       elseif(iqq.lt.7)then
+        fann(iqq)=fann(iqq)+(1.d0-exp(-vit))
+       else
+        fann(iqq)=fann(iqq)+.5d0*((1.d0-exp(-vit))**2
+     *  +(exp(2.d0*(vit-vicn))-1.d0)*exp(-2.d0*vit))
+       endif
+      enddo
+      return
+      end
+
+c------------------------------------------------------------------------
+      subroutine qglool(sy,bb,icdp,icz,fann)
+c-----------------------------------------------------------------------
+c qglool - integrated Pomeron leg eikonal with loops
+c sy   - pomeron mass squared,
+c bb   - impact parameter squared,
+c icz  - hadron class
+c iqq=1 - all
+c iqq=2 - single Pomeron end
+c iqq=3 - single cut Pomeron
+c iqq=4 - single cut Pomeron with single Pomeron end
+c iqq=5 - single cut Pomeron end
+c iqq=6 - no rap-gap at the end
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension fann(14)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      do iqq=1,6
+       fann(iqq)=0.d0
+      enddo
+      if(sy.le.sgap**2)goto 1
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr=(sy/sgap**2)**(-.5d0-x1(ix1)*(mx1-1.5d0))/sgap
+       rp=(rq(icdp,icz)-alfp*log(xpomr))*4.d0*.0389d0
+       rp1=alfp*log(xpomr*sy)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+      do ix2=1,7
+      do mx2=1,2
+       z=.5d0+x1(ix2)*(mx2-1.5d0)
+       bb0=-rp2*log(z)
+      do ix3=1,7
+      do mx3=1,2
+       phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+       bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+       bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+
+       vpl=qglegi(1.d0/xpomr,bb2,icdp,icz,1)
+       v1i0=qgpini(xpomr*sy,bb1,0.d0,0.d0,4)
+       v1i1=min(v1i0,qgpini(xpomr*sy,bb1,0.d0,0.d0,3))
+       v1i=min(v1i1,qgpini(xpomr*sy,bb1,0.d0,0.d0,2))
+       v1ic0=min(v1i0,qgpini(xpomr*sy,bb1,0.d0,0.d0,7))
+       v1ic1=min(v1ic0,qgpini(xpomr*sy,bb1,0.d0,0.d0,6))
+       v1ic=min(v1ic1,qgpini(xpomr*sy,bb1,0.d0,0.d0,5))
+       v1icn=min(v1i,qgpini(xpomr*sy,bb1,0.d0,0.d0,8))
+       vicn0=min(v1i1,qgpini(xpomr*sy,bb1,0.d0,0.d0,12))
+       vicn=min(vicn0,qgpini(xpomr*sy,bb1,0.d0,0.d0,11))
+       vic0=min(vicn0,qgpini(xpomr*sy,bb1,0.d0,0.d0,10))
+       vic1=min(vic0,qgpini(xpomr*sy,bb1,0.d0,0.d0,9))
+       vicn=min(vicn,v1icn)
+       vic1=min(vicn,vic1)
+       do iqq=1,6
+        if(iqq.eq.1)then
+         dpx=vpl*(min(0.d0,1.d0-exp(-v1i)-v1i)+v1i-v1i1)
+        elseif(iqq.eq.2)then
+         dpx=vpl*(v1i1-v1i0)
+        elseif(iqq.eq.3)then
+         dpx=vpl*(v1ic*exp(-2.d0*v1icn)-v1ic1)
+        elseif(iqq.eq.4)then
+         dpx=vpl*(v1ic1-v1ic0)
+        elseif(iqq.eq.5)then
+         dpx=vpl*(vic1*exp(-2.d0*v1icn)-vic0)
+        elseif(iqq.eq.6)then
+         dpx=vpl*(.5d0*max(0.d0,1.d0-exp(-2.d0*v1icn)-2.d0*v1icn
+     *   *exp(-2.d0*v1icn))+vicn*exp(-2.d0*v1icn)-vicn0)
+        else
+         dpx=0.d0
+        endif
+        fann(iqq)=fann(iqq)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+       enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+1     dlool=qglegi(sy,bb,icdp,icz,1)
+      do iqq=1,6
+       fann(iqq)=(fann(iqq)*log(sy/sgap**2)/8.d0*pi*r3p/.0389d0/g3p**3
+     * +dlool)/(1.d0-(1.d0-(1.d0-1.d0/sy)**(1.+ahl(icz)))**(1.+dels))
+      enddo
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgrev(sy,bb,vvxt0,vvxt,vvxpt,vvxp0
+     *,vvxpl,icdp,icz)
+c-----------------------------------------------------------------------
+c qgrev - zigzag contribution
+c sy    - c.m. energy squared,
+c bb    - impact parameter squared,
+c icdp  - diffractive state for the projectile,
+c icz   - hadron class,
+c vvxt0 = 1 - exp[-sum_j chi^(3)_targ(j)]
+c vvxt  = 1 - exp[-sum_j chi_targ(j)]
+c vvxpt = 1 - exp[-sum_{i>I} chi^(6)_proj(i)]
+c vvxp0 = 1 - exp[-sum_{i>I} chi^(3)_proj(i)]
+c vvxpl = 1 - exp[-sum_{i<I} chi_proj(i)]
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qgrev=0.d0
+      if(sy.lt..999d0*sgap**2)return
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr=(sy/sgap**2)**(-.5d0-x1(ix1)*(mx1-1.5d0))/sgap
+       rp=(rq(icdp,icz)-alfp*log(xpomr))*4.d0*.0389d0
+       rp1=alfp*log(xpomr*sy)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+      do ix2=1,7
+      do mx2=1,2
+       z=.5d0+x1(ix2)*(mx2-1.5d0)
+       bb0=-rp2*log(z)
+      do ix3=1,7
+      do mx3=1,2
+       phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+       bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+       bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+
+       vvx=1.d0-(1.d0-vvxt)*(1.d0-vvxpl)
+       vpf=qgfani(1.d0/xpomr,bb2,vvx,0.d0,0.d0,icdp,icz,1)
+
+       viu=qgpini(xpomr*sy,bb1,0.d0,0.d0,2)
+       viloop=(1.d0-exp(-viu))
+       vim=2.d0*min(viu,qgpini(xpomr*sy,bb1,0.d0,0.d0,8))
+
+       if(vvxt.eq.0.d0)then
+        vvxpin=1.d0-(1.d0-vvxp0)*(1.d0-vvxpl)*exp(-vpf)
+        vvxtin=0.d0
+        vi=max(0.d0,qgpini(xpomr*sy,bb1,vvxpin,vvxtin,21)*viloop
+     *  -qgpini(xpomr*sy,bb1,vvxpin,vvxtin,23)
+     *  *(viloop**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))/2.d0)
+
+        dpx=vi*(1.d0-exp(-vpf))
+       else
+        vpf0=min(vpf,qgfani(1.d0/xpomr,bb2,vvx,vvxp0,vvxpl,icdp,icz,3))
+        vpft=max(vpf,qgfani(1.d0/xpomr,bb2,vvx,vvxpt,vvxpl,icdp,icz,6))
+        vvxpin=1.d0-(1.d0-vvxp0)*(1.d0-vvxpl)*exp(-vpf0)
+        vvxtin=vvxt0
+        vi=max(0.d0,qgpini(xpomr*sy,bb1,vvxpin,vvxtin,21)*viloop
+     *  -qgpini(xpomr*sy,bb1,vvxpin,vvxtin,23)
+     *  *(viloop**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))/2.d0)
+        if(vvxpt.eq.1.d0)then
+         dpx=vi*(1.d0-exp(-vpft))
+        else
+         dpx=vi*(1.d0-exp(-vpft)+((1.d0-vvxt)**2*(max(0.d0
+     *   ,1.d0-exp(-vpft)*(1.d0+vpft))-max(0.d0,1.d0-exp(-vpf0)
+     *   *(1.d0+vpf0))*(1.d0-vvxp0)/(1.d0-vvxpt))
+     *   +vpft*((1.d0-vvxt)**2*exp(-vpft)-exp(-vpf0)*(1.d0-vvxpl)
+     *   *(1.d0-vvxp0)/(1.d0-vvxpt)*(1.d0-vvxt0)**2)
+     *   -vpf0*exp(-vpf0)*(1.d0-vvxp0)/(1.d0-vvxpt)*((1.d0-vvxt)**2
+     *   -(1.d0-vvxpl)*(1.d0-vvxt0)**2))/(1.d0-(1.d0-vvxt)**2))
+         if(dpx.le.0.d0)dpx=vi*(1.d0-exp(-vpft))
+        endif
+       endif
+
+       qgrev=qgrev+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      qgrev=qgrev/8.d0*pi*r3p/.0389d0/g3p**3
+      if(.not.(qgrev.gt.0.d0.and.qgrev.lt.1.d10))stop'qgrev=NAN'
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgrevi(sy,bb,vvxt0,vvxt,vvxpt,vvxp0
+     *,vvxpl,icdp,icz)
+c-----------------------------------------------------------------------
+c qgrevi - zigzag contribution (interpolation)
+c sy    - c.m. energy squared,
+c bb    - impact parameter squared,
+c icdp  - diffractive state for the projectile,
+c icz   - hadron class,
+c vvxt0 = 1 - exp[-sum_j chi^(3)_targ(j)]
+c vvxt  = 1 - exp[-sum_j chi_targ(j)
+c vvxpt = 1 - exp[-sum_{i>I} chi^(6)_proj(i)]
+c vvxp0 = 1 - exp[-sum_{i>I} chi^(3)_proj(i)]
+c vvxpl = 1 - exp[-sum_{i<I} chi_proj(i)]
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wz(3),wj(3),wi(3),wm2(3),wm3(3),wm4(3)
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr27/ qlegi(51,11,2,3,7),qfanu(51,11,11,6,2)
+     *,qfanc(51,11,11,39,18),qdfan(21,11,11,2,3),qrev(11,11,66,219,2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qgrevi=0.d0
+      revm=0.d0
+      if(sy.le.sgap**2)return
+
+      rp=(rq(icdp,icz)+alfp*dlog(sy))*4.d0*.0389d0
+      z=dexp(-bb/rp)
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-dlog(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      yl=dlog(sy/sgap**2)/dlog(spmax/sgap**2)*10.d0+1.d0
+      k=max(1,int(1.00001d0*yl-1.d0))
+      k=min(k,9)
+      wk(2)=yl-k
+      if(yl.le.2.d0)then
+       iymax=2
+       wk(1)=1.d0-wk(2)
+      else
+       wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+       wk(1)=1.d0-wk(2)+wk(3)
+       wk(2)=wk(2)-2.d0*wk(3)
+       iymax=3
+      endif
+
+      if(vvxt0.gt..99d0)then
+       j=11
+       wj(1)=1.d0
+       ivmax=1
+       i=1
+       wi(1)=1.d0
+       iv1max=1
+      else
+       vl=max(1.d0,vvxt0*10.d0+1.d0)
+       j=min(int(vl),9)
+       wj(2)=vl-dble(j)
+       wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+       wj(1)=1.d0-wj(2)+wj(3)
+       wj(2)=wj(2)-2.d0*wj(3)
+       ivmax=3
+
+       vl1=max(1.d0,(vvxt-vvxt0)/(1.d0-vvxt0)*5.d0+1.d0)
+       i=min(int(vl1),4)
+       wi(2)=vl1-dble(i)
+       wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+       wi(1)=1.d0-wi(2)+wi(3)
+       wi(2)=wi(2)-2.d0*wi(3)
+       iv1max=3
+      endif
+
+      if(icz.ne.2.or.vvxpt+vvxp0+vvxpl.eq.0.d0)then !hadron (no proj. nucl. corr.)
+       ll=icz+(icz-1)*(3-icz)*2
+       do i1=1,iv1max
+        i2=i+i1-2
+       do j1=1,ivmax
+        j2=j+j1-1
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgrevi=qgrevi+qrev(k2,l2,j2+11*i2,ll,icdp)
+     *  *wk(k1)*wz(l1)*wj(j1)*wi(i1)
+       enddo
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do i1=1,iv1max
+         i2=i+i1-2
+        do j1=1,ivmax
+         j2=j+j1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         revm=revm+qrev(k2,1,j2+11*i2,ll,icdp)*wk(k1)*wj(j1)*wi(i1)
+        enddo
+        enddo
+        enddo
+        qgrevi=min(qgrevi,revm)
+       endif
+
+      else
+       vm2=max(1.d0,vvxpt*5.d0+1.d0)
+       m2=min(int(vm2),5)
+       wm2(2)=vm2-dble(m2)
+       wm2(1)=1.d0-wm2(2)
+       im2max=2
+
+       if(vvxpt.lt.1.d-2)then
+        m3=1
+        wm3(1)=1.d0
+        im3max=1
+       else
+        vm3=max(1.d0,vvxp0/vvxpt*5.d0+1.d0)
+        m3=min(int(vm3),5)
+        wm3(2)=vm3-dble(m3)
+        wm3(1)=1.d0-wm3(2)
+        im3max=2
+       endif
+
+       vm4=max(1.d0,vvxpl*5.d0+1.d0)
+       m4=min(int(vm4),5)
+       wm4(2)=vm4-dble(m4)
+       wm4(1)=1.d0-wm4(2)
+       im4max=2
+
+       do mn4=1,im4max
+       do mn3=1,im3max
+       do mn2=1,im2max
+        mn=icz+m2+mn2+6*(m3+mn3-2)+36*(m4+mn4-2)
+       do i1=1,iv1max
+        i2=i+i1-2
+       do j1=1,ivmax
+        j2=j+j1-1
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgrevi=qgrevi+qrev(k2,l2,j2+11*i2,mn,icdp)
+     *  *wk(k1)*wz(l1)*wj(j1)*wi(i1)*wm2(mn2)*wm3(mn3)*wm4(mn4)
+       enddo
+       enddo
+       enddo
+       enddo
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do mn4=1,im4max
+        do mn3=1,im3max
+        do mn2=1,im2max
+         mn=icz+m2+mn2+6*(m3+mn3-2)+36*(m4+mn4-2)
+        do i1=1,iv1max
+         i2=i+i1-2
+        do j1=1,ivmax
+         j2=j+j1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         revm=revm+qrev(k2,1,j2+11*i2,mn,icdp)
+     *   *wk(k1)*wj(j1)*wi(i1)*wm2(mn2)*wm3(mn3)*wm4(mn4)
+        enddo
+        enddo
+        enddo
+        enddo
+        enddo
+        enddo
+        qgrevi=min(qgrevi,revm)
+       endif
+      endif
+      qgrevi=dexp(qgrevi)*z*dlog(sy/sgap**2)
+     **(1.d0-(1.d0-vvxt)**2)*(1.d0-vvxpt)
+      return
+      end
+
+c------------------------------------------------------------------------
+      subroutine qgfan(sy,bb,vvx,icdp,icz,fann)
+c-----------------------------------------------------------------------
+c qgfan - integrated fan-contributions
+c sy    - c.m. energy squared,
+c bb    - impact parameter squared,
+c icdp  - diffractive state for the projectile,
+c icz   - hadron class
+c vvx  = 1 - exp[-sum_j chi_targ(j) - sum_{i<I} chi_proj(i)]
+c iqq=1  - general fan with loops
+c iqq=2  - general fan with single pomeron end
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension fann(14)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      do iqq=1,2
+       fann(iqq)=0.d0
+      enddo
+      if(sy.le.sgap**2)goto 1
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr1=(sy/sgap**2)**(-.5d0-x1(ix1)*(mx1-1.5d0))/sgap
+       rp=(rq(icdp,icz)-alfp*log(xpomr1))*4.d0*.0389d0
+       rp1=alfp*log(xpomr1*sy)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+       do ix2=1,7
+       do mx2=1,2
+        z=.5d0+x1(ix2)*(mx2-1.5d0)
+        bb0=-rp2*log(z)
+       do ix3=1,7
+       do mx3=1,2
+        phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+        bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+        bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+
+        vpf1=qgfani(1.d0/xpomr1,bb2,vvx,0.d0,0.d0,icdp,icz,2)
+        vpf=min(vpf1,qgfani(1.d0/xpomr1,bb2,vvx,0.d0,0.d0,icdp,icz,1))
+        v1i1=qgpini(xpomr1*sy,bb1,0.d0,0.d0,3)
+        v1i=min(v1i1,qgpini(xpomr1*sy,bb1,0.d0,0.d0,2))
+        do iqq=1,2
+         if(iqq.eq.1)then
+          dpx=(1.d0-exp(-v1i))*(min(0.d0,1.d0-exp(-vpf)-vpf)
+     *    *(1.d0-vvx)-vpf*vvx)
+         else
+          dpx=v1i1*(min(0.d0,1.d0-exp(-vpf)-vpf)*(1.d0-vvx)-vpf*vvx)
+         endif
+         fann(iqq)=fann(iqq)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+        enddo
+       enddo
+       enddo
+       enddo
+       enddo
+      enddo
+      enddo
+1     continue
+      do iqq=1,2
+       fann(iqq)=(fann(iqq)*dlog(sy/sgap**2)/8.d0*pi*r3p/.0389d0/g3p**3
+     * +qglegi(sy,bb,icdp,icz,iqq+1))
+     * /(1.d0-(1.d0-(1.d0-1.d0/sy)**(1.+ahl(icz)))**(1.+dels))
+      enddo
+      return
+      end
+
+c------------------------------------------------------------------------
+      subroutine qgfanc(sy,bb,vvx,vvxp,vvxpl,icdp,icz,fann)
+c-----------------------------------------------------------------------
+c qgfan - cut fan-contributions
+c sy    - c.m. energy squared,
+c bb    - impact parameter squared,
+c icdp  - diffractive state for the projectile,
+c icz   - hadron class,
+c vvx   = 1 - exp[-sum_j chi_targ(j) - sum_{i<I} chi_proj(i)]
+c vvxp  = 1 - exp[-sum_{i>I} chi^(3)_proj(i)] (iqq=1,2,3)
+c vvxp  = 1 - exp[-sum_{i>I} chi^(6)_proj(i)] (iqq=4)
+c vvxp  = 1 - exp[-sum_{i>I} chi_proj(i)]     (iqq=5-9)
+c vvxpl = 1 - exp[-sum_{i<I} chi_proj(i)]
+c iqq=1 - cut handle fan
+c iqq=2 - no rap-gap at the end
+c iqq=3 - single cut Pomeron end
+c iqq=4 - total fan-like contribution
+c iqq=5 - leg-like cut
+c iqq=6 - leg-like cut with cut handle
+c iqq=7 - single Pomeron cut
+c iqq=8 - leg-like cut with single cut Pomeron end
+c iqq=9 - leg-like cut without a rap-gap at the end
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension fann(14)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      do iqq=1,9
+       fann(iqq)=0.d0
+      enddo
+      if(sy.le.sgap**2)goto 1
+
+      if(vvx.gt..999d0)then
+       vvxs=0.d0
+      else
+       vvxs=(1.d0-vvx)**2/(1.d0-vvxpl)
+      endif
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr1=(sy/sgap**2)**(-.5d0-x1(ix1)*(mx1-1.5d0))/sgap
+       rp=(rq(icdp,icz)-alfp*log(xpomr1))*4.d0*.0389d0
+       rp1=alfp*log(xpomr1*sy)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+       do ix2=1,7
+       do mx2=1,2
+        z=.5d0+x1(ix2)*(mx2-1.5d0)
+        bb0=-rp2*log(z)
+       do ix3=1,7
+       do mx3=1,2
+        phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+        bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+        bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+
+        vi=qgpini(xpomr1*sy,bb1,0.d0,0.d0,2)
+        vicn=min(vi,qgpini(xpomr1*sy,bb1,0.d0,0.d0,8))
+        vicgap=min(vicn,qgpini(xpomr1*sy,bb1,0.d0,0.d0,11))
+        vic1p=min(vicgap,qgpini(xpomr1*sy,bb1,0.d0,0.d0,9))
+        vic1=min(vic1p,qgpini(xpomr1*sy,bb1,0.d0,0.d0,5))
+
+        vpf=qgfani(1.d0/xpomr1,bb2,vvx,0.d0,0.d0,icdp,icz,1)
+        vpfc0=min(vpf
+     *  ,qgfani(1.d0/xpomr1,bb2,vvx,vvxp,vvxpl,icdp,icz,3))
+        vpfct=max(vpf
+     *  ,qgfani(1.d0/xpomr1,bb2,vvx,vvxp,vvxpl,icdp,icz,6))
+        vpf1p=min(vpf
+     *  ,qgfani(1.d0/xpomr1,bb2,vvx,vvxp,vvxpl,icdp,icz,7))
+        vpf1p0=min(vpf1p
+     *  ,qgfani(1.d0/xpomr1,bb2,vvx,vvxp,vvxpl,icdp,icz,8))
+        vpfc1=min(vpf1p0
+     *  ,qgfani(1.d0/xpomr1,bb2,vvx,vvxp,vvxpl,icdp,icz,9))
+        do iqq=1,9
+         if(iqq.eq.1)then      !cut handle
+          dpx=(1.d0-exp(-vi))
+     *    *(vvxs*(min(0.d0,1.d0-exp(-vpfc0)-vpfc0)
+     *    +vvxp*(exp(-vpfc0)-exp(-vpf)))+vpfc0*(vvxs-1.d0))
+         elseif(iqq.eq.2)then  !no rap-gap at the end
+          dpx=(.5d0*max(0.d0,1.d0-exp(-2.d0*vicn)*(1.d0+2.d0*vicn))
+     *    +vicgap*exp(-2.d0*vicn))
+     *    *(vvxs*(min(0.d0,1.d0-exp(-vpfc0)-vpfc0)
+     *    +vvxp*(exp(-vpfc0)-exp(-vpf)))+vpfc0*(vvxs-1.d0))
+         elseif(iqq.eq.3)then  !single cut Pomeron end
+          dpx=vic1p*exp(-2.d0*vicn)
+     *    *(vvxs*(min(0.d0,1.d0-exp(-vpfc0)-vpfc0)
+     *    +vvxp*(exp(-vpfc0)-exp(-vpf)))+vpfc0*(vvxs-1.d0))
+         elseif(iqq.eq.4)then  !total fan-like contribution
+          dpx=(1.d0-exp(-vi))
+     *    *((1.d0-vvxpl)*(min(0.d0,1.d0-exp(-vpfct)-vpfct)
+     *    +vvxp*(exp(-vpfct)-exp(-vpf)))-vpfct*vvxpl)
+         elseif(iqq.eq.5)then  !leg-like cut
+          dpx=(1.d0-exp(-vi))*vpf1p
+     *    *((1.d0-vvx)*(1.d0-vvxpl)*(1.d0-vvxp)**2*exp(-2.d0*vpf)-1.d0)
+         elseif(iqq.eq.6)then  !leg-like cut with cut handle
+          dpx=(1.d0-exp(-vi))
+     *    *(vpf1p0*((1.d0-vvx)**2*(1.d0-vvxp)**2*exp(-2.d0*vpf)-1.d0)
+     *    -(vpf1p-vpf1p0)*vvxs*(1.d0-vvxp)*exp(-vpf)
+     *    *(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpf)))
+         elseif(iqq.eq.7)then  !single Pomeron cut
+          dpx=vic1*exp(-2.d0*vicn)
+     *    *vpfc1*((1.d0-vvx)**2*(1.d0-vvxp)**2*exp(-2.d0*vpf)-1.d0)
+         elseif(iqq.eq.8)then  !leg-like cut with single cut Pomeron end
+          dpx=vic1p*exp(-2.d0*vicn)
+     *    *(vpf1p0*((1.d0-vvx)**2*(1.d0-vvxp)**2*exp(-2.d0*vpf)-1.d0)
+     *    -(vpf1p-vpf1p0)*vvxs*(1.d0-vvxp)*exp(-vpf)
+     *    *(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpf)))
+         elseif(iqq.eq.9)then  !leg-like cut without a rap-gap at the end
+          dpx=(.5d0*max(0.d0,1.d0-exp(-2.d0*vicn)*(1.d0+2.d0*vicn))
+     *    +vicgap*exp(-2.d0*vicn))
+     *    *(vpf1p0*((1.d0-vvx)**2*(1.d0-vvxp)**2*exp(-2.d0*vpf)-1.d0)
+     *    -(vpf1p-vpf1p0)*vvxs*(1.d0-vvxp)*exp(-vpf)
+     *    *(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpf)))
+         else
+          dpx=0.d0
+         endif
+         fann(iqq)=fann(iqq)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+        enddo
+       enddo
+       enddo
+       enddo
+       enddo
+      enddo
+      enddo
+1     continue
+      dfan=qglegi(sy,bb,icdp,icz,2)
+      dfangap=min(dfan,qglegi(sy,bb,icdp,icz,7))
+      dfan1p=min(dfangap,qglegi(sy,bb,icdp,icz,6))
+      dfanc1=min(dfan1p,qglegi(sy,bb,icdp,icz,4))
+      do iqq=1,9
+       fann(iqq)=fann(iqq)*dlog(sy/sgap**2)/8.d0*pi*r3p/.0389d0/g3p**3
+       if(iqq.eq.2.or.iqq.eq.9)then
+        fann(iqq)=fann(iqq)+dfangap
+       elseif(iqq.eq.3.or.iqq.eq.8)then
+        fann(iqq)=fann(iqq)+dfan1p
+       elseif(iqq.eq.7)then
+        fann(iqq)=fann(iqq)+dfanc1
+       else
+        fann(iqq)=fann(iqq)+dfan
+       endif
+       fann(iqq)=fann(iqq)
+     * /(1.d0-(1.d0-(1.d0-1.d0/sy)**(1.+ahl(icz)))**(1.+dels))
+      enddo
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgfani(sy,bb,vvx,vvxp,vvxpl
+     *,icdp,icz,iqq)
+c-----------------------------------------------------------------------
+c qgfani - integrated fan-contributions
+c sy   - c.m. energy squared,
+c bb   - impact parameter squared,
+c icdp - diffractive state for the projectile,
+c icz  - hadron class,
+c vvx   = 1 - exp[-sum_j chi_targ(j) - sum_{i<I} chi_proj(i)]
+c vvxp=vvxpl=0                                (iqq=1,2)
+c vvxp  = 1 - exp[-sum_{i>I} chi^(3)_proj(i)] (iqq=3,4,5)
+c vvxp  = 1 - exp[-sum_{i>I} chi^(6)_proj(i)] (iqq=6)
+c vvxp  = 1 - exp[-sum_{i>I} chi_proj(i)]     (iqq=7-11)
+c vvxpl = 1 - exp[-sum_{i<I} chi_proj(i)]
+c uncut fans:
+c iqq=1  - general fan with loops
+c iqq=2  - general fan with single pomeron end
+c cut fans:
+c iqq=3  - cut handle fan
+c iqq=4  - no rap-gap at the end
+c iqq=5  - single cut Pomeron end
+c iqq=6  - total fan-like contribution
+c iqq=7  - leg-like cut
+c iqq=8  - leg-like cut with cut handle
+c iqq=9  - single Pomeron cut
+c iqq=10 - leg-like cut with single cut Pomeron end
+c iqq=11 - leg-like cut without a rap-gap at the end
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wz(3),wj(3),wi(3),wn(3)
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr27/ qlegi(51,11,2,3,7),qfanu(51,11,11,6,2)
+     *,qfanc(51,11,11,39,18),qdfan(21,11,11,2,3),qrev(11,11,66,219,2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qgfani=0.d0
+      fanm=0.d0
+
+      if(sy.le.sgap**2)then
+       qgfani=qglegi(sy,bb,icdp,icz,1)
+       return
+      endif
+
+      rp=(rq(icdp,icz)+alfp*dlog(sy))*4.d0*.0389d0
+      z=dexp(-bb/rp)
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-dlog(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      yl=dlog(sy/sgap)/dlog(spmax/sgap)*50.d0+1.d0
+      k=max(1,int(1.00001d0*yl-1.d0))
+      k=min(k,49)
+      wk(2)=yl-k
+      if(yl.le.2.d0)then
+       iymax=2
+       wk(1)=1.d0-wk(2)
+      else
+       wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+       wk(1)=1.d0-wk(2)+wk(3)
+       wk(2)=wk(2)-2.d0*wk(3)
+       iymax=3
+      endif
+
+      vl=max(1.d0,vvx*10.d0+1.d0)
+      if(vvx.eq.0.d0)then
+       ivmax=1
+       j=1
+       wj(1)=1.d0
+      else
+       j=min(int(vl),9)
+       wj(2)=vl-dble(j)
+       wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+       wj(1)=1.d0-wj(2)+wj(3)
+       wj(2)=wj(2)-2.d0*wj(3)
+       ivmax=3
+      endif
+
+      if(iqq.le.2)then
+       ii=icdp+2*(icz-1)
+       do j1=1,ivmax
+        j2=j+j1-1
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgfani=qgfani+qfanu(k2,l2,j2,ii,iqq)
+     *  *wk(k1)*wz(l1)*wj(j1)
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do j1=1,ivmax
+         j2=j+j1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         fanm=fanm+qfanu(k2,1,j2,ii,iqq)*wk(k1)*wj(j1)
+        enddo
+        enddo
+        qgfani=min(qgfani,fanm)
+       endif
+
+      elseif(icz.ne.2.or.vvxp+vvxpl.eq.0.d0)then  !hadron (no proj. nucl. corr.)
+       ii=icdp+2*(iqq-3)
+       ll=icz+(icz-1)*(3-icz)*2
+       do j1=1,ivmax
+        j2=j+j1-1
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgfani=qgfani+qfanc(k2,l2,j2,ll,ii)*wk(k1)*wz(l1)*wj(j1)
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do j1=1,ivmax
+         j2=j+j1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         fanm=fanm+qfanc(k2,1,j2,ll,ii)*wk(k1)*wj(j1)
+        enddo
+        enddo
+        qgfani=min(qgfani,fanm)
+       endif
+
+      else
+       iv1max=2
+       vl1=max(1.d0,vvxp*5.d0+1.d0)
+       i=min(int(vl1),5)
+       wi(2)=vl1-i
+       wi(1)=1.d0-wi(2)
+
+       if(vvx.lt..01d0)then                 !weak (no) screening
+        iv2max=1
+         n=1
+        wn(1)=1.d0
+       else                                    !nuclear effects
+        iv2max=2
+        vl2=max(1.d0,vvxpl/vvx*5.d0+1.d0)
+        n=min(int(vl2),5)
+        wn(2)=vl2-n
+        wn(1)=1.d0-wn(2)
+       endif
+
+       ii=icdp+2*(iqq-3)
+       do n1=1,iv2max
+        n2=n+n1-2
+       do i1=1,iv1max
+        i2=i+i1+2
+       do j1=1,ivmax
+        j2=j+j1-1
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgfani=qgfani+qfanc(k2,l2,j2,i2+6*n2,ii)
+     *  *wk(k1)*wz(l1)*wj(j1)*wi(i1)*wn(n1)
+       enddo
+       enddo
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do n1=1,iv2max
+         n2=n+n1-2
+        do i1=1,iv1max
+         i2=i+i1+2
+        do j1=1,ivmax
+         j2=j+j1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         fanm=fanm+qfanc(k2,1,j2,i2+6*n2,ii)
+     *   *wk(k1)*wj(j1)*wi(i1)*wn(n1)
+        enddo
+        enddo
+        enddo
+        enddo
+        qgfani=min(qgfani,fanm)
+       endif
+      endif
+      qgfani=dexp(qgfani)*z
+     **(1.d0-(1.d0-(1.d0-1.d0/sy)**(1.+ahl(icz)))**(1.+dels))
+      return
+      end
+
+c------------------------------------------------------------------------
+      subroutine qgdfan(xpomr,xpomr1,bb,icdp,fann,nn)
+c-----------------------------------------------------------------------
+c qgdfan - diffractive fans
+c xpomr - pomeron lc momentum,
+c xpomr1 - rapgap,
+c bb    - impact parameter squared,
+c icdp - diffractive state for the projectile,
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension fann(14),dps(3)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      icz=2
+      do iqq=1,3
+       fann(iqq)=0.d0
+      enddo
+
+      rp=(rq(icdp,icz)-alfp*log(xpomr1))*2.d0*.0389d0
+      rp1=alfp*log(xpomr1/xpomr)*4.d0*.0389d0
+      rp2=rp*rp1/(rp+rp1)
+      do ix2=1,7
+      do mx2=1,2
+       z=.5d0+x1(ix2)*(mx2-1.5d0)
+       bb0=-rp2*log(z)
+      do ix3=1,7
+      do mx3=1,2
+       phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+       bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+       bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+
+       vpf=qgfani(1.d0/xpomr1,bb2,0.d0,0.d0,0.d0,icdp,icz,1)
+       v1i1=qgpini(xpomr1/xpomr,bb1,0.d0,0.d0,3)
+       v1i=min(v1i1,qgpini(xpomr1/xpomr,bb1,0.d0,0.d0,2))
+
+       do iqq=1,2
+        if(iqq.eq.1)then
+         dpx=(1.d0-exp(-v1i))*(1.d0-exp(-vpf))**2
+        else
+         dpx=v1i1*(1.d0-exp(-vpf))**2
+        endif
+        fann(iqq)=fann(iqq)+a1(ix2)*a1(ix3)*dpx/z*rp2
+       enddo
+      enddo
+      enddo
+      enddo
+      enddo
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr2=xpomr1*(xpomr/xpomr1*sgap)**(.5d0+x1(ix1)*(mx1-1.5d0))
+       rp=(rq(icdp,icz)-alfp*log(xpomr2))*2.d0*.0389d0
+       rp1=alfp*log(xpomr2/xpomr)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+       do ix2=1,7
+       do mx2=1,2
+        z=.5d0+x1(ix2)*(mx2-1.5d0)
+        bb0=-rp2*log(z)
+       do ix3=1,7
+       do mx3=1,2
+        phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+        bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+        bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+
+        vpf=qgfani(1.d0/xpomr2,bb2,0.d0,0.d0,0.d0,icdp,icz,1)
+        v1i=qgpini(xpomr2/xpomr,bb1,0.d0,0.d0,2)
+        dpx=(1.d0-exp(-v1i))*(1.d0-exp(-vpf))**2/2.d0
+        fann(3)=fann(3)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+       enddo
+       enddo
+       enddo
+       enddo
+      enddo
+      enddo
+      do iqq=1,3
+       fann(iqq)=fann(iqq)*(r3p*pi/.0389d0)/g3p**3/8.d0
+      enddo
+
+      if(nn.gt.1.and.xpomr1/xpomr.gt.sgap**2)then
+       do iqq=1,3
+        dps(iqq)=0.d0
+       enddo
+       do ix1=1,7
+       do mx1=1,2
+        xpomr2=xpomr1/sgap*(xpomr/xpomr1*sgap**2)
+     *  **(.5d0+x1(ix1)*(mx1-1.5d0))
+        rp=(rq(icdp,icz)-alfp*log(xpomr2))*2.d0*.0389d0
+        rp1=alfp*log(xpomr2/xpomr)*4.d0*.0389d0
+        rp2=rp*rp1/(rp+rp1)
+        do ix2=1,7
+        do mx2=1,2
+         z=.5d0+x1(ix2)*(mx2-1.5d0)
+         bb0=-rp2*log(z)
+        do ix3=1,7
+        do mx3=1,2
+         phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+          bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     *   +bb0*sin(phi)**2
+         bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     *   +bb0*sin(phi)**2
+
+         vpf=qgfani(1.d0/xpomr2,bb2,0.d0,0.d0,0.d0,icdp,icz,1)
+         v1i1=qgpini(xpomr2/xpomr,bb1,0.d0,0.d0,3)
+         v1i=min(v1i1,qgpini(xpomr2/xpomr,bb1,0.d0,0.d0,2))
+         vpdf=qgdfani(xpomr2,xpomr1,bb2,icdp,1)
+         vpdfi=qgdfani(xpomr2,xpomr1,bb2,icdp,3)
+         do iqq=1,3
+          if(iqq.eq.1)then
+           dpx=(1.d0-exp(-v1i))*vpdf*(exp(2.d0*(vpdfi-vpf))-1.d0)
+          elseif(iqq.eq.2)then
+           dpx=v1i1*vpdf*(exp(2.d0*(vpdfi-vpf))-1.d0)
+          elseif(iqq.eq.3)then
+           dpx=(1.d0-exp(-v1i))*((exp(2.d0*vpdfi)-1.d0)*exp(-2.d0*vpf)
+     *     -2.d0*vpdfi)/2.d0/dlog(xpomr1/xpomr/sgap)
+          endif
+          dps(iqq)=dps(iqq)+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+         enddo
+        enddo
+        enddo
+        enddo
+        enddo
+       enddo
+       enddo
+       do iqq=1,3
+        fann(iqq)=fann(iqq)+dps(iqq)*dlog(xpomr1/xpomr/sgap**2)
+     *  *(r3p*pi/.0389d0)/g3p**3/8.d0
+       enddo
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgdfani(xpomr,xpomr1,bb,icdp,iqq)
+c-----------------------------------------------------------------------
+c qgfani - integrated fan-contributions
+c xpomr - pomeron lc momentum,
+c xpomr1 - rapgap,
+c bb    - impact parameter squared,
+c icdp - diffractive state for the projectile,
+c icz  - hadron class
+c iqq=1 - total unintegrated,
+c iqq=2 - single end unintegrated,
+c iqq=3 - total integrated
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wz(3),wj(3)
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr27/ qlegi(51,11,2,3,7),qfanu(51,11,11,6,2)
+     *,qfanc(51,11,11,39,18),qdfan(21,11,11,2,3),qrev(11,11,66,219,2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qgdfani=0.d0
+      dfanm=0.d0
+      if(xpomr*sgap**2.gt.1.d0)return
+
+      icz=2
+      rp=(rq(icdp,icz)-alfp*dlog(xpomr))*2.d0*.0389d0
+      z=dexp(-bb/rp)
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-dlog(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      if(xpomr*sgap**2.gt..9999d0)then
+       k=1
+       j=1
+       wk(1)=1.d0
+       wj(1)=1.d0
+       iymax=1
+       iy1max=1
+      else
+       yl=-dlog(xpomr*sgap**2)/dlog(1.d5/sgap**2)*20.d0+1.d0
+       k=max(1,int(1.00001d0*yl-1.d0))
+       k=min(k,19)
+       wk(2)=yl-k
+       if(yl.le.2.d0)then
+        iymax=2
+        wk(1)=1.d0-wk(2)
+       else
+        wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+        wk(1)=1.d0-wk(2)+wk(3)
+        wk(2)=wk(2)-2.d0*wk(3)
+        iymax=3
+       endif
+
+       yl1=11.d0-dlog(xpomr1*sgap)/dlog(xpomr*sgap**2)*10.d0
+       j=max(1,int(yl1))
+       j=min(j,9)
+       wj(2)=yl1-dble(j)
+       wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+       wj(1)=1.d0-wj(2)+wj(3)
+       wj(2)=wj(2)-2.d0*wj(3)
+       iy1max=3
+      endif
+
+      do l1=1,izmax
+       l2=jz+l1-1
+      do j1=1,iy1max
+       j2=j+j1-1
+      do k1=1,iymax
+       k2=k+k1-1
+       qgdfani=qgdfani+qdfan(k2,j2,l2,icdp,iqq)
+     * *wk(k1)*wz(l1)*wj(j1)
+      enddo
+      enddo
+      enddo
+      if(zz.lt.1.d0)then
+       do j1=1,iy1max
+        j2=j+j1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        dfanm=dfanm+qdfan(k2,j2,1,icdp,iqq)*wk(k1)*wj(j1)
+       enddo
+       enddo
+       qgdfani=min(qgdfani,dfanm)
+      endif
+      qgdfani=dexp(qgdfani)*z
+      if(iqq.eq.3)qgdfani=qgdfani*max(0.d0,dlog(xpomr1/xpomr/sgap))
+      return
+      end
+
+c=============================================================================
+      double precision function qg3pom(sy,b,vvx,vvxp,vvxt
+     *,icdp,icdt,icz)
+c-----------------------------------------------------------------------
+c qg3pom - integrated 3p-contributions to the interaction eikonal
+c sy   - pomeron mass squared,
+c b    - impact parameter,
+c icdp - diffractive state for the projectile,
+c icdt - diffractive state for the target,
+c icz  - hadron class
+c vvx  = 1 - exp[-sum_{j<J} chi_targ(j) - sum_{i<I} chi_proj(i)]
+c vvxp = 1 - exp[-sum_{i>I} chi_proj(i)]
+c vvxt = 1 - exp[-sum_{j>J} chi_targ(j)]
+c------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgdebug/  debug
+      common /qgarr43/ moniou
+      common /arr3/   x1(7),a1(7)
+
+      qg3pom=0.d0
+      if(sy.le.sgap**2)return
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr1=(sy/sgap**2)**(-(.5+x1(ix1)*(mx1-1.5)))/sgap
+       rp1=(rq(icdp,icz)-alfp*log(xpomr1))*4.d0*.0389d0
+       rp2=(rq(icdt,2)+alfp*log(xpomr1*sy))*4.d0*.0389d0
+       rp=rp1*rp2/(rp1+rp2)
+      do ib1=1,7
+      do mb1=1,2
+       z=.5d0+x1(ib1)*(mb1-1.5d0)
+       bb0=-rp*dlog(z)
+      do ib2=1,7
+      do mb2=1,2
+       phi=pi*(.5d0+x1(ib2)*(mb2-1.5d0))
+       bb1=(b*rp1/(rp1+rp2)+dsqrt(bb0)*cos(phi))**2+bb0*sin(phi)**2
+       bb2=(b*rp2/(rp1+rp2)-dsqrt(bb0)*cos(phi))**2+bb0*sin(phi)**2
+
+       v1p0=qglegi(1.d0/xpomr1,bb1,icdp,icz,1)
+       v1t0=qglegi(xpomr1*sy,bb2,icdt,2,1)
+       v1p1=min(v1p0,qglegi(1.d0/xpomr1,bb1,icdp,icz,3))
+       v1t1=min(v1t0,qglegi(xpomr1*sy,bb2,icdt,2,3))
+       v1p=min(v1p1,qglegi(1.d0/xpomr1,bb1,icdp,icz,2))
+       v1t=min(v1t1,qglegi(xpomr1*sy,bb2,icdt,2,2))
+
+       vpf0=min(v1p,qgfani(1.d0/xpomr1,bb1
+     * ,1.d0-(1.d0-vvx)*(1.d0-vvxt),0.d0,0.d0,icdp,icz,1))
+       vtf0=min(v1t,qgfani(xpomr1*sy,bb2
+     * ,1.d0-(1.d0-vvx)*(1.d0-vvxp),0.d0,0.d0,icdt,2,1))
+
+       n=1
+1      n=n+1
+       vpf=qgfani(1.d0/xpomr1,bb1
+     * ,1.d0-(1.d0-vvx)*(1.d0-vvxt)*exp(-vtf0),0.d0,0.d0,icdp,icz,1)
+       vtf=qgfani(xpomr1*sy,bb2
+     * ,1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpf0),0.d0,0.d0,icdt,2,1)
+       if(abs(1.d0-vpf/vpf0)+abs(1.d0-vtf/vtf0).gt.1.d-2.and.n.lt.100)
+     * then
+        vpf0=vpf
+        vtf0=vtf
+        goto 1
+       endif
+
+       dpx=(1.d0-vvx)*(min(0.d0,1.d0-exp(-vpf)-vpf)
+     * *min(0.d0,1.d0-exp(-vtf)-vtf)
+     * +vpf*min(0.d0,1.d0-exp(-vtf)-vtf)
+     * +vtf*min(0.d0,1.d0-exp(-vpf)-vpf))-vvx*vpf*vtf
+     * -.5d0*(vtf-v1t)*(min(0.d0,1.d0-exp(-vpf)-vpf)
+     * *(1.d0-vvx)*(1.d0-vvxt)*exp(-vtf)
+     * -vpf*(1.d0-(1.d0-vvx)*(1.d0-vvxt)*exp(-vtf)))
+     * -.5d0*(vpf-v1p)*(min(0.d0,1.d0-exp(-vtf)-vtf)
+     * *(1.d0-vvx)*(1.d0-vvxp)*exp(-vpf)
+     * -vtf*(1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpf)))
+     * +.5d0*(v1t-v1t1)*v1p0+.5d0*(v1p-v1p1)*v1t0
+       dpx=min(1.d0,dpx)
+
+       qg3pom=qg3pom+a1(ib1)*a1(ib2)*a1(ix1)/z*rp*dpx
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      qg3pom=qg3pom/8.d0*log(sy/sgap**2)*(r3p*pi/.0389d0)/g3p**3
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgpcut(sy,b,vvx,vvxp,vvxt
+     *,icdp,icdt,icz)
+c-----------------------------------------------------------------------
+c qglool - integrated Pomeron leg eikonal with loops
+c sy   - pomeron mass squared,
+c bb   - impact parameter squared,
+c vvx  = 1 - exp[-sum_{j<J} chi_targ(j) - sum_{i<I} chi_proj(i)]
+c vvxp = 1 - exp[-sum_{i>I} chi_proj(i)]
+c vvxt = 1 - exp[-sum_{j>J} chi_targ(j)]
+c icz  - hadron class
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qgpcut=0.d0
+      if(sy.le.sgap**2)return
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr1=(sy/sgap**2)**(-(.5+x1(ix1)*(mx1-1.5)))/sgap
+       rp1=(rq(icdp,icz)-alfp*log(xpomr1))*4.d0*.0389d0
+       rp2=(rq(icdt,2)+alfp*log(xpomr1*sy))*4.d0*.0389d0
+       rp=rp1*rp2/(rp1+rp2)
+      do ib1=1,7
+      do mb1=1,2
+       z=.5d0+x1(ib1)*(mb1-1.5d0)
+       bb0=-rp*dlog(z)
+      do ib2=1,7
+      do mb2=1,2
+       phi=pi*(.5d0+x1(ib2)*(mb2-1.5d0))
+       bb1=(b*rp1/(rp1+rp2)+dsqrt(bb0)*cos(phi))**2+bb0*sin(phi)**2
+       bb2=(b*rp2/(rp1+rp2)-dsqrt(bb0)*cos(phi))**2+bb0*sin(phi)**2
+
+       vpl=qglegi(1.d0/xpomr1,bb1,icdp,icz,1)
+       vtl=qglegi(xpomr1*sy,bb2,icdt,2,1)
+       vpf0=qgfani(1.d0/xpomr1,bb1,1.d0-(1.d0-vvx)*(1.d0-vvxt)
+     * ,0.d0,0.d0,icdp,icz,1)
+       vtf0=qgfani(xpomr1*sy,bb2,1.d0-(1.d0-vvx)*(1.d0-vvxp)
+     * ,0.d0,0.d0,icdt,2,1)
+
+       n=1
+1      n=n+1
+       vpf=qgfani(1.d0/xpomr1,bb1,1.d0-(1.d0-vvx)*(1.d0-vvxt)
+     * *exp(-vtf0),0.d0,0.d0,icdp,icz,1)
+       vtf=qgfani(xpomr1*sy,bb2,1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpf0)
+     * ,0.d0,0.d0,icdt,2,1)
+       if(abs(1.d0-vpf/vpf0)+abs(1.d0-vtf/vtf0).gt.1.d-2.and.n.lt.100)
+     * then
+        vpf0=vpf
+        vtf0=vtf
+        goto 1
+       endif
+
+       vpls=qgfani(1.d0/xpomr1,bb1,1.d0-(1.d0-vvx)*(1.d0-vvxt)
+     * *exp(-vtf),vvxp,0.d0,icdp,icz,9)
+       vtls=qgfani(xpomr1*sy,bb2,1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpf)
+     * ,vvxt,0.d0,icdt,2,9)
+       vploop0=qglegi(1.d0/xpomr1,bb1,icdp,icz,5)
+       vploop=min(vploop0,qglegi(1.d0/xpomr1,bb1,icdp,icz,4))
+       vtloop0=qglegi(xpomr1*sy,bb2,icdt,2,5)
+       vtloop=min(vtloop0,qglegi(xpomr1*sy,bb2,icdt,2,4))
+
+       dpx=(vpls*vtloop+vtls*vploop)*(((1.d0-vvx)*(1.d0-vvxp)
+     * *(1.d0-vvxt))**2*exp(-2.d0*vpf-2.d0*vtf)-1.d0)
+     * +vpl*(vtloop-vtloop0)+vtl*(vploop-vploop0)
+
+       qgpcut=qgpcut+a1(ib1)*a1(ib2)*a1(ix1)/z*rp*dpx
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      qgpcut=qgpcut/16.d0*log(sy/sgap**2)*(r3p*pi/.0389d0)/g3p**3
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgpomi(sy,bb,vvx,vvxp,vvxt
+     *,icdp,icdt,icz,iqq)
+c-----------------------------------------------------------------------
+c qgpomi - integrated  eikonal contributions
+c sy   - pomeron mass squared,
+c bb   - impact parameter squared,
+c icdp - diffractive state for the projectile,
+c icdt - diffractive state for the target,
+c icz  - projectile class
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wz(3),wi(3),wj(3),wm(3)
+      common /qgarr10/ am(7),ammu
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr24/ qpomr(11,11,216,12,2)
+      common /qgdebug/  debug
+      common /qgarr43/ moniou
+
+      qgpomi=0.d0
+      pomm=0.d0
+      if(cd(icdp,icz).eq.0.d0.or.cd(icdt,2).eq.0.d0)return
+
+      rp=(rq(icdp,icz)+rq(icdt,2)+alfp*log(sy))*4.d0*.0389d0
+      z=exp(-bb/rp)
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-log(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      yl=dlog10((sy-am(2)**2-am(icz)**2)/2.d0/am(2))
+      k=max(1,int(yl))
+      k=min(k,9)
+      wk(2)=yl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+
+      ml=icdp+2*(icdt-1)+4*(icz-1)
+      if(vvx+vvxp+vvxt.eq.0.d0)then  !hadron-proton (no nucl. screening)
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,3
+        k2=k+k1-1
+        qgpomi=qgpomi+qpomr(k2,l2,1,ml,iqq)*wk(k1)*wz(l1)
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do k1=1,3
+         k2=k+k1-1
+         pomm=pomm+qpomr(k2,1,1,ml,iqq)*wk(k1)
+        enddo
+        qgpomi=min(qgpomi,pomm)
+       endif
+      else
+       vl=max(1.d0,vvx*5.d0+1.d0)
+       j=min(int(vl),4)
+       wj(2)=vl-j
+       wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+       wj(1)=1.d0-wj(2)+wj(3)
+       wj(2)=wj(2)-2.d0*wj(3)
+
+       if(icz.ne.2.or.vvxp.eq.0.d0)then   !hadron-nucleus (no proj. nucl. scr.)
+        i1max=1
+        i=1
+        wi(1)=1.d0
+       else
+        i1max=3
+        vl1=max(1.d0,vvxp*5.d0+1.d0)
+        i=min(int(vl1),4)
+        wi(2)=vl1-i
+        wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+        wi(1)=1.d0-wi(2)+wi(3)
+        wi(2)=wi(2)-2.d0*wi(3)
+       endif
+
+       vl2=max(1.d0,vvxt*5.d0+1.d0)
+       m=min(int(vl2),4)
+       wm(2)=vl2-m
+       wm(3)=wm(2)*(wm(2)-1.d0)*.5d0
+       wm(1)=1.d0-wm(2)+wm(3)
+       wm(2)=wm(2)-2.d0*wm(3)
+
+       do m1=1,3
+        m2=m+m1-2
+       do i1=1,i1max
+        i2=i+i1-2
+       do j1=1,3
+        j2=j+j1-1
+        mij=j2+6*i2+36*m2
+       do l1=1,izmax
+        l2=jz+l1-1
+       do k1=1,3
+        k2=k+k1-1
+        qgpomi=qgpomi+qpomr(k2,l2,mij,ml,iqq)
+     *  *wk(k1)*wz(l1)*wj(j1)*wi(i1)*wm(m1)
+       enddo
+       enddo
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do m1=1,3
+         m2=m+m1-2
+        do i1=1,i1max
+         i2=i+i1-2
+        do j1=1,3
+         j2=j+j1-1
+         mij=j2+6*i2+36*m2
+        do k1=1,3
+         k2=k+k1-1
+         pomm=pomm+qpomr(k2,1,mij,ml,iqq)*wk(k1)*wj(j1)*wi(i1)*wm(m1)
+        enddo
+        enddo
+        enddo
+        enddo
+        qgpomi=min(qgpomi,pomm)
+       endif
+      endif
+      qgpomi=exp(qgpomi)*z
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgppdi(xp,iqq)
+c-----------------------------------------------------------------------
+c qgppdi - parton distributions in the Pomeron
+c xp    - parton LC momentum share,
+c iqq=0 - gluon
+c iqq=1 - sea quark
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr20/ spmax
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.3)write (moniou,201)xp,iqq
+      if(xp.ge..9999999d0)then
+       qgppdi=0.d0
+      else
+       if(iqq.eq.0)then                             !gluon
+        qgppdi=(1.d0-xp)**betp*(1.d0-dgqq)
+       elseif(iqq.eq.1)then                         !quark
+        qgppdi=qgftlf(xp)*dgqq
+       endif
+      endif
+      if(debug.ge.4)write (moniou,202)qgppdi
+
+201   format(2x,'qgppdi - parton distr. in the Pomeron (interpol.):'
+     */4x,'xp=',e10.3,2x,'iqq=',i1)
+202   format(2x,'qgppdi=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgvpdf(x,icz)
+c-----------------------------------------------------------------------------
+c qgvpdf - valence quark structure function
+c x   - Feinman x,
+c icz - hadron class
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr25/ ahv(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qgvpdf=(qggrv(x,qt0,icz,1)+qggrv(x,qt0,icz,2))*(1.d0-x)**ahv(icz)
+      return
+      end
+
+c=============================================================================
+      double precision function qgspdf(x,icz)
+c-----------------------------------------------------------------------------
+c qgspdf - sea quark structure function
+c x   - Feinman x,
+c icz - hadron class
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qgspdf=0.d0
+      if(x*sgap.ge.1.d0)goto 1
+
+      do icdp=1,2
+       rp=(rq(icdp,icz)-alfp*log(x))*2.d0*.0389d0
+       if(cd(icdp,icz).ne.0.d0)then
+        dps=0.d0
+        do ix=1,7
+        do mx=1,2
+         xpomr=(x*sgap)**(.5d0+x1(ix)*(mx-1.5d0))/sgap
+        do ib=1,7
+        do mb=1,2
+         z=.5d0+x1(ib)*(mb-1.5d0)
+         bb=-rp*log(z)
+
+         v1p1=qgfani(1.d0/xpomr,bb,0.d0,0.d0,0.d0,icdp,icz,2)
+         v1p=min(v1p1,qgfani(1.d0/xpomr,bb,0.d0,0.d0,0.d0,icdp,icz,1))
+         dps=dps+a1(ix)*a1(ib)*(min(0.d0,1.d0-exp(-v1p)-v1p)+v1p-v1p1)
+     *   *qgftlf(x/xpomr)*(xpomr/x)**dels/z
+        enddo
+        enddo
+        enddo
+        enddo
+        qgspdf=qgspdf-dps*dlog(x*sgap)*rp/g3p**2*pi*rr*(r3p*pi/.0389d0)
+     *  *dgqq*cc(icdp,icz)
+       endif
+      enddo
+
+1     qgspdf=qgspdf+4.*pi*rr*fp(icz)*qgftle(x,icz)/x**dels
+      return
+      end
+
+c=============================================================================
+      double precision function qggpdf(x,icz)
+c-----------------------------------------------------------------------------
+c qggpdf - gluon structure function (xg(x,qt0))
+c x   - Feinman x,
+c icz - hadron class
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qggpdf=0.d0
+      if(x*sgap.ge.1.d0)goto 1
+
+      do icdp=1,2
+       rp=(rq(icdp,icz)-alfp*log(x))*2.d0*.0389d0
+       if(cd(icdp,icz).ne.0.d0)then
+        dps=0.d0
+        do ix=1,7
+        do mx=1,2
+         xpomr=(x*sgap)**(.5d0+x1(ix)*(mx-1.5d0))/sgap
+        do ib=1,7
+        do mb=1,2
+         z=.5d0+x1(ib)*(mb-1.5d0)
+         bb=-rp*log(z)
+
+         v1p1=qgfani(1.d0/xpomr,bb,0.d0,0.d0,0.d0,icdp,icz,2)
+         v1p=min(v1p1,qgfani(1.d0/xpomr,bb,0.d0,0.d0,0.d0,icdp,icz,1))
+         dps=dps+a1(ix)*a1(ib)*(min(0.d0,1.d0-exp(-v1p)-v1p)+v1p-v1p1)
+     *   *(1.d0-x/xpomr)**betp*(xpomr/x)**dels/z
+        enddo
+        enddo
+        enddo
+        enddo
+        qggpdf=qggpdf-dps*dlog(x*sgap)*rp/g3p**2*pi*rr*(r3p*pi/.0389d0)
+     *  *(1.d0-dgqq)*cc(icdp,icz)
+       endif
+      enddo
+
+1     qggpdf=qggpdf+4.*pi*rr*fp(icz)*qgftld(x,icz)/x**dels
+      return
+      end
+
+c=============================================================================
+      double precision function qgpdfb(x,bb,icz,jj)
+c-----------------------------------------------------------------------------
+c qgpdfb - b-dependent parton momentum distributions (xf(x,b,qt0))
+c x   - Feinman x,
+c icz - hadron class
+c jj=0 - g,
+c jj=1 - q
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qgpdfb=0.d0
+      if(x*sgap.lt.1.d0)then
+       do icdp=1,2
+        if(cd(icdp,icz).ne.0.d0)then
+         dps=0.d0
+         do ix=1,7
+         do mx=1,2
+          xpomr=(x*sgap)**(.5d0+x1(ix)*(mx-1.5d0))/sgap
+          rp=(rq(icdp,icz)-alfp*log(xpomr))*2.d0*.0389d0
+          rp1=alfp*dlog(xpomr/x)*4.d0*.0389d0
+          rp2=rp1*rp/(rp1+rp)
+         do ix2=1,7
+         do mx2=1,2
+          bb0=-rp2*log(.5d0+x1(ix2)*(mx2-1.5d0))
+         do ix3=1,7
+         do mx3=1,2
+          phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+          bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     *    +bb0*sin(phi)**2
+          bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     *    +bb0*sin(phi)**2
+
+          if(jj.eq.0)then
+           v1i=(1.d0-x/xpomr)**betp*(1.d0-dgqq)
+          else
+           v1i=qgftlf(x/xpomr)*dgqq
+          endif
+          v1p1=qgfani(1.d0/xpomr,bb2,0.d0,0.d0,0.d0,icdp,icz,2)
+          v1p=min(v1p1,qgfani(1.d0/xpomr,bb2,0.d0,0.d0,0.d0,icdp,icz,1))
+
+          dps=dps+a1(ix)*a1(ix2)*a1(ix3)*v1i
+     *    *(min(0.d0,1.d0-exp(-v1p)-v1p)+v1p-v1p1)
+     *    *(xpomr/x)**dels*rp/(rp1+rp)*exp(bb2/rp-bb/(rp1+rp))
+         enddo
+         enddo
+         enddo
+         enddo
+         enddo
+         enddo
+         qgpdfb=qgpdfb-dps*dlog(x*sgap)*pi*rr*r3p/g3p**2/.0389d0/2.d0
+     *   *cc(icdp,icz)
+        endif
+       enddo
+
+       do icdp=1,2
+        rp=(rq(icdp,icz)-alfp*dlog(x))*4.d0*.0389d0
+        if(jj.eq.0)then
+         qgpdfb=qgpdfb+4.d0*rr*fp(icz)*qgftld(x,icz)/x**dels
+     *   /rp*exp(-bb/rp)*cc(icdp,icz)
+        else
+         qgpdfb=qgpdfb+4.d0*rr*fp(icz)*qgftle(x,icz)/x**dels
+     *   /rp*exp(-bb/rp)*cc(icdp,icz)
+        endif
+       enddo
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgpdfi(x,bb,icz,jj)
+c-----------------------------------------------------------------------
+c qgpdfi - b-dependent parton momentum distributions
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wz(3)
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr20/ spmax
+      common /qgarr53/ qpdfb(51,11,3,2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qgpdfi=0.d0
+      rp=(rq(1,icz)-alfp*dlog(x))*4.d0*.0389d0
+      if(rp.le.1.d-10)then
+       z=1.d0
+      else
+       z=exp(-bb/rp)
+      endif
+      if(z.lt..2d0*exp(-10.d0))then
+       izmax=2
+       jz=1
+       wz(2)=5.d0*z*exp(10.d0)
+       wz(1)=1.d0-wz(2)
+      else
+       if(z.gt..2d0)then
+        zz=5.d0*z+6.d0
+       else
+        zz=(-bb/rp-log(0.2d0))/2.d0+7.d0
+       endif
+       jz=min(9,int(zz))
+       jz=max(2,jz)
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      yl=-dlog(x)/log(spmax)*50.d0+1.d0
+      k=max(1,int(yl))
+      k=min(k,49)
+      wk(2)=yl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+
+      do j1=1,izmax
+       j2=jz+j1-1
+      do k1=1,3
+       k2=k+k1-1
+       qgpdfi=qgpdfi+qpdfb(k2,j2,icz,jj+1)*wk(k1)*wz(j1)
+      enddo
+      enddo
+      qgpdfi=exp(qgpdfi)*z*4.d0*rr*fp(icz)/x**dels/rp
+      if(jj.eq.0)then
+       qgpdfi=qgpdfi*qgftld(x,icz)
+      else
+       qgpdfi=qgpdfi*qgftle(x,icz)
+      endif
+      return
+      end
+
+c=============================================================================
+      double precision function qgdgdf(x,xpomr,icz,jj)
+c-----------------------------------------------------------------------------
+c qgdgdf - diffractive gluon pdf xpomr*g_d^3(x,xpomr,qt0)
+c x   - Feinman x,
+c icz - hadron class
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qgdgdf=0.d0
+      do icdp=1,2
+      if(cd(icdp,icz).ne.0.d0)then
+       dps=0.d0
+       if(jj.eq.1)then
+        rp=(rq(icdp,icz)-alfp*log(xpomr))*2.d0*.0389d0
+        do ib=1,7
+        do mb=1,2
+         z=.5d0+x1(ib)*(mb-1.5d0)
+         bb=-rp*log(z)
+
+         v1p=qgfani(1.d0/xpomr,bb,0.d0,0.d0,0.d0,icdp,icz,1)
+         dps=dps+a1(ib)*(1.d0-exp(-v1p))**2/z
+        enddo
+        enddo
+        dps=dps*rp*pi*rr*(r3p*pi/.0389d0)*cc(icdp,icz)/g3p**2
+     *  *(1.d0-x/xpomr)**betp*(1.d0-dgqq)*(xpomr/x)**dels
+
+       elseif(jj.eq.2.and.xpomr/x.gt.sgap)then
+        do ix1=1,7
+        do mx1=1,2
+         xpomr1=(x/xpomr*sgap)**(.5d0+x1(ix1)*(mx1-1.5d0))*xpomr/sgap
+         rp=(rq(icdp,icz)-alfp*log(xpomr1))*2.d0*.0389d0
+         do ib=1,7
+         do mb=1,2
+          z=.5d0+x1(ib)*(mb-1.5d0)
+          bb=-rp*log(z)
+
+          vpf=qgfani(1.d0/xpomr1,bb,0.d0,0.d0,0.d0,icdp,icz,1)
+          vpdf1=qgdfani(xpomr1,xpomr,bb,icdp,2)
+          vpdf=min(vpdf1,qgdfani(xpomr1,xpomr,bb,icdp,1))
+          vpdfi=qgdfani(xpomr1,xpomr,bb,icdp,3)
+           dpx=vpdf*exp(2.d0*vpdfi-2.d0*vpf)-vpdf1
+
+          dps=dps+a1(ix1)*a1(ib)*dpx/z*rp
+     *    *(1.d0-x/xpomr1)**betp*(xpomr1/x)**dels
+         enddo
+         enddo
+        enddo
+        enddo
+        dps=dps*rr*pi*(r3p*pi/.0389d0)*dlog(xpomr/x/sgap)/g3p**2
+     *  *(1.d0-dgqq)*cc(icdp,icz)
+       endif
+       qgdgdf=qgdgdf+dps
+      endif
+      enddo
+      return
+      end
+
+c=============================================================================
+      double precision function qgdpdf(x,xpomr,icz,jj)
+c-----------------------------------------------------------------------------
+c qgdpdf - diffractive structure function
+c x   - Feinman x,
+c icz - hadron class
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qgdpdf=0.d0
+      do icdp=1,2
+      if(cd(icdp,icz).ne.0.d0)then
+       dps=0.d0
+       if(jj.eq.1)then
+        rp=(rq(icdp,icz)-alfp*log(xpomr))*2.d0*.0389d0
+        do ib=1,7
+        do mb=1,2
+         z=.5d0+x1(ib)*(mb-1.5d0)
+         bb=-rp*log(z)
+
+         v1p=qgfani(1.d0/xpomr,bb,0.d0,0.d0,0.d0,icdp,icz,1)
+         dps=dps+a1(ib)*(1.d0-exp(-v1p))**2/z
+        enddo
+        enddo
+        dps=dps*rp*pi*rr*(r3p*pi/.0389d0)*cc(icdp,icz)/g3p**2
+     *  *qgftlf(x/xpomr)*dgqq*(xpomr/x)**dels
+
+       elseif(jj.eq.2.and.xpomr/x.gt.sgap)then
+        do ix1=1,7
+        do mx1=1,2
+         xpomr1=(x/xpomr*sgap)**(.5d0+x1(ix1)*(mx1-1.5d0))*xpomr/sgap
+         rp=(rq(icdp,icz)-alfp*log(xpomr1))*2.d0*.0389d0
+         do ib=1,7
+         do mb=1,2
+          z=.5d0+x1(ib)*(mb-1.5d0)
+          bb=-rp*log(z)
+
+          vpf=qgfani(1.d0/xpomr1,bb,0.d0,0.d0,0.d0,icdp,icz,1)
+          vpdf1=qgdfani(xpomr1,xpomr,bb,icdp,2)
+          vpdf=min(vpdf1,qgdfani(xpomr1,xpomr,bb,icdp,1))
+          vpdfi=qgdfani(xpomr1,xpomr,bb,icdp,3)
+           dpx=vpdf*exp(2.d0*vpdfi-2.d0*vpf)-vpdf1
+
+          dps=dps+a1(ix1)*a1(ib)*dpx/z*rp
+     *    *qgftlf(x/xpomr1)*(xpomr1/x)**dels
+         enddo
+         enddo
+        enddo
+        enddo
+        dps=dps*rr*pi*(r3p*pi/.0389d0)*dlog(xpomr/x/sgap)/g3p**2
+     *  *dgqq*cc(icdp,icz)
+       endif
+       qgdpdf=qgdpdf+dps
+      endif
+      enddo
+      qgdpdf=qgdpdf/4.5d0
+      return
+      end
+
+c=============================================================================
+      double precision function qgfsh(sy,bb,icdp,icdt,icz,iqq)
+c-----------------------------------------------------------------------------
+c qgfsh - semihard interaction eikonal
+c sy  - pomeron mass squared,
+c bb  - impact parameter squared,
+c icz - hadron class
+c iqq - type of the hard interaction (0-gg, 1-q_vg, 2-gq_v)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr25/ ahv(3)
+      common /qgarr26/ factk,fqscal
+      common /arr3/   x1(7),a1(7)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)sy,bb,iqq,icz
+
+      qgfsh=0.d0
+      s2min=4.d0*fqscal*qt0
+      xmin=s2min/sy
+      if(xmin.ge.1.d0)return
+      xmin=xmin**(delh-dels)
+      if(iqq.eq.1)then
+       icv=icz
+       icq=2
+      elseif(iqq.eq.2)then
+       icv=2
+       icq=icz
+      endif
+      if(debug.ge.3)write (moniou,205)xmin,iqq
+
+c numerical integration over z1
+      do i=1,7
+      do m=1,2
+       z1=(.5d0*(1.d0+xmin-(2*m-3)*x1(i)*(1.d0-xmin)))
+     * **(1.d0/(delh-dels))
+       ww=z1*sy
+       sjqq=qgjit(qt0,qt0,ww,2,2)
+       sjqg=qgjit(qt0,qt0,ww,1,2)
+       sjgg=qgjit(qt0,qt0,ww,1,1)
+       if(debug.ge.3)write (moniou,203)ww,sjqq+sjqg+sjgg
+
+       if(iqq.eq.0)then
+        st2=0.d0
+        do j=1,7
+        do k=1,2
+         xx=.5d0*(1.d0+x1(j)*(2*k-3))
+         xp=z1**xx
+         xm=z1/xp
+         glu1=qgftld(xp,icz)
+         sea1=qgftle(xp,icz)
+         glu2=qgftld(xm,2)
+         sea2=qgftle(xm,2)
+         st2=st2+a1(j)*(glu1*glu2*sjgg+(glu1*sea2+glu2*sea1)*sjqg
+     *   +sea1*sea2*sjqq)
+        enddo
+        enddo
+        rh=rq(icdp,icz)+rq(icdt,2)-alfp*dlog(z1)
+        qgfsh=qgfsh-a1(i)*dlog(z1)/z1**delh*st2
+     *  *exp(-bb/(4.d0*.0389d0*rh))/rh
+
+       else
+        st2=0.d0
+        alh=.5d0+dels
+        xam=z1**alh
+
+        do j=1,7
+        do k=1,2
+         xp=(.5d0*(1.d0+xam+x1(j)*(2*k-3)*(1.d0-xam)))**(1.d0/alh)
+         xm=z1/xp
+         glu=qgftld(xm,icq)
+         sea=qgftle(xm,icq)
+         rh=rq(icdp,icz)+rq(icdt,2)-alfp*dlog(xm)
+
+         fst=(glu*sjqg+sea*sjqq)*(1.d0-xp)**ahv(icv)
+     *   *(qggrv(xp,qt0,icv,1)+qggrv(xp,qt0,icv,2))/dsqrt(xp)
+     *   *exp(-bb/(4.d0*.0389d0*rh))/rh
+         st2=st2+a1(j)*fst
+        enddo
+        enddo
+        st2=st2*(1.d0-xam)/alh
+        qgfsh=qgfsh+a1(i)/z1**delh*st2
+       endif
+      enddo
+      enddo
+
+      if(iqq.eq.0)then
+       qgfsh=qgfsh*rr**2*(1.d0-xmin)/(delh-dels)*fp(icz)*fp(2)*factk
+     * /2.d0*pi*cd(icdp,icz)*cd(icdt,2)
+      else
+       qgfsh=qgfsh*rr*fp(icq)*(1.d0-xmin)/(delh-dels)*factk/8.d0
+     * *cd(icdp,icz)*cd(icdt,2)
+      endif
+
+      if(debug.ge.3)write (moniou,202)qgfsh
+201   format(2x,'qgfsh - semihard interaction eikonal:'
+     */4x,'sy=',e10.3,2x,'bb=',e10.3,2x,'iqq=',i1,2x,'icz=',i1)
+202   format(2x,'qgfsh=',e10.3)
+203   format(2x,'qgfsh:',2x,'s_hard=',e10.3,2x,'sigma_hard=',e10.3)
+205   format(2x,'qgfsh:',2x,'xmin=',e10.3,2x,'iqq=',i3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgftld(z,icz)
+c-----------------------------------------------------------------------------
+c qgftld - auxilliary function for semihard eikonals calculation -
+c (proportional to gluon sf: g(z)*z^(1+dels)) -
+c integration over semihard block light cone momentum share x
+c z - x-cutoff from below,
+c icz - type of the hadron to which the semihard block is connected
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/    debug
+      common /arr3/     x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)z,icz
+
+      qgftld=0.d0
+      xpmin=z**(1.d0+dels)
+      do i1=1,7
+      do m1=1,2
+       tp=1.d0-(1.d0-xpmin)*(.5d0+x1(i1)*(m1-1.5d0))
+     * **(1.d0/(1.d0+ahl(icz)))
+       xp=tp**(1.d0/(1.d0+dels))
+       qgftld=qgftld+a1(i1)*((1.d0-xp)/(1.d0-tp))**ahl(icz)
+     * *(1.d0-z/xp)**betp
+      enddo
+      enddo
+      qgftld=qgftld*.5d0*(1.d0-xpmin)**(ahl(icz)+1.d0)
+     */(ahl(icz)+1.d0)/(1.d0+dels)*(1.d0-dgqq)
+
+      if(debug.ge.3)write (moniou,202)qgftld
+201   format(2x,'qgftld:',2x,'z=',e10.3,2x,'icz=',i1)
+202   format(2x,'qgftld=',e10.3)
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgftle(z,icz)
+c-----------------------------------------------------------------------
+c qgftle - auxilliary function for semihard eikonals calculation
+c (proportional to sea quark sf: q_s(z)*z^(1+dels)) -
+c integration over semihard pomeron light cone momentum share x
+c z - light cone x of the quark,
+c icz - type of the hadron to which the semihard block is connected
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)z,icz
+
+      qgftle=0.d0
+      xpmin=z**(1.d0+dels)
+      do i1=1,7
+      do m1=1,2
+       tp=1.d0-(1.d0-xpmin)*(.5d0+x1(i1)*(m1-1.5d0))
+     * **(1.d0/(1.d0+ahl(icz)))
+       xp=tp**(1.d0/(1.d0+dels))
+       qgftle=qgftle+a1(i1)*((1.d0-xp)/(1.d0-tp))**ahl(icz)
+     * *qgftlf(z/xp)
+      enddo
+      enddo
+      qgftle=qgftle*.5d0*(1.d0-xpmin)**(ahl(icz)+1.d0)
+     */(ahl(icz)+1.d0)/(1.d0+dels)*dgqq
+
+      if(debug.ge.3)write (moniou,202)qgftle
+201   format(2x,'qgftle:',2x,'z=',e10.3,2x,'icz=',i1)
+202   format(2x,'qgftle=',e10.3)
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgftlf(zz)
+c-----------------------------------------------------------------------
+c qgftlf - auxilliary function for semihard eikonals calculation
+c zz - ratio of the quark and pomeron light cone x (zz=x_G/x_P)
+c integration over quark to gluon light cone momentum ratio (z=x/x_G):
+c qgftlf=int(dz) z^dels * (1-zz/z)^betp * P_qG(z)
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)zz
+201   format(2x,'qgftlf:',2x,'zz=',e10.3)
+
+      qgftlf=0.d0
+      zmin=zz**(1.d0+dels)
+      do i=1,7
+      do m=1,2
+        z=(.5d0*(1.d0+zmin+(2*m-3)*x1(i)*(1.d0-zmin)))**(1.d0/
+     *  (1.d0+dels))
+        qgftlf=qgftlf+a1(i)*max(1.d-9,(1.d0-zz/z))**betp
+     *  *(z**2+(1.d0-z)**2)
+      enddo
+      enddo
+      qgftlf=qgftlf*1.5d0*(1.d0-zmin)/(1.d0+dels)   !1.5=naflav/2 at Q0
+
+      if(debug.ge.3)write (moniou,202)qgftlf
+202   format(2x,'qgftlf=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgfz(b,gz,iddp1,iddp2)
+c----------------------------------------------------------------------------
+c hadron-hadron and hadron-nucleus cross sections calculation
+c----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      dimension gz(5),wt1(3),wt2(3)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr43/ moniou
+      common /arr3/   x1(7),a1(7)
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)b,iddp1,iddp2
+      do l=1,5
+       gz(l)=0.d0
+      enddo
+      rp=(rq(1,icz)+rq(1,2)+alfp*log(scm))*4.d0*.0389d0
+      g0=0.d0
+      if(ia(2).eq.1.and.iddp1.eq.0.and.iddp2.eq.0)then
+       g0=pi*rp*10.d0                     !normalization factor (in mb)
+       bm=2.d0*dsqrt(rp)                  !impact parameter for exp. fall-down
+      endif
+
+      do i1=1,7
+      do m=1,2
+       z=.5d0+x1(i1)*(m-1.5d0)
+       bb1=rp*z
+       bb2=rp*(1.d0-dlog(z))
+
+       do l=1,3
+        wt1(l)=0.d0
+        wt2(l)=0.d0
+       enddo
+
+       if(ia(2).eq.1)then
+        do idd1=1,2
+        do idd2=1,2
+         vv1=exp(-qgpomi(scm,bb1,0.d0,0.d0,0.d0,idd1,idd2,icz,1))
+         vv2=exp(-qgpomi(scm,bb2,0.d0,0.d0,0.d0,idd1,idd2,icz,1))
+
+         do l=1,2
+          wt1(l)=wt1(l)+cc(idd1,icz)*cc(idd2,2)*vv1**l
+          wt2(l)=wt2(l)+cc(idd1,icz)*cc(idd2,2)*vv2**l
+         enddo
+         do idd3=1,2
+          wt1(3)=wt1(3)+cc(idd1,icz)*cc(idd2,2)*cc(idd3,icz)*vv1
+     *    *exp(-qgpomi(scm,bb1,0.d0,0.d0,0.d0,idd3,idd2,icz,1))
+          wt2(3)=wt2(3)+cc(idd1,icz)*cc(idd2,2)*cc(idd3,icz)*vv2
+     *    *exp(-qgpomi(scm,bb2,0.d0,0.d0,0.d0,idd3,idd2,icz,1))
+         enddo
+        enddo
+        enddo
+        do l=1,2
+         gz(l)=gz(l)+a1(i1)*((1.d0-wt1(l))+(1.d0-wt2(l))/z)
+        enddo
+        gz(3)=gz(3)+a1(i1)*((wt1(2)-wt1(3))+(wt2(2)-wt2(3))/z)
+        gz(4)=gz(4)+a1(i1)*((wt1(3)-wt1(1)**2)+(wt2(3)-wt2(1)**2)/z)
+        gz(5)=gz(5)+a1(i1)*((1.d0-wt1(1))*z+(1.d0-wt2(1))/z*(1.-log(z)))
+
+       else
+        do idd1=1,2
+        do idd2=1,2
+         vv1=exp(-qgpomi(scm,bb1,0.d0,0.d0,0.d0,iddp1,idd1,icz,1)
+     *   -qgpomi(scm,bb1,0.d0,0.d0,0.d0,iddp2,idd2,icz,1))
+         vv2=exp(-qgpomi(scm,bb2,0.d0,0.d0,0.d0,iddp1,idd1,icz,1)
+     *   -qgpomi(scm,bb2,0.d0,0.d0,0.d0,iddp2,idd2,icz,1))
+
+         if(idd1.eq.idd2)then
+          wt1(1)=wt1(1)+cc(idd1,2)*vv1
+          wt2(1)=wt2(1)+cc(idd1,2)*vv2
+         endif
+         wt1(2)=wt1(2)+cc(idd1,2)*cc(idd2,2)*vv1
+         wt2(2)=wt2(2)+cc(idd1,2)*cc(idd2,2)*vv2
+        enddo
+        enddo
+        cg1=qgrot(b,dsqrt(bb1))
+        cg2=qgrot(b,dsqrt(bb2))
+        do l=1,2
+         gz(l)=gz(l)+a1(i1)*(cg1*(1.d0-wt1(l))+cg2*(1.d0-wt2(l))/z)
+        enddo
+       endif
+      enddo
+      enddo
+      if(ia(2).eq.1.and.iddp1.eq.0.and.iddp2.eq.0)then     !hadron-proton
+       do l=1,5
+        gz(l)=gz(l)*g0
+       enddo
+       gz(5)=gz(5)/gz(1)*(rq(1,icz)+rq(1,2)+alfp*log(scm))*2.d0
+      endif
+
+      if(debug.ge.2)write (moniou,203)gz
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qgfz - hadronic cross-sections calculation'
+     */4x,'b=',e10.3,2x,'iddp=',2i3)
+202   format(2x,'qgfz - end')
+203   format(2x,'qgfz: gz=',5e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qghard(sy,bb,icdp,icdt,icz)
+c-----------------------------------------------------------------------------
+c qghard - hard quark-quark interaction cross-section
+c s - energy squared for the interaction (hadron-hadron),
+c icz - type of the primaty hadron (nucleon)
+c----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr25/ ahv(3)
+      common /qgarr26/ factk,fqscal
+      common /arr3/   x1(7),a1(7)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)sy,icz
+
+      qghard=0.d0
+      s2min=4.d0*fqscal*qt0
+      xmin=s2min/sy
+      if(xmin.ge.1.d0)return
+      xmin=xmin**(delh+.5d0)
+
+c numerical integration over z1
+      do i=1,7
+      do m=1,2
+       z1=(.5d0*(1.d0+xmin-(2*m-3)*x1(i)*(1.d0-xmin)))
+     * **(1.d0/(delh+.5d0))
+
+       st2=0.d0
+       do j=1,7
+       do k=1,2
+        xx=.5d0*(1.d0+x1(j)*(2*k-3))
+        xp=z1**xx
+        xm=z1/xp
+        st2=st2+a1(j)*(1.d0-xp)**ahv(icz)*(1.d0-xm)**ahv(2)
+     *  *(qggrv(xp,qt0,icz,1)+qggrv(xp,qt0,icz,2))
+     *  *(qggrv(xm,qt0,2,1)+qggrv(xm,qt0,2,2))/dsqrt(z1)
+       enddo
+       enddo
+       sj=qgjit(qt0,qt0,z1*sy,2,2)
+       st2=-st2*dlog(z1)*sj
+       if(debug.ge.3)write (moniou,203)z1*sy,sj
+
+       qghard=qghard+a1(i)/z1**delh*st2
+      enddo
+      enddo
+      qghard=qghard*(1.d0-xmin)/(.5d0+delh)*.25d0*factk
+      rh=rq(icdp,icz)+rq(icdt,2)
+      qghard=qghard/(8.d0*pi*rh)*exp(-bb/(4.d0*.0389d0*rh))
+     **cd(icdp,icz)*cd(icdt,2)
+
+      if(debug.ge.2)write (moniou,202)qghard
+201   format(2x,'qghard - hard quark-quark interaction eikonal:'
+     */2x,'s=',e10.3,2x,'icz=',i1)
+202   format(2x,'qghard=',e10.3)
+203   format(2x,'qghard:',2x,'s_hard=',e10.3,2x,'sigma_hard=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgbdef(bba,bbb,xxa,yya,xxb,yyb,xxp,yyp,jb)
+c-----------------------------------------------------------------------
+c qgbdef - defines coordinates (xxp,yyp) of a multi-pomeron vertex
+c------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+
+      xx=xxa-xxb
+      yy=yya-yyb
+      bb=xx**2+yy**2
+      if(bb.lt.1.d-5)then
+       xxp=xxb+dsqrt(bba)
+       yyp=yyb
+      elseif(abs(yy).lt.1.d-8)then
+       xxp=(bba-bbb+xxb**2-xxa**2)/2.d0/(xxb-xxa)
+       yyp=yyb+(2*jb-3)*dsqrt(max(0.d0,bbb-(xxb-xxp)**2))
+      else
+       bbd=bb+bbb-bba
+       discr=max(0.d0,4.d0*bb*bbb-bbd**2)
+       xxp=(xx*bbd+(2*jb-3)*abs(yy)*dsqrt(discr))/2.d0/bb
+       yyp=(bbd-2.d0*xx*xxp)/2.d0/yy
+       xxp=xxp+xxb
+       yyp=yyp+yyb
+      endif
+      return
+      end
+
+c=============================================================================
+      subroutine qgv(x,y,xb,vin,vdd,vabs)
+c xxv - eikonal dependent factor for hadron-nucleus interaction
+c (used for total and diffractive hadron-nucleus cross-sections calculation)
+c----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      dimension xb(iapmax,3),vabs(2)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)x,y
+
+      vin=0.d0
+      vdd=0.d0
+      do iddp1=1,2
+       dv=0.d0
+       do m=1,ia(2)
+        bb=(x-xb(m,1))**2+(y-xb(m,2))**2
+        dv=dv+qgpomi(scm,bb,0.d0,0.d0,0.d0,iddp1,iddt(m),icz,1)
+       enddo
+       dv=exp(-dv)
+       vabs(iddp1)=1.d0-dv**2       !1-exp(-2 * chi_i)
+       vdd=vdd+cc(iddp1,icz)*dv**2  !sum_i cc(i) exp(-2 * chi_i)
+       vin=vin+cc(iddp1,icz)*dv     !sum_i cc(i) exp(-chi_i)
+      enddo
+      vin=1.d0-vin**2               !1-sum_ij cc(i) cc(j) exp(-chi_i-chi_j)
+      vdd=vdd+vin-1.d0
+          !sum_i cc(i) exp(-2*chi_i) - sum_ij cc(i) cc(j) exp(-chi_i-chi_j)
+
+      if(debug.ge.3)write (moniou,202)vin,vdd,vabs
+201   format(2x,'qgv - eikonal factor: nucleon coordinates x='
+     *  ,e10.3,2x,'y=',e10.3)
+202   format(2x,'vin=',e10.3,2x,'vdd=',e10.3,2x,'vabs=',2e10.3)
+      return
+      end
+
+
+c=============================================================================
+      subroutine qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt
+     *  ,vvxpl,vvxtl,ip,it)
+c-----------------------------------------------------------------------
+c qgfdf - configuration of fan contributions (cut and uncut fans)
+c xxp, yyp -  coordinates of the multi-Pomeron vertex,
+c xpomr    - LC momentum share of the multi-Pomeron vertex,
+c ip       - proj. index,
+c it       - targ. index
+c vvx   = 1 - exp[-sum_{j<J} chi_targ(j) - sum_{i<I} chi_proj(i)]
+c vvxp  = 1 - exp[-sum_{i>I} chi_proj(i)]
+c vvxt  = 1 - exp[-sum_{j>J} chi_targ(j)]
+c vvxpl = 1 - exp[-sum_{i<I} chi_proj(i)]
+c vvxtl = 1 - exp[-sum_{j<J} chi_targ(j)]
+c------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      dimension vpac(iapmax),vtac(iapmax)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr7/  xa(iapmax,3),xb(iapmax,3),b
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr43/ moniou
+      common /qgarr46/ iconab(iapmax,iapmax),icona(iapmax)
+     *,iconb(iapmax)
+      common /qgdebug/   debug
+
+      if(debug.ge.3)write (moniou,201)xxp,yyp,xpomr,ip,it
+
+      vvx=0.d0
+      vvxp=0.d0
+      vvxt=0.d0
+      vvxpl=0.d0
+      vvxtl=0.d0
+      if(scm.le.sgap**2)return
+
+      sumup0=0.d0                      !proj. fans without targ. screening
+      do ipp=1,ia(1)
+       if(iconab(ipp,it).eq.0)then    !no connection
+                                      !(nucleon too far from the vertex)
+        vpac(ipp)=0.d0
+       else
+        bbp=(xa(ipp,1)+b-xxp)**2+(xa(ipp,2)-yyp)**2
+        vpac(ipp)=qgfani(1.d0/xpomr,bbp,1.d0-exp(-sumup0),0.d0,0.d0
+     *  ,iddp(ipp),icz,1)
+        sumup0=sumup0+vpac(ipp)
+       endif
+      enddo
+
+      sumut0=0.d0                      !targ. fans without proj. screening
+      do itt=1,ia(2)
+       if(iconab(ip,itt).eq.0)then     !no connection
+        vtac(itt)=0.d0
+       else
+        bbt=(xb(itt,1)-xxp)**2+(xb(itt,2)-yyp)**2
+        vtac(itt)=qgfani(xpomr*scm,bbt,1.d0-exp(-sumut0),0.d0,0.d0
+     *  ,iddt(itt),2,1)
+        sumut0=sumut0+vtac(itt)
+       endif
+      enddo
+
+      nn=0
+1     nn=nn+1
+      sumup=0.d0                       !proj. fans with targ. screening
+      do ipp=1,ia(1)
+       if(iconab(ipp,it).eq.0)then    !no connection
+        vpac(ipp)=0.d0
+       else
+        bbp=(xa(ipp,1)+b-xxp)**2+(xa(ipp,2)-yyp)**2
+        vpac(ipp)=qgfani(1.d0/xpomr,bbp,1.d0-exp(-sumup-sumut0)
+     *  ,0.d0,0.d0,iddp(ipp),icz,1)
+        sumup=sumup+vpac(ipp)
+       endif
+      enddo
+
+      sumut=0.d0                      !targ. uncut fans with proj. screening
+      do itt=1,ia(2)
+       if(iconab(ip,itt).eq.0)then
+        vtac(itt)=0.d0
+       else
+        bbt=(xb(itt,1)-xxp)**2+(xb(itt,2)-yyp)**2
+        vtac(itt)=qgfani(xpomr*scm,bbt,1.d0-exp(-sumut-sumup0)
+     *  ,0.d0,0.d0,iddt(itt),2,1)
+        sumut=sumut+vtac(itt)
+       endif
+      enddo
+
+      if((abs(sumup-sumup0).gt..01d0.or.abs(sumut-sumut0).gt..01d0)
+     *.and.nn.lt.100)then
+       sumup0=sumup
+       sumut0=sumut
+       goto 1
+      endif
+
+      if(ia(1).gt.1)then
+       do ipp=1,ia(1)
+        if(ipp.lt.ip)then
+         vvxpl=vvxpl+vpac(ipp)
+        elseif(ipp.gt.ip)then
+         vvxp=vvxp+vpac(ipp)
+        endif
+       enddo
+      endif
+
+      if(ia(2).gt.1)then
+       do itt=1,ia(2)
+        if(itt.lt.it)then
+         vvxtl=vvxtl+vtac(itt)
+        elseif(itt.gt.it)then
+         vvxt=vvxt+vtac(itt)
+        endif
+       enddo
+      endif
+      vvx=1.d0-exp(-vvxpl-vvxtl)
+      vvxp=1.d0-exp(-vvxp)
+      vvxpl=1.d0-exp(-vvxpl)
+      vvxt=1.d0-exp(-vvxt)
+      vvxtl=1.d0-exp(-vvxtl)
+      if(debug.ge.4)write (moniou,202)
+
+201   format(2x,'qgfdf - configuration of fan contributions:'
+     */2x,'xxp=',e10.3,2x,'yyp=',e10.3,2x,'xpomr=',e10.3
+     *,2x,'ip=',i3,2x,'it=',i3)
+202   format(2x,'qgfdf - end')
+      return
+      end
+
+c=============================================================================
+      subroutine qgconf
+c-----------------------------------------------------------------------------
+c interaction (cut Pomeron) configuration:
+c b - impact parameter,
+c xa(1-iap,3), xb(1-iat,3) - proj. and targ. nucleon coordinates,
+c iddp(1-iap), iddt(1-iat) - proj. and targ. nucleon diffractive eigenstates,
+c icona(1-iap) - connection for proj. nucleons (0 if too far from the target),
+c iconab(1-iap,1-iat) - connection for proj.-targ. nucleons (0 if too far from
+c each other),
+c nwp, nwt - numbers of wounded proj. and targ. nucleons (inelastic or diff.),
+c iwp(1-iap), iwt(1-iat) - indexes for wounded proj. and targ. nucleons
+c (0 - intact, 1 - inel., 2,3 - diffr., -1 - recoiled from diffraction),
+c ncola(1-iap), ncolb(1-iat) - index for inel.-wounded proj. and targ. nucleons,
+c nbpom  - total number of Pomeron blocks,
+c ias(k) (ibs(k)) - index of the proj. (targ.) nucleon for k-th Pomeron block,
+c bbpom(k) - squared impact parameter (between proj. and targ.) for k-th block,
+c vvxpom(k) - relative strenth of A-screening corrections for k-th block,
+c nqs(k) - number of single Pomerons in k-th block (without cut 3P-vertexes),
+c npompr(k) - number of proj. leg Pomerons in k-th block,
+c npomtg(k) - number of targ. leg Pomerons in k-th block,
+c npomin(k) - number of interm. Pomerons (between 2 3P-vertexes) in k-th block,
+c xpopin(n,k) - LC momentum of the upper 3P-vertex for n-th interm. Pomeron
+c in k-th block,
+c xpomin(n,k) - LC momentum of the lower 3P-vertex for n-th interm. Pomeron
+c in k-th block,
+c nnpr(i,k) - proj. participant index for i-th single Pomeron in k-th block,
+c nntg(i,k) - targ. participant index for i-th single Pomeron in k-th block,
+c ilpr(i,k) - proj. index for i-th proj. leg Pomeron in k-th block,
+c iltg(i,k) - proj. index for i-th targ. leg Pomeron in k-th block,
+c lnpr(i,k) - proj. participant index for i-th proj. leg Pomeron in k-th block,
+c lntg(i,k) - targ. participant index for i-th targ. leg Pomeron in k-th block,
+c lqa(ip) - number of cut Pomerons connected to ip-th proj. nucleon (hadron),
+c lqb(it) - number of cut Pomerons connected to it-th targ. nucleon (hadron),
+c nbpi(n,ip) - block index for n-th Pomeron connected to ip-th proj. nucleon,
+c nbti(n,it) - block index for n-th Pomeron connected to it-th targ. nucleon,
+c idnpi(n,ip) - type of n-th Pomeron (0 - single, 1 - leg) connected to ip-th
+c proj. nucleon,
+c idnti(n,it) - type of n-th Pomeron (0 - single, 1 - leg) connected to it-th
+c targ. nucleon,
+c nppi(n,ip) - index in the block of n-th Pomeron connected to ip-th proj.
+c nucleon (for single Pomerons),
+c npti(n,it) - index in the block of n-th Pomeron connected to it-th targ.
+c nucleon (for single Pomerons),
+c nlpi(n,ip) - index in the block of n-th Pomeron connected to ip-th proj.
+c nucleon (for leg Pomerons),
+c nlti(n,it) - index in the block of n-th Pomeron connected to it-th targ.
+c nucleon (for leg Pomerons),
+c iprcn(ip) - index of the recoiled targ. nucleon for ip-th proj. nucleon
+c (undergoing diffraction),
+c itgcn(it) - index of the recoiled proj. nucleon for it-th targ. nucleon
+c (undergoing diffraction),
+c bpompr(n,ip) - squared impact parameter for n-th leg Pomeron connected
+c to ip-th proj. nucleon,
+c bpomtg(n,it) - squared impact parameter for n-th leg Pomeron connected
+c to it-th targ. nucleon,
+c vvxpr(n,ip) - relative strenth of A-screening corrections for n-th leg
+c Pomeron connected to ip-th proj. nucleon,
+c vvxtg(n,it) - relative strenth of A-screening corrections for n-th leg
+c Pomeron connected to it-th targ. nucleon,
+c xpompr(n,ip) - LC momentum of the 3P-vertex for n-th leg Pomeron connected
+c to ip-th proj. nucleon,
+c xpomtg(n,it) - LC momentum of the 3P-vertex for n-th leg Pomeron connected
+c to it-th targ. nucleon
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208,npbmax=1000,npnmax=900,npmax=900,legmax=900)
+      dimension xas(iapmax,3),vabs(2),vabsi(2,iapmax),wdifi(iapmax)
+     *,vpac(iapmax),vtac(iapmax),xpomip(npmax),xpomim(npmax)
+     *,vvxim(npmax),bpomim(npmax),xpompi(legmax),xpomti(legmax)
+     *,vvxpi(legmax),vvxti(legmax),bpompi(legmax),bpomti(legmax)
+     *,ipompi(legmax),ipomti(legmax),ncola(iapmax),ncolb(iapmax)
+     *,wdp(2,iapmax),wdt(2,iapmax),wabs(2,2),xrapmin(100),xrapmax(100)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr4/  ey0(3)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr7/  xa(iapmax,3),xb(iapmax,3),b
+      common /qgarr9/  iwp(iapmax),iwt(iapmax),lqa(iapmax),lqb(iapmax)
+     *,iprcn(iapmax),itgcn(iapmax),ias(npbmax),ibs(npbmax),nqs(npbmax)
+     *,npompr(npbmax),npomtg(npbmax),npomin(npbmax),nnpr(npmax,npbmax)
+     *,nntg(npmax,npbmax),ilpr(legmax,npbmax),iltg(legmax,npbmax)
+     *,lnpr(legmax,npbmax),lntg(legmax,npbmax)
+     *,nbpi(npnmax,iapmax),nbti(npnmax,iapmax),idnpi(npnmax,iapmax)
+     *,idnti(npnmax,iapmax),nppi(npnmax,iapmax),npti(npnmax,iapmax)
+     *,nlpi(npnmax,iapmax),nlti(npnmax,iapmax)
+      common /qgarr10/ am(7),ammu
+      common /qgarr11/ b10
+      common /qgarr12/ nsp
+      common /qgarr13/ nsf,iaf(iapmax)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr23/ bbpom(npbmax),vvxpom(npbmax)
+     *,bpompr(npnmax,iapmax),bpomtg(npnmax,iapmax)
+     *,vvxpr(npnmax,iapmax),vvxtg(npnmax,iapmax)
+     *,xpompr(npnmax,iapmax),xpomtg(npnmax,iapmax)
+     *,xpopin(npmax,npbmax),xpomin(npmax,npbmax),vvxin(npmax,npbmax)
+     *,bpomin(npmax,npbmax)
+      common /qgarr43/ moniou
+      common /qgarr46/ iconab(iapmax,iapmax),icona(iapmax)
+     *,iconb(iapmax)
+      common /qgarr55/ nwt,nwp       !N of wounded targ.(proj.) nucleons
+      common /qgarr56/ nspec,nspect  !N of spectators targ.(proj.) nucleons
+      common /qgdebug/  debug
+      common /qgsIInex1/xan(iapmax,3),xbn(iapmax,3) !used to link with nexus
+     *,bqgs,bmaxqgs,bmaxnex,bminnex
+      common/jdiff/bdiff,jdiff     !for external use: impact parameter
+                                   !for diffraction, diffraction type
+ctp from epos
+      integer ng1evt,ng2evt,ikoevt
+      real    rglevt,sglevt,eglevt,fglevt,typevt
+      common/c2evt/ng1evt,ng2evt,rglevt,sglevt,eglevt,fglevt,ikoevt
+     *,typevt            !in epos.inc
+
+      external qgran
+
+      if(debug.ge.1)write (moniou,201)
+      nsp=0
+      nsf=0
+      nsp0=nsp
+
+c initialization
+1     continue
+      do i=1,ia(1)
+       iddp(i)=1+int(qgran(b10)+cc(2,icz)) !diffractive eigenstates for proj.
+      enddo
+      do i=1,ia(2)
+       iddt(i)=1+int(qgran(b10)+cc(2,2))   !diffractive eigenstates for targ.
+      enddo
+
+c-------------------------------------------------
+c squared impact parameter is sampled uniformly (b**2<bm**2)
+      b=bm*dsqrt(qgran(b10))
+      if(debug.ge.1)write (moniou,202)b
+
+      if(bmaxnex.ge.0.d0)then              !used to link with nexus
+       b1=bminnex
+       b2=min(bm,bmaxnex)
+       if(b1.gt.b2)stop'bmin > bmax in qgsjet'
+       b=dsqrt(b1*b1+(b2*b2-b1*b1)*qgran(b10))
+       bqgs=b
+      endif
+
+c-------------------------------------------------
+c nuclear configurations
+      if(debug.ge.1)write (moniou,203)
+      if(ia(1).gt.1)then          !projectile nucleon coordinates
+       call qggea(ia(1),xa,1)     !xa(n,i), i=1,2,3 - x,y,z for n-th nucleon
+      else
+       do i=1,3
+        xa(1,i)=0.d0              !projectile hadron
+       enddo
+      endif
+      if(ia(2).gt.1)then          !target nucleon coordinates
+       call qggea(ia(2),xb,2)     !xb(n,i), i=1,2,3 - x,y,z for n-th nucleon
+      else
+       do i=1,3
+        xb(1,i)=0.d0              !target proton
+       enddo
+      endif
+
+c-------------------------------------------------
+c check connections
+      if(debug.ge.1)write (moniou,204)
+      do it=1,ia(2)
+       iconb(it)=0
+      enddo
+
+      do ip=1,ia(1)
+       icdp=iddp(ip)
+       icona(ip)=0
+       do it=1,ia(2)
+        icdt=iddt(it)
+        bbp=(xa(ip,1)+b-xb(it,1))**2+(xa(ip,2)-xb(it,2))**2
+        vv1p=qgpomi(scm,bbp,0.d0,0.d0,0.d0,icdp,icdt,icz,1)
+        if(vv1p.gt.1.d-3)then
+         if(debug.ge.2)write (moniou,205)ip,it
+         iconab(ip,it)=1
+         icona(ip)=1
+         iconb(it)=1
+         if(debug.ge.2)write (moniou,206)ip
+         if(debug.ge.2)write (moniou,207)it
+        else
+         iconab(ip,it)=0
+        endif
+       enddo
+      enddo
+
+      nrej=0
+2     nrej=nrej+1
+      if(debug.ge.2)write (moniou,208)nrej
+      if(nrej.gt.10)then
+       if(debug.ge.1)write (moniou,209)
+       goto 1
+      endif
+      nsp=nsp0
+      nbpom=0
+      nwp=0
+      nwt=0
+      do i=1,ia(1)
+       lqa(i)=0
+       iwp(i)=0
+       ncola(i)=0
+       wdp(1,i)=0.d0
+       wdp(2,i)=0.d0
+      enddo
+      do i=1,ia(2)
+       lqb(i)=0
+       iwt(i)=0
+       ncolb(i)=0
+       wdt(1,i)=0.d0
+       wdt(2,i)=0.d0
+      enddo
+      nqs(1)=0
+      npomin(1)=0
+      npompr(1)=0
+      npomtg(1)=0
+
+c-------------------------------------------------
+c Pomeron configuration
+      if(debug.ge.1)write (moniou,210)
+      do 4 ip=1,ia(1)             !loop over all projectile nucleons
+       if(debug.ge.2)write (moniou,211)ip
+       if(icona(ip).eq.0)goto 4
+       x=xa(ip,1)+b               !proj. x is shifted by the impact parameter b
+       y=xa(ip,2)
+       icdp=iddp(ip)              !diffr. eigenstate for ip
+
+       do 3 it=1,ia(2)            !loop over all target nucleons
+        if(debug.ge.2)write (moniou,212)it
+        if(iconab(ip,it).eq.0)goto 3
+        icdt=iddt(it)                         !diffr. eigenstate for it
+        bbp=(x-xb(it,1))**2+(y-xb(it,2))**2   !distance squared between ip, it
+
+c calculate nuclear screening factors for "middle point" -> eikonals
+        xpomr=1.d0/dsqrt(scm)
+        xxp=.5d0*(x+xb(it,1))
+        yyp=.5d0*(y+xb(it,2))
+        call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *  ,ip,it)
+        vv=qgpomi(scm,bbp,vvx,vvxp,vvxt,icdp,icdt,icz,1)        !total eikonal
+        vv1p=min(vv,qgpomi(scm,bbp,vvx,vvxp,vvxt,icdp,icdt,icz,2)) !1P-eikonal
+        if(debug.ge.2)write (moniou,213)vv,vv1p
+
+        if(qgran(b10).gt.1.d0-exp(-2.d0*vv))goto 3 !1.-exp(-2*vv) - probability
+                                                   !for inelastic interaction
+        iwt(it)=1
+        iwp(ip)=1
+        ncola(ip)=ncola(ip)+1                   !N of binary collisions for ip
+        ncolb(it)=ncolb(it)+1                   !N of binary collisions for it
+
+        n=npgen(2.d0*vv,1,50) !number of elem. inter. for (ip-it) collision
+        nbpom=nbpom+1         !new Pomeron block
+        if(nbpom.gt.npbmax)then
+         goto 2
+        endif
+        ias(nbpom)=ip         !proj. index for current elementary interaction
+        ibs(nbpom)=it         !targ. index for current elementary interaction
+        bbpom(nbpom)=bbp      !distance squared between ip, it
+        vvxpom(nbpom)=1.d0-(1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt)
+        if(debug.ge.2)write (moniou,214)nbpom,ip,it,n
+
+        nqs(nbpom)=0
+        npomin(nbpom)=0
+        npompr(nbpom)=0
+        npomtg(nbpom)=0
+        do i=1,n
+         if(qgran(b10).lt.vv1p/vv.or.scm.le.sgap**2)then  !single Pomeron
+          if(debug.ge.2)write (moniou,215)i
+          np=nqs(nbpom)+1
+          if(np.gt.legmax)then
+           goto 2
+          endif
+          nqs(nbpom)=np                  !update Pomeron number in the block
+          l0=lqa(ip)+1
+          if(l0.gt.npnmax)then
+           goto 2
+          endif
+          lqa(ip)=l0                     !update number of connections for proj.
+          nnpr(np,nbpom)=l0              !index for connected proj. participant
+          nbpi(l0,ip)=nbpom
+          idnpi(l0,ip)=0
+          nppi(l0,ip)=np
+          l0=lqb(it)+1
+          if(l0.gt.npnmax)then
+           goto 2
+          endif
+          lqb(it)=l0
+          nntg(np,nbpom)=l0              !index for connected targ. participant
+          nbti(l0,it)=nbpom
+          idnti(l0,it)=0
+          npti(l0,it)=np
+
+         else                            !multi-Pomeron vertex
+          if(debug.ge.2)write (moniou,219)
+          call qg3pdf(vvxpi,vvxti,xpompi,xpomti,bpompi,bpomti,xpomip
+     *    ,xpomim,vvxim,bpomim,npompi,npomti,npin,ipompi,ipomti
+     *    ,wdp,wdt,ip,it,iret)
+          if(iret.ne.0)goto 2
+
+          if(npin.ne.0)then
+           if(debug.ge.2)write (moniou,220)i,npin
+           npomin(nbpom)=npomin(nbpom)+npin
+           if(npomin(nbpom).gt.npmax)then
+            goto 2
+           endif
+           do l=1,npin
+            l1=npomin(nbpom)+l-npin
+            xpopin(l1,nbpom)=xpomip(l)
+            xpomin(l1,nbpom)=xpomim(l)
+            vvxin(l1,nbpom)=vvxim(l)
+            bpomin(l1,nbpom)=bpomim(l)
+           enddo
+          endif
+          if(npompi.ne.0)then
+           if(debug.ge.2)write (moniou,221)i,npompi
+           do m=1,npompi
+            np=npompr(nbpom)+1
+            if(np.gt.legmax)then
+             goto 2
+            endif
+            npompr(nbpom)=np
+            ipp=ipompi(m)
+            iwp(ipp)=1
+            ilpr(np,nbpom)=ipp
+            l0=lqa(ipp)+1
+            if(l0.gt.npnmax)then
+             goto 2
+            endif
+            lqa(ipp)=l0
+            lnpr(np,nbpom)=l0
+            nbpi(l0,ipp)=nbpom
+            idnpi(l0,ipp)=1
+            nlpi(l0,ipp)=np
+            vvxpr(l0,ipp)=vvxpi(m)
+            xpompr(l0,ipp)=1.d0/xpompi(m)/scm
+            bpompr(l0,ipp)=bpompi(m)
+           enddo
+          endif
+          if(npomti.ne.0)then
+           if(debug.ge.2)write (moniou,222)i,npomti
+           do m=1,npomti
+            np=npomtg(nbpom)+1
+            if(np.gt.legmax)then
+             goto 2
+            endif
+            npomtg(nbpom)=np
+            itt=ipomti(m)
+            iwt(itt)=1
+            iltg(np,nbpom)=itt
+            l0=lqb(itt)+1
+            if(l0.gt.npnmax)then
+             goto 2
+            endif
+            lqb(itt)=l0
+            lntg(np,nbpom)=l0
+            nbti(l0,itt)=nbpom
+            idnti(l0,itt)=1
+            nlti(l0,itt)=np
+            vvxtg(l0,itt)=vvxti(m)
+            xpomtg(l0,itt)=xpomti(m)
+            bpomtg(l0,itt)=bpomti(m)
+           enddo
+          endif
+         endif
+        enddo                   !end of Pomeron loop
+3      continue                 !end of it-loop
+4     continue                  !end of ip-loop
+
+c-------------------------------------------------
+c   diffraction (hadron-hadron case)
+      if(ia(1).eq.1.and.ia(2).eq.1.and.iwp(1).eq.0.and.iwt(1).eq.0)then
+       wel=0.d0
+       winel=0.d0
+       do icdp=1,2
+       do icdt=1,2
+        vv=qgpomi(scm,b*b,0.d0,0.d0,0.d0,icdp,icdt,icz,1)   !total eikonal
+        wabs(icdp,icdt)=exp(-vv)
+        wel=wel+cc(icdp,icz)*cc(icdt,2)*wabs(icdp,icdt)
+        winel=winel+cc(icdp,icz)*cc(icdt,2)*wabs(icdp,icdt)**2
+       enddo
+       enddo
+       if(qgran(b10).le.wel**2/winel)then
+        if(debug.ge.1)write (moniou,231)
+        goto 1
+       endif
+
+       wdifp=cc(1,icz)*cc(2,icz)*(cc(1,2)**2*(wabs(1,1)-wabs(2,1))**2
+     * +cc(2,2)**2*(wabs(1,2)-wabs(2,2))**2+2.d0*cc(1,2)*cc(2,2)
+     * *(wabs(1,1)-wabs(2,1))*(wabs(1,2)-wabs(2,2)))
+       wdift=cc(1,2)*cc(2,2)*(cc(1,icz)**2*(wabs(1,1)-wabs(1,2))**2
+     * +cc(2,icz)**2*(wabs(2,1)-wabs(2,2))**2+2.d0*cc(1,icz)*cc(2,icz)
+     * *(wabs(1,1)-wabs(1,2))*(wabs(2,1)-wabs(2,2)))
+       wdifd=cc(1,icz)*cc(2,icz)*cc(1,2)*cc(2,2)
+     * *(wabs(1,1)+wabs(2,2)-wabs(1,2)-wabs(2,1))**2
+       aks=(wdifp+wdift+wdifd)*qgran(b10)
+       if(aks.lt.wdifp)then
+        nwp=nwp+1
+        iwp(1)=2
+        iprcn(1)=1
+        iwt(1)=-1
+       elseif(aks.lt.wdifp+wdift)then
+        nwt=nwt+1
+        iwt(1)=2
+        itgcn(1)=1
+        iwp(1)=-1
+       else
+        nwp=nwp+1
+        nwt=nwt+1
+        iwp(1)=2
+        iwt(1)=2
+        iprcn(1)=1
+        itgcn(1)=1
+       endif
+       goto 9
+      endif
+
+c-------------------------------------------------
+c   diffraction (hadron-nucleus & nucleus-nucleus)
+      do ip=1,ia(1)             !loop over all projectile nucleons
+       x=xa(ip,1)+b             !proj. x is shifted by b
+       y=xa(ip,2)
+       if(iwp(ip).ne.0)then
+        nwp=nwp+1               !one more wounded proj. nucleon
+        if(lqa(ip).eq.0.and.(wdp(1,ip).ne.0.d0.or.wdp(2,ip).ne.0.d0))
+     *  then
+         icdps=iddp(ip)
+         xpomr=1.d0/dsqrt(scm)
+         do it=1,ia(2)
+          if(iconab(ip,it).ne.0)then
+            bbp=(x-xb(it,1))**2+(y-xb(it,2))**2
+           xxp=.5d0*(x+xb(it,1))
+           yyp=.5d0*(y+xb(it,2))
+           icdt=iddt(it)
+           do icdp=1,2
+            iddp(ip)=icdp
+            call qgfdf(xxp,yyp,xpomr,vpac,vtac
+     *      ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,it)
+            vv=qgpomi(scm,bbp,vvx,vvxp,vvxt,icdp,icdt,icz,1)   !total eikonal
+            wdp(icdp,ip)=wdp(icdp,ip)*exp(-vv)
+           enddo
+          endif
+         enddo
+         iddp(ip)=icdps
+         wdifr=cc(1,icz)*cc(2,icz)*(wdp(1,ip)-wdp(2,ip))**2
+     *   /(cc(1,icz)*wdp(1,ip)**2+cc(2,icz)*wdp(2,ip)**2)
+         if(qgran(b10).lt.wdifr)iwp(ip)=3                     !LMD excitation
+        endif
+
+       elseif(icona(ip).ne.0)then
+        if(debug.ge.2)write (moniou,223)ip
+        vabs(1)=0.d0
+        vabs(2)=0.d0
+        icdps=iddp(ip)
+        do it=1,ia(2)
+          bbp=(x-xb(it,1))**2+(y-xb(it,2))**2
+         icdt=iddt(it)
+         do icdp=1,2
+          if(iconab(ip,it).eq.0)then
+           vabsi(icdp,it)=0.d0
+          else
+           iddp(ip)=icdp
+           xpomr=1.d0/dsqrt(scm)
+           xxp=.5d0*(x+xb(it,1))
+           yyp=.5d0*(y+xb(it,2))
+           call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *     ,ip,it)
+           vv=qgpomi(scm,bbp,vvx,vvxp,vvxt,icdp,icdt,icz,1)   !total eikonal
+           vabsi(icdp,it)=vv
+           vabs(icdp)=vabs(icdp)+vv
+          endif
+         enddo
+        enddo
+        iddp(ip)=icdps
+        wdifr=cc(1,icz)*cc(2,icz)*(exp(-vabs(1))-exp(-vabs(2)))**2
+     *  /(cc(1,icz)*exp(-2.d0*vabs(1))+cc(2,icz)*exp(-2.d0*vabs(2)))
+
+        if(qgran(b10).lt.wdifr)then       !projectile diffraction
+         wdift=0.d0
+         do it=1,ia(2)
+          if(iwt(it).ne.-1)then
+           wdifi(it)=cc(1,icz)*cc(2,icz)*(exp(-vabsi(1,it))
+     *     -exp(-vabsi(2,it)))**2/(cc(1,icz)*exp(-2.d0*vabsi(1,it))
+     *     +cc(2,icz)*exp(-2.d0*vabsi(2,it)))
+           wdift=wdift+wdifi(it)
+          else
+           wdifi(it)=0.d0
+          endif
+         enddo
+         if(wdift.ne.0.d0)then
+          nwp=nwp+1
+          iwp(ip)=2
+          aks=qgran(b10)*wdift
+          do it=1,ia(2)
+           aks=aks-wdifi(it)
+           if(aks.lt.0.d0)goto 5
+          enddo
+5          continue
+          iprcn(ip)=it
+          if(iwt(it).eq.0)iwt(it)=-1
+          if(debug.ge.2)write (moniou,224)ip,it
+         endif
+        endif
+       endif
+      enddo                            !end of ip-loop
+
+      do 8 it=1,ia(2)                     !check target diffraction
+       if(iwt(it).gt.0)then
+        nwt=nwt+1                         !one more wounded targ. nucleon
+        if(lqb(it).eq.0.and.(wdt(1,it).ne.0.d0.or.wdt(2,it).ne.0.d0))
+     *  then
+         icdts=iddt(it)
+         xpomr=1.d0/dsqrt(scm)
+         do ip=1,ia(1)
+          if(iconab(ip,it).ne.0)then
+           bbp=(xa(ip,1)+b-xb(it,1))**2+(xa(ip,2)-xb(it,2))**2
+           xxp=.5d0*(xa(ip,1)+b+xb(it,1))
+           yyp=.5d0*(xa(ip,2)+xb(it,2))
+           icdp=iddp(ip)
+           do icdt=1,2
+            iddt(it)=icdt
+            call qgfdf(xxp,yyp,xpomr,vpac,vtac
+     *      ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,it)
+            vv=qgpomi(scm,bbp,vvx,vvxp,vvxt,icdp,icdt,icz,1)   !total eikonal
+             wdt(icdt,it)=wdt(icdt,it)*exp(-vv)
+           enddo
+          endif
+         enddo
+         iddt(it)=icdts
+         wdifr=cc(1,2)*cc(2,2)*(wdt(1,it)-wdt(2,it))**2
+     *   /(cc(1,2)*wdt(1,it)**2+cc(2,2)*wdt(2,it)**2)
+         if(qgran(b10).lt.wdifr)iwt(it)=3
+        endif
+
+       elseif(iconb(it).ne.0)then
+        if(debug.ge.2)write (moniou,225)it
+        vabs(1)=0.d0
+        vabs(2)=0.d0
+        icdts=iddt(it)
+        do ip=1,ia(1)
+         bbp=(xa(ip,1)+b-xb(it,1))**2+(xa(ip,2)-xb(it,2))**2
+         icdp=iddp(ip)
+         do icdt=1,2
+          if(iconab(ip,it).eq.0)then
+           vabsi(icdt,ip)=0.d0
+          else
+           iddt(it)=icdt
+           xpomr=1.d0/dsqrt(scm)
+           xxp=.5d0*(xa(ip,1)+b+xb(it,1))
+           yyp=.5d0*(xa(ip,2)+xb(it,2))
+           call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *     ,ip,it)
+           vv=qgpomi(scm,bbp,vvx,vvxp,vvxt,icdp,icdt,icz,1)   !total eikonal
+           vabsi(icdt,ip)=vv
+           vabs(icdt)=vabs(icdt)+vv
+          endif
+         enddo
+        enddo
+        iddt(it)=icdts
+        wdifr=cc(1,2)*cc(2,2)*(exp(-vabs(1))-exp(-vabs(2)))**2
+     *  /(cc(1,2)*exp(-2.d0*vabs(1))+cc(2,2)*exp(-2.d0*vabs(2)))
+
+        if(qgran(b10).lt.wdifr)then       !target diffraction
+         wdift=0.d0
+         do ip=1,ia(1)
+          if(iwp(ip).eq.-1)then
+           wdifi(ip)=0.d0
+          else
+           if(iwp(ip).eq.2)then
+            itt=iprcn(ip)
+            if(itt.eq.it)goto 7
+            if(iwt(itt).eq.2)then
+             wdifi(ip)=0.d0
+             goto 6
+            endif
+           endif
+           wdifi(ip)=cc(1,2)*cc(2,2)*(exp(-vabsi(1,ip))
+     *     -exp(-vabsi(2,ip)))**2/(cc(1,2)*exp(-2.d0*vabsi(1,ip))
+     *     +cc(2,2)*exp(-2.d0*vabsi(2,ip)))
+          endif
+6          wdift=wdift+wdifi(ip)
+         enddo
+         if(wdift.eq.0.d0)goto 8
+         nwt=nwt+1
+         iwt(it)=2
+         aks=qgran(b10)*wdift
+         do ip=1,ia(1)
+          aks=aks-wdifi(ip)
+          if(aks.lt.0.d0)goto 7
+         enddo
+7         continue
+         itgcn(it)=ip
+         if(debug.ge.2)write (moniou,226)it,ip
+         if(iwp(ip).eq.0)then
+          iwp(ip)=-1
+         elseif(iwp(ip).eq.2)then
+          itt=iprcn(ip)
+          iprcn(ip)=it
+          if(itt.ne.it.and.iwt(itt).eq.-1)iwt(itt)=0
+         endif
+        endif
+       endif
+8     continue
+c check diffractive cross sections          !so060413-beg
+9     jdiff=0                             !non-diffractive
+      nqst=0
+      nint=0
+      if(nbpom.ne.0)then
+       do i=1,nbpom
+        nqst=nqst+nqs(i)
+        nint=nint+npomin(i)
+       enddo
+      endif
+      if((nwp.ne.0.or.nwt.ne.0).and.nqst.eq.0)then   !not elastic nor ND
+       lqat=0
+       do ip=1,ia(1)
+        lqat=lqat+lqa(ip)
+       enddo
+       lqbt=0
+       do it=1,ia(2)
+        lqbt=lqbt+lqb(it)
+       enddo
+       iwpt=0
+       do ip=1,ia(1)
+        if(iwp(ip).eq.1)then
+         iwpt=1
+         goto 10
+        elseif(iwp(ip).ge.2)then
+         iwpt=2
+        endif
+       enddo
+10     continue
+       iwtt=0
+       do it=1,ia(2)
+        if(iwt(it).eq.1)then
+         iwtt=1
+         goto 11
+        elseif(iwt(it).ge.2)then
+         iwtt=2
+        endif
+       enddo
+11     continue
+       if(lqat.eq.0.and.lqbt.eq.0)then
+        if(nbpom.eq.0.or.nint.eq.0)then
+         if(iwpt.eq.2.and.iwtt.ne.2)then
+          jdiff=6                         !SD(LM)-proj
+         elseif(iwpt.ne.2.and.iwtt.eq.2)then
+          jdiff=7                         !SD(LM)-targ
+         elseif(iwpt.eq.2.and.iwtt.eq.2)then
+          jdiff=8                         !DD(LM)
+         else
+          goto 14
+         endif
+        else
+         if(iwpt.ne.2.and.iwtt.ne.2)then
+          jdiff=9                         !CD(DPE)
+         else
+          jdiff=10                        !CD+LMD
+         endif
+        endif
+       elseif(lqat.gt.0.and.lqbt.eq.0.and.iwtt.ne.2)then
+        jdiff=1                          !SD(HM)-proj
+       elseif(lqat.eq.0.and.lqbt.gt.0.and.iwpt.ne.2)then
+        jdiff=2                          !SD(HM)-targ
+       elseif(lqat.gt.0.and.lqbt.eq.0.and.iwtt.eq.2)then
+        jdiff=3                          !DD(LHM)-proj
+       elseif(lqat.eq.0.and.lqbt.gt.0.and.iwpt.eq.2)then
+        jdiff=4                          !DD(LHM)-targ
+
+       elseif(lqat.gt.0.and.lqbt.gt.0)then
+        if(nbpom.eq.0)stop'problem with nbpom!!!'
+        xrapmax(1)=1.d0
+        xrapmin(1)=1.d0/scm
+        do ibpom=1,nbpom
+         if(npompr(ibpom).gt.0)then
+          do i=1,npompr(ibpom)
+           ip=ilpr(i,ibpom)
+           lpom=lnpr(i,ibpom)
+           xrapmax(1)=min(xrapmax(1),1.d0/xpompr(lpom,ip)/scm)
+          enddo
+         endif
+         if(npomtg(ibpom).gt.0)then
+          do i=1,npomtg(ibpom)
+           it=iltg(i,ibpom)
+           lpom=lntg(i,ibpom)
+           xrapmin(1)=max(xrapmin(1),xpomtg(lpom,it))
+          enddo
+         endif
+        enddo
+        if(xrapmin(1).gt..999d0*xrapmax(1))goto 14
+        nraps=1
+12      if(nraps.gt.90)stop'nraps>90'
+        do ibpom=1,nbpom
+         if(npomin(ibpom).gt.0)then
+          do i=1,npomin(ibpom)
+           if(nraps.eq.1)then
+            if(1.d0/scm/xpomin(i,ibpom).lt..999d0*xrapmax(1)
+     *      .and.xpopin(i,ibpom).gt.1.001d0*xrapmin(1))then !rap-gaps changed
+             if(1.d0/scm/xpomin(i,ibpom).lt.1.001d0*xrapmin(1)
+     *       .and.xpopin(i,ibpom).gt..999d0*xrapmax(1))then !no rap-gap (filled)
+               goto 14
+             elseif(xpopin(i,ibpom).gt..999d0*xrapmax(1))then
+              xrapmax(1)=1.d0/scm/xpomin(i,ibpom)
+             elseif(1.d0/scm/xpomin(i,ibpom).lt.1.001d0*xrapmin(1))then
+              xrapmin(1)=xpopin(i,ibpom)
+             else
+              xrapmin(2)=xrapmin(1)
+              xrapmin(1)=xpopin(i,ibpom)
+              xrapmax(2)=1.d0/scm/xpomin(i,ibpom)
+              nraps=2
+              goto 12
+             endif
+            endif
+           else
+            if(1.d0/scm/xpomin(i,ibpom).lt..999d0*xrapmax(1)
+     *      .and.xpopin(i,ibpom).gt.1.001d0*xrapmin(nraps))then !rap-gaps changed
+             if(1.d0/scm/xpomin(i,ibpom).lt.1.001d0*xrapmin(nraps)
+     *       .and.xpopin(i,ibpom).gt..999d0*xrapmax(1))then !no rap-gaps (filled)
+              goto 14
+             else
+              do irap=1,nraps
+               if(xpopin(i,ibpom).gt..999d0*xrapmax(irap).and.1.d0/scm
+     *         /xpomin(i,ibpom).lt.1.001d0*xrapmin(irap))then !gap filled
+                if(irap.lt.nraps)then
+                 do j=irap,nraps-1
+                  xrapmax(j)=xrapmax(j+1)
+                  xrapmin(j)=xrapmin(j+1)
+                 enddo
+                endif
+                nraps=nraps-1
+                goto 12
+               elseif(xpopin(i,ibpom).gt..999d0*xrapmax(irap))then
+                xrapmax(irap)=min(1.d0/scm/xpomin(i,ibpom)
+     *          ,xrapmax(irap))
+               elseif(1.d0/scm/xpomin(i,ibpom)
+     *         .lt.1.001d0*xrapmin(irap))then
+                xrapmin(irap)=max(xpopin(i,ibpom),xrapmin(irap))
+               elseif(1.d0/scm/xpomin(i,ibpom).gt.xrapmin(irap)
+     *         .and.xpopin(i,ibpom).lt.xrapmax(irap))then
+                xrapmin(irap)=max(xpopin(i,ibpom),xrapmin(irap))
+                if(irap.lt.nraps)then
+                 do j=1,nraps-irap
+                  xrapmax(nraps-j+2)=xrapmax(nraps-j+1)
+                  xrapmin(nraps-j+2)=xrapmin(nraps-j+1)
+                 enddo
+                endif
+                xrapmin(irap+1)=xrapmin(irap)
+                xrapmin(irap)=xpopin(i,ibpom)
+                xrapmax(irap+1)=1.d0/scm/xpomin(i,ibpom)
+                nraps=nraps+1
+                goto 12
+               endif
+              enddo                       !end of irap-loop
+             endif
+            endif
+           endif
+          enddo                           !end of npin-loop
+         endif
+        enddo                             !end of ibpom-loop
+        jdiff=5                          !DD(HM)
+       endif
+      endif                              !end of diffr. check
+14    bdiff=b
+
+ctp define collision type
+      typevt=0                      !no interaction
+      if(nwp.gt.0.or.nwt.gt.0)then         !so060413-end
+       if(jdiff.eq.0)then                                  !ND (no rap-gaps)
+        typevt=1
+       elseif(jdiff.eq.8.or.jdiff.eq.10.or.
+     *       (jdiff.gt.2.and.jdiff.lt.6))then !DD + (CD+LMD)
+        typevt=2
+       elseif(jdiff.eq.1.or.jdiff.eq.6)then                  !SD pro
+        typevt=4
+       elseif(jdiff.eq.2.or.jdiff.eq.7)then                  !SD tar
+        typevt=-4
+       elseif(jdiff.eq.9)then                                !CD
+        typevt=3
+       else
+        stop'problem with typevt!'
+       endif
+      endif
+
+
+c form projectile spectator part
+      if(debug.ge.1)write (moniou,227)
+      nspec=0
+      do ip=1,ia(1)
+       if(iwp(ip).eq.0)then
+        if(debug.ge.2)write (moniou,228)ip
+        nspec=nspec+1
+        do l=1,3
+         xas(nspec,l)=xa(ip,l)
+        enddo
+       endif
+      enddo
+
+      nspect=0
+      do it=1,ia(2)
+       if(iwt(it).eq.0)nspect=nspect+1
+      enddo
+
+c inelastic interaction: energy sharing and particle production
+      if(nwp.ne.0.or.nwt.ne.0)then
+       if(ia(1).eq.nspec.or.ia(2).eq.nspect)stop'ia(1)=nspec!!!'
+       if(debug.ge.1)write (moniou,229)
+
+       call qgsha(nbpom,ncola,ncolb,iret)
+       if(iret.ne.0)goto 1
+       if(nsp.le.nsp0+2)then
+        if(debug.ge.1)write (moniou,230)
+        goto 1
+       endif
+      else                                 !no interaction
+       if(debug.ge.1)write (moniou,231)
+       goto 1
+      endif
+      if(debug.ge.1)write (moniou,232)nsp
+
+c fragmentation of the projectile spectator part
+      if(debug.ge.1)write (moniou,233)
+      call qgfrgm(nspec,xas)
+      if(debug.ge.1)write (moniou,234)nsf
+      if(debug.ge.1)write (moniou,235)
+
+201   format(2x,'qgconf - configuration of the interaction')
+202   format(2x,'qgconf: impact parameter b=',e10.3,' fm')
+203   format(2x,'qgconf: nuclear configurations')
+204   format(2x,'qgconf: check connections')
+205   format(2x,'qgconf: ',i3,'-th proj. nucleon may interact with '
+     *,i3,'-th target nucleon')
+206   format(2x,'qgconf: ',i3,'-th projectile nucleon may interact')
+207   format(2x,'qgconf: ',i3,'-th target nucleon may interact')
+208   format(2x,'qgconf: ',i3,'-th rejection,'
+     *,' redo Pomeron configuration')
+209   format(2x,'qgconf: too many rejections,'
+     *,' redo nuclear configuartions')
+210   format(2x,'qgconf: Pomeron configuration')
+211   format(2x,'qgconf: check ',i3,'-th projectile nucleon')
+212   format(2x,'qgconf: interaction with ',i3,'-th target nucleon?')
+213   format(2x,'qgconf: eikonals - total: ',e10.3,2x,'single: ',e10.3)
+214   format(2x,'qgconf: ',i4,'-th Pomeron block connected to ',i3
+     *,'-th proj. nucleon and'/4x,i3,'-th targ. nucleon;'
+     *,' number of element. processes in the block: ',i3)
+215   format(2x,'qgconf: ',i3
+     *,'-th process in the block is single cut Pomeron')
+219   format(2x,'qgconf: configuration of multi-Pomeron vertexes')
+220   format(2x,'qgconf: ',i3,'-th process in the block contains '
+     *,i3,' interm. Pomerons')
+221   format(2x,'qgconf: ',i3,'-th process in the block contains '
+     *,i3,' proj. legs')
+222   format(2x,'qgconf: ',i3,'-th process in the block contains '
+     *,i3,' targ. legs')
+223   format(2x,'qgconf: check diffraction for ',i3,'-th proj. nucleon')
+224   format(2x,'qgconf: diffr. of ',i3,'-th proj. nucleon,'
+     *,' recoil of ',i3,'-th targ. nucleon')
+225   format(2x,'qgconf: check diffraction for ',i3,'-th targ. nucleon')
+226   format(2x,'qgconf: diffr. of ',i3,'-th targ. nucleon,'
+     *,' recoil of ',i3,'-th proj. nucleon')
+227   format(2x,'qgconf: projectile spectator part')
+228   format(2x,'qgconf: ',i3,'-th proj. nucleon stays idle')
+229   format(2x,'qgconf: inelastic interaction: energy sharing'
+     *,' and particle production')
+230   format(2x,'qgconf: no particle produced - rejection')
+231   format(2x,'qgconf: no interaction - rejection')
+232   format(2x,'qgconf: ',i5,' particles have been produced')
+233   format(2x,'qgconf: fragmentation of the proj. spectator part')
+234   format(2x,'qgconf: ',i3,' proj. fragments have been produced')
+235   format(2x,'qgconf - end')
+      return
+      end
+
+c=============================================================================
+      subroutine qg3pdf(vvxpi,vvxti,xpompi,xpomti,bpompi,bpomti
+     *,xpomip,xpomim,vvxim,bpomim,nppr,nptg,npin,ipompi,ipomti
+     *,wdp,wdt,ip,it,iret)
+c-----------------------------------------------------------------------
+c qg3pdf - configuration for multi-Pomeron/diffractive contributions
+c ip,it - indexes of proj. and targ. nucleons for current collision
+c to determine:
+c nppr - number of proj. leg Pomerons in the process,
+c nptg - number of targ. leg Pomerons in the process,
+c npin - number of interm. Pomerons (between 2 3P-vertexes) in the process,
+c xpomip(i) - LC momentum of the upper 3P-vertex for i-th interm. Pomeron
+c in the process,
+c xpomim(i) - LC momentum of the lower 3P-vertex for i-th interm. Pomeron
+c in the process,
+c ipompi(i) - proj. index for i-th proj. leg Pomeron in the process,
+c ipomti(i) - proj. index for i-th targ. leg Pomeron in the process,
+c bpompi(i) - squared impact param. for i-th proj. leg Pomeron in the process,
+c bpomti(i) - squared impact param. for i-th targ. leg Pomeron in the process,
+c vvxpi(i) - relative strenth of scr. corrections for i-th proj. leg Pomeron,
+c vvxti(i) - relative strenth of scr. corrections for i-th targ. leg Pomeron,
+c xpompi(i) - LC momentum of the 3P-vertex for i-th proj. leg Pomeron,
+c xpomti(i) - LC momentum of the 3P-vertex for i-th targ. leg Pomeron
+c iret=1 - reject configuration
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208,npbmax=1000,npnmax=900,npmax=900
+     *,levmax=20,legmax=900)
+      dimension vpac(iapmax),vtac(iapmax)
+     *,vpac0(iapmax),vtac0(iapmax),vpact(iapmax),vtact(iapmax)
+     *,xpomip(npmax),xpomim(npmax),vvxim(npmax),bpomim(npmax)
+     *,xpompi(legmax),xpomti(legmax)
+     *,vvxpi(legmax),vvxti(legmax),bpompi(legmax),bpomti(legmax)
+     *,ipompi(legmax),ipomti(legmax),ippr0(legmax),iptg0(legmax)
+     *,nppm(levmax),ippm(legmax,levmax),ii(levmax),xpomm(levmax)
+     *,wgpm(levmax),xxm(levmax),yym(levmax)
+     *,itypr0(legmax),itytg0(legmax),itypm(legmax,levmax),vv(12)
+     *,wdp(2,iapmax),wdt(2,iapmax)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr6/  pi,bm,amws
+      common /qgarr7/  xa(iapmax,3),xb(iapmax,3),b
+      common /qgarr9/  iwp(iapmax),iwt(iapmax),lqa(iapmax),lqb(iapmax)
+     *,iprcn(iapmax),itgcn(iapmax),ias(npbmax),ibs(npbmax),nqs(npbmax)
+     *,npompr(npbmax),npomtg(npbmax),npomin(npbmax),nnpr(npmax,npbmax)
+     *,nntg(npmax,npbmax),ilpr(legmax,npbmax),iltg(legmax,npbmax)
+     *,lnpr(legmax,npbmax),lntg(legmax,npbmax)
+     *,nbpi(npnmax,iapmax),nbti(npnmax,iapmax),idnpi(npnmax,iapmax)
+     *,idnti(npnmax,iapmax),nppi(npnmax,iapmax),npti(npnmax,iapmax)
+     *,nlpi(npnmax,iapmax),nlti(npnmax,iapmax)
+      common /qgarr11/ b10
+      common /qgarr12/ nsp
+      common /qgarr13/ nsf,iaf(iapmax)
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr23/ bbpom(npbmax),vvxpom(npbmax)
+     *,bpompr(npnmax,iapmax),bpomtg(npnmax,iapmax)
+     *,vvxpr(npnmax,iapmax),vvxtg(npnmax,iapmax)
+     *,xpompr(npnmax,iapmax),xpomtg(npnmax,iapmax)
+     *,xpopin(npmax,npbmax),xpomin(npmax,npbmax),vvxin(npmax,npbmax)
+     *,bpomin(npmax,npbmax)
+      common /qgarr43/ moniou
+      common /qgarr46/ iconab(iapmax,iapmax),icona(iapmax)
+     *,iconb(iapmax)
+      common /qgdebug/  debug
+      external qgran
+
+      if(debug.ge.2)write (moniou,201)ip,it
+
+      if(scm.le.sgap**2)stop'qg3pdf: scm<sgap**2!'
+      iret=0
+      vpacng=0.d0
+      vtacng=0.d0
+      vpacpe=0.d0
+      vtacpe=0.d0
+      vimp=0.d0
+      viuc=0.d0
+      viuu=0.d0
+      vip=0.d0
+      vicc=0.d0
+      vicu=0.d0
+c normalization of rejection function
+      xpomr=1.d0/dsqrt(scm)
+      bpt=dsqrt((xa(ip,1)+b-xb(it,1))**2+(xa(ip,2)-xb(it,2))**2)
+      rp1=(rq(iddp(ip),icz)-alfp*dlog(xpomr))*4.d0*.0389d0
+      rp2=(rq(iddt(it),2)+alfp*dlog(xpomr*scm))*4.d0*.0389d0
+      rp0=rp1*rp2/(rp1+rp2)
+      bbpr=(bpt*rp1/(rp1+rp2))**2
+      bbtg=(bpt*rp2/(rp1+rp2))**2
+      call qgbdef(bbpr,bbtg,xa(ip,1)+b,xa(ip,2),xb(it,1),xb(it,2)
+     *,xxp,yyp,1)
+
+      rpmax=max(rq(iddp(ip),icz),rq(iddt(it),2))*4.d0*.0389d0
+      rpmin=min(rq(iddp(ip),icz),rq(iddt(it),2))*4.d0*.0389d0
+      if(rpmax.eq.rpmin)then
+       rpmax=rpmax+alfp*dlog(scm)*2.d0*.0389d0
+       rpmin=rpmin+alfp*dlog(scm)*2.d0*.0389d0
+      else
+       rpmin=rpmin+alfp*dlog(scm/sgap)*4.d0*.0389d0
+      endif
+      rp0=rpmax*rpmin/(rpmax+rpmin)
+
+      call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *,ip,it)
+      vvxts=1.d0-(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+      vpl=qglegi(1.d0/xpomr,bbpr,iddp(ip),icz,2)
+      vplc=min(vpl
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,7))
+      vplc0=min(vplc
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,8))
+      vplcpe=min(vplc0
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,10))
+      vplcp=min(vplcpe
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,9))
+
+      vvxps=1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+      vtl=qglegi(xpomr*scm,bbtg,iddt(it),2,2)
+      vtlc=min(vtl
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,7))
+      vtlc0=min(vtlc
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,8))
+      vtlcpe=min(vtlc0
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,10))
+      vtlcp=min(vtlcpe
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,9))
+
+      sumcp0=0.d0
+      sumup=0.d0
+      do i=1,ia(1)
+       sumup=sumup+vpac(i)
+      enddo
+      vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+      do i=1,ia(1)-ip+1
+       ipp=ia(1)-i+1
+       bbp=(xa(ipp,1)+b-xxp)**2+(xa(ipp,2)-yyp)**2
+       sumup=sumup-vpac(ipp)
+       vpac0(ipp)=min(vpac(ipp)
+     * ,qgfani(1.d0/xpomr,bbp,1.d0-vvxs*exp(-sumup)
+     * ,1.d0-exp(-sumcp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+       if(ipp.gt.ip)sumcp0=sumcp0+vpac0(ipp)
+      enddo
+      sumct0=0.d0
+      sumut=0.d0
+      do i=1,ia(2)
+       sumut=sumut+vtac(i)
+      enddo
+      vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+      do i=1,ia(2)-it+1
+       itt=ia(2)-i+1
+       bbt=(xb(itt,1)-xxp)**2+(xb(itt,2)-yyp)**2
+       sumut=sumut-vtac(itt)
+       vtac0(itt)=min(vtac(itt)
+     * ,qgfani(xpomr*scm,bbt,1.d0-vvxs*exp(-sumut)
+     * ,1.d0-exp(-sumct0),1.d0-exp(-sumut),iddt(itt),2,3))
+       if(itt.gt.it)sumct0=sumct0+vtac0(itt)
+      enddo
+      vvxp0=1.d0-exp(-sumcp0)
+      vvxt0=1.d0-exp(-sumct0)
+
+c weights for vertex contributions:
+c vv(1): >1 proj. legs and >1 targ. legs
+      vv(1)=(max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **(max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvx)**2
+     *-2.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))
+     **(1.d0-vvxp0)+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))*exp(-vpac(ip))
+     **(max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvx)*(1.d0-vvxtl)
+     *-2.d0*(max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))*exp(-vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxpl)
+c vv(2): 0 proj. legs and 0 targ. legs
+      vv(2)=((1.d0-exp(-vpac(ip)))**2*(1.d0-vvxpl)
+     *+2.d0*(1.d0-exp(-vpac(ip)))*vvxpl)
+     **((1.d0-exp(-vtac(it)))**2*(1.d0-vvxtl)
+     *+2.d0*(1.d0-exp(-vtac(it)))*vvxtl)*(1.d0-vvx)
+c vv(3): 0 proj. legs and >1 targ. legs
+      vv(3)=((1.d0-exp(-vpac(ip)))**2*(1.d0-vvxpl)
+     *+2.d0*(1.d0-exp(-vpac(ip)))*vvxpl)*(1.d0-vvx)
+     **((max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvxtl)
+     *-2.d0*(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0
+     *-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))*exp(-vtac(it)))
+c vv(4): >1 proj. legs and 0 targ. legs
+      vv(4)=((max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **(1.d0-vvxpl)
+     *-2.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))
+     **(1.d0-vvxp0)+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))*exp(-vpac(ip)))
+     **((1.d0-exp(-vtac(it)))**2*(1.d0-vvxtl)
+     *+2.d0*(1.d0-exp(-vtac(it)))*vvxtl)*(1.d0-vvx)
+c vv(5): 0 proj. legs and >1 targ. (handle) legs
+      vv(5)=4.d0*(1.d0-exp(-vpac(ip)))*(1.d0-vvx)
+     **(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))*exp(-vtac(it))
+      if(xpomr*scm.lt.1.1d0*sgap**2)vv(5)=0.d0
+c vv(6): >1 proj. (handle) legs and 0 targ. legs
+      vv(6)=4.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))*(1.d0-vvxp0)
+     *+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))*exp(-vpac(ip))
+     **(1.d0-exp(-vtac(it)))*(1.d0-vvx)
+      if(xpomr*sgap**2.gt..9d0)vv(6)=0.d0
+c vv(7): >1 proj. legs and 1 targ. leg
+      vv(7)=(max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **((vtac0(it)+vtlc0)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *-(vtac(it)+vtlc-vtac0(it)-vtlc0)
+     **(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxpl)*(1.d0-vvxt)
+     *-2.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))
+     **(1.d0-vvxp0)+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))
+     **(vtac(it)+vtlc)*exp(-vpac(ip)-2.d0*vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+c vv(8): 1 proj. leg and >1 targ. legs
+      vv(8)=((vpac0(ip)+vplc0)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *-(vpac(ip)+vplc-vpac0(ip)-vplc0)
+     **(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ip))
+     **(max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxtl)
+     *-2.d0*(vpac(ip)+vplc)*exp(-2.d0*vpac(ip)-vtac(it))
+     **(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))
+     **(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)
+c vv(9): 0 proj. legs and 1 targ. leg
+      vv(9)=((1.d0-exp(-vpac(ip)))**2*(1.d0-vvxpl)
+     *+2.d0*(1.d0-exp(-vpac(ip)))*vvxpl)*(1.d0-vvx)*(1.d0-vvxt)
+     **((vtac0(it)+vtlc0)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *-(vtac(it)+vtlc-vtac0(it)-vtlc0)
+     **(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(it))
+c vv(10): 1 proj. leg and 0 targ. legs
+      vv(10)=((vpac0(ip)+vplc0)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *-(vpac(ip)+vplc-vpac0(ip)-vplc0)
+     **(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ip))
+     **((1.d0-exp(-vtac(it)))**2*(1.d0-vvxtl)
+     *+2.d0*(1.d0-exp(-vtac(it)))*vvxtl)*(1.d0-vvx)*(1.d0-vvxp)
+c vv(11): 1 cut proj. leg and 1 targ. leg
+      vv(11)=2.d0*vplcp*((vtlc0-vtlcpe)
+     **exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *-(vtlc-vtlc0)*(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))
+     **exp(-2.d0*vpac(ip)-vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)*(1.d0-vvxt)
+      if(xpomr*scm.lt.1.1d0*sgap**2)vv(11)=0.d0
+c vv(12): 1 proj. leg and 1 cut targ. leg
+      vv(12)=2.d0*vtlcp*((vplc0-vplcpe)
+     **exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *-(vplc-vplc0)*(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))
+     **exp(-2.d0*vtac(it)-vpac(ip))
+     **(1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+      if(xpomr*sgap**2.gt..9d0)vv(12)=0.d0
+
+      gb0=0.d0
+      do i=1,12
+       gb0=gb0+max(0.d0,vv(i))/4.d0
+      enddo
+
+      if(gb0.le.0.d0)then      !so170712
+       if(debug.ge.3)write (moniou,202)
+       iret=1
+       goto 31
+      endif
+      if(debug.ge.3)write (moniou,203)gb0
+
+1     continue
+      xpomr=(scm/sgap**2)**(-qgran(b10))/sgap   !proposed LC momentum for 3P-vertex
+      rp1=(rq(iddp(ip),icz)-alfp*dlog(xpomr))*4.d0*.0389d0
+      rp2=(rq(iddt(it),2)+alfp*dlog(xpomr*scm))*4.d0*.0389d0
+      rp=rp1*rp2/(rp1+rp2)
+      z=qgran(b10)
+      phi=pi*qgran(b10)
+      b0=dsqrt(-rp*dlog(z))
+      bbpr=(bpt*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+      bbtg=(bpt*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+      call qgbdef(bbpr,bbtg,xa(ip,1)+b,xa(ip,2),xb(it,1),xb(it,2)
+     *,xxp,yyp,int(1.5d0+qgran(b10)))   !determine coordinates for the vertex
+
+      call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *,ip,it)
+      vvxts=1.d0-(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+      vpl=qglegi(1.d0/xpomr,bbpr,iddp(ip),icz,2)
+      vplc=min(vpl
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,7))
+      vplc0=min(vplc
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,8))
+      vplcpe=min(vplc0
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,10))
+      vplcp=min(vplcpe
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,9))
+
+      vvxps=1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+      vtl=qglegi(xpomr*scm,bbtg,iddt(it),2,2)
+      vtlc=min(vtl
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,7))
+      vtlc0=min(vtlc
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,8))
+      vtlcpe=min(vtlc0
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,10))
+      vtlcp=min(vtlcpe
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,9))
+
+      sumcp0=0.d0
+      sumup=0.d0
+      do i=1,ia(1)
+       sumup=sumup+vpac(i)
+      enddo
+      vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+      do i=1,ia(1)-ip+1
+       ipp=ia(1)-i+1
+       bbp=(xa(ipp,1)+b-xxp)**2+(xa(ipp,2)-yyp)**2
+       sumup=sumup-vpac(ipp)
+       vpac0(ipp)=min(vpac(ipp)
+     * ,qgfani(1.d0/xpomr,bbp,1.d0-vvxs*exp(-sumup)
+     * ,1.d0-exp(-sumcp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+       if(ipp.gt.ip)sumcp0=sumcp0+vpac0(ipp)
+      enddo
+      sumct0=0.d0
+      sumut=0.d0
+      do i=1,ia(2)
+       sumut=sumut+vtac(i)
+      enddo
+      vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+      do i=1,ia(2)-it+1
+       itt=ia(2)-i+1
+       bbt=(xb(itt,1)-xxp)**2+(xb(itt,2)-yyp)**2
+       sumut=sumut-vtac(itt)
+       vtac0(itt)=min(vtac(itt)
+     * ,qgfani(xpomr*scm,bbt,1.d0-vvxs*exp(-sumut)
+     * ,1.d0-exp(-sumct0),1.d0-exp(-sumut),iddt(itt),2,3))
+       if(itt.gt.it)sumct0=sumct0+vtac0(itt)
+      enddo
+      vvxp0=1.d0-exp(-sumcp0)
+      vvxt0=1.d0-exp(-sumct0)
+
+c weights for vertex contributions:
+c vv(1): >1 proj. legs and >1 targ. legs
+      vv(1)=(max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **(max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvx)**2
+     *-2.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))
+     **(1.d0-vvxp0)+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))*exp(-vpac(ip))
+     **(max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvx)*(1.d0-vvxtl)
+     *-2.d0*(max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))*exp(-vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxpl)
+c vv(2): 0 proj. legs and 0 targ. legs
+      vv(2)=((1.d0-exp(-vpac(ip)))**2*(1.d0-vvxpl)
+     *+2.d0*(1.d0-exp(-vpac(ip)))*vvxpl)
+     **((1.d0-exp(-vtac(it)))**2*(1.d0-vvxtl)
+     *+2.d0*(1.d0-exp(-vtac(it)))*vvxtl)*(1.d0-vvx)
+c vv(3): 0 proj. legs and >1 targ. legs
+      vv(3)=((1.d0-exp(-vpac(ip)))**2*(1.d0-vvxpl)
+     *+2.d0*(1.d0-exp(-vpac(ip)))*vvxpl)*(1.d0-vvx)
+     **((max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvxtl)
+     *-2.d0*(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0
+     *-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))*exp(-vtac(it)))
+c vv(4): >1 proj. legs and 0 targ. legs
+      vv(4)=((max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **(1.d0-vvxpl)
+     *-2.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))
+     **(1.d0-vvxp0)+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))*exp(-vpac(ip)))
+     **((1.d0-exp(-vtac(it)))**2*(1.d0-vvxtl)
+     *+2.d0*(1.d0-exp(-vtac(it)))*vvxtl)*(1.d0-vvx)
+c vv(5): 0 proj. legs and >1 targ. (handle) legs
+      vv(5)=4.d0*(1.d0-exp(-vpac(ip)))*(1.d0-vvx)
+     **(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))*exp(-vtac(it))
+      if(xpomr*scm.le.sgap**2)vv(5)=0.d0
+c vv(6): >1 proj. (handle) legs and 0 targ. legs
+      vv(6)=4.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))*(1.d0-vvxp0)
+     *+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))*exp(-vpac(ip))
+     **(1.d0-exp(-vtac(it)))*(1.d0-vvx)
+      if(xpomr*sgap**2.ge.1.d0)vv(6)=0.d0
+c vv(7): >1 proj. legs and 1 targ. leg
+      vv(7)=(max(0.d0,1.d0-exp(-2.d0*vpac(ip))*(1.d0+2.d0*vpac(ip)))
+     *+2.d0*vpac(ip)*exp(-2.d0*vpac(ip))*(1.d0-(1.d0-vvxp)**2))
+     **((vtac0(it)+vtlc0)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *-(vtac(it)+vtlc-vtac0(it)-vtlc0)
+     **(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxpl)*(1.d0-vvxt)
+     *-2.d0*(max(0.d0,exp(vpac(ip)-vpac0(ip))-1.d0
+     *-(vpac(ip)-vpac0(ip)))
+     **(1.d0-vvxp0)+(vpac(ip)-vpac0(ip))*(vvxp-vvxp0))
+     **(vtac(it)+vtlc)*exp(-vpac(ip)-2.d0*vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+c vv(8): 1 proj. leg and >1 targ. legs
+      vv(8)=((vpac0(ip)+vplc0)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *-(vpac(ip)+vplc-vpac0(ip)-vplc0)
+     **(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ip))
+     **(max(0.d0,1.d0-exp(-2.d0*vtac(it))*(1.d0+2.d0*vtac(it)))
+     *+2.d0*vtac(it)*exp(-2.d0*vtac(it))*(1.d0-(1.d0-vvxt)**2))
+     **(1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxtl)
+     *-2.d0*(vpac(ip)+vplc)*exp(-2.d0*vpac(ip)-vtac(it))
+     **(max(0.d0,exp(vtac(it)-vtac0(it))-1.d0-(vtac(it)-vtac0(it)))
+     **(1.d0-vvxt0)+(vtac(it)-vtac0(it))*(vvxt-vvxt0))
+     **(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)
+c vv(9): 0 proj. legs and 1 targ. leg
+      vv(9)=((1.d0-exp(-vpac(ip)))**2*(1.d0-vvxpl)
+     *+2.d0*(1.d0-exp(-vpac(ip)))*vvxpl)*(1.d0-vvx)*(1.d0-vvxt)
+     **((vtac0(it)+vtlc0)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *-(vtac(it)+vtlc-vtac0(it)-vtlc0)
+     **(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(it))
+c vv(10): 1 proj. leg and 0 targ. legs
+      vv(10)=((vpac0(ip)+vplc0)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *-(vpac(ip)+vplc-vpac0(ip)-vplc0)
+     **(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ip))
+     **((1.d0-exp(-vtac(it)))**2*(1.d0-vvxtl)
+     *+2.d0*(1.d0-exp(-vtac(it)))*vvxtl)*(1.d0-vvx)*(1.d0-vvxp)
+c vv(11): 1 cut proj. leg and 1 targ. leg
+      vv(11)=2.d0*vplcp*((vtlc0-vtlcpe)
+     **exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *-(vtlc-vtlc0)*(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))
+     **exp(-2.d0*vpac(ip)-vtac(it))
+     **(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)*(1.d0-vvxt)
+      if(xpomr*scm.lt.1.1d0*sgap**2)vv(11)=0.d0
+c vv(12): 1 proj. leg and 1 cut targ. leg
+      vv(12)=2.d0*vtlcp*((vplc0-vplcpe)
+     **exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *-(vplc-vplc0)*(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))
+     **exp(-2.d0*vtac(it)-vpac(ip))
+     **(1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+      if(xpomr*sgap**2.gt..9d0)vv(12)=0.d0
+
+      gb=0.d0
+      do i=1,12
+       vv(i)=max(0.d0,vv(i))
+       gb=gb+vv(i)/4.d0
+      enddo
+      gb=gb/gb0/z*rp/rp0  /max(2.d0,dlog10(scm)-1.d0)  /2.
+      if(debug.ge.5)write (moniou,204)xpomr,bbpr,bbtg,gb
+
+      if(qgran(b10).gt.gb)goto 1
+      if(debug.ge.3)write (moniou,205)xpomr,bbpr,bbtg,xxp,yyp
+
+      vplcng=min(vplc0
+     *,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp,vvxpl,iddp(ip),icz,11))
+      vtlcng=min(vtlc0
+     *,qgfani(xpomr*scm,bbtg,vvxps,vvxt,vvxtl,iddt(it),2,11))
+
+      sumcpt=0.d0
+      sumcp0=0.d0
+      sumup=0.d0
+      vvxp0l=0.d0
+      do i=1,ia(1)
+       sumup=sumup+vpac(i)
+      enddo
+      vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+      do i=1,ia(1)
+       ipp=ia(1)-i+1
+       bbp=(xa(ipp,1)+b-xxp)**2+(xa(ipp,2)-yyp)**2
+       sumup=sumup-vpac(ipp)
+       if(ipp.ge.ip)vpact(ipp)=max(vpac(ipp)
+     * ,qgfani(1.d0/xpomr,bbp,1.d0-vvxs*exp(-sumup)
+     * ,1.d0-exp(-sumcpt),1.d0-exp(-sumup),iddp(ipp),icz,6))
+       vpac0(ipp)=min(vpac(ipp)
+     * ,qgfani(1.d0/xpomr,bbp,1.d0-vvxs*exp(-sumup)
+     * ,1.d0-exp(-sumcp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+       if(ipp.gt.ip)then
+        sumcpt=sumcpt+vpact(ipp)
+       elseif(ipp.lt.ip)then
+        vvxp0l=vvxp0l+vpac0(ipp)
+       endif
+       sumcp0=sumcp0+vpac0(ipp)
+      enddo
+      sumctt=0.d0
+      sumct0=0.d0
+      sumut=0.d0
+      vvxt0l=0.d0
+      do i=1,ia(2)
+       sumut=sumut+vtac(i)
+      enddo
+      vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+      do i=1,ia(2)
+       itt=ia(2)-i+1
+       bbt=(xb(itt,1)-xxp)**2+(xb(itt,2)-yyp)**2
+       sumut=sumut-vtac(itt)
+       if(itt.ge.it)vtact(itt)=max(vtac(itt)
+     * ,qgfani(xpomr*scm,bbt,1.d0-vvxs*exp(-sumut)
+     * ,1.d0-exp(-sumctt),1.d0-exp(-sumut),iddt(itt),2,6))
+       vtac0(itt)=min(vtac(itt)
+     * ,qgfani(xpomr*scm,bbt,1.d0-vvxs*exp(-sumut)
+     * ,1.d0-exp(-sumct0),1.d0-exp(-sumut),iddt(itt),2,3))
+       if(itt.gt.it)then
+        sumctt=sumctt+vtact(itt)
+       elseif(itt.lt.it)then
+        vvxt0l=vvxt0l+vtac0(itt)
+       endif
+       sumct0=sumct0+vtac0(itt)
+      enddo
+      vvxpt=1.d0-exp(-sumcpt)
+      vvxtt=1.d0-exp(-sumctt)
+      vvxp0l=1.d0-exp(-vvxp0l)
+      vvxt0l=1.d0-exp(-vvxt0l)
+
+      vvt=0.d0
+      do i=1,12
+       vvt=vvt+vv(i)
+      enddo
+      if(.not.(vvt.gt.0.d0))stop'vvt<0'
+
+      aks=qgran(b10)*vvt
+      do jt=1,12
+       aks=aks-vv(jt)
+       if(aks.lt.0.d0)goto 2
+      enddo
+      stop'jt>12!'
+
+2     continue
+      if(xpomr*scm.gt.sgap**2)then
+       wzgp=-2.d0*(1.d0-exp(-2.d0*vpac(ip)))*(1.d0-vvxpl)**2
+     * *(max(0.d0,1.d0-exp(-vtact(it))*(1.d0+vtact(it)))*(1.d0-vvxtt)
+     * -max(0.d0,1.d0-exp(-vtac0(it))*(1.d0+vtac0(it)))*(1.d0-vvxt0)
+     * +vtact(it)*exp(-vtact(it))*(1.d0-vvxtt
+     * -exp(vtact(it)-vtac(it))*(1.d0-vvxtl)*(1.d0-vvxt))
+     * -vtac0(it)*exp(-vtac0(it))*(1.d0-vvxt0
+     * -exp(vtac0(it)-vtac(it))*(1.d0-vvxtl)*(1.d0-vvxt)))
+      else
+       wzgp=0.d0
+      endif
+      if(xpomr*sgap**2.lt.1.d0)then
+       wzgt=-2.d0*(1.d0-exp(-2.d0*vtac(it)))*(1.d0-vvxtl)**2
+     * *(max(0.d0,1.d0-exp(-vpact(ip))*(1.d0+vpact(ip)))*(1.d0-vvxpt)
+     * -max(0.d0,1.d0-exp(-vpac0(ip))*(1.d0+vpac0(ip)))*(1.d0-vvxp0)
+     * +vpact(ip)*exp(-vpact(ip))*(1.d0-vvxpt
+     * -exp(vpact(ip)-vpac(ip))*(1.d0-vvxpl)*(1.d0-vvxp))
+     * -vpac0(ip)*exp(-vpac0(ip))*(1.d0-vvxp0
+     * -exp(vpac0(ip)-vpac(ip))*(1.d0-vvxpl)*(1.d0-vvxp)))
+      else
+       wzgt=0.d0
+      endif
+
+      nppr0=0
+      nptg0=0
+      npprh0=0
+      nptgh0=0
+      wgpr0=0.d0
+      wgtg0=0.d0
+      if(jt.eq.1.or.jt.eq.4.or.jt.eq.7)then
+       ntry=0
+3      ntry=ntry+1
+       npprh0=0
+       if(ip.eq.ia(1).or.ntry.gt.100)then
+        nppr0=npgen(2.d0*vpac(ip),2,20)
+        do i=1,nppr0
+         if(qgran(b10).le.vpac0(ip)/vpac(ip).or.xpomr*sgap**2.ge.1.d0)
+     *   then
+          itypr0(i)=0
+         else
+          npprh0=npprh0+1
+          itypr0(i)=1
+         endif
+         ippr0(i)=ip
+        enddo
+        wh=(vpac(ip)/vpac0(ip)-1.d0)/nppr0
+       else
+        nppr0=npgen(2.d0*vpac(ip),1,20)
+        do i=1,nppr0
+         if(qgran(b10).le.vpac0(ip)/vpac(ip).or.xpomr*sgap**2.ge.1.d0)
+     *   then
+          itypr0(i)=0
+         else
+          npprh0=npprh0+1
+          itypr0(i)=1
+         endif
+         ippr0(i)=ip
+        enddo
+        wh=(vpac(ip)/vpac0(ip)-1.d0)/nppr0
+        do ipp=ip+1,ia(1)
+         ninc=npgen(2.d0*vpac(ipp),0,20)
+         if(ninc.ne.0)then
+          nppr0=nppr0+ninc
+          nh0=npprh0
+          if(nppr0.gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nppr0-ninc+1,nppr0
+           if(qgran(b10).le.vpac0(ipp)/vpac(ipp)
+     *     .or.xpomr*sgap**2.ge.1.d0)then
+            itypr0(i)=0
+           else
+            npprh0=npprh0+1
+            itypr0(i)=1
+           endif
+           ippr0(i)=ipp
+          enddo
+          if(ninc.gt.npprh0-nh0)wh=(vpac(ipp)/vpac0(ipp)-1.d0)/ninc
+         endif
+        enddo
+        if(nppr0.eq.1)goto 3
+       endif
+       if(nppr0.le.npprh0+1)then
+        if(jt.ne.7)then
+         wh0=1.d0-exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     *   /(1.d0-vvxp)/(1.d0-vvxpl)
+        else
+         wh0=1.d0-exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     *   /(1.d0-vvxp)/(1.d0-vvxpl)
+     *   *(vtac(it)+vtlc)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *   /((vtac0(it)+vtlc0)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     *   -(vtac(it)+vtlc-vtac0(it)-vtlc0)
+     *   *(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))
+        endif
+        if(nppr0.eq.npprh0.and.wh0.lt.0.d0
+     *  .or.nppr0.eq.npprh0+1.and.qgran(b10).gt.1.d0+wh*wh0)goto 3
+       endif
+      endif
+
+      if(jt.eq.1.or.jt.eq.3.or.jt.eq.8)then
+       ntry=0
+4      ntry=ntry+1
+       nptgh0=0
+       if(it.eq.ia(2).or.ntry.gt.100)then
+        nptg0=npgen(2.d0*vtac(it),2,20)
+        do i=1,nptg0
+         if(qgran(b10).le.vtac0(it)/vtac(it).or.xpomr*scm.le.sgap**2)
+     *   then
+          itytg0(i)=0
+         else
+          nptgh0=nptgh0+1
+          itytg0(i)=1
+         endif
+         iptg0(i)=it
+        enddo
+        wh=(vtac(it)/vtac0(it)-1.d0)/nptg0
+       else
+        nptg0=npgen(2.d0*vtac(it),1,20)
+        do i=1,nptg0
+         if(qgran(b10).le.vtac0(it)/vtac(it).or.xpomr*scm.le.sgap**2)
+     *   then
+          itytg0(i)=0
+         else
+          nptgh0=nptgh0+1
+          itytg0(i)=1
+         endif
+         iptg0(i)=it
+        enddo
+        wh=(vtac(it)/vtac0(it)-1.d0)/nptg0
+        do itt=it+1,ia(2)
+         ninc=npgen(2.d0*vtac(itt),0,20)
+         if(ninc.ne.0)then
+          nptg0=nptg0+ninc
+          nh0=nptgh0
+          if(nptg0.gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nptg0-ninc+1,nptg0
+           if(qgran(b10).le.vtac0(itt)/vtac(itt)
+     *     .or.xpomr*scm.le.sgap**2) then
+            itytg0(i)=0
+           else
+            nptgh0=nptgh0+1
+            itytg0(i)=1
+           endif
+           iptg0(i)=itt
+          enddo
+          if(ninc.gt.nptgh0-nh0)wh=(vtac(itt)/vtac0(itt)-1.d0)/ninc
+         endif
+        enddo
+        if(nptg0.eq.1)goto 4
+       endif
+       if(nptg0.le.nptgh0+1)then
+        if(jt.ne.8)then
+         wh0=1.d0-exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))
+     *   /(1.d0-vvxt)/(1.d0-vvxtl)
+        else
+         wh0=1.d0-exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))
+     *   /(1.d0-vvxt)/(1.d0-vvxtl)
+     *   *(vpac(ip)+vplc)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *   /((vpac0(ip)+vplc0)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     *   -(vpac(ip)+vplc-vpac0(ip)-vplc0)
+     *   *(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))
+        endif
+        if(nptg0.eq.nptgh0.and.wh0.lt.0.d0
+     *  .or.nptg0.eq.nptgh0+1.and.qgran(b10).gt.1.d0+wh*wh0)goto 4
+       endif
+      endif
+
+      if(jt.eq.6)then
+       ntry=0
+5      ntry=ntry+1
+       if(ip.eq.ia(1).or.ntry.gt.100)then
+        nppr0=npgen(vpac(ip)-vpac0(ip),2,20)
+        do i=1,nppr0
+         itypr0(i)=1
+         ippr0(i)=ip
+        enddo
+       else
+        nppr0=npgen(vpac(ip)-vpac0(ip),1,20)
+        do i=1,nppr0
+         itypr0(i)=1
+         ippr0(i)=ip
+        enddo
+        do ipp=ip+1,ia(1)
+         ninc=npgen(vpac(ipp)-vpac0(ipp),0,20)
+         if(ninc.ne.0)then
+          nppr0=nppr0+ninc
+          if(nppr0.gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nppr0-ninc+1,nppr0
+           itypr0(i)=1
+           ippr0(i)=ipp
+          enddo
+         endif
+        enddo
+        if(nppr0.eq.1)goto 5
+       endif
+      endif
+
+      if(jt.eq.5)then
+       ntry=0
+6      ntry=ntry+1
+       if(it.eq.ia(2).or.ntry.gt.100)then
+        nptg0=npgen(vtac(it)-vtac0(it),2,20)
+        do i=1,nptg0
+         itytg0(i)=1
+         iptg0(i)=it
+        enddo
+       else
+        nptg0=npgen(vtac(it)-vtac0(it),1,20)
+        do i=1,nptg0
+         itytg0(i)=1
+         iptg0(i)=it
+        enddo
+        do itt=it+1,ia(2)
+         ninc=npgen(vtac(itt)-vtac0(itt),0,20)
+         if(ninc.ne.0)then
+          nptg0=nptg0+ninc
+          if(nptg0.gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nptg0-ninc+1,nptg0
+           itytg0(i)=1
+           iptg0(i)=itt
+          enddo
+         endif
+        enddo
+        if(nptg0.eq.1)goto 6
+       endif
+      endif
+
+      gbt=1.d0
+      if((jt.eq.1.and.nptgh0.lt.nptg0.or.jt.eq.4)
+     *.and.npprh0.eq.nppr0)then
+       gbt=1.d0-exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     * /(1.d0-vvxp)/(1.d0-vvxpl)
+      elseif((jt.eq.1.and.npprh0.lt.nppr0.or.jt.eq.3)
+     *.and.nptgh0.eq.nptg0)then
+       gbt=1.d0-exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))
+     * /(1.d0-vvxt)/(1.d0-vvxtl)
+      elseif(jt.eq.1.and.nptgh0.eq.nptg0.and.npprh0.eq.nppr0)then
+       gbt=1.d0-exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     * /(1.d0-vvxp)/(1.d0-vvxpl)
+     * -exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))/(1.d0-vvxt)/(1.d0-vvxtl)
+      elseif(jt.eq.7.and.npprh0.eq.nppr0)then
+       gbt=1.d0-exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     * /(1.d0-vvxp)/(1.d0-vvxpl)
+     * *(vtac(it)+vtlc)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     * /((vtac0(it)+vtlc0)*exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     * -(vtac(it)+vtlc-vtac0(it)-vtlc0)
+     * *(1.d0-exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)))
+      elseif(jt.eq.8.and.nptgh0.eq.nptg0)then
+       gbt=1.d0-exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))
+     * /(1.d0-vvxt)/(1.d0-vvxtl)
+     * *(vpac(ip)+vplc)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     * /((vpac0(ip)+vplc0)*exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     * -(vpac(ip)+vplc-vpac0(ip)-vplc0)
+     * *(1.d0-exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)))
+      endif
+      if(qgran(b10).gt.gbt)goto 2
+
+c less important part of 'zigzag' cuts - commented out (sub-per cent effect)
+c      if((jt.eq.1.or.jt.eq.8)
+c     *  .and.qgran(b10).lt.max(0.d0,wzgp/(vv(1)+vv(8))))nppr0=0
+c      if((jt.eq.1.or.jt.eq.7)
+c     *  .and.qgran(b10).lt.max(0.d0,wzgt/(vv(1)+vv(7))))nptg0=0
+
+      if(jt.eq.7.or.jt.eq.9.or.jt.eq.11.or.jt.eq.12)then
+       nptg0=1
+       iptg0(1)=it
+      endif
+      if(jt.eq.8.or.jt.eq.10.or.jt.eq.11.or.jt.eq.12)then
+       nppr0=1
+       ippr0(1)=ip
+      endif
+
+      if(jt.eq.8.and.nptgh0.lt.nptg0.or.jt.eq.10)then !'fan' from cut vertex
+       vpacng=min(vpac0(ip)
+     * ,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp0,vvxpl,iddp(ip),icz,4))
+
+       factor=exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+       wng=(vpacng+vplcng)*factor
+       wgap=max(0.d0,(vpac0(ip)+vplc0)*factor
+     * -(vpac(ip)+vplc-vpac0(ip)-vplc0)*(1.d0-factor)-wng)
+       if(qgran(b10).ge.wgap/(wgap+wng).or.xpomr*sgap**2.gt..9d0)then
+        if(qgran(b10).lt.vpacng/(vpacng+vplcng)
+     *  .and.xpomr*sgap**2.lt..9d0)then
+         itypr0(1)=2            !cut 'fan' (no gap at the end)
+        else
+         itypr0(1)=4            !cut 'leg' (no gap at the end)
+        endif
+       else
+        wfg=max(0.d0,(vpac0(ip)-vpacng)*factor
+     *         -(vpac(ip)-vpac0(ip))*(1.d0-factor))
+        wlg=max(0.d0,(vplc0-vplcng)*factor-(vplc-vplc0)*(1.d0-factor))
+        if(qgran(b10).lt.wfg/(wfg+wlg))then
+         itypr0(1)=3            !cut 'fan' (gap at the end)
+        else
+         itypr0(1)=5            !cut 'leg' (gap at the end)
+        endif
+        wgpr0=(1.d0-factor)/factor
+       endif
+
+      elseif(jt.eq.8.and.nptgh0.eq.nptg0)then !'fan' from cut/uncut vertex
+       vpacng=min(vpac0(ip)
+     * ,qgfani(1.d0/xpomr,bbpr,vvxts,vvxp0,vvxpl,iddp(ip),icz,4))
+
+       factor=exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+       wng=(vpacng+vplcng)*factor*(1.d0-exp(vtac(it)
+     * +(1.d0-nptg0)*dlog(2.d0))/(1.d0-vvxt)/(1.d0-vvxtl))
+       wgap=max(0.d0,(vpac0(ip)+vplc0)*factor
+     * -(vpac(ip)+vplc-vpac0(ip)-vplc0)*(1.d0-factor)
+     * -exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))/(1.d0-vvxt)/(1.d0-vvxtl)
+     * *(vpac(ip)+vplc)*factor-wng)
+       if(qgran(b10).ge.wgap/(wgap+wng).or.xpomr*sgap**2.gt..9d0)then
+        if(qgran(b10).lt.vpacng/(vpacng+vplcng)
+     *  .and.xpomr*sgap**2.lt..9d0)then
+         itypr0(1)=2            !cut 'fan' (no gap at the end)
+        else
+         itypr0(1)=4            !cut 'leg' (no gap at the end)
+        endif
+       else
+        wfg=max(0.d0,(vpac0(ip)-vpacng)*factor
+     *         -(vpac(ip)-vpac0(ip))*(1.d0-factor)
+     *  -exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))
+     *  /(1.d0-vvxt)/(1.d0-vvxtl)*(vpac(ip)-vpacng)*factor)
+        wlg=max(0.d0,(vplc0-vplcng)*factor-(vplc-vplc0)*(1.d0-factor)
+     *  -exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))
+     *  /(1.d0-vvxt)/(1.d0-vvxtl)*(vplc-vplcng)*factor)
+        if(qgran(b10).lt.wfg/(wfg+wlg))then
+         itypr0(1)=3            !cut 'fan' (gap at the end)
+        else
+         itypr0(1)=5            !cut 'leg' (gap at the end)
+        endif
+        wgpr0=1.d0/factor/(1.d0-exp(vtac(it)+(1.d0-nptg0)*dlog(2.d0))
+     *  /(1.d0-vvxt)/(1.d0-vvxtl))-1.d0
+       endif
+
+      elseif(jt.eq.11)then
+       itypr0(1)=6
+      elseif(jt.eq.12)then
+       factor=exp(-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+       wng=max(0.d0,vplcng-vplcpe)*factor
+     * /((vplc0-vplcpe)*factor-(vplc-vplc0)*(1.d0-factor))
+       if(qgran(b10).le.wng)then
+        itypr0(1)=7            !cut 'leg' (>1 cut Poms at the end)
+       else
+        itypr0(1)=5            !cut 'leg' (gap at the end)
+        wgpr0=(1.d0-factor)/factor
+       endif
+      endif
+
+      if(jt.eq.7.and.npprh0.lt.nppr0.or.jt.eq.9)then !'fan' from cut vertex
+       vtacng=min(vtac0(it)
+     * ,qgfani(xpomr*scm,bbtg,vvxps,vvxt0,vvxtl,iddt(it),2,4))
+
+       factor=exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+       wng=(vtacng+vtlcng)*factor
+       wgap=max(0.d0,(vtac0(it)+vtlc0)*factor
+     * -(vtac(it)+vtlc-vtac0(it)-vtlc0)*(1.d0-factor)-wng)
+       if(qgran(b10).ge.wgap/(wgap+wng)
+     * .or.xpomr*scm.lt.1.1d0*sgap**2)then
+        if(qgran(b10).lt.vtacng/(vtacng+vtlcng)
+     *  .and.xpomr*scm.gt.1.1d0*sgap**2)then
+         itytg0(1)=2            !cut 'fan' (no gap at the end)
+        else
+         itytg0(1)=4            !cut 'leg' (no gap at the end)
+        endif
+       else
+        wfg=max(0.d0,(vtac0(it)-vtacng)*factor
+     *         -(vtac(it)-vtac0(it))*(1.d0-factor))
+        wlg=max(0.d0,(vtlc0-vtlcng)*factor-(vtlc-vtlc0)*(1.d0-factor))
+        if(qgran(b10).lt.wfg/(wfg+wlg))then
+         itytg0(1)=3            !cut 'fan' (gap at the end)
+        else
+         itytg0(1)=5            !cut 'leg' (gap at the end)
+        endif
+        wgtg0=(1.d0-factor)/factor
+       endif
+
+      elseif(jt.eq.7.and.npprh0.eq.nppr0)then !'fan' from cut/uncut vertex
+       vtacng=min(vtac0(it)
+     * ,qgfani(xpomr*scm,bbtg,vvxps,vvxt0,vvxtl,iddt(it),2,4))
+
+       factor=exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+       wng=(vtacng+vtlcng)*factor*(1.d0-exp(vpac(ip)
+     * +(1.d0-nppr0)*dlog(2.d0))/(1.d0-vvxp)/(1.d0-vvxpl))
+       wgap=max(0.d0,(vtac0(it)+vtlc0)*factor
+     * -(vtac(it)+vtlc-vtac0(it)-vtlc0)*(1.d0-factor)
+     * -exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))/(1.d0-vvxp)/(1.d0-vvxpl)
+     * *(vtac(it)+vtlc)*factor-wng)
+       if(qgran(b10).ge.wgap/(wgap+wng)
+     * .or.xpomr*scm.lt.1.1d0*sgap**2)then
+        if(qgran(b10).lt.vtacng/(vtacng+vtlcng)
+     *  .and.xpomr*scm.gt.1.1d0*sgap**2)then
+         itytg0(1)=2            !cut 'fan' (no gap at the end)
+        else
+         itytg0(1)=4            !cut 'leg' (no gap at the end)
+        endif
+       else
+        wfg=max(0.d0,(vtac0(it)-vtacng)*factor
+     *         -(vtac(it)-vtac0(it))*(1.d0-factor)
+     *  -exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     *  /(1.d0-vvxp)/(1.d0-vvxpl)*(vtac(it)-vtacng)*factor)
+        wlg=max(0.d0,(vtlc0-vtlcng)*factor-(vtlc-vtlc0)*(1.d0-factor)
+     *  -exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     *  /(1.d0-vvxp)/(1.d0-vvxpl)*(vtlc-vtlcng)*factor)
+        if(qgran(b10).lt.wfg/(wfg+wlg))then
+         itytg0(1)=3            !cut 'fan' (gap at the end)
+        else
+         itytg0(1)=5            !cut 'leg' (gap at the end)
+        endif
+        wgtg0=1.d0/factor/(1.d0-exp(vpac(ip)+(1.d0-nppr0)*dlog(2.d0))
+     *  /(1.d0-vvxp)/(1.d0-vvxpl))-1.d0
+       endif
+
+      elseif(jt.eq.12)then
+       itytg0(1)=6
+      elseif(jt.eq.11)then
+       factor=exp(-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+       wng=max(0.d0,vtlcng-vtlcpe)*factor
+     * /((vtlc0-vtlcpe)*factor-(vtlc-vtlc0)*(1.d0-factor))
+       if(qgran(b10).le.wng)then
+        itytg0(1)=7            !cut 'leg' (>1 cut Poms at the end)
+       else
+        itytg0(1)=5            !cut 'leg' (gap at the end)
+        wgtg0=(1.d0-factor)/factor
+       endif
+      endif
+      if(debug.ge.3)write (moniou,206)nppr0,nptg0
+
+      nppr=0
+      nptg=0
+      npin=0
+
+      if(nppr0.eq.1.and.itypr0(1).eq.6)then     !single cut Pomeron
+       nppr=1
+       xpompi(nppr)=xpomr
+       vvxpi(nppr)=1.d0-(1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt)
+     * *exp(-vtac(it))
+       ipompi(nppr)=ip
+       bpompi(nppr)=bbpr
+       if(debug.ge.4)write (moniou,209)nppr,ip,bbpr,xpompi(nppr)
+     * ,vvxpi(nppr)
+       nppr0=0
+      endif
+      if(nptg0.eq.1.and.itytg0(1).eq.6)then     !single cut Pomeron
+       nptg=1
+       xpomti(nptg)=xpomr
+       vvxti(nptg)=1.d0-(1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt)
+     * *exp(-vpac(ip))
+       ipomti(nptg)=it
+       bpomti(nptg)=bbtg
+       if(debug.ge.4)write (moniou,217)nptg,it,bbtg,xpomti(nptg)
+     * ,vvxti(nptg)
+       nptg0=0
+      endif
+
+      vvxps=vvxp
+      vvxpls=vvxpl
+      vvxp0s=vvxp0
+      if(nppr0.ne.0)then
+       i=0
+7      i=i+1
+       ityp=itypr0(i)
+       if(ityp.eq.0.or.ityp.eq.2.or.ityp.eq.4)then
+        ipp=ippr0(i)
+        bbp=(xa(ipp,1)+b-xxp)**2+(xa(ipp,2)-yyp)**2
+        vvxp=0.d0
+        vvxpl=0.d0
+        vvxp0=0.d0
+        if(ia(1).gt.1)then
+         do l=1,ia(1)
+          if(l.lt.ipp)then
+           vvxpl=vvxpl+vpac(l)
+          elseif(l.gt.ipp)then
+           vvxp=vvxp+vpac(l)
+           vvxp0=vvxp0+vpac0(l)
+          endif
+         enddo
+        endif
+        vvxp=1.d0-exp(-vvxp)
+        vvxpl=1.d0-exp(-vvxpl)
+        vvxp0=1.d0-exp(-vvxp0)
+        vvxts=1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*(1.d0-vvxpl)*exp(-vtac(it))
+        if(ityp.ne.4)then
+         vpacng=min(vpac0(ipp)
+     *   ,qgfani(1.d0/xpomr,bbp,vvxts,vvxp0,vvxpl,iddp(ipp),icz,4))
+         vpacpe=min(vpacng
+     *   ,qgfani(1.d0/xpomr,bbp,vvxts,vvxp0,vvxpl,iddp(ipp),icz,5))
+         vplcp=min(vpacpe
+     *   ,qgfani(1.d0/xpomr,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,9))
+        else
+         vplcng=min(vpac0(ipp)
+     *   ,qgfani(1.d0/xpomr,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,11))
+         vplcpe=min(vplcng
+     *   ,qgfani(1.d0/xpomr,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,10))
+         vplcp=min(vplcpe
+     *   ,qgfani(1.d0/xpomr,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,9))
+        endif
+
+        if(ityp.eq.0)then
+         aks=qgran(b10)*vpac0(ipp)
+         if(aks.le.vplcp.or.xpomr*sgap**2.gt..9d0)then
+          itypr0(i)=6        !single cut Pomeron
+         elseif(aks.lt.vpacpe)then
+          itypr0(i)=-1       !'fan' (cut Pomeron end)
+         elseif(aks.lt.vpacng)then
+          itypr0(i)=2        !'fan' (>1 cut Poms at the end)
+         endif
+        elseif(ityp.eq.2)then
+         aks=qgran(b10)*vpacng
+         if(aks.le.vplcp.or.xpomr*sgap**2.gt..9d0)then
+          itypr0(i)=6        !single cut Pomeron
+         elseif(aks.lt.vpacpe)then
+          itypr0(i)=-1       !'fan' (cut Pomeron end)
+         endif
+        elseif(ityp.eq.4)then
+         aks=qgran(b10)*vplcng
+         if(aks.le.vplcp.or.xpomr*sgap**2.gt..9d0)then
+          itypr0(i)=6        !single cut Pomeron
+         elseif(aks.gt.vplcpe.or.xpomr*sgap**3.gt..9d0)then
+          itypr0(i)=7        !'leg' (>1 cut Poms at the end)
+         endif
+        endif
+
+        if(itypr0(i).eq.6)then        !single cut Pomeron
+         nppr=nppr+1
+         xpompi(nppr)=xpomr
+         vvxpi(nppr)=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*(1.d0-vvxt)
+     *   *(1.d0-vvxtl)*exp(-vtac(it))
+         ipompi(nppr)=ipp
+         bpompi(nppr)=bbp
+         if(debug.ge.4)write (moniou,209)nppr,ipp,bbp,xpompi(nppr)
+     *   ,vvxpi(nppr)
+         nppr0=nppr0-1
+         if(nppr0.ge.i)then
+          do l=i,nppr0
+           ippr0(l)=ippr0(l+1)
+           itypr0(l)=itypr0(l+1)
+          enddo
+         endif
+         i=i-1
+        endif
+       endif
+       if(i.lt.nppr0)goto 7
+      endif
+
+      vvxp=vvxps
+      vvxpl=vvxpls
+      vvxp0=vvxp0s
+      vvxts=vvxt
+      vvxtls=vvxtl
+      vvxt0s=vvxt0
+      if(nptg0.ne.0)then
+       i=0
+8      i=i+1
+       ityt=itytg0(i)
+       if(ityt.eq.0.or.ityt.eq.2.or.ityt.eq.4)then
+        itt=iptg0(i)
+        bbt=(xb(itt,1)-xxp)**2+(xb(itt,2)-yyp)**2
+        vvxt=0.d0
+        vvxtl=0.d0
+        vvxt0=0.d0
+        if(ia(2).gt.1)then
+         do l=1,ia(2)
+          if(l.lt.itt)then
+           vvxtl=vvxtl+vtac(l)
+          elseif(l.gt.itt)then
+           vvxt=vvxt+vtac(l)
+           vvxt0=vvxt0+vtac0(l)
+          endif
+         enddo
+        endif
+        vvxt=1.d0-exp(-vvxt)
+        vvxtl=1.d0-exp(-vvxtl)
+        vvxt0=1.d0-exp(-vvxt0)
+        vvxps=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*(1.d0-vvxtl)*exp(-vpac(ip))
+        if(ityt.ne.4)then
+         vtacng=min(vtac0(itt)
+     *   ,qgfani(xpomr*scm,bbt,vvxps,vvxt0,vvxtl,iddt(itt),2,4))
+         vtacpe=min(vtacng
+     *   ,qgfani(xpomr*scm,bbt,vvxps,vvxt0,vvxtl,iddt(itt),2,5))
+         vtlcp=min(vtacpe
+     *   ,qgfani(xpomr*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,9))
+        else
+         vtlcng=min(vtac0(itt)
+     *   ,qgfani(xpomr*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,11))
+         vtlcpe=min(vtlcng
+     *   ,qgfani(xpomr*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,10))
+         vtlcp=min(vtlcpe
+     *   ,qgfani(xpomr*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,9))
+        endif
+
+        if(ityt.eq.0)then
+         aks=qgran(b10)*vtac0(itt)
+         if(aks.le.vtlcp.or.xpomr*scm.lt.1.1d0*sgap**2)then
+          itytg0(i)=6        !single cut Pomeron
+         elseif(aks.lt.vtacpe)then
+          itytg0(i)=-1       !'fan' (cut Pomeron end)
+         elseif(aks.lt.vtacng)then
+          itytg0(i)=2        !'fan' (>1 cut Poms at the end)
+         endif
+        elseif(ityt.eq.2)then
+         aks=qgran(b10)*vtacng
+         if(aks.le.vtlcp.or.xpomr*scm.lt.1.1d0*sgap**2)then
+          itytg0(i)=6        !single cut Pomeron
+         elseif(aks.lt.vtacpe)then
+          itytg0(i)=-1       !'fan' (cut Pomeron end)
+         endif
+        elseif(ityt.eq.4)then
+         aks=qgran(b10)*vtlcng
+         if(aks.le.vtlcp.or.xpomr*scm.lt.1.1d0*sgap**2)then
+          itytg0(i)=6
+         elseif(aks.gt.vtlcpe.or.xpomr*scm.lt.1.1d0*sgap**3)then
+          itytg0(i)=7        !'leg' (>1 cut Poms at the end)
+         endif
+        endif
+
+        if(itytg0(i).eq.6)then        !single cut Pomeron
+         nptg=nptg+1
+         xpomti(nptg)=xpomr
+         vvxti(nptg)=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*(1.d0-vvxt)
+     *   *(1.d0-vvxtl)*exp(-vpac(ip))
+         ipomti(nptg)=itt
+         bpomti(nptg)=bbt
+         if(debug.ge.4)write (moniou,217)nptg,itt,bbt,xpomti(nptg)
+     *   ,vvxti(nptg)
+         nptg0=nptg0-1
+         if(nptg0.ge.i)then
+          do l=i,nptg0
+           iptg0(l)=iptg0(l+1)
+           itytg0(l)=itytg0(l+1)
+          enddo
+         endif
+         i=i-1
+        endif
+       endif
+       if(i.lt.nptg0)goto 8
+      endif
+      vvxt=vvxts
+      vvxtl=vvxtls
+      vvxt0=vvxt0s
+
+      if((jt-1)*(jt-4)*(jt-7).eq.0.and.xpomr*sgap**2.lt..9d0)then
+       vvxts=1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+       vvxt0s=1.d0-(1.d0-vvxt0)*(1.d0-vvxt0l)*exp(-vtac0(it))
+       vvxs=((1.d0-vvxp)*(1.d0-vvxpl))**2*exp(-2.d0*vpac(ip))
+       vvx0s=((1.d0-vvxp0)*(1.d0-vvxp0l))**2*exp(-2.d0*vpac0(ip))
+
+       wzzp=2.d0*qgrevi(1.d0/xpomr,bbpr,vvxt0s,vvxts
+     * ,vvxpt,vvxp0,vvxpl,iddp(ip),icz)
+     * *((1.d0-exp(-vtact(it)))*(1.d0-vvxtt)*(1.d0-vvxs)
+     * +vvxs*(max(0.d0,1.d0-exp(-vtact(it))*(1.d0+vtact(it)))
+     * *(1.d0-vvxtt)
+     * -max(0.d0,1.d0-exp(-vtac0(it))*(1.d0+vtac0(it)))*(1.d0-vvxt0))
+     * +vtact(it)*exp(-vtact(it))*((1.d0-vvxtt)*vvxs
+     * -exp(vtact(it)-vtac0(it))*(1.d0-vvxt0)*(1.d0-vvxt0l)*vvx0s)
+     * -vtac0(it)*exp(-vtac0(it))*(1.d0-vvxt0)
+     * *(vvxs-vvx0s+vvxt0l*vvx0s))
+       wzzp=max(0.d0,wzzp)
+       nzzp=npgen(wzzp/(vv(1)+vv(4)+vv(7)),0,50)
+      else
+       nzzp=0
+      endif
+
+      if((jt-1)*(jt-3)*(jt-8).eq.0.and.xpomr*scm.gt.1.1d0*sgap**2)then
+       vvxps=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+       vvxp0s=1.d0-(1.d0-vvxp0)*(1.d0-vvxp0l)*exp(-vpac0(ip))
+       vvxs=((1.d0-vvxt)*(1.d0-vvxtl))**2*exp(-2.d0*vtac(it))
+       vvx0s=((1.d0-vvxt0)*(1.d0-vvxt0l))**2*exp(-2.d0*vtac0(it))
+       wzzt=2.d0*qgrevi(xpomr*scm,bbtg,vvxp0s,vvxps
+     * ,vvxtt,vvxt0,vvxtl,iddt(it),2)
+     * *((1.d0-exp(-vpact(ip)))*(1.d0-vvxpt)*(1.d0-vvxs)
+     * +vvxs*(max(0.d0,1.d0-exp(-vpact(ip))*(1.d0+vpact(ip)))
+     * *(1.d0-vvxpt)
+     * -max(0.d0,1.d0-exp(-vpac0(ip))*(1.d0+vpac0(ip)))*(1.d0-vvxp0))
+     * +vpact(ip)*exp(-vpact(ip))*((1.d0-vvxpt)*vvxs
+     * -exp(vpact(ip)-vpac0(ip))*(1.d0-vvxp0)*(1.d0-vvxp0l)*vvx0s)
+     * -vpac0(ip)*exp(-vpac0(ip))*(1.d0-vvxp0)
+     * *(vvxs-vvx0s+vvxp0l*vvx0s))
+       wzzt=max(0.d0,wzzt)
+       nzzt=npgen(wzzt/(vv(1)+vv(3)+vv(8)),0,50)
+      else
+       nzzt=0
+      endif
+
+      if(nzzp.ne.0)then
+       bpm=(xa(ip,1)+b-xxp)**2+(xa(ip,2)-yyp)**2
+       xpomr0=min(dsqrt(xpomr),1.d0/sgap)
+       xpomr0=max(xpomr0,xpomr*sgap)
+       rp1=(rq(iddp(ip),icz)-alfp*dlog(xpomr0))*4.d0*.0389d0
+       rp2=alfp*dlog(xpomr0/xpomr)*4.d0*.0389d0
+       rp0=rp1*rp2/(rp1+rp2)
+       bbp=bpm*(rp1/(rp1+rp2))**2
+       bbi=bpm*(rp2/(rp1+rp2))**2
+       call qgbdef(bbp,bbi,xa(ip,1)+b,xa(ip,2),xxp,yyp,xxp0,yyp0,1)
+       call qgfdf(xxp0,yyp0,xpomr0,vpac,vtac,vvx,vvxp,vvxt
+     * ,vvxpl,vvxtl,ip,it)
+
+       sumcp0=0.d0
+       sumcpt=0.d0
+       sumup=0.d0
+       vvxp0=0.d0
+       vvxp0l=0.d0
+       do i=1,ia(1)
+        sumup=sumup+vpac(i)
+       enddo
+       vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+       do i=1,ia(1)
+        ipp=ia(1)-i+1
+        bbpi=(xa(ipp,1)+b-xxp0)**2+(xa(ipp,2)-yyp0)**2
+        sumup=sumup-vpac(ipp)
+        vpac0(ipp)=min(vpac(ipp)
+     *  ,qgfani(1.d0/xpomr0,bbpi,1.d0-vvxs*exp(-sumup)
+     *  ,1.d0-exp(-sumcp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+        if(ipp.ge.ip)vpact(ipp)=max(vpac(ipp)
+     *  ,qgfani(1.d0/xpomr0,bbpi,1.d0-vvxs*exp(-sumup)
+     *  ,1.d0-exp(-sumcpt),1.d0-exp(-sumup),iddp(ipp),icz,6))
+        if(ipp.gt.ip)then
+         vvxp0=vvxp0+vpac0(ipp)
+         sumcpt=sumcpt+vpact(ipp)
+        elseif(ipp.lt.ip)then
+         vvxp0l=vvxp0l+vpac0(ipp)
+        endif
+        sumcp0=sumcp0+vpac0(ipp)
+       enddo
+       vvxpt=1.d0-exp(-sumcpt)
+       vvxp0=1.d0-exp(-vvxp0)
+       vvxp0l=1.d0-exp(-vvxp0l)
+
+       sumut=0.d0
+       sumct0=0.d0
+       vvxt0=0.d0
+       vvxt0l=0.d0
+       do i=1,ia(2)
+        sumut=sumut+vtac(i)
+       enddo
+       vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+       do i=1,ia(2)
+        itt=ia(2)-i+1
+        bbti=(xb(itt,1)-xxp0)**2+(xb(itt,2)-yyp0)**2
+        sumut=sumut-vtac(itt)
+        vtac0(itt)=min(vtac(itt)
+     *  ,qgfani(xpomr0*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *  ,1.d0-exp(-sumct0),1.d0-exp(-sumut),iddt(itt),2,3))
+        if(itt.gt.it)then
+         vvxt0=vvxt0+vtac0(itt)
+        elseif(itt.lt.it)then
+        vvxt0l=vvxt0l+vtac0(itt)
+        endif
+        sumct0=sumct0+vtac0(itt)
+       enddo
+       vvxt0=1.d0-exp(-vvxt0)
+       vvxt0l=1.d0-exp(-vvxt0l)
+
+       viu=qgpini(xpomr0/xpomr,bbi,0.d0,0.d0,2)
+       vim=2.d0*min(viu,qgpini(xpomr0/xpomr,bbi,0.d0,0.d0,8))
+       vvxpin=1.d0-(1.d0-vvxp0)*(1.d0-vvxp0l)*exp(-vpac0(ip))
+       vvxtin=1.d0-(1.d0-vvxt0)*(1.d0-vvxt0l)*exp(-vtac0(it))
+       vi=qgpini(xpomr0/xpomr,bbi,vvxpin,vvxtin,21)*(1.d0-exp(-viu))
+     * -qgpini(xpomr0/xpomr,bbi,vvxpin,vvxtin,23)*((1.d0-exp(-viu))**2
+     * +(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))/2.d0
+
+       vvx0s=(1.d0-vvxtin)**2
+       vvxs=((1.d0-vvxt)*(1.d0-vvxtl))**2*exp(-2.d0*vtac(it))
+
+       gb0=vi                        *15.
+     * *((1.d0-exp(-vpact(ip)))*(1.d0-vvxpt)*(1.d0-vvxs)
+     * +vvxs*(max(0.d0,1.d0-exp(-vpact(ip))*(1.d0+vpact(ip)))
+     * *(1.d0-vvxpt)
+     * -max(0.d0,1.d0-exp(-vpac0(ip))*(1.d0+vpac0(ip)))*(1.d0-vvxp0))
+     * +vpact(ip)*exp(-vpact(ip))*((1.d0-vvxpt)*vvxs
+     * -exp(vpact(ip)-vpac0(ip))*(1.d0-vvxp0)*(1.d0-vvxp0l)*vvx0s)
+     * -vpac0(ip)*exp(-vpac0(ip))*(1.d0-vvxp0)
+     * *(vvxs-vvx0s+vvxp0l*vvx0s))
+
+       do in=1,nzzp
+        nrej=0
+32      xpomri=(xpomr*sgap**2)**qgran(b10)/sgap
+        rp1=(rq(iddp(ip),icz)-alfp*dlog(xpomri))*4.d0*.0389d0
+        rp2=alfp*dlog(xpomri/xpomr)*4.d0*.0389d0
+        rp=rp1*rp2/(rp1+rp2)
+        z=qgran(b10)
+        phi=pi*qgran(b10)
+        b0=dsqrt(-rp*dlog(z))
+        bbp=(dsqrt(bpm)*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+        bbi=(dsqrt(bpm)*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+        call qgbdef(bbp,bbi,xa(ip,1)+b,xa(ip,2),xxp,yyp
+     *  ,xxi,yyi,int(1.5d0+qgran(b10)))   !coordinates for the vertex
+        call qgfdf(xxi,yyi,xpomri,vpac,vtac
+     *  ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,it)
+
+        sumcp0=0.d0
+        sumcpt=0.d0
+        sumup=0.d0
+        vvxp0=0.d0
+        vvxp0l=0.d0
+        do i=1,ia(1)
+         sumup=sumup+vpac(i)
+        enddo
+        vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+        do i=1,ia(1)
+         ipp=ia(1)-i+1
+         bbpi=(xa(ipp,1)+b-xxi)**2+(xa(ipp,2)-yyi)**2
+         sumup=sumup-vpac(ipp)
+         vpac0(ipp)=min(vpac(ipp)
+     *   ,qgfani(1.d0/xpomri,bbpi,1.d0-vvxs*exp(-sumup)
+     *   ,1.d0-exp(-sumcp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+         if(ipp.ge.ip)vpact(ipp)=max(vpac(ipp)
+     *   ,qgfani(1.d0/xpomri,bbpi,1.d0-vvxs*exp(-sumup)
+     *   ,1.d0-exp(-sumcpt),1.d0-exp(-sumup),iddp(ipp),icz,6))
+         if(ipp.gt.ip)then
+          vvxp0=vvxp0+vpac0(ipp)
+          sumcpt=sumcpt+vpact(ipp)
+         elseif(ipp.lt.ip)then
+          vvxp0l=vvxp0l+vpac0(ipp)
+         endif
+         sumcp0=sumcp0+vpac0(ipp)
+        enddo
+        vvxpt=1.d0-exp(-sumcpt)
+        vvxp0=1.d0-exp(-vvxp0)
+        vvxp0l=1.d0-exp(-vvxp0l)
+
+        sumut=0.d0
+        sumct0=0.d0
+        vvxt0=0.d0
+        vvxt0l=0.d0
+        do i=1,ia(2)
+         sumut=sumut+vtac(i)
+        enddo
+        vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+        do i=1,ia(2)
+         itt=ia(2)-i+1
+         bbti=(xb(itt,1)-xxi)**2+(xb(itt,2)-yyi)**2
+         sumut=sumut-vtac(itt)
+         vtac0(itt)=min(vtac(itt)
+     *   ,qgfani(xpomri*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *   ,1.d0-exp(-sumct0),1.d0-exp(-sumut),iddt(itt),2,3))
+         if(itt.gt.it)then
+          vvxt0=vvxt0+vtac0(itt)
+         elseif(itt.lt.it)then
+          vvxt0l=vvxt0l+vtac0(itt)
+         endif
+         sumct0=sumct0+vtac0(itt)
+        enddo
+        vvxt0=1.d0-exp(-vvxt0)
+        vvxt0l=1.d0-exp(-vvxt0l)
+
+        viu=qgpini(xpomri/xpomr,bbi,0.d0,0.d0,2)
+        vim=2.d0*min(viu,qgpini(xpomri/xpomr,bbi,0.d0,0.d0,8))
+        vvxpin=1.d0-(1.d0-vvxp0)*(1.d0-vvxp0l)*exp(-vpac0(ip))
+        vvxtin=1.d0-(1.d0-vvxt0)*(1.d0-vvxt0l)*exp(-vtac0(it))
+        vi=qgpini(xpomri/xpomr,bbi,vvxpin,vvxtin,21)*(1.d0-exp(-viu))
+     *  -qgpini(xpomri/xpomr,bbi,vvxpin,vvxtin,23)*((1.d0-exp(-viu))**2
+     *  +(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))/2.d0
+
+        vvx0s=(1.d0-vvxtin)**2
+        vvxs=((1.d0-vvxt)*(1.d0-vvxtl))**2*exp(-2.d0*vtac(it))
+
+        gb=vi
+     *  *((1.d0-exp(-vpact(ip)))*(1.d0-vvxpt)*(1.d0-vvxs)
+     *  +vvxs*(max(0.d0,1.d0-exp(-vpact(ip))*(1.d0+vpact(ip)))
+     *  *(1.d0-vvxpt)
+     *  -max(0.d0,1.d0-exp(-vpac0(ip))*(1.d0+vpac0(ip)))*(1.d0-vvxp0))
+     *  +vpact(ip)*exp(-vpact(ip))*((1.d0-vvxpt)*vvxs
+     *  -exp(vpact(ip)-vpac0(ip))*(1.d0-vvxp0)*(1.d0-vvxp0l)*vvx0s)
+     *  -vpac0(ip)*exp(-vpac0(ip))*(1.d0-vvxp0)
+     *  *(vvxs-vvx0s+vvxp0l*vvx0s))
+
+        gb=gb/gb0/z*rp/rp0
+        nrej=nrej+1
+        if(qgran(b10).gt.gb.and.nrej.lt.10000)goto 32
+
+        vi1p=qgpini(xpomri/xpomr,bbi,1.d0-(1.d0-vvxpin)**2*vvx0s
+     *  ,0.d0,16)*exp(-vim)
+        vimp=max(0.d0,(1.d0-exp(-vim)*(1.d0+vim)))/2.d0
+
+        if(qgran(b10).le.(vi1p+vimp)/vi
+     *  .or.xpomri/xpomr.lt.1.1d0*sgap**2)then
+         if(qgran(b10).le.vi1p/(vi1p+vimp))then   !single cut Pomeron
+          npin=npin+1
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          xpomim(npin)=1.d0/xpomr/scm
+          xpomip(npin)=xpomri
+          vvxim(npin)=1.d0-(1.d0-vvxpin)**2*vvx0s
+          bpomim(npin)=bbi
+          if(debug.ge.4)write (moniou,211)npin,xpomip(npin)
+     *    ,xpomim(npin),vvxim(npin),bpomim(npin)
+         else                                     !more than 1 cut Pomeron
+          ninc=npgen(vim,2,20)
+          npin=npin+ninc
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          do i=npin-ninc+1,npin
+           xpomim(i)=1.d0/xpomr/scm
+           xpomip(i)=xpomri
+           vvxim(i)=0.d0
+           bpomim(i)=bbi
+           if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *     ,vvxim(i),bpomim(i)
+          enddo
+         endif
+
+        else                                      !additional vertices
+         xpomz0=dsqrt(xpomr*xpomri)
+         rp0=alfp*dlog(xpomri/xpomr)*.0389d0
+         xxz0=.5d0*(xxp+xxi)
+         yyz0=.5d0*(yyp+yyi)
+         bbzp=.25d0*bbi
+         bbzt=bbzp
+         call qgfdf(xxz0,yyz0,xpomz0,vpac,vtac,vvx,vvxp,vvxt
+     *   ,vvxpl,vvxtl,ip,it)
+
+         vvxp0=0.d0
+         sumup=0.d0
+         do i=1,ia(1)
+          sumup=sumup+vpac(i)
+         enddo
+         vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+         do i=1,ia(1)
+          ipp=ia(1)-i+1
+          bbpi=(xa(ipp,1)+b-xxz0)**2+(xa(ipp,2)-yyz0)**2
+          sumup=sumup-vpac(ipp)
+          vpac0(ipp)=min(vpac(ipp)
+     *    ,qgfani(1.d0/xpomz0,bbpi,1.d0-vvxs*exp(-sumup)
+     *    ,1.d0-exp(-vvxp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+          vvxp0=vvxp0+vpac0(ipp)
+         enddo
+         vvxp0=1.d0-exp(-vvxp0)
+
+         sumut=0.d0
+         vvxt0=0.d0
+         do i=1,ia(2)
+          sumut=sumut+vtac(i)
+         enddo
+         vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+         do i=1,ia(2)
+          itt=ia(2)-i+1
+          bbti=(xb(itt,1)-xxz0)**2+(xb(itt,2)-yyz0)**2
+          sumut=sumut-vtac(itt)
+          vtac0(itt)=min(vtac(itt)
+     *    ,qgfani(xpomz0*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *    ,1.d0-exp(-vvxt0),1.d0-exp(-sumut),iddt(itt),2,3))
+          vvxt0=vvxt0+vtac0(itt)
+         enddo
+         vvxt0=1.d0-exp(-vvxt0)
+
+         viu=qgpini(xpomri/xpomz0,bbzp,0.d0,0.d0,2)
+         vilu=1.d0-exp(-viu)
+         vimu=2.d0*min(viu,qgpini(xpomri/xpomz0,bbzp,0.d0,0.d0,8))
+         vimpu=max(0.d0,(1.d0-exp(-vimu)*(1.d0+vimu)))/2.d0
+         vid=qgpini(xpomz0/xpomr,bbzt,0.d0,0.d0,2)
+         vild=1.d0-exp(-vid)
+         vimd=2.d0*min(vid,qgpini(xpomz0/xpomr,bbzt,0.d0,0.d0,8))
+         vimpd=max(0.d0,(1.d0-exp(-vimd)*(1.d0+vimd)))/2.d0
+
+         vi1pu=qgpini(xpomri/xpomz0,bbzp
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimu)
+         vguu=qgpini(xpomri/xpomz0,bbzp,vvxp0,vvxt0,21)*vilu      !uu+uc
+         vgcu=qgpini(xpomri/xpomz0,bbzp,vvxp0,vvxt0,23)
+     *   *(vilu**2+(exp(2.d0*viu-vimu)-1.d0)*exp(-2.d0*viu))/2.d0 !cc+cu
+         vi1pd=qgpini(xpomz0/xpomr,bbzt
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimd)
+         vgud=qgpini(xpomz0/xpomr,bbzt,vvxt0,vvxp0,21)*vild       !uu+uc
+         vgcd=qgpini(xpomz0/xpomr,bbzt,vvxt0,vvxp0,23)
+     *   *(vild**2+(exp(2.d0*vid-vimd)-1.d0)*exp(-2.d0*vid))/2.d0 !cc+cu
+
+         gbz0=(vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd+vimpu*vgcd
+     *   +vgcu*vimpd+vi1pu*vgcd+vgcu*vi1pd)*(1.d0-vvxp0)*(1.d0-vvxt0)
+     *   +(vimpu+vi1pu)*vgud*(1.d0-vvxp0)*vvxt0
+     *   +(vimpd+vi1pd)*vguu*(1.d0-vvxt0)*vvxp0
+
+         nrej=0
+34       xpomz=xpomr*sgap*(xpomri/xpomr/sgap**2)**qgran(b10)
+         rpp=alfp*dlog(xpomri/xpomz)*4.d0*.0389d0
+         rpt=alfp*dlog(xpomz/xpomr)*4.d0*.0389d0
+         rp=rpp*rpt/(rpp+rpt)
+         z=qgran(b10)
+         phi=pi*qgran(b10)
+         b0=dsqrt(-rp*dlog(z))
+         bbzp=(dsqrt(bbi)*rpp/(rpp+rpt)+b0*cos(phi))**2
+     *   +(b0*sin(phi))**2
+         bbzt=(dsqrt(bbi)*rpt/(rpp+rpt)-b0*cos(phi))**2
+     *   +(b0*sin(phi))**2
+         call qgbdef(bbzp,bbzt,xxi,yyi,xxp,yyp,xxz,yyz
+     *   ,int(1.5d0+qgran(b10)))               !coordinates for the vertex
+         call qgfdf(xxz,yyz,xpomz,vpac,vtac
+     *   ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,it)
+
+         vvxp0=0.d0
+         sumup=0.d0
+         do i=1,ia(1)
+          sumup=sumup+vpac(i)
+         enddo
+         vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+         do i=1,ia(1)
+          ipp=ia(1)-i+1
+          bbpi=(xa(ipp,1)+b-xxz)**2+(xa(ipp,2)-yyz)**2
+          sumup=sumup-vpac(ipp)
+          vpac0(ipp)=min(vpac(ipp)
+     *    ,qgfani(1.d0/xpomz,bbpi,1.d0-vvxs*exp(-sumup)
+     *    ,1.d0-exp(-vvxp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+          vvxp0=vvxp0+vpac0(ipp)
+         enddo
+         vvxp0=1.d0-exp(-vvxp0)
+
+         sumut=0.d0
+         vvxt0=0.d0
+         do i=1,ia(2)
+          sumut=sumut+vtac(i)
+         enddo
+         vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+         do i=1,ia(2)
+          itt=ia(2)-i+1
+          bbti=(xb(itt,1)-xxz)**2+(xb(itt,2)-yyz)**2
+          sumut=sumut-vtac(itt)
+          vtac0(itt)=min(vtac(itt)
+     *    ,qgfani(xpomz*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *    ,1.d0-exp(-vvxt0),1.d0-exp(-sumut),iddt(itt),2,3))
+          vvxt0=vvxt0+vtac0(itt)
+         enddo
+         vvxt0=1.d0-exp(-vvxt0)
+
+         viu=qgpini(xpomri/xpomz,bbzp,0.d0,0.d0,2)
+         vilu=1.d0-exp(-viu)
+         vimu=2.d0*min(viu,qgpini(xpomri/xpomz,bbzp,0.d0,0.d0,8))
+         vimpu=max(0.d0,(1.d0-exp(-vimu)*(1.d0+vimu)))/2.d0
+         vid=qgpini(xpomz/xpomr,bbzt,0.d0,0.d0,2)
+         vild=1.d0-exp(-vid)
+         vimd=2.d0*min(vid,qgpini(xpomz/xpomr,bbzt,0.d0,0.d0,8))
+         vimpd=max(0.d0,(1.d0-exp(-vimd)*(1.d0+vimd)))/2.d0
+
+         vi1pu=qgpini(xpomri/xpomz,bbzp
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimu)
+         vguu=qgpini(xpomri/xpomz,bbzp,vvxp0,vvxt0,21)*vilu       !uu+uc
+         vgcu=qgpini(xpomri/xpomz,bbzp,vvxp0,vvxt0,23)
+     *   *(vilu**2+(exp(2.d0*viu-vimu)-1.d0)*exp(-2.d0*viu))/2.d0 !cc+cu
+         vi1pd=qgpini(xpomz/xpomr,bbzt
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimd)
+         vgud=qgpini(xpomz/xpomr,bbzt,vvxt0,vvxp0,21)*vild        !uu+uc
+         vgcd=qgpini(xpomz/xpomr,bbzt,vvxt0,vvxp0,23)
+     *   *(vild**2+(exp(2.d0*vid-vimd)-1.d0)*exp(-2.d0*vid))/2.d0 !cc+cu
+
+         vvcc=vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd+vimpu*vgcd+vgcu*vimpd
+     *   +vi1pu*vgcd+vgcu*vi1pd
+         vvt=vvcc*(1.d0-vvxp0)*(1.d0-vvxt0)
+     *   +(vimpu+vi1pu)*vgud*(1.d0-vvxp0)*vvxt0
+     *   +(vimpd+vi1pd)*vguu*(1.d0-vvxt0)*vvxp0
+
+         gbz=vvt/gbz0/z*rp/rp0  /1.4d0
+         nrej=nrej+1
+         if(qgran(b10).gt.gbz.and.nrej.lt.10000)goto 34
+
+         aks=vvt*qgran(b10)
+         if(aks.gt.vvcc*(1.d0-vvxp0)*(1.d0-vvxt0)
+     *   +(vimpu+vi1pu)*vgud*(1.d0-vvxp0)*vvxt0)then
+          jtu=0
+          if(qgran(b10).lt.vimpd/(vimpd+vi1pd))then
+           jtd=2
+          else
+           jtd=1
+          endif
+         elseif(aks.gt.vvcc*(1.d0-vvxp0)*(1.d0-vvxt0))then
+          jtd=0
+          if(qgran(b10).lt.vimpu/(vimpu+vi1pu))then
+           jtu=2
+          else
+           jtu=1
+          endif
+         else
+          aks=vvcc*qgran(b10)
+          if(aks.lt.vimpu*vimpd)then
+           jtu=2
+           jtd=2
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd)then
+           jtu=2
+           jtd=1
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd)then
+           jtu=1
+           jtd=2
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd
+     *    +vimpu*vgcd)then
+           jtu=2
+           jtd=0
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd
+     *    +vimpu*vgcd+vgcu*vimpd)then
+           jtu=0
+           jtd=2
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd
+     *    +vimpu*vgcd+vgcu*vimpd+vi1pu*vgcd)then
+           jtu=1
+           jtd=0
+          else
+           jtu=0
+           jtd=1
+          endif
+         endif
+
+         if(jtu.eq.1)then                         !single cut Pomeron
+          npin=npin+1
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          xpomim(npin)=1.d0/xpomz/scm
+          xpomip(npin)=xpomri
+          vvxim(npin)=1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2
+          bpomim(npin)=bbzp
+          if(debug.ge.4)write (moniou,211)npin,xpomip(npin)
+     *    ,xpomim(npin),vvxim(npin),bpomim(npin)
+         elseif(jtu.eq.2)then                     !more than 1 cut Pomeron
+          ninc=npgen(vimu,2,20)
+          npin=npin+ninc
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          do i=npin-ninc+1,npin
+           xpomim(i)=1.d0/xpomz/scm
+           xpomip(i)=xpomri
+           vvxim(i)=0.d0
+           bpomim(i)=bbzp
+           if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *     ,vvxim(i),bpomim(i)
+          enddo
+         endif
+
+         if(jtd.eq.1)then                         !single cut Pomeron
+          npin=npin+1
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          xpomim(npin)=1.d0/xpomr/scm
+          xpomip(npin)=xpomz
+          vvxim(npin)=1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2
+          bpomim(npin)=bbzt
+          if(debug.ge.4)write (moniou,211)npin,xpomip(npin)
+     *    ,xpomim(npin),vvxim(npin),bpomim(npin)
+         elseif(jtu.eq.2)then                     !more than 1 cut Pomeron
+          ninc=npgen(vimd,2,20)
+          npin=npin+ninc
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          do i=npin-ninc+1,npin
+           xpomim(i)=1.d0/xpomr/scm
+           xpomip(i)=xpomz
+           vvxim(i)=0.d0
+           bpomim(i)=bbzt
+           if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *     ,vvxim(i),bpomim(i)
+          enddo
+         endif
+        endif
+       enddo          !end of the zigzag-loop
+      endif           !nzzp.ne.0
+
+      if(nzzt.ne.0)then
+       btm=(xb(it,1)-xxp)**2+(xb(it,2)-yyp)**2
+       xpomr0=max(dsqrt(xpomr/scm),sgap/scm)
+       xpomr0=min(xpomr0,xpomr/sgap)
+       rp1=(rq(iddt(it),2)+alfp*dlog(xpomr0*scm))*4.d0*.0389d0
+       rp2=alfp*dlog(xpomr/xpomr0)*4.d0*.0389d0
+       rp0=rp1*rp2/(rp1+rp2)
+       bbt=btm*(rp1/(rp1+rp2))**2
+       bbi=btm*(rp2/(rp1+rp2))**2
+       call qgbdef(bbt,bbi,xb(it,1),xb(it,2),xxp,yyp,xxp0,yyp0,1)
+       call qgfdf(xxp0,yyp0,xpomr0,vpac,vtac
+     * ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,it)
+
+       sumct0=0.d0
+       sumctt=0.d0
+       sumut=0.d0
+       vvxt0=0.d0
+       vvxt0l=0.d0
+       do i=1,ia(2)
+        sumut=sumut+vtac(i)
+       enddo
+       vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+       do i=1,ia(2)
+        itt=ia(2)-i+1
+        bbti=(xb(itt,1)-xxp0)**2+(xb(itt,2)-yyp0)**2
+        sumut=sumut-vtac(itt)
+        vtac0(itt)=min(vtac(itt)
+     *  ,qgfani(xpomr0*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *  ,1.d0-exp(-sumct0),1.d0-exp(-sumut),iddt(itt),2,3))
+        if(itt.ge.it)vtact(itt)=max(vtac(itt)
+     *  ,qgfani(xpomr0*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *  ,1.d0-exp(-sumctt),1.d0-exp(-sumut),iddt(itt),2,6))
+        if(itt.gt.it)then
+         vvxt0=vvxt0+vtac0(itt)
+         sumctt=sumctt+vtact(itt)
+        elseif(itt.lt.it)then
+         vvxt0l=vvxt0l+vtac0(itt)
+        endif
+        sumct0=sumct0+vtac0(itt)
+       enddo
+       vvxtt=1.d0-exp(-sumctt)
+       vvxt0=1.d0-exp(-vvxt0)
+       vvxt0l=1.d0-exp(-vvxt0l)
+
+       sumcp0=0.d0
+       sumup=0.d0
+       vvxp0=0.d0
+       vvxp0l=0.d0
+       do i=1,ia(1)
+        sumup=sumup+vpac(i)
+       enddo
+       vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+       do i=1,ia(1)
+        ipp=ia(1)-i+1
+        bbpi=(xa(ipp,1)+b-xxp0)**2+(xa(ipp,2)-yyp0)**2
+        sumup=sumup-vpac(ipp)
+        vpac0(ipp)=min(vpac(ipp)
+     *  ,qgfani(1.d0/xpomr0,bbpi,1.d0-vvxs*exp(-sumup)
+     *  ,1.d0-exp(-sumcp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+        if(ipp.gt.ip)then
+         vvxp0=vvxp0+vpac0(ipp)
+        elseif(ipp.lt.ip)then
+         vvxp0l=vvxp0l+vpac0(ipp)
+        endif
+        sumcp0=sumcp0+vpac0(ipp)
+       enddo
+       vvxp0=1.d0-exp(-vvxp0)
+       vvxp0l=1.d0-exp(-vvxp0l)
+
+       viu=qgpini(xpomr/xpomr0,bbi,0.d0,0.d0,2)
+       vim=2.d0*min(viu,qgpini(xpomr/xpomr0,bbi,0.d0,0.d0,8))
+       vvxpin=1.d0-(1.d0-vvxp0)*(1.d0-vvxp0l)*exp(-vpac0(ip))
+       vvxtin=1.d0-(1.d0-vvxt0)*(1.d0-vvxt0l)*exp(-vtac0(it))
+       vi=qgpini(xpomr/xpomr0,bbi,vvxtin,vvxpin,21)*(1.d0-exp(-viu))
+     * -qgpini(xpomr/xpomr0,bbi,vvxtin,vvxpin,23)*((1.d0-exp(-viu))**2
+     * +(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))/2.d0
+
+       vvx0s=(1.d0-vvxpin)**2
+       vvxs=((1.d0-vvxp)*(1.d0-vvxpl))**2*exp(-2.d0*vpac(ip))
+
+       gb0=vi                      *15.
+     * *((1.d0-exp(-vtact(it)))*(1.d0-vvxtt)*(1.d0-vvxs)
+     * +vvxs*(max(0.d0,1.d0-exp(-vtact(it))*(1.d0+vtact(it)))
+     * *(1.d0-vvxtt)
+     * -max(0.d0,1.d0-exp(-vtac0(it))*(1.d0+vtac0(it)))*(1.d0-vvxt0))
+     * +vtact(it)*exp(-vtact(it))*((1.d0-vvxtt)*vvxs
+     * -exp(vtact(it)-vtac0(it))*(1.d0-vvxt0)*(1.d0-vvxt0l)*vvx0s)
+     * -vtac0(it)*exp(-vtac0(it))*(1.d0-vvxt0)
+     * *(vvxs-vvx0s+vvxt0l*vvx0s))
+
+       do in=1,nzzt
+        nrej=0
+33      xpomri=xpomr/sgap/(xpomr*scm/sgap**2)**qgran(b10)
+        rp1=(rq(iddt(it),2)+alfp*dlog(xpomri*scm))*4.d0*.0389d0
+        rp2=alfp*dlog(xpomr/xpomri)*4.d0*.0389d0
+        rp=rp1*rp2/(rp1+rp2)
+        z=qgran(b10)
+        phi=pi*qgran(b10)
+        b0=dsqrt(-rp*dlog(z))
+        bbt=(dsqrt(btm)*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+        bbi=(dsqrt(btm)*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+        call qgbdef(bbt,bbi,xb(it,1),xb(it,2),xxp,yyp,xxi,yyi
+     *  ,int(1.5d0+qgran(b10)))   !coordinates for the vertex
+        call qgfdf(xxi,yyi,xpomri,vpac,vtac
+     *  ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,it)
+
+        sumct0=0.d0
+        sumctt=0.d0
+        sumut=0.d0
+        vvxt0=0.d0
+        vvxt0l=0.d0
+        do i=1,ia(2)
+         sumut=sumut+vtac(i)
+        enddo
+        vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+        do i=1,ia(2)
+         itt=ia(2)-i+1
+         bbti=(xb(itt,1)-xxi)**2+(xb(itt,2)-yyi)**2
+         sumut=sumut-vtac(itt)
+         vtac0(itt)=min(vtac(itt)
+     *   ,qgfani(xpomri*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *   ,1.d0-exp(-sumct0),1.d0-exp(-sumut),iddt(itt),2,3))
+         if(itt.ge.it)vtact(itt)=max(vtac(itt)
+     *   ,qgfani(xpomri*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *   ,1.d0-exp(-sumctt),1.d0-exp(-sumut),iddt(itt),2,6))
+         if(itt.gt.it)then
+          vvxt0=vvxt0+vtac0(itt)
+          sumctt=sumctt+vtact(itt)
+         elseif(itt.lt.it)then
+          vvxt0l=vvxt0l+vtac0(itt)
+         endif
+         sumct0=sumct0+vtac0(itt)
+        enddo
+        vvxtt=1.d0-exp(-sumctt)
+        vvxt0=1.d0-exp(-vvxt0)
+        vvxt0l=1.d0-exp(-vvxt0l)
+
+        sumcp0=0.d0
+        sumup=0.d0
+        vvxp0=0.d0
+        vvxp0l=0.d0
+        do i=1,ia(1)
+         sumup=sumup+vpac(i)
+        enddo
+        vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+        do i=1,ia(1)
+         ipp=ia(1)-i+1
+         bbpi=(xa(ipp,1)+b-xxi)**2+(xa(ipp,2)-yyi)**2
+         sumup=sumup-vpac(ipp)
+         vpac0(ipp)=min(vpac(ipp)
+     *   ,qgfani(1.d0/xpomri,bbpi,1.d0-vvxs*exp(-sumup)
+     *   ,1.d0-exp(-sumcp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+         if(ipp.gt.ip)then
+          vvxp0=vvxp0+vpac0(ipp)
+         elseif(ipp.lt.ip)then
+          vvxp0l=vvxp0l+vpac0(ipp)
+         endif
+         sumcp0=sumcp0+vpac0(ipp)
+        enddo
+        vvxp0=1.d0-exp(-vvxp0)
+        vvxp0l=1.d0-exp(-vvxp0l)
+
+        viu=qgpini(xpomr/xpomri,bbi,0.d0,0.d0,2)
+        vim=2.d0*min(viu,qgpini(xpomr/xpomri,bbi,0.d0,0.d0,8))
+        vvxpin=1.d0-(1.d0-vvxp0)*(1.d0-vvxp0l)*exp(-vpac0(ip))
+        vvxtin=1.d0-(1.d0-vvxt0)*(1.d0-vvxt0l)*exp(-vtac0(it))
+        vi=qgpini(xpomr/xpomri,bbi,vvxtin,vvxpin,21)*(1.d0-exp(-viu))
+     *  -qgpini(xpomr/xpomri,bbi,vvxtin,vvxpin,23)*((1.d0-exp(-viu))**2
+     *  +(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))/2.d0
+
+        vvx0s=(1.d0-vvxpin)**2
+        vvxs=((1.d0-vvxp)*(1.d0-vvxpl))**2*exp(-2.d0*vpac(ip))
+
+        gb=vi
+     *  *((1.d0-exp(-vtact(it)))*(1.d0-vvxtt)*(1.d0-vvxs)
+     *  +vvxs*(max(0.d0,1.d0-exp(-vtact(it))*(1.d0+vtact(it)))
+     *  *(1.d0-vvxtt)
+     *  -max(0.d0,1.d0-exp(-vtac0(it))*(1.d0+vtac0(it)))*(1.d0-vvxt0))
+     *  +vtact(it)*exp(-vtact(it))*((1.d0-vvxtt)*vvxs
+     *  -exp(vtact(it)-vtac0(it))*(1.d0-vvxt0)*(1.d0-vvxt0l)*vvx0s)
+     *  -vtac0(it)*exp(-vtac0(it))*(1.d0-vvxt0)
+     *  *(vvxs-vvx0s+vvxt0l*vvx0s))
+
+        gb=gb/gb0/z*rp/rp0
+        nrej=nrej+1
+        if(qgran(b10).gt.gb.and.nrej.lt.10000)goto 33
+
+        vi1p=qgpini(xpomr/xpomri,bbi,1.d0-(1.d0-vvxtin)**2*vvx0s
+     *  ,0.d0,16)*exp(-vim)
+        vimp=max(0.d0,(1.d0-exp(-vim)*(1.d0+vim)))/2.d0
+
+        if(qgran(b10).le.(vi1p+vimp)/vi
+     *  .or.xpomr/xpomri.lt.1.1d0*sgap**2)then
+         if(qgran(b10).le.vi1p/(vi1p+vimp))then   !single cut Pomeron
+          npin=npin+1
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          xpomim(npin)=1.d0/xpomri/scm
+          xpomip(npin)=xpomr
+          vvxim(npin)=1.d0-(1.d0-vvxtin)**2*vvx0s
+          bpomim(npin)=bbi
+          if(debug.ge.4)write (moniou,211)npin,xpomip(npin)
+     *    ,xpomim(npin),vvxim(npin),bpomim(npin)
+         else                                     !more than 1 cut pomeron
+          ninc=npgen(vim,2,20)
+          npin=npin+ninc
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          do i=npin-ninc+1,npin
+           xpomim(i)=1.d0/xpomri/scm
+           xpomip(i)=xpomr
+           vvxim(i)=0.d0
+           bpomim(i)=bbi
+           if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *     ,vvxim(i),bpomim(i)
+          enddo
+         endif
+
+        else                                      !additional vertices
+         xpomz0=dsqrt(xpomr*xpomri)
+         rp0=alfp*dlog(xpomr/xpomri)*.0389d0
+         xxz0=.5d0*(xxp+xxi)
+         yyz0=.5d0*(yyp+yyi)
+         bbzp=.25d0*bbi
+         bbzt=bbzp
+         call qgfdf(xxz0,yyz0,xpomz0,vpac,vtac,vvx,vvxp,vvxt
+     *   ,vvxpl,vvxtl,ip,it)
+
+         vvxp0=0.d0
+         sumup=0.d0
+         do i=1,ia(1)
+          sumup=sumup+vpac(i)
+         enddo
+         vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+         do i=1,ia(1)
+          ipp=ia(1)-i+1
+          bbpi=(xa(ipp,1)+b-xxz0)**2+(xa(ipp,2)-yyz0)**2
+          sumup=sumup-vpac(ipp)
+          vpac0(ipp)=min(vpac(ipp)
+     *    ,qgfani(1.d0/xpomz0,bbpi,1.d0-vvxs*exp(-sumup)
+     *    ,1.d0-exp(-vvxp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+          vvxp0=vvxp0+vpac0(ipp)
+         enddo
+         vvxp0=1.d0-exp(-vvxp0)
+
+         sumut=0.d0
+         vvxt0=0.d0
+         do i=1,ia(2)
+          sumut=sumut+vtac(i)
+         enddo
+         vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+         do i=1,ia(2)
+          itt=ia(2)-i+1
+          bbti=(xb(itt,1)-xxz0)**2+(xb(itt,2)-yyz0)**2
+          sumut=sumut-vtac(itt)
+          vtac0(itt)=min(vtac(itt)
+     *    ,qgfani(xpomz0*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *    ,1.d0-exp(-vvxt0),1.d0-exp(-sumut),iddt(itt),2,3))
+          vvxt0=vvxt0+vtac0(itt)
+         enddo
+         vvxt0=1.d0-exp(-vvxt0)
+
+         viu=qgpini(xpomr/xpomz0,bbzp,0.d0,0.d0,2)
+         vilu=1.d0-exp(-viu)
+         vimu=2.d0*min(viu,qgpini(xpomr/xpomz0,bbzp,0.d0,0.d0,8))
+         vimpu=max(0.d0,(1.d0-exp(-vimu)*(1.d0+vimu)))/2.d0
+         vid=qgpini(xpomz0/xpomri,bbzt,0.d0,0.d0,2)
+         vild=1.d0-exp(-vid)
+         vimd=2.d0*min(vid,qgpini(xpomz0/xpomri,bbzt,0.d0,0.d0,8))
+         vimpd=max(0.d0,(1.d0-exp(-vimd)*(1.d0+vimd)))/2.d0
+
+         vi1pu=qgpini(xpomr/xpomz0,bbzp
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimu)
+         vguu=qgpini(xpomr/xpomz0,bbzp,vvxp0,vvxt0,21)*vilu       !uu+uc
+         vgcu=qgpini(xpomr/xpomz0,bbzp,vvxp0,vvxt0,23)
+     *   *(vilu**2+(exp(2.d0*viu-vimu)-1.d0)*exp(-2.d0*viu))/2.d0 !cc+cu
+         vi1pd=qgpini(xpomz0/xpomri,bbzt
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimd)
+         vgud=qgpini(xpomz0/xpomri,bbzt,vvxt0,vvxp0,21)*vild      !uu+uc
+         vgcd=qgpini(xpomz0/xpomri,bbzt,vvxt0,vvxp0,23)
+     *   *(vild**2+(exp(2.d0*vid-vimd)-1.d0)*exp(-2.d0*vid))/2.d0 !cc+cu
+
+         gbz0=(vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd+vimpu*vgcd
+     *   +vgcu*vimpd+vi1pu*vgcd+vgcu*vi1pd)*(1.d0-vvxp0)*(1.d0-vvxt0)
+     *   +(vimpu+vi1pu)*vgud*(1.d0-vvxp0)*vvxt0
+     *   +(vimpd+vi1pd)*vguu*(1.d0-vvxt0)*vvxp0
+
+         nrej=0
+35       xpomz=xpomri*sgap*(xpomr/xpomri/sgap**2)**qgran(b10)
+         rpt=alfp*dlog(xpomz/xpomri)*4.d0*.0389d0
+         rpp=alfp*dlog(xpomr/xpomz)*4.d0*.0389d0
+         rp=rpp*rpt/(rpp+rpt)
+         z=qgran(b10)
+         phi=pi*qgran(b10)
+         b0=dsqrt(-rp*dlog(z))
+         bbzt=(dsqrt(bbi)*rpt/(rpp+rpt)-b0*cos(phi))**2
+     *   +(b0*sin(phi))**2
+         bbzp=(dsqrt(bbi)*rpp/(rpp+rpt)+b0*cos(phi))**2
+     *   +(b0*sin(phi))**2
+         call qgbdef(bbzt,bbzp,xxi,yyi,xxp,yyp,xxz,yyz
+     *   ,int(1.5d0+qgran(b10)))               !coordinates for the vertex
+         call qgfdf(xxz,yyz,xpomz,vpac,vtac
+     *   ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,it)
+
+         vvxp0=0.d0
+         sumup=0.d0
+         do i=1,ia(1)
+          sumup=sumup+vpac(i)
+         enddo
+         vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+         do i=1,ia(1)
+          ipp=ia(1)-i+1
+          bbpi=(xa(ipp,1)+b-xxz)**2+(xa(ipp,2)-yyz)**2
+          sumup=sumup-vpac(ipp)
+          vpac0(ipp)=min(vpac(ipp)
+     *    ,qgfani(1.d0/xpomz,bbpi,1.d0-vvxs*exp(-sumup)
+     *    ,1.d0-exp(-vvxp0),1.d0-exp(-sumup),iddp(ipp),icz,3))
+          vvxp0=vvxp0+vpac0(ipp)
+         enddo
+         vvxp0=1.d0-exp(-vvxp0)
+
+         sumut=0.d0
+         vvxt0=0.d0
+         do i=1,ia(2)
+          sumut=sumut+vtac(i)
+         enddo
+         vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+         do i=1,ia(2)
+          itt=ia(2)-i+1
+          bbti=(xb(itt,1)-xxz)**2+(xb(itt,2)-yyz)**2
+          sumut=sumut-vtac(itt)
+          vtac0(itt)=min(vtac(itt)
+     *    ,qgfani(xpomz*scm,bbti,1.d0-vvxs*exp(-sumut)
+     *    ,1.d0-exp(-vvxt0),1.d0-exp(-sumut),iddt(itt),2,3))
+          vvxt0=vvxt0+vtac0(itt)
+         enddo
+         vvxt0=1.d0-exp(-vvxt0)
+
+         viu=qgpini(xpomr/xpomz,bbzp,0.d0,0.d0,2)
+         vilu=1.d0-exp(-viu)
+         vimu=2.d0*min(viu,qgpini(xpomr/xpomz,bbzp,0.d0,0.d0,8))
+         vimpu=max(0.d0,(1.d0-exp(-vimu)*(1.d0+vimu)))/2.d0
+         vid=qgpini(xpomz/xpomri,bbzt,0.d0,0.d0,2)
+         vild=1.d0-exp(-vid)
+         vimd=2.d0*min(vid,qgpini(xpomz/xpomri,bbzt,0.d0,0.d0,8))
+         vimpd=max(0.d0,(1.d0-exp(-vimd)*(1.d0+vimd)))/2.d0
+
+         vi1pu=qgpini(xpomr/xpomz,bbzp
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimu)
+         vguu=qgpini(xpomr/xpomz,bbzp,vvxp0,vvxt0,21)*vilu        !uu+uc
+         vgcu=qgpini(xpomr/xpomz,bbzp,vvxp0,vvxt0,23)
+     *   *(vilu**2+(exp(2.d0*viu-vimu)-1.d0)*exp(-2.d0*viu))/2.d0 !cc+cu
+         vi1pd=qgpini(xpomz/xpomri,bbzt
+     *   ,1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2,0.d0,16)*exp(-vimd)
+         vgud=qgpini(xpomz/xpomri,bbzt,vvxt0,vvxp0,21)*vild       !uu+uc
+         vgcd=qgpini(xpomz/xpomri,bbzt,vvxt0,vvxp0,23)
+     *   *(vild**2+(exp(2.d0*vid-vimd)-1.d0)*exp(-2.d0*vid))/2.d0 !cc+cu
+
+         vvcc=vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd+vimpu*vgcd+vgcu*vimpd
+     *   +vi1pu*vgcd+vgcu*vi1pd
+         vvt=vvcc*(1.d0-vvxp0)*(1.d0-vvxt0)
+     *   +(vimpu+vi1pu)*vgud*(1.d0-vvxp0)*vvxt0
+     *   +(vimpd+vi1pd)*vguu*(1.d0-vvxt0)*vvxp0
+
+         gbz=vvt/gbz0/z*rp/rp0    /1.4d0
+         nrej=nrej+1
+         if(qgran(b10).gt.gbz.and.nrej.lt.10000)goto 35
+
+         aks=vvt*qgran(b10)
+         if(aks.gt.vvcc*(1.d0-vvxp0)*(1.d0-vvxt0)
+     *   +(vimpu+vi1pu)*vgud*(1.d0-vvxp0)*vvxt0)then
+          jtu=0
+          if(qgran(b10).lt.vimpd/(vimpd+vi1pd))then
+           jtd=2
+          else
+           jtd=1
+          endif
+         elseif(aks.gt.vvcc*(1.d0-vvxp0)*(1.d0-vvxt0))then
+          jtd=0
+          if(qgran(b10).lt.vimpu/(vimpu+vi1pu))then
+           jtu=2
+          else
+           jtu=1
+          endif
+         else
+          aks=vvcc*qgran(b10)
+          if(aks.lt.vimpu*vimpd)then
+           jtu=2
+           jtd=2
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd)then
+           jtu=2
+           jtd=1
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd)then
+           jtu=1
+           jtd=2
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd
+     *    +vimpu*vgcd)then
+           jtu=2
+           jtd=0
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd
+     *    +vimpu*vgcd+vgcu*vimpd)then
+           jtu=0
+           jtd=2
+          elseif(aks.lt.vimpu*vimpd+vimpu*vi1pd+vi1pu*vimpd
+     *    +vimpu*vgcd+vgcu*vimpd+vi1pu*vgcd)then
+           jtu=1
+           jtd=0
+          else
+           jtu=0
+           jtd=1
+          endif
+         endif
+
+         if(jtu.eq.1)then                         !single cut Pomeron
+          npin=npin+1
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          xpomim(npin)=1.d0/xpomz/scm
+          xpomip(npin)=xpomr
+          vvxim(npin)=1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2
+          bpomim(npin)=bbzp
+          if(debug.ge.4)write (moniou,211)npin,xpomip(npin)
+     *    ,xpomim(npin),vvxim(npin),bpomim(npin)
+         elseif(jtu.eq.2)then                     !more than 1 cut Pomeron
+          ninc=npgen(vimu,2,20)
+          npin=npin+ninc
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          do i=npin-ninc+1,npin
+           xpomim(i)=1.d0/xpomz/scm
+           xpomip(i)=xpomr
+           vvxim(i)=0.d0
+           bpomim(i)=bbzp
+           if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *     ,vvxim(i),bpomim(i)
+          enddo
+         endif
+
+         if(jtd.eq.1)then                         !single cut Pomeron
+          npin=npin+1
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          xpomim(npin)=1.d0/xpomri/scm
+          xpomip(npin)=xpomz
+          vvxim(npin)=1.d0-((1.d0-vvxp0)*(1.d0-vvxt0))**2
+          bpomim(npin)=bbzt
+          if(debug.ge.4)write (moniou,211)npin,xpomip(npin)
+     *    ,xpomim(npin),vvxim(npin),bpomim(npin)
+         elseif(jtu.eq.2)then                     !more than 1 cut Pomeron
+          ninc=npgen(vimd,2,20)
+          npin=npin+ninc
+          if(npin.gt.npmax)then
+           iret=1
+           goto 31
+          endif
+          do i=npin-ninc+1,npin
+           xpomim(i)=1.d0/xpomri/scm
+           xpomip(i)=xpomz
+           vvxim(i)=0.d0
+           bpomim(i)=bbzt
+           if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *     ,vvxim(i),bpomim(i)
+          enddo
+         endif
+        endif
+       enddo          !end of the zigzag-loop
+      endif           !nzzt.ne.0
+
+      call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *,ip,it)
+      if((jt.eq.2.or.jt.eq.3.or.jt.eq.9)
+     *.and.qgran(b10).lt.(1.d0-exp(-vpac(ip)))*(1.d0-vvxpl)
+     */((1.d0-exp(-vpac(ip)))*(1.d0-vvxpl)+2.d0*vvxpl))then
+       icdps=iddp(ip)
+       do icdp=1,2
+        iddp(ip)=icdp
+        call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *  ,ip,it)
+        wdp(icdp,ip)=(1.d0-exp(-vpac(ip)))*(1.d0-vvxpl)
+       enddo
+       iddp(ip)=icdps
+      endif
+      call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *,ip,it)
+      if((jt.eq.2.or.jt.eq.4.or.jt.eq.10)
+     *.and.qgran(b10).lt.(1.d0-exp(-vtac(it)))*(1.d0-vvxtl)
+     */((1.d0-exp(-vtac(it)))*(1.d0-vvxtl)+2.d0*vvxtl))then
+       icdts=iddt(it)
+       do icdt=1,2
+        iddt(it)=icdt
+        call qgfdf(xxp,yyp,xpomr,vpac,vtac,vvx,vvxp,vvxt,vvxpl,vvxtl
+     *  ,ip,it)
+        wdt(icdt,it)=(1.d0-exp(-vtac(it)))*(1.d0-vvxtl)
+       enddo
+       iddt(it)=icdts
+      endif
+
+      if(nppr0.eq.0)goto 20
+
+c projectile 'fans'
+      m=0
+      nppm(1)=nppr0
+      xpomm(1)=xpomr
+      wgpm(1)=wgpr0
+      xxm(1)=xxp
+      yym(1)=yyp
+      do i=1,nppr0
+       ippm(i,1)=ippr0(i)
+       itypm(i,1)=itypr0(i)
+      enddo
+
+9     m=m+1                                 !next level multi-Pomeron vertex
+      if(m.gt.levmax)then
+       iret=1
+       goto 31
+      endif
+      ii(m)=0
+10    ii(m)=ii(m)+1                         !next cut fan in the vertex
+      if(ii(m).gt.nppm(m))then              !all fans at the level considered
+       m=m-1                                !one level down
+       if(m.eq.0)goto 20                    !all proj. fans considered
+       goto 10
+      endif
+      l=ii(m)
+      ipp=ippm(l,m)                         !proj. index for the leg
+      itypom=itypm(l,m)                     !type of the cut
+      bpm=(xa(ipp,1)+b-xxm(m))**2+(xa(ipp,2)-yym(m))**2      !b^2 for the leg
+      if(debug.ge.4)write (moniou,208)ii(m),m,ipp,bpm
+      if(xpomm(m)*sgap**2.gt.1.d0)stop'xpomm(m)*sgap**2>1!'
+      if(itypom.eq.4.and.xpomm(m)*sgap**3.gt.1.d0)
+     *stop'4:xpomm(m)*sgap**3>1!'
+
+      if(debug.ge.4)write (moniou,210)m
+      xpomr0=min(dsqrt(xpomm(m)),1.d0/sgap)
+      xpomr0=max(xpomr0,xpomm(m)*sgap)
+      if(itypom.eq.4)xpomr0=min(xpomr0,dsqrt(xpomm(m)/sgap))
+      rp1=(rq(iddp(ipp),icz)-alfp*dlog(xpomr0))*4.d0*.0389d0
+      rp2=alfp*dlog(xpomr0/xpomm(m))*4.d0*.0389d0
+      rp0=rp1*rp2/(rp1+rp2)
+      bbp=bpm*(rp1/(rp1+rp2))**2
+      bbi=bpm*(rp2/(rp1+rp2))**2
+      call qgbdef(bbp,bbi,xa(ipp,1)+b,xa(ipp,2),xxm(m),yym(m)
+     *,xxp0,yyp0,1)
+
+      call qgfdf(xxp0,yyp0,xpomr0,vpac,vtac,vvx,vvxp,vvxt
+     *,vvxpl,vvxtl,ipp,it)
+      vvxts=1.d0-(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+      viu=qgpini(xpomr0/xpomm(m),bbi,0.d0,0.d0,2)
+      vim=2.d0*min(viu,qgpini(xpomr0/xpomm(m),bbi,0.d0,0.d0,8))
+      if(itypom.eq.-1.or.itypom.eq.4)then         !single cut Pomeron at the end
+       vvxi=1.d0-((1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt))**2
+     * *exp(-2.d0*vpac(ipp)-2.d0*vtac(it))
+       vip=qgpini(xpomr0/xpomm(m),bbi,vvxi,0.d0,16)*exp(-vim)
+      elseif(itypom.eq.2.or.itypom.eq.7)then       !>1 cut Poms at the end
+       vimp=max(0.d0,1.d0-exp(-vim)*(1.d0+vim))
+      else                                         !rap-gap
+       vvxpin=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ipp))
+       vvxtin=1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+       viuu=qgpini(xpomr0/xpomm(m),bbi,vvxpin,vvxtin,20)
+     * *(1.d0-exp(-viu))
+       viuc=max(0.d0,viuu
+     * -qgpini(xpomr0/xpomm(m),bbi,vvxpin,vvxtin,21)*(1.d0-exp(-viu)))
+       vicc=qgpini(xpomr0/xpomm(m),bbi,vvxpin,vvxtin,22)*.5d0
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+       vicu=max(0.d0,qgpini(xpomr0/xpomm(m),bbi,vvxpin,vvxtin,23)*.5d0
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+     * -vicc)
+      endif
+
+      if(itypom.le.3)then
+       sumup=0.d0
+       vvxp0=0.d0
+       do i=1,ia(1)
+        sumup=sumup+vpac(i)
+       enddo
+       vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+       do i=1,ia(1)-ipp+1
+        ipi=ia(1)-i+1
+        bbl=(xa(ipi,1)+b-xxp0)**2+(xa(ipi,2)-yyp0)**2
+        sumup=sumup-vpac(ipi)
+        vpac0(ipi)=min(vpac(ipi)
+     *  ,qgfani(1.d0/xpomr0,bbl,1.d0-vvxs*exp(-sumup)
+     *  ,1.d0-exp(-vvxp0),1.d0-exp(-sumup),iddp(ipi),icz,3))
+        if(ipi.gt.ipp)vvxp0=vvxp0+vpac0(ipi)
+       enddo
+       vvxp0=1.d0-exp(-vvxp0)
+       vpacng=min(vpac0(ipp)
+     * ,qgfani(1.d0/xpomr0,bbp,vvxts,vvxp0,vvxpl,iddp(ipp),icz,4))
+       vpacpe=min(vpacng
+     * ,qgfani(1.d0/xpomr0,bbp,vvxts,vvxp0,vvxpl,iddp(ipp),icz,5))
+      else
+       vplc=qgfani(1.d0/xpomr0,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,7)
+       vplc0=min(vplc
+     * ,qgfani(1.d0/xpomr0,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,8))
+       vplcng=min(vplc0
+     * ,qgfani(1.d0/xpomr0,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,11))
+       vplcpe=min(vplcng
+     * ,qgfani(1.d0/xpomr0,bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,10))
+      endif
+
+      if(itypom.eq.-1)then          !'fan' (single cut Pomeron at the end)
+       gb0=vip*((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*((vpac0(ipp)-vpacpe)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)-(vpac(ipp)-vpac0(ipp))*(1.d0-exp(-vpac(ipp))
+     * *(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ipp))*(1.d0-vvxp))
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)*exp(-2.d0*vtac(it))
+       gb0=gb0*40.d0
+      elseif(itypom.eq.0)then      !'fan' (cut loop at the end - rapgap)
+       gb0=((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl))
+     * *(vicc*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * -vicu*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))))
+     * *(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+     * -2.d0*vicu*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp)-vtac(it))
+     * *(1.d0-vvx)*(1.d0-vvxt)
+      elseif(itypom.eq.1)then      !'fan' (uncut end - rapgap)
+       gb0=((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl))
+     * *(viuc*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * +viuu*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))))
+     * *(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+     * +2.d0*viuu*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp)-vtac(it))
+     * *(1.d0-vvx)*(1.d0-vvxt)
+      elseif(itypom.eq.2)then        !'fan' (>1 cut Poms at the end)
+       gb0=vimp*((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*(vpac0(ipp)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)-(vpac(ipp)-vpac0(ipp))*(1.d0-exp(-vpac(ipp))
+     * *(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ipp))*(1.d0-vvxp))
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)*exp(-2.d0*vtac(it))
+      elseif(itypom.eq.3)then      !'fan' (cut/uncut end - rapgap)
+       gb0=((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl))
+     * *(vicc-wgpm(m)*viuc)*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * *(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+      elseif(itypom.eq.4)then          !'leg' (single cut Pomeron at the end)
+       gb0=vip*((vplc0-vplcpe)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl))*exp(-vpac(ipp)-2.d0*vtac(it))*(1.d0-vvxp)
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+       if(gb0.le.0.d0)then
+        gb0=vip*vplc0*.01d0*exp(-vpac(ipp))*(1.d0-vvxp)
+     *  *(1.d0-vvxpl)*exp(-vpac(ipp)-2.d0*vtac(it))*(1.d0-vvxp)
+     *  *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+       endif
+      elseif(itypom.eq.5)then      !'leg' (cut/uncut end - rapgap)
+       gb0=vplcng*exp(-2.d0*vpac(ipp)-vtac(it))
+     * *(1.d0-vvxp)**2*(1.d0-vvxpl)*(1.d0-vvx)*(1.d0-vvxt)
+     * *(vicc-wgpm(m)*viuc)*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+      elseif(itypom.eq.7)then      !'leg' (>1 cut Poms at the end)
+       gb0=vimp*(vplc0*exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)
+     * -(vplc-vplc0)*(1.d0-exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)))
+     * *exp(-vpac(ipp)-2.d0*vtac(it))*(1.d0-vvxp)
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+      endif
+      if(gb0.le.0.d0)then      !so170712
+       iret=1
+       goto 31
+      endif
+      nrej=0
+
+11    xpomm(m+1)=(xpomm(m)*sgap**2)**qgran(b10)/sgap
+      if(itypom.eq.4)xpomm(m+1)=(xpomm(m)*sgap**3)**qgran(b10)/sgap**2
+      rp1=(rq(iddp(ipp),icz)-alfp*dlog(xpomm(m+1)))*4.d0*.0389d0
+      rp2=alfp*dlog(xpomm(m+1)/xpomm(m))*4.d0*.0389d0
+      rp=rp1*rp2/(rp1+rp2)
+      z=qgran(b10)
+      phi=pi*qgran(b10)
+      b0=dsqrt(-rp*dlog(z))
+      bbp=(dsqrt(bpm)*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+      bbi=(dsqrt(bpm)*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+      call qgbdef(bbp,bbi,xa(ipp,1)+b,xa(ipp,2),xxm(m),yym(m)
+     *,xxm(m+1),yym(m+1),int(1.5d0+qgran(b10)))   !coordinates for the vertex
+
+      call qgfdf(xxm(m+1),yym(m+1),xpomm(m+1),vpac,vtac
+     *,vvx,vvxp,vvxt,vvxpl,vvxtl,ipp,it)
+      vvxts=1.d0-(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+      viu=qgpini(xpomm(m+1)/xpomm(m),bbi,0.d0,0.d0,2)
+      vim=2.d0*min(viu,qgpini(xpomm(m+1)/xpomm(m),bbi,0.d0,0.d0,8))
+      if(itypom.eq.-1.or.itypom.eq.4)then         !single cut Pomeron at the end
+       vvxi=1.d0-((1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt))**2
+     * *exp(-2.d0*vpac(ipp)-2.d0*vtac(it))
+       vip=qgpini(xpomm(m+1)/xpomm(m),bbi,vvxi,0.d0,16)*exp(-vim)
+      elseif(itypom.eq.2.or.itypom.eq.7)then       !>1 cut Poms at the end
+       vimp=max(0.d0,1.d0-exp(-vim)*(1.d0+vim))
+      else                                         !rap-gap
+       vvxpin=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ipp))
+       vvxtin=1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+       viuu=qgpini(xpomm(m+1)/xpomm(m),bbi,vvxpin,vvxtin,20)
+     * *(1.d0-exp(-viu))
+       viuc=max(0.d0,viuu-qgpini(xpomm(m+1)/xpomm(m),bbi
+     * ,vvxpin,vvxtin,21)*(1.d0-exp(-viu)))
+       vicc=qgpini(xpomm(m+1)/xpomm(m),bbi,vvxpin,vvxtin,22)*.5d0
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+       vicu=max(0.d0,qgpini(xpomm(m+1)/xpomm(m),bbi,vvxpin,vvxtin,23)
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+     * /2.d0-vicc)
+      endif
+
+      if(itypom.le.3)then
+       sumup=0.d0
+       vvxp0=0.d0
+       do i=1,ia(1)
+        sumup=sumup+vpac(i)
+       enddo
+       vvxs=(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+       do i=1,ia(1)-ipp+1
+        ipi=ia(1)-i+1
+        bbl=(xa(ipi,1)+b-xxm(m+1))**2+(xa(ipi,2)-yym(m+1))**2
+        sumup=sumup-vpac(ipi)
+        vpac0(ipi)=min(vpac(ipi)
+     *  ,qgfani(1.d0/xpomm(m+1),bbl,1.d0-vvxs*exp(-sumup)
+     *  ,1.d0-exp(-vvxp0),1.d0-exp(-sumup),iddp(ipi),icz,3))
+        if(ipi.gt.ipp)vvxp0=vvxp0+vpac0(ipi)
+       enddo
+       vvxp0=1.d0-exp(-vvxp0)
+
+       vpacng=min(vpac0(ipp)
+     * ,qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp0,vvxpl,iddp(ipp),icz,4))
+       vpacpe=min(vpacng
+     * ,qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp0,vvxpl,iddp(ipp),icz,5))
+      else
+       vplc=qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp,vvxpl,iddp(ipp)
+     * ,icz,7)
+       vplc0=min(vplc
+     * ,qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,8))
+       vplcng=min(vplc0
+     * ,qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,11))
+       vplcpe=min(vplcng
+     * ,qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,10))
+      endif
+
+      if(itypom.eq.-1)then          !'fan' (single cut Pomeron at the end)
+       gb=vip*((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*((vpac0(ipp)-vpacpe)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)-(vpac(ipp)-vpac0(ipp))*(1.d0-exp(-vpac(ipp))
+     * *(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ipp))*(1.d0-vvxp))
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)*exp(-2.d0*vtac(it))
+      elseif(itypom.eq.0)then      !'fan' (cut loop at the end - rapgap)
+       gb=((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl))
+     * *(vicc*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * -vicu*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))))
+     * *(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+     * -2.d0*vicu*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp)-vtac(it))
+     * *(1.d0-vvx)*(1.d0-vvxt)
+      elseif(itypom.eq.1)then      !'fan' (uncut end - rapgap)
+       gb=((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl))
+     * *(viuc*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * +viuu*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))))
+     * *(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+     * +2.d0*viuu*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp)-vtac(it))
+     * *(1.d0-vvx)*(1.d0-vvxt)
+      elseif(itypom.eq.2)then        !'fan' (>1 cut Poms at the end)
+       gb=vimp*((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*(vpac0(ipp)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)-(vpac(ipp)-vpac0(ipp))*(1.d0-exp(-vpac(ipp))
+     * *(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ipp))*(1.d0-vvxp))
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)*exp(-2.d0*vtac(it))
+      elseif(itypom.eq.3)then      !'fan' (cut/uncut end - rapgap)
+       gb=((max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+     * +((1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl)
+     * +2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl))
+     * *((vicc-wgpm(m)*viuc)*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * -(vicu+wgpm(m)*viuu)*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)
+     * *exp(-vtac(it))))*(1.d0-vvx)*(1.d0-vvxt)*exp(-vtac(it))
+     * -2.d0*(vicu+wgpm(m)*viuu)*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))
+     * -1.d0-(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp)-vtac(it))
+     * *(1.d0-vvx)*(1.d0-vvxt)
+      elseif(itypom.eq.4)then          !'leg' (single cut Pomeron at the end)
+       gb=vip*((vplc0-vplcpe)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)-(vplc-vplc0)*(1.d0-exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)))*exp(-vpac(ipp)-2.d0*vtac(it))*(1.d0-vvxp)
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+      elseif(itypom.eq.5)then      !'leg' (cut/uncut end - rapgap)
+       gb=vplcng*exp(-2.d0*vpac(ipp)-vtac(it))
+     * *(1.d0-vvxp)**2*(1.d0-vvxpl)*(1.d0-vvx)*(1.d0-vvxt)
+     * *((vicc-wgpm(m)*viuc)*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * -(vicu+wgpm(m)*viuu)*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)
+     * *exp(-vtac(it))))
+      elseif(itypom.eq.7)then      !'leg' (>1 cut Poms at the end)
+       gb=vimp*(vplc0*exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)
+     * -(vplc-vplc0)*(1.d0-exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)))
+     * *exp(-vpac(ipp)-2.d0*vtac(it))*(1.d0-vvxp)
+     * *(1.d0-vvx)*(1.d0-vvxt)**2*(1.d0-vvxtl)
+      endif
+      gb=gb/gb0/z*rp/rp0  /10.d0
+      nrej=nrej+1
+      if(qgran(b10).gt.gb.and.nrej.le.1000)goto 11
+
+      if(itypom.eq.-1.or.itypom.eq.4)then  !'single cut Pomeron in the handle
+       npin=npin+1
+       if(npin.gt.npmax)then
+        iret=1
+        goto 31
+       endif
+       xpomim(npin)=1.d0/xpomm(m)/scm
+       xpomip(npin)=xpomm(m+1)
+       vvxim(npin)=vvxi
+       bpomim(npin)=bbi
+       if(debug.ge.4)write (moniou,211)npin,xpomip(npin),xpomim(npin)
+     * ,vvxim(npin),bpomim(npin)
+      elseif(itypom.eq.2.or.itypom.eq.7)then   !>1 cut Pomerons in the handle
+       ninc=npgen(vim,2,20)
+       npin=npin+ninc
+       if(npin.gt.npmax)then
+        iret=1
+        goto 31
+       endif
+       do i=npin-ninc+1,npin
+        xpomim(i)=1.d0/xpomm(m)/scm
+        xpomip(i)=xpomm(m+1)
+        vvxim(i)=0.d0
+        bpomim(i)=bbi
+        if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *  ,vvxim(i),bpomim(i)
+       enddo
+      endif
+
+      if(itypom.eq.-1)then      !single cut Pomeron in the 'handle'
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+       vv2=(1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl
+       vv3=2.d0*((vpac0(ipp)-vpacpe)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)-(vpac(ipp)-vpac0(ipp))*(1.d0-exp(-vpac(ipp))
+     * *(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ipp))*(1.d0-vvxp)
+       if(xpomm(m+1)*sgap**2.gt..9d0.or.vv3.lt.0.d0)vv3=0.d0
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+      elseif(itypom.eq.0)then    !cut 'loop' in the 'handle' (rap-gap)
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp)-vtac(it))
+     * *(1.d0-vvxt)*(1.d0-vvxtl)*(vicc+vicu)
+     * /(vicc*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * -vicu*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))))
+       vv2=(1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl
+       vv3=2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl)
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+      elseif(itypom.eq.1)then    !uncut 'handle' (rap-gap)
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+       vv2=(1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl
+       vv3=2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2*(1.d0-vvxpl)
+       vv4=2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0-(vpac(ipp)
+     * -vpac0(ipp)))*(1.d0-vvxp0)+(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))
+     * *exp(-vpac(ipp))*viuu/(viuu*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)
+     * *exp(-vtac(it)))+viuc*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it)))
+       if(xpomm(m+1)*sgap**2.gt..9d0.or.vv4.lt.0.d0)vv4=0.d0
+       aks=(vv1+vv2+vv3+vv4)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       elseif(aks.lt.vv1+vv2+vv3)then
+        jt=3                     !1 cut fan
+       else
+        jt=4                     !>1 cut 'handle' fans
+       endif
+      elseif(itypom.eq.2)then    !>1 cut Pomerons in the 'handle'
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))*exp(-vpac(ipp))
+       vv2=(1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl
+       vv3=2.d0*(vpac0(ipp)*exp(-vpac(ipp))*(1.d0-vvxp)
+     * *(1.d0-vvxpl)-(vpac(ipp)-vpac0(ipp))*(1.d0-exp(-vpac(ipp))
+     * *(1.d0-vvxp)*(1.d0-vvxpl)))*exp(-vpac(ipp))*(1.d0-vvxp)
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+
+      elseif(itypom.eq.3)then    !rap-gap in the 'handle'
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vpac(ipp))
+     * *(1.d0+2.d0*vpac(ipp)))+2.d0*vpac(ipp)*exp(-2.d0*vpac(ipp))
+     * *(1.d0-(1.d0-vvxp)**2))*(1.d0-vvxpl)
+     * -2.d0*(max(0.d0,exp(vpac(ipp)-vpac0(ipp))-1.d0
+     * -(vpac(ipp)-vpac0(ipp)))*(1.d0-vvxp0)
+     * +(vpac(ipp)-vpac0(ipp))*(vvxp-vvxp0))
+     * *exp(-vpac(ipp)-vtac(it))*(1.d0-vvxt)*(1.d0-vvxtl)
+     * *(vicc+vicu+wgpm(m)*(viuu-viuc))
+     * /((vicc-wgpm(m)*viuc)*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     * -(vicu+wgpm(m)*viuu)*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)
+     * *exp(-vtac(it))))
+       vv2=(1.d0-exp(-vpac(ipp)))**2*(1.d0-vvxpl)
+     * +2.d0*(1.d0-exp(-vpac(ipp)))*vvxpl
+       vv3=2.d0*vpacng*exp(-2.d0*vpac(ipp))*(1.d0-vvxp)**2
+     * *(1.d0-vvxpl)
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+      else
+       jt=5                      !cut leg
+      endif
+
+      nppm(m+1)=0
+      wgpm(m+1)=0.d0
+      if(jt.eq.1)then                        !>1 cut fans
+       ntry=0
+12     ntry=ntry+1
+       nphm=0
+       if(ipp.eq.ia(1).or.ntry.gt.100)then
+        nppm(m+1)=npgen(2.d0*vpac(ipp),2,20)
+        do i=1,nppm(m+1)
+         if(qgran(b10).le.vpac0(ipp)/vpac(ipp)
+     *   .or.xpomm(m+1)*sgap**2.gt..9d0)then
+          itypm(i,m+1)=0
+         else
+          itypm(i,m+1)=1
+          nphm=nphm+1
+         endif
+         ippm(i,m+1)=ipp
+        enddo
+        wh=(vpac(ipp)/vpac0(ipp)-1.d0)/nppm(m+1)
+       else
+        nppm(m+1)=npgen(2.d0*vpac(ipp),1,20)
+        do i=1,nppm(m+1)
+         if(qgran(b10).le.vpac0(ipp)/vpac(ipp)
+     *   .or.xpomm(m+1)*sgap**2.gt..9d0)then
+          itypm(i,m+1)=0
+         else
+          itypm(i,m+1)=1
+          nphm=nphm+1
+         endif
+         ippm(i,m+1)=ipp
+        enddo
+        wh=(vpac(ipp)/vpac0(ipp)-1.d0)/nppm(m+1)
+        do ipi=ipp+1,ia(1)
+         ninc=npgen(2.d0*vpac(ipi),0,20)
+         if(ninc.ne.0)then
+          nppm(m+1)=nppm(m+1)+ninc
+          nh0=nphm
+          if(nppm(m+1).gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nppm(m+1)-ninc+1,nppm(m+1)
+           if(qgran(b10).le.vpac0(ipi)/vpac(ipi)
+     *     .or.xpomm(m+1)*sgap**2.gt..9d0)then
+            itypm(i,m+1)=0
+           else
+            itypm(i,m+1)=1
+            nphm=nphm+1
+           endif
+           ippm(i,m+1)=ipi
+          enddo
+          if(ninc.gt.nphm-nh0)wh=(vpac(ipi)/vpac0(ipi)-1.d0)/ninc
+         endif
+        enddo
+        if(nppm(m+1).eq.1)goto 12
+       endif
+
+       if(nphm+1.ge.nppm(m+1))then
+        if(itypom.eq.-1.or.itypom.eq.1.or.itypom.eq.2)then
+         gbt=1.d0-exp(vpac(ipp)+(1.d0-nphm)*dlog(2.d0))
+     *   /(1.d0-vvxp)/(1.d0-vvxpl)
+        elseif(itypom.eq.0)then
+         gbt=1.d0-(vicc+vicu)*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     *   /(vicc*(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     *   -vicu*(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))))
+     *   *exp(vpac(ipp)+(1.d0-nphm)*dlog(2.d0))
+     *   /(1.d0-vvxp)/(1.d0-vvxpl)
+        elseif(itypom.eq.3)then
+         gbt=1.d0-(vicc+vicu+wgpm(m)*(viuu-viuc))
+     *   *(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))
+     *   /((vicc-wgpm(m)*viuc)*(1.d0-vvxt)*(1.d0-vvxtl)
+     *   *exp(-vtac(it))-(vicu+wgpm(m)*viuu)
+     *   *(1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(it))))
+     *   *exp(vpac(ipp)+(1.d0-nphm)*dlog(2.d0))
+     *   /(1.d0-vvxp)/(1.d0-vvxpl)
+        else
+         stop'unknown itypom'
+        endif
+        if(nphm.eq.nppm(m+1).and.qgran(b10).gt.gbt
+     *  .or.nphm+1.eq.nppm(m+1).and.qgran(b10).gt.1.d0+wh*gbt)then
+         ntry=0
+          goto 12
+        endif
+       endif
+
+      elseif(jt.eq.4)then                    !>1 cut 'handle' fans
+       ntry=0
+14     ntry=ntry+1
+       if(ipp.eq.ia(1).or.ntry.gt.100)then
+        nppm(m+1)=npgen(vpac(ipp)-vpac0(ipp),2,20)
+        do i=1,nppm(m+1)
+          itypm(i,m+1)=1
+         ippm(i,m+1)=ipp
+        enddo
+       else
+        nppm(m+1)=npgen(vpac(ipp)-vpac0(ipp),1,20)
+        do i=1,nppm(m+1)
+         itypm(i,m+1)=1
+         ippm(i,m+1)=ipp
+        enddo
+        do ipi=ipp+1,ia(1)
+         ninc=npgen(vpac(ipi)-vpac0(ipi),0,20)
+         if(ninc.ne.0)then
+          nppm(m+1)=nppm(m+1)+ninc
+          if(nppm(m+1).gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nppm(m+1)-ninc+1,nppm(m+1)
+           itypm(i,m+1)=1
+           ippm(i,m+1)=ipi
+          enddo
+         endif
+        enddo
+        if(nppm(m+1).eq.1)goto 14
+       endif
+
+      elseif(jt.eq.3)then                    !1 cut fan
+       nppm(m+1)=1
+       ippm(1,m+1)=ipp
+       if(itypom.eq.-1)then             !single cut Pomeron in the 'handle'
+        factor=exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)
+        wng=(vpacng-vpacpe)*factor/((vpac0(ipp)-vpacpe)*factor
+     *  -(vpac(ipp)-vpac0(ipp))*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0
+     *  .or.xpomm(m+1)*sgap**2.gt..9d0)then
+         itypm(1,m+1)=2          !>1 cut Pomerons in the 'handle'
+        else
+         itypm(1,m+1)=3          !rap-gap in the 'handle'
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       elseif(itypom.eq.2)then          !>1 cut Pomerons in the 'handle'
+        factor=exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)
+        wng=vpacng*factor/(vpac0(ipp)*factor
+     *  -(vpac(ipp)-vpac0(ipp))*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0
+     *  .or.xpomm(m+1)*sgap**2.gt..9d0)then
+         if(qgran(b10).le.vpacpe/vpacng
+     *   .or.xpomm(m+1)*sgap**2.gt..9d0)then
+          itypm(1,m+1)=-1        !single cut Pomeron in the 'handle'
+         else
+          itypm(1,m+1)=2         !>1 cut Pomerons in the 'handle'
+         endif
+        else
+         itypm(1,m+1)=3          !rap-gap in the 'handle'
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       else                             !rap-gap in the 'handle'
+        if(qgran(b10).le.vpacpe/vpacng
+     *  .or.xpomm(m+1)*sgap**2.gt..9d0)then
+         itypm(1,m+1)=-1         !single cut Pomeron in the 'handle'
+        else
+         itypm(1,m+1)=2          !>1 cut Pomerons in the 'handle'
+        endif
+       endif
+
+       if(itypm(1,m+1).eq.-1)then     !single cut Pomeron in the 'handle'
+        vplcp=min(vpacpe
+     *  ,qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,9))
+        if(qgran(b10).le.vplcp/vpacpe
+     *  .or.xpomm(m+1)*sgap**2.gt..9d0)itypm(1,m+1)=6 !single cut Pomeron
+       endif
+
+      elseif(jt.eq.5)then                    !cut 'leg'
+       nppm(m+1)=1
+       ippm(1,m+1)=ipp
+       if(itypom.eq.4)then              !single cut Pomeron at the end
+        if(xpomm(m+1)*sgap**2.ge.1.d0)stop'=4:xpomm(m+1)*sgap**2>1'
+        factor=exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)
+        wng=(vplcng-vplcpe)*factor/((vplc0-vplcpe)*factor
+     *  -(vplc-vplc0)*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0)then
+         itypm(1,m+1)=7          !>1 cut Pomerons at the end
+        else
+         itypm(1,m+1)=5          !rap-gap at the end
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       elseif(itypom.eq.5)then          !rap-gap at the end (cut or uncut loop)
+        if(qgran(b10).le.vplcpe/vplcng
+     *  .or.xpomm(m+1)*sgap**2.gt..9d0)then
+         itypm(1,m+1)=4          !single cut Pomeron at the end
+        else
+         itypm(1,m+1)=7          !>1 cut Pomerons at the end
+        endif
+       elseif(itypom.eq.7)then          !>1 cut Pomerons at the end
+        factor=exp(-vpac(ipp))*(1.d0-vvxp)*(1.d0-vvxpl)
+        wng=vplcng*factor/(vplc0*factor-(vplc-vplc0)*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0
+     *  .or.xpomm(m+1)*sgap**2.gt..9d0)then
+         if(qgran(b10).le.vplcpe/vplcng
+     *   .or.xpomm(m+1)*sgap**2.gt..9d0)then
+          itypm(1,m+1)=4         !single cut Pomeron at the end
+         else
+          itypm(1,m+1)=7         !>1 cut Pomerons at the end
+         endif
+        else
+         itypm(1,m+1)=5          !rap-gap at the end
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       endif
+
+       if(itypm(1,m+1).eq.4)then        !single cut Pomeron at the end
+        vplcp=min(vplcpe
+     *  ,qgfani(1.d0/xpomm(m+1),bbp,vvxts,vvxp,vvxpl,iddp(ipp),icz,9))
+        if(qgran(b10).le.vplcp/vplcpe
+     *  .or.xpomm(m+1)*sgap**3.gt..9d0)itypm(1,m+1)=6 !single cut Pomeron
+       endif
+      endif
+
+      if(nppm(m+1).eq.1.and.itypm(1,m+1).eq.6)then  !record single cut Pomeron
+       nppr=nppr+1
+       if(nppr.gt.legmax)then
+        iret=1
+        goto 31
+       endif
+       xpompi(nppr)=xpomm(m+1)
+       vvxpi(nppr)=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*(1.d0-vvxt)
+     * *(1.d0-vvxtl)*exp(-vtac(it))
+       ipompi(nppr)=ipp
+       bpompi(nppr)=bbp
+       nppm(m+1)=0
+       if(debug.ge.4)write (moniou,209)nppr,ipp,bbp,xpompi(nppr)
+     * ,vvxpi(nppr)
+
+      elseif(nppm(m+1).gt.1)then
+       i=0
+15     i=i+1
+       ityp=itypm(i,m+1)
+       if(ityp.eq.0)then
+        ipi=ippm(i,m+1)
+        bbi=(xa(ipi,1)+b-xxm(m+1))**2+(xa(ipi,2)-yym(m+1))**2
+        vvxp=0.d0
+        vvxpl=0.d0
+        vvxp0=0.d0
+        if(ia(1).gt.1)then
+         do l=1,ia(1)
+          if(l.lt.ipi)then
+           vvxpl=vvxpl+vpac(l)
+          elseif(l.gt.ipi)then
+           vvxp=vvxp+vpac(l)
+           vvxp0=vvxp0+vpac0(l)
+          endif
+         enddo
+        endif
+        vvxp=1.d0-exp(-vvxp)
+        vvxpl=1.d0-exp(-vvxpl)
+        vvxp0=1.d0-exp(-vvxp0)
+
+        vpacng=min(vpac0(ipi)
+     *  ,qgfani(1.d0/xpomm(m+1),bbi,vvxts,vvxp0,vvxpl,iddp(ipi),icz,4))
+        vpacpe=min(vpacng
+     *  ,qgfani(1.d0/xpomm(m+1),bbi,vvxts,vvxp0,vvxpl,iddp(ipi),icz,5))
+        vplcp=min(vpacpe
+     *  ,qgfani(1.d0/xpomm(m+1),bbi,vvxts,vvxp,vvxpl,iddp(ipi),icz,9))
+
+        aks=qgran(b10)*vpac0(ipi)
+        if(aks.le.vplcp.or.xpomm(m+1)*sgap**2.gt..9d0)then
+         itypm(i,m+1)=6          !single cut Pomeron
+        elseif(aks.lt.vpacpe)then
+         itypm(i,m+1)=-1         !single cut Pomeron in the 'handle'
+        elseif(aks.lt.vpacng)then
+         itypm(i,m+1)=2          !>1 cut Pomerons in the 'handle'
+        endif
+
+        if(itypm(i,m+1).eq.6)then      !record single cut Pomeron
+         nppr=nppr+1
+         if(nppr.gt.legmax)then
+          iret=1
+          goto 31
+         endif
+         xpompi(nppr)=xpomm(m+1)
+         vvxpi(nppr)=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*(1.d0-vvxt)
+     *   *(1.d0-vvxtl)*exp(-vtac(it))
+         ipompi(nppr)=ipi
+         bpompi(nppr)=bbi
+         if(debug.ge.4)write (moniou,209)nppr,ipi,bbi,xpompi(nppr)
+     *   ,vvxpi(nppr)
+         nppm(m+1)=nppm(m+1)-1
+         if(nppm(m+1).ge.i)then
+          do l=i,nppm(m+1)
+           ippm(l,m+1)=ippm(l+1,m+1)
+           itypm(l,m+1)=itypm(l+1,m+1)
+          enddo
+         endif
+         i=i-1
+        endif
+       endif
+       if(i.lt.nppm(m+1))goto 15
+      endif
+
+      if(jt.eq.2.and.qgran(b10).lt.(1.d0-exp(-vpac(ipp)))*(1.d0-vvxpl)
+     */((1.d0-exp(-vpac(ipp)))*(1.d0-vvxpl)+2.d0*vvxpl))then
+       if(debug.ge.4)write (moniou,212)
+       icdps=iddp(ipp)
+       do icdp=1,2
+        iddp(ipp)=icdp
+        call qgfdf(xxm(m+1),yym(m+1),xpomm(m+1),vpac,vtac
+     *  ,vvx,vvxp,vvxt,vvxpl,vvxtl,ipp,it)
+        wdp(icdp,ipp)=(1.d0-exp(-vpac(ipp)))*(1.d0-vvxpl)
+       enddo
+       iddp(ipp)=icdps
+      endif
+
+      if(nppm(m+1).ne.0)then
+       goto 9
+      else
+       goto 10
+      endif
+
+20    continue
+      if(debug.ge.3)write (moniou,214)nppr
+      if(nptg0.eq.0)goto 31
+
+c target 'fans'
+      m=0
+      nppm(1)=nptg0
+      xpomm(1)=xpomr
+      wgpm(1)=wgtg0
+      xxm(1)=xxp
+      yym(1)=yyp
+      do i=1,nptg0
+       ippm(i,1)=iptg0(i)
+       itypm(i,1)=itytg0(i)
+      enddo
+
+21    m=m+1                                   !next level multi-Pomeron vertex
+      if(m.gt.levmax)then
+       iret=1
+       goto 31
+      endif
+      ii(m)=0
+22    ii(m)=ii(m)+1                           !next cut fan in the vertex
+      if(ii(m).gt.nppm(m))then                !all fans at the level considered
+       m=m-1                                  !one level down
+       if(m.eq.0)goto 31                      !all targ. fans considered
+       goto 22
+      endif
+      l=ii(m)
+      itt=ippm(l,m)                           !targ. index for the leg
+      itypom=itypm(l,m)                       !type of the cut
+      btm=(xb(itt,1)-xxm(m))**2+(xb(itt,2)-yym(m))**2  !b^2 for the leg
+      if(debug.ge.4)write (moniou,216)ii(m),m,itt,btm
+      if(xpomm(m)*scm.lt.sgap**2)stop'xpomm(m)*scm<sgap**2!'
+
+      if(debug.ge.4)write (moniou,210)m
+      xpomr0=min(dsqrt(xpomm(m)/scm),xpomm(m)/sgap)
+      xpomr0=max(xpomr0,sgap/scm)
+      if(itypom.eq.4)xpomr0=max(xpomr0,dsqrt(xpomm(m)*sgap/scm))
+      rp1=(rq(iddt(itt),2)+alfp*dlog(xpomr0*scm))*4.d0*.0389d0
+      rp2=alfp*dlog(xpomm(m)/xpomr0)*4.d0*.0389d0
+      rp0=rp1*rp2/(rp1+rp2)
+      bbt=btm*(rp1/(rp1+rp2))**2
+      bbi=btm*(rp2/(rp1+rp2))**2
+      call qgbdef(bbt,bbi,xb(itt,1),xb(itt,2),xxm(m),yym(m)
+     *,xxp0,yyp0,1)
+
+      call qgfdf(xxp0,yyp0,xpomr0,vpac,vtac
+     *,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,itt)
+      vvxps=1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+      viu=qgpini(xpomm(m)/xpomr0,bbi,0.d0,0.d0,2)
+      vim=2.d0*min(viu,qgpini(xpomm(m)/xpomr0,bbi,0.d0,0.d0,8))
+      if(itypom.eq.-1.or.itypom.eq.4)then      !single cut Pomeron at the end
+       vvxi=1.d0-((1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt))**2
+     * *exp(-2.d0*vpac(ip)-2.d0*vtac(itt))
+       vip=qgpini(xpomm(m)/xpomr0,bbi,vvxi,0.d0,16)*exp(-vim)
+      elseif(itypom.eq.2.or.itypom.eq.7)then   !>1 cut Pomerons at the end
+       vimp=max(0.d0,1.d0-exp(-vim)*(1.d0+vim))
+      else                                     !rap-gap at the end
+       vvxpin=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+       vvxtin=1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(itt))
+       viuu=qgpini(xpomm(m)/xpomr0,bbi,vvxtin,vvxpin,20)
+     * *(1.d0-exp(-viu))
+       viuc=max(0.d0,viuu-qgpini(xpomm(m)/xpomr0,bbi
+     * ,vvxtin,vvxpin,21)*(1.d0-exp(-viu)))
+       vicc=qgpini(xpomm(m)/xpomr0,bbi,vvxtin,vvxpin,22)*.5d0
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+       vicu=max(0.d0,qgpini(xpomm(m)/xpomr0,bbi,vvxtin,vvxpin,23)*.5d0
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+     * -vicc)
+      endif
+
+      if(itypom.le.3)then                         !cut 'fan'
+       sumut=0.d0
+       vvxt0=0.d0
+       do i=1,ia(2)
+        sumut=sumut+vtac(i)
+       enddo
+       vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+       do i=1,ia(2)-itt+1
+        iti=ia(2)-i+1
+        bbl=(xb(iti,1)-xxp0)**2+(xb(iti,2)-yyp0)**2
+        sumut=sumut-vtac(iti)
+        vtac0(iti)=min(vtac(iti)
+     *  ,qgfani(xpomr0*scm,bbl,1.d0-vvxs*exp(-sumut)
+     *  ,1.d0-exp(-vvxt0),1.d0-exp(-sumut),iddt(iti),2,3))
+        if(iti.gt.itt)vvxt0=vvxt0+vtac0(iti)
+       enddo
+       vvxt0=1.d0-exp(-vvxt0)
+       vtacng=min(vtac0(itt)
+     * ,qgfani(xpomr0*scm,bbt,vvxps,vvxt0,vvxtl,iddt(itt),2,4))
+       vtacpe=min(vtacng
+     * ,qgfani(xpomr0*scm,bbt,vvxps,vvxt0,vvxtl,iddt(itt),2,5))
+      else                                        !cut 'leg'
+       vtlc=qgfani(xpomr0*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,7)
+       vtlc0=min(vtlc
+     * ,qgfani(xpomr0*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,8))
+       vtlcng=min(vtlc0
+     * ,qgfani(xpomr0*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,11))
+       vtlcpe=min(vtlcng
+     * ,qgfani(xpomr0*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,10))
+      endif
+
+      if(itypom.eq.-1)then         !'fan' (single cut Pomeron at the end)
+       gb0=vip*((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*((vtac0(itt)-vtacpe)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)-(vtac(itt)-vtac0(itt))*(1.d0-exp(-vtac(itt))
+     * *(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(itt))*(1.d0-vvxt))
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)*exp(-2.d0*vpac(ip))
+       gb0=gb0*40.d0
+      elseif(itypom.eq.0)then      !'fan' (cut loop at the end - rapgap)
+       gb0=((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl))
+     * *(vicc*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * -vicu*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))))
+     * *(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+     * -2.d0*vicu*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt)-vpac(ip))
+     * *(1.d0-vvx)*(1.d0-vvxp)
+      elseif(itypom.eq.1)then      !'fan' (uncut end - rapgap)
+       gb0=((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl))
+     * *(viuc*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * +viuu*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))))
+     * *(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+     * +2.d0*viuu*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt)-vpac(ip))
+     * *(1.d0-vvx)*(1.d0-vvxp)
+      elseif(itypom.eq.2)then      !'fan' (>1 cut Poms at the end)
+       gb0=vimp*((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*(vtac0(itt)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)-(vtac(itt)-vtac0(itt))*(1.d0-exp(-vtac(itt))
+     * *(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(itt))*(1.d0-vvxt))
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)*exp(-2.d0*vpac(ip))
+      elseif(itypom.eq.3)then      !'fan' (cut/uncut end - rapgap)
+       gb0=((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl))
+     * *(vicc-wgpm(m)*viuc)*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * *(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+      elseif(itypom.eq.4)then      !'leg' (single cut Pomeron at the end)
+       gb0=vip*((vtlc0-vtlcpe)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl))*exp(-vtac(itt)-2.d0*vpac(ip))*(1.d0-vvxt)
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)
+       if(gb0.eq.0.d0)then
+        gb0=vip*vtlc0*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)*exp(-vtac(itt)-2.d0*vpac(ip))*(1.d0-vvxt)
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)  *.01d0
+       endif
+      elseif(itypom.eq.5)then      !'leg' (cut/uncut end - rapgap)
+       gb0=vtlcng*exp(-2.d0*vtac(itt)-vpac(ip))
+     * *(1.d0-vvxt)**2*(1.d0-vvxtl)*(1.d0-vvx)*(1.d0-vvxp)
+     * *(vicc-wgpm(m)*viuc)*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+      elseif(itypom.eq.7)then      !'leg' (>1 cut Poms at the end)
+       gb0=vimp*(vtlc0*exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)
+     * -(vtlc-vtlc0)*(1.d0-exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)))
+     * *exp(-vtac(itt)-2.d0*vpac(ip))*(1.d0-vvxt)
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)
+      endif
+      if(gb0.le.0.d0)then      !so170712
+       iret=1
+       goto 31
+      endif
+      nrej=0
+
+23    xpomm(m+1)=xpomm(m)/sgap/(xpomm(m)*scm/sgap**2)**qgran(b10)
+      if(itypom.eq.4)xpomm(m+1)=xpomm(m)/sgap
+     */(xpomm(m)*scm/sgap**3)**qgran(b10)
+      rp1=(rq(iddt(itt),2)+alfp*dlog(xpomm(m+1)*scm))*4.d0*.0389d0
+      rp2=alfp*dlog(xpomm(m)/xpomm(m+1))*4.d0*.0389d0
+      rp=rp1*rp2/(rp1+rp2)
+      z=qgran(b10)
+      phi=pi*qgran(b10)
+      b0=dsqrt(-rp*dlog(z))
+      bbt=(dsqrt(btm)*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+      bbi=(dsqrt(btm)*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+      call qgbdef(bbt,bbi,xb(itt,1),xb(itt,2),xxm(m),yym(m)
+     *,xxm(m+1),yym(m+1),int(1.5d0+qgran(b10)))   !coordinates for the vertex
+
+      call qgfdf(xxm(m+1),yym(m+1),xpomm(m+1),vpac,vtac
+     *,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,itt)
+      vvxps=1.d0-(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+      viu=qgpini(xpomm(m)/xpomm(m+1),bbi,0.d0,0.d0,2)
+      vim=2.d0*min(viu,qgpini(xpomm(m)/xpomm(m+1),bbi,0.d0,0.d0,8))
+      if(itypom.eq.-1.or.itypom.eq.4)then      !single cut Pomeron at the end
+       vvxi=1.d0-((1.d0-vvx)*(1.d0-vvxp)*(1.d0-vvxt))**2
+     * *exp(-2.d0*vpac(ip)-2.d0*vtac(itt))
+       vip=qgpini(xpomm(m)/xpomm(m+1),bbi,vvxi,0.d0,16)*exp(-vim)
+      elseif(itypom.eq.2.or.itypom.eq.7)then   !>1 cut Pomerons at the end
+        vimp=max(0.d0,1.d0-exp(-vim)*(1.d0+vim))
+      else                                     !rap-gap at the end
+       vvxpin=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+       vvxtin=1.d0-(1.d0-vvxt)*(1.d0-vvxtl)*exp(-vtac(itt))
+       viuu=qgpini(xpomm(m)/xpomm(m+1),bbi,vvxtin,vvxpin,20)
+     * *(1.d0-exp(-viu))
+       viuc=max(0.d0,viuu-qgpini(xpomm(m)/xpomm(m+1),bbi
+     * ,vvxtin,vvxpin,21)*(1.d0-exp(-viu)))
+       vicc=qgpini(xpomm(m)/xpomm(m+1),bbi,vvxtin,vvxpin,22)*.5d0
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+       vicu=max(0.d0,qgpini(xpomm(m)/xpomm(m+1),bbi,vvxtin,vvxpin,23)
+     * *((1.d0-exp(-viu))**2+(exp(2.d0*viu-vim)-1.d0)*exp(-2.d0*viu))
+     * /2.d0-vicc)
+      endif
+
+      if(itypom.le.3)then                         !cut 'fan'
+       sumut=0.d0
+       vvxt0=0.d0
+       do i=1,ia(2)
+        sumut=sumut+vtac(i)
+       enddo
+       vvxs=(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+       do i=1,ia(2)-itt+1
+        iti=ia(2)-i+1
+        bbl=(xb(iti,1)-xxm(m+1))**2+(xb(iti,2)-yym(m+1))**2
+        sumut=sumut-vtac(iti)
+        vtac0(iti)=min(vtac(iti)
+     *  ,qgfani(xpomm(m+1)*scm,bbl,1.d0-vvxs*exp(-sumut)
+     *  ,1.d0-exp(-vvxt0),1.d0-exp(-sumut),iddt(iti),2,3))
+        if(iti.gt.itt)vvxt0=vvxt0+vtac0(iti)
+       enddo
+       vvxt0=1.d0-exp(-vvxt0)
+
+       vtacng=min(vtac0(itt)
+     * ,qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt0,vvxtl,iddt(itt),2,4))
+       vtacpe=min(vtacng
+     * ,qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt0,vvxtl,iddt(itt),2,5))
+      else                                        !cut 'leg'
+       vtlc=qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,7)
+       vtlc0=min(vtlc
+     * ,qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,8))
+       vtlcng=min(vtlc0
+     * ,qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,11))
+       vtlcpe=min(vtlcng
+     * ,qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,10))
+      endif
+
+      if(itypom.eq.-1)then         !'fan' (single cut Pomeron at the end)
+       gb=vip*((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*((vtac0(itt)-vtacpe)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)-(vtac(itt)-vtac0(itt))*(1.d0-exp(-vtac(itt))
+     * *(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(itt))*(1.d0-vvxt))
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)*exp(-2.d0*vpac(ip))
+      elseif(itypom.eq.0)then      !'fan' (cut loop at the end - rapgap)
+       gb=((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl))
+     * *(vicc*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * -vicu*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))))
+     * *(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+     * -2.d0*vicu*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt)-vpac(ip))
+     * *(1.d0-vvx)*(1.d0-vvxp)
+      elseif(itypom.eq.1)then      !'fan' (uncut end - rapgap)
+       gb=((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl))
+     * *(viuc*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * +viuu*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))))
+     * *(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+     * +2.d0*viuu*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt)-vpac(ip))
+     * *(1.d0-vvx)*(1.d0-vvxp)
+      elseif(itypom.eq.2)then      !'fan' (>1 cut Poms at the end)
+       gb=vimp*((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*(vtac0(itt)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)-(vtac(itt)-vtac0(itt))*(1.d0-exp(-vtac(itt))
+     * *(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(itt))*(1.d0-vvxt))
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)*exp(-2.d0*vpac(ip))
+      elseif(itypom.eq.3)then      !'fan' (cut/uncut end - rapgap)
+       gb=((max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+     * +((1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl)
+     * +2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl))
+     * *((vicc-wgpm(m)*viuc)*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * -(vicu+wgpm(m)*viuu)*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)
+     * *exp(-vpac(ip))))*(1.d0-vvx)*(1.d0-vvxp)*exp(-vpac(ip))
+     * -2.d0*(vicu+wgpm(m)*viuu)*(max(0.d0,exp(vtac(itt)-vtac0(itt))
+     * -1.d0-(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt)-vpac(ip))
+     * *(1.d0-vvx)*(1.d0-vvxp)
+      elseif(itypom.eq.4)then      !'leg' (single cut Pomeron at the end)
+       gb=vip*((vtlc0-vtlcpe)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)-(vtlc-vtlc0)*(1.d0-exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)))*exp(-vtac(itt)-2.d0*vpac(ip))*(1.d0-vvxt)
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)
+      elseif(itypom.eq.5)then      !'leg' (cut/uncut end - rapgap)
+       gb=vtlcng*exp(-2.d0*vtac(itt)-vpac(ip))
+     * *(1.d0-vvxt)**2*(1.d0-vvxtl)*(1.d0-vvx)*(1.d0-vvxp)
+     * *((vicc-wgpm(m)*viuc)*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * -(vicu+wgpm(m)*viuu)*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)
+     * *exp(-vpac(ip))))
+      elseif(itypom.eq.7)then      !'leg' (>1 cut Poms at the end)
+       gb=vimp*(vtlc0*exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)
+     * -(vtlc-vtlc0)*(1.d0-exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)))
+     * *exp(-vtac(itt)-2.d0*vpac(ip))*(1.d0-vvxt)
+     * *(1.d0-vvx)*(1.d0-vvxp)**2*(1.d0-vvxpl)
+      endif
+      nrej=nrej+1
+      gb=gb/gb0/z*rp/rp0  /10.d0
+      if(qgran(b10).gt.gb.and.nrej.le.1000)goto 23
+
+      if(itypom.eq.-1.or.itypom.eq.4)then    !'single cut Pomeron in the handle
+       npin=npin+1
+       if(npin.gt.npmax)then
+        iret=1
+        goto 31
+       endif
+       xpomim(npin)=1.d0/xpomm(m+1)/scm
+       xpomip(npin)=xpomm(m)
+       vvxim(npin)=vvxi
+       bpomim(npin)=bbi
+       if(debug.ge.4)write (moniou,211)npin,xpomip(npin),xpomim(npin)
+     * ,vvxim(npin),bpomim(npin)
+      elseif(itypom.eq.2.or.itypom.eq.7)then !>1 cut Pomerons in the handle
+       ninc=npgen(vim,2,20)
+       npin=npin+ninc
+       if(npin.gt.npmax)then
+        iret=1
+        goto 31
+       endif
+       do i=npin-ninc+1,npin
+        xpomim(i)=1.d0/xpomm(m+1)/scm
+        xpomip(i)=xpomm(m)
+        vvxim(i)=0.d0
+        bpomim(i)=bbi
+        if(debug.ge.4)write (moniou,211)i,xpomip(i),xpomim(i)
+     *  ,vvxim(i),bpomim(i)
+       enddo
+      endif
+
+      if(itypom.eq.-1)then      !single cut Pomeron in the 'handle'
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+       vv2=(1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl
+       vv3=2.d0*((vtac0(itt)-vtacpe)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)-(vtac(itt)-vtac0(itt))*(1.d0-exp(-vtac(itt))
+     * *(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(itt))*(1.d0-vvxt)
+       if(xpomm(m+1)*scm.lt.1.1d0*sgap**2.or.vv3.lt.0.d0)vv3=0.d0
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+      elseif(itypom.eq.0)then      !cut 'loop' in the 'handle'
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt)-vpac(ip))
+     * *(1.d0-vvxp)*(1.d0-vvxpl)*(vicc+vicu)
+     * /(vicc*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * -vicu*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))))
+       vv2=(1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl
+       vv3=2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl)
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+      elseif(itypom.eq.1)then    !uncut 'handle' (rap-gap)
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+       vv2=(1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl
+       vv3=2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2*(1.d0-vvxtl)
+       vv4=2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0-(vtac(itt)
+     * -vtac0(itt)))*(1.d0-vvxt0)+(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))
+     * *exp(-vtac(itt))*viuu/(viuu*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)
+     * *exp(-vpac(ip)))+viuc*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip)))
+       if(xpomm(m+1)*scm.lt.1.1d0*sgap**2.or.vv4.lt.0.d0)vv4=0.d0
+       aks=(vv1+vv2+vv3+vv4)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       elseif(aks.lt.vv1+vv2+vv3)then
+        jt=3                     !1 cut fan
+       else
+        jt=4                     !>1 cut 'handle' fans
+       endif
+      elseif(itypom.eq.2)then    !>1 cut Pomerons in the 'handle'
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vtac(itt))
+     * *(1.d0+2.d0*vtac(itt)))+2.d0*vtac(itt)*exp(-2.d0*vtac(itt))
+     * *(1.d0-(1.d0-vvxt)**2))*(1.d0-vvxtl)
+     * -2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)
+     * +(vtac(itt)-vtac0(itt))*(vvxt-vvxt0))*exp(-vtac(itt))
+       vv2=(1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl
+       vv3=2.d0*(vtac0(itt)*exp(-vtac(itt))*(1.d0-vvxt)
+     * *(1.d0-vvxtl)-(vtac(itt)-vtac0(itt))*(1.d0-exp(-vtac(itt))
+     * *(1.d0-vvxt)*(1.d0-vvxtl)))*exp(-vtac(itt))*(1.d0-vvxt)
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+      elseif(itypom.eq.3)then    !rap-gap in the 'handle'
+       vv1=(max(0.d0,1.d0-exp(-2.d0*vtac(itt))*(1.d0+2.d0*vtac(itt)))
+     * +2.d0*vtac(itt)*exp(-2.d0*vtac(itt))*(1.d0-(1.d0-vvxt)**2))
+     * *(1.d0-vvxtl)-2.d0*(max(0.d0,exp(vtac(itt)-vtac0(itt))-1.d0
+     * -(vtac(itt)-vtac0(itt)))*(1.d0-vvxt0)+(vtac(itt)-vtac0(itt))
+     * *(vvxt-vvxt0))*exp(-vtac(itt)-vpac(ip))*(1.d0-vvxp)*(1.d0-vvxpl)
+     * *(vicc+vicu+wgpm(m)*(viuu-viuc))
+     * /((vicc-wgpm(m)*viuc)*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     * -(vicu+wgpm(m)*viuu)*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)
+     * *exp(-vpac(ip))))
+       vv2=(1.d0-exp(-vtac(itt)))**2*(1.d0-vvxtl)
+     * +2.d0*(1.d0-exp(-vtac(itt)))*vvxtl
+       vv3=2.d0*vtacng*exp(-2.d0*vtac(itt))*(1.d0-vvxt)**2
+     * *(1.d0-vvxtl)
+       aks=(vv1+vv2+vv3)*qgran(b10)
+       if(aks.lt.vv1)then
+        jt=1                     !>1 cut fans
+       elseif(aks.lt.vv1+vv2)then
+        jt=2                     !diffr. cut
+       else
+        jt=3                     !1 cut fan
+       endif
+      else
+       jt=5                      !cut leg
+      endif
+
+      nppm(m+1)=0
+      wgpm(m+1)=0.d0
+      if(jt.eq.1)then                        !>1 cut fans
+       ntry=0
+24     ntry=ntry+1
+       nphm=0
+       if(itt.eq.ia(2).or.ntry.gt.100)then
+        nppm(m+1)=npgen(2.d0*vtac(itt),2,20)
+        do i=1,nppm(m+1)
+         if(qgran(b10).le.vtac0(itt)/vtac(itt)
+     *   .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+          itypm(i,m+1)=0
+         else
+          nphm=nphm+1
+          itypm(i,m+1)=1
+         endif
+         ippm(i,m+1)=itt
+        enddo
+        wh=(vtac(itt)/vtac0(itt)-1.d0)/nppm(m+1)
+       else
+        nppm(m+1)=npgen(2.d0*vtac(itt),1,20)
+        do i=1,nppm(m+1)
+         if(qgran(b10).le.vtac0(itt)/vtac(itt)
+     *   .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+          itypm(i,m+1)=0
+         else
+          nphm=nphm+1
+          itypm(i,m+1)=1
+         endif
+         ippm(i,m+1)=itt
+        enddo
+        wh=(vtac(itt)/vtac0(itt)-1.d0)/nppm(m+1)
+        do iti=itt+1,ia(2)
+         ninc=npgen(2.d0*vtac(iti),0,20)
+         if(ninc.ne.0)then
+          nppm(m+1)=nppm(m+1)+ninc
+          nh0=nphm
+          if(nppm(m+1).gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nppm(m+1)-ninc+1,nppm(m+1)
+           if(qgran(b10).le.vtac0(iti)/vtac(iti)
+     *     .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+            itypm(i,m+1)=0
+           else
+            nphm=nphm+1
+            itypm(i,m+1)=1
+           endif
+           ippm(i,m+1)=iti
+          enddo
+          if(ninc.gt.nphm-nh0)wh=(vtac(iti)/vtac0(iti)-1.d0)/ninc
+         endif
+        enddo
+        if(nppm(m+1).eq.1)goto 24
+       endif
+
+       if(nphm+1.ge.nppm(m+1))then
+        if(itypom.eq.-1.or.itypom.eq.1.or.itypom.eq.2)then
+         gbt=1.d0-exp(vtac(itt)+(1.d0-nphm)*dlog(2.d0))
+     *   /(1.d0-vvxt)/(1.d0-vvxtl)
+        elseif(itypom.eq.0)then
+         gbt=1.d0-(vicc+vicu)*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     *   /(vicc*(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     *   -vicu*(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))))
+     *   *exp(vtac(itt)+(1.d0-nphm)*dlog(2.d0))
+     *   /(1.d0-vvxt)/(1.d0-vvxtl)
+        elseif(itypom.eq.3)then
+         gbt=1.d0-(vicc+vicu+wgpm(m)*(viuu-viuc))
+     *   *(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))
+     *   /((vicc-wgpm(m)*viuc)*(1.d0-vvxp)*(1.d0-vvxpl)
+     *   *exp(-vpac(ip))-(vicu+wgpm(m)*viuu)
+     *   *(1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*exp(-vpac(ip))))
+     *   *exp(vtac(itt)+(1.d0-nphm)*dlog(2.d0))
+     *   /(1.d0-vvxt)/(1.d0-vvxtl)
+        else
+         stop'unknown itypom'
+        endif
+        if(nphm.eq.nppm(m+1).and.qgran(b10).gt.gbt
+     *  .or.nphm+1.eq.nppm(m+1).and.qgran(b10).gt.1.d0+wh*gbt)then
+         ntry=0
+          goto 24
+        endif
+       endif
+
+      elseif(jt.eq.4)then                    !>1 cut 'handle' fans
+       ntry=0
+25     ntry=ntry+1
+       if(itt.eq.ia(2).or.ntry.gt.100)then
+        nppm(m+1)=npgen(vtac(itt)-vtac0(itt),2,20)
+        do i=1,nppm(m+1)
+         itypm(i,m+1)=1
+         ippm(i,m+1)=itt
+        enddo
+       else
+        nppm(m+1)=npgen(vtac(itt)-vtac0(itt),1,20)
+        do i=1,nppm(m+1)
+         itypm(i,m+1)=1
+         ippm(i,m+1)=itt
+        enddo
+        do iti=itt+1,ia(2)
+         ninc=npgen(vtac(iti)-vtac0(iti),0,20)
+         if(ninc.ne.0)then
+          nppm(m+1)=nppm(m+1)+ninc
+          if(nppm(m+1).gt.legmax)then
+           iret=1
+           goto 31
+          endif
+          do i=nppm(m+1)-ninc+1,nppm(m+1)
+           itypm(i,m+1)=1
+           ippm(i,m+1)=iti
+          enddo
+         endif
+        enddo
+        if(nppm(m+1).eq.1)goto 25
+       endif
+
+      elseif(jt.eq.3)then                    !1 cut fan
+       nppm(m+1)=1
+       ippm(1,m+1)=itt
+       if(itypom.eq.-1)then             !single cut Pomeron in the 'handle'
+        factor=exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)
+        wng=(vtacng-vtacpe)*factor/((vtac0(itt)-vtacpe)*factor
+     *  -(vtac(itt)-vtac0(itt))*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0
+     *  .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+         itypm(1,m+1)=2          !>1 cut Pomerons in the 'handle'
+        else
+         itypm(1,m+1)=3          !rap-gap in the 'handle'
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       elseif(itypom.eq.2)then          !>1 cut Pomerons in the 'handle'
+        factor=exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)
+        wng=vtacng*factor/(vtac0(itt)*factor
+     *  -(vtac(itt)-vtac0(itt))*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0
+     *  .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+         if(qgran(b10).le.vtacpe/vtacng
+     *   .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+          itypm(1,m+1)=-1        !single cut Pomeron in the 'handle'
+         else
+          itypm(1,m+1)=2         !>1 cut Pomerons in the 'handle'
+         endif
+        else
+         itypm(1,m+1)=3          !rap-gap in the 'handle'
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       else                             !rap-gap in the 'handle'
+        if(qgran(b10).le.vtacpe/vtacng
+     *  .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+         itypm(1,m+1)=-1         !single cut Pomeron in the 'handle'
+        else
+         itypm(1,m+1)=2          !>1 cut Pomerons in the 'handle'
+        endif
+       endif
+
+       if(itypm(1,m+1).eq.-1)then     !single cut Pomeron in the 'handle'
+        vtlcp=min(vtacpe
+     *  ,qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,9))
+        if(qgran(b10).le.vtlcp/vtacpe
+     *  .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)itypm(1,m+1)=6 !single cut Pomeron
+       endif
+
+      elseif(jt.eq.5)then                    !cut 'leg'
+       nppm(m+1)=1
+       ippm(1,m+1)=itt
+       if(itypom.eq.4)then              !single cut Pomeron at the end
+        if(xpomm(m+1)*scm.le.sgap**2)stop'=4:xpomm(m+1)*scm<sgap**2'
+        factor=exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)
+        wng=(vtlcng-vtlcpe)*factor/((vtlc0-vtlcpe)*factor
+     *  -(vtlc-vtlc0)*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0)then
+         itypm(1,m+1)=7          !>1 cut Pomerons at the end
+        else
+         itypm(1,m+1)=5          !rap-gap at the end
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       elseif(itypom.eq.5)then          !rap-gap at the end (cut or uncut loop)
+        if(qgran(b10).le.vtlcpe/vtlcng
+     *  .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+         itypm(1,m+1)=4          !single cut Pomeron at the end
+        else
+         itypm(1,m+1)=7          !>1 cut Pomerons at the end
+        endif
+       elseif(itypom.eq.7)then          !>1 cut Pomerons at the end
+        factor=exp(-vtac(itt))*(1.d0-vvxt)*(1.d0-vvxtl)
+        wng=vtlcng*factor/(vtlc0*factor-(vtlc-vtlc0)*(1.d0-factor))
+        if(qgran(b10).le.wng.or.wng.lt.0.d0
+     *  .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+         if(qgran(b10).le.vtlcpe/vtlcng
+     *   .or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+          itypm(1,m+1)=4         !single cut Pomeron at the end
+         else
+          itypm(1,m+1)=7         !>1 cut Pomerons at the end
+         endif
+        else
+         itypm(1,m+1)=5          !rap-gap at the end
+         wgpm(m+1)=(1.d0-factor)/factor
+        endif
+       endif
+
+       if(itypm(1,m+1).eq.4)then        !single cut Pomeron at the end
+        vtlcp=min(vtlcpe
+     *  ,qgfani(xpomm(m+1)*scm,bbt,vvxps,vvxt,vvxtl,iddt(itt),2,9))
+        if(qgran(b10).le.vtlcp/vtlcpe
+     *  .or.xpomm(m+1)*scm.lt.1.1d0*sgap**3)itypm(1,m+1)=6 !single cut Pomeron
+       endif
+      endif
+
+      if(nppm(m+1).eq.1.and.itypm(1,m+1).eq.6)then  !record single cut Pomeron
+       nptg=nptg+1
+       if(nptg.gt.legmax)then
+        iret=1
+        goto 31
+       endif
+       xpomti(nptg)=xpomm(m+1)
+       vvxti(nptg)=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*(1.d0-vvxt)
+     * *(1.d0-vvxtl)*exp(-vpac(ip))
+       ipomti(nptg)=itt
+       bpomti(nptg)=bbt
+       nppm(m+1)=0
+       if(debug.ge.4)write (moniou,217)nptg,itt,bbt,xpomti(nptg)
+     * ,vvxti(nptg)
+
+      elseif(nppm(m+1).gt.1)then
+       i=0
+26     i=i+1
+       ityp=itypm(i,m+1)
+       if(ityp.eq.0)then
+        iti=ippm(i,m+1)
+        bbi=(xb(iti,1)-xxm(m+1))**2+(xb(iti,2)-yym(m+1))**2
+        vvxt=0.d0
+        vvxtl=0.d0
+        vvxt0=0.d0
+        if(ia(2).gt.1)then
+         do l=1,ia(2)
+          if(l.lt.iti)then
+           vvxtl=vvxtl+vtac(l)
+          elseif(l.gt.iti)then
+           vvxt=vvxt+vtac(l)
+           vvxt0=vvxt0+vtac0(l)
+          endif
+         enddo
+        endif
+        vvxt=1.d0-exp(-vvxt)
+        vvxtl=1.d0-exp(-vvxtl)
+        vvxt0=1.d0-exp(-vvxt0)
+
+        vtacng=min(vtac0(iti)
+     *  ,qgfani(xpomm(m+1)*scm,bbi,vvxps,vvxt0,vvxtl,iddt(iti),2,4))
+        vtacpe=min(vtacng
+     *  ,qgfani(xpomm(m+1)*scm,bbi,vvxps,vvxt0,vvxtl,iddt(iti),2,5))
+        vtlcp=min(vtacpe
+     *  ,qgfani(xpomm(m+1)*scm,bbi,vvxps,vvxt,vvxtl,iddt(iti),2,9))
+
+        aks=qgran(b10)*vtac0(iti)
+        if(aks.le.vtlcp.or.xpomm(m+1)*scm.lt.1.1d0*sgap**2)then
+         itypm(i,m+1)=6          !single cut Pomeron
+        elseif(aks.lt.vtacpe)then
+         itypm(i,m+1)=-1         !single cut Pomeron in the 'handle'
+        elseif(aks.lt.vtacng)then
+         itypm(i,m+1)=2          !>1 cut Pomerons in the 'handle'
+        endif
+
+        if(itypm(i,m+1).eq.6)then      !record single cut Pomeron
+         nptg=nptg+1
+         if(nptg.gt.legmax)then
+          iret=1
+          goto 31
+         endif
+         xpomti(nptg)=xpomm(m+1)
+         vvxti(nptg)=1.d0-(1.d0-vvxp)*(1.d0-vvxpl)*(1.d0-vvxt)
+     *   *(1.d0-vvxtl)*exp(-vpac(ip))
+         ipomti(nptg)=iti
+         bpomti(nptg)=bbi
+         if(debug.ge.4)write (moniou,217)nptg,iti,bbi,xpomti(nptg)
+     *   ,vvxti(nptg)
+         nppm(m+1)=nppm(m+1)-1
+         if(nppm(m+1).ge.i)then
+          do l=i,nppm(m+1)
+           ippm(l,m+1)=ippm(l+1,m+1)
+           itypm(l,m+1)=itypm(l+1,m+1)
+          enddo
+         endif
+         i=i-1
+        endif
+       endif
+       if(i.lt.nppm(m+1))goto 26
+      endif
+
+      if(jt.eq.2.and.qgran(b10).lt.(1.d0-exp(-vtac(itt)))*(1.d0-vvxtl)
+     */((1.d0-exp(-vtac(itt)))*(1.d0-vvxtl)+2.d0*vvxtl))then
+       if(debug.ge.4)write (moniou,212)
+       icdts=iddt(itt)
+       do icdt=1,2
+        iddt(itt)=icdt
+        call qgfdf(xxm(m+1),yym(m+1),xpomm(m+1),vpac,vtac
+     *  ,vvx,vvxp,vvxt,vvxpl,vvxtl,ip,itt)
+        wdt(icdt,itt)=(1.d0-exp(-vtac(itt)))*(1.d0-vvxtl)
+       enddo
+       iddt(itt)=icdts
+      endif
+
+      if(nppm(m+1).ne.0)then
+       goto 21
+      else
+       goto 22
+      endif
+31    continue
+      if(debug.ge.2)write (moniou,219)nppr,nptg,npin,iret
+
+201   format(2x,'qg3pdf - configuration for multi-Pomeron'
+     *,'/diffractive contributions'
+     */4x,i2,'-th proj. nucleon',2x,i2,'-th targ. nucleon')
+202   format(2x,'qg3pdf: problem with initial normalization'
+     *,' -> rejection')
+203   format(2x,'qg3pdf: normalization of rejection function - ',e10.3)
+204   format(2x,'qg3pdf: xpomr=',e10.3,2x,'bbpr=',e10.3,2x,'bbtg=',e10.3
+     *,2x,'gb=',e10.3)
+205   format(2x,'qg3pdf: xpomr=',e10.3,2x,'bbpr=',e10.3,2x,'bbtg=',e10.3
+     *,2x,'xxp=',e10.3,2x,'yyp=',e10.3)
+206   format(2x,'qg3pdf: main vertex, nppr0=',i3,2x,'nptg0=',i3)
+208   format(2x,'qg3pdf: check',i3,'-th cut fan at ',i2,'-th level,'
+     *,' proj. index - ',i3,2x,'b^2=',e10.3)
+209   format(2x,'qg3pdf: ',i3,'-th proj. leg, proj. index - ',i3
+     *,2x,'b^2=',e10.3,2x,'xpomr=',e10.3,2x,'vvx=',e10.3)
+210   format(2x,'qg3pdf: new vertex at ',i3,'-th level')
+211   format(2x,'qg3pdf: ',i3,'-th interm. Pomeron'
+     */4x,'xpomip=',e10.3,2x,'xpomim=',e10.3
+     *,2x,'vvxim=',e10.3,2x,'bpomim=',e10.3)
+212   format(2x,'qg3pdf: diffractive cut')
+214   format(2x,'qg3pdf: total number of proj. legs - ',i3)
+216   format(2x,'qg3pdf: check',i3,'-th cut fan at ',i2,'-th level,'
+     *,' targ. index - ',i3,2x,'b^2=',e10.3)
+217   format(2x,'qg3pdf: ',i3,'-th targ. leg, targ. index - ',i3
+     *,2x,'b^2=',e10.3,2x,'xpomr=',e10.3,2x,'vvx=',e10.3)
+219   format(2x,'qg3pdf - end',2x,'number of proj. legs:',i3
+     *,2x,'number of targ. legs:',i3
+     */4x,'number of interm. Pomerons:',i3,'return flag:',i2)
+      return
+      end
+
+c------------------------------------------------------------------------
+      subroutine qgloolc(sy,xp,bb,icdp,icz,iqq,fan1,fan0)
+c-----------------------------------------------------------------------
+c qgloolc - unintegrated Pomeron leg eikonal with loops
+c sy   - Pomeron mass squared,
+c xp   - Pomeron LC momentum,
+c bb   - impact parameter squared,
+c icz  - hadron class
+c iqq=1 - tot
+c iqq=2 - soft Pomeron
+c iqq=3 - (soft+g)-Pomeron
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      fan0=0.d0
+      fan1=0.d0
+      if(sy.le.sgap*max(1.d0,xp*sgap))goto 1
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr=min(xp,1.d0/sgap)/(sy/sgap/max(1.d0,xp*sgap))
+     * **(.5d0+x1(ix1)*(mx1-1.5d0))
+       rp=(rq(icdp,icz)-alfp*log(xpomr))*4.d0*.0389d0
+       rp1=alfp*log(xpomr*sy/xp)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+      do ix2=1,7
+      do mx2=1,2
+       z=.5d0+x1(ix2)*(mx2-1.5d0)
+       bb0=-rp2*log(z)
+      do ix3=1,7
+      do mx3=1,2
+       phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+       bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+       bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+
+       v1icn=qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,8)
+       if(iqq.eq.1)then
+        vpl=qglegc(xp/xpomr,xp,bb2,0.d0,icdp,icz,1)
+        v1ic0=qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,7)
+        v1ic1=min(v1ic0,qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,6))
+        v1ic=min(v1ic1,qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,5))
+       elseif(iqq.eq.2)then
+        vpl=qglegc(xp/xpomr,xp,bb2,0.d0,icdp,icz,0)
+        v1ic0=qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,15)
+        v1ic1=min(v1ic0,qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,14))
+        v1ic=min(v1ic1,qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,13))
+       elseif(iqq.eq.3)then
+        vpl=qglegc(xp/xpomr,xp,bb2,0.d0,icdp,icz,2)
+        v1ic0=qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,7)
+        v1ic1=min(v1ic0,qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,6))
+        v1ic=min(v1ic1,qgpini(xpomr*sy/xp,bb1,0.d0,0.d0,5))
+       else
+         vpl=0.d0
+         v1ic0=0.d0
+         v1ic1=0.d0
+         v1ic=0.d0
+         stop 'Should no happen in qgloolc !'
+       endif
+       fan1=fan1+a1(ix1)*a1(ix2)*a1(ix3)/z*rp2
+     * *vpl*(v1ic*exp(-2.d0*v1icn)-v1ic1)
+       fan0=fan0+a1(ix1)*a1(ix2)*a1(ix3)/z*rp2*vpl*(v1ic1-v1ic0)
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      fan0=fan0/8.d0*pi*r3p/.0389d0/g3p**3
+     **dlog(sy/sgap/max(1.d0,xp*sgap))
+      fan1=fan1/8.d0*pi*r3p/.0389d0/g3p**3
+     **dlog(sy/sgap/max(1.d0,xp*sgap))
+1     continue
+      if(iqq.eq.1)then
+       dleg=qglegc(sy,xp,bb,0.d0,icdp,icz,1)
+      elseif(iqq.eq.2)then
+       dleg=qglegc(sy,xp,bb,0.d0,icdp,icz,0)
+      elseif(iqq.eq.3)then
+       dleg=qglegc(sy,xp,bb,0.d0,icdp,icz,2)
+      else
+       dleg=0.d0
+       stop 'Should no happen in qgloolc !'
+      endif
+      fan0=fan0+dleg
+      fan1=fan1+dleg
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qglscr(sy,xp,bb,vvx,icdp,icz,iqq)
+c-----------------------------------------------------------------------
+c vvx  = 1 - exp[-sum_j chi_targ(j) - sum_{i.ne.I} chi_proj(i)]
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qglscr=0.d0
+      if(sy.le.sgap*max(1.d0,xp*sgap))goto 1
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr1=min(xp,1.d0/sgap)/(sy/sgap/max(1.d0,xp*sgap))
+     * **(.5d0+x1(ix1)*(mx1-1.5d0))
+       rp=(rq(icdp,icz)-alfp*log(xpomr1))*4.d0*.0389d0
+       rp1=alfp*log(xpomr1*sy/xp)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+       do ix2=1,7
+       do mx2=1,2
+        z=.5d0+x1(ix2)*(mx2-1.5d0)
+        bb0=-rp2*log(z)
+       do ix3=1,7
+       do mx3=1,2
+        phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+        bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+        bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+
+        vicn=qgpini(xpomr1*sy/xp,bb1,0.d0,0.d0,8)
+        vpf=qgfani(1.d0/xpomr1,bb2,vvx,0.d0,0.d0,icdp,icz,1)
+        if(iqq.eq.1)then
+         vpl=qglegc(xp/xpomr1,xp,bb2,vvx,icdp,icz,9)
+         vi=qgpini(xpomr1*sy/xp,bb1,0.d0,0.d0,5)
+        elseif(iqq.eq.2)then
+         vpl=qglegc(xp/xpomr1,xp,bb2,vvx,icdp,icz,10)
+         vi=qgpini(xpomr1*sy/xp,bb1,0.d0,0.d0,13)
+        elseif(iqq.eq.3)then
+         vpl=qglegc(xp/xpomr1,xp,bb2,vvx,icdp,icz,11)
+         vi=qgpini(xpomr1*sy/xp,bb1,0.d0,0.d0,5)
+        else
+         vpl=0.d0
+         vi=0.d0
+         stop 'Should no happen in qglscr !'
+        endif
+
+        dpx=vpl*vi*exp(-2.d0*vicn)
+     *  *((1.d0-vvx)**2*exp(-2.d0*vpf)-1.d0)
+        qglscr=qglscr+a1(ix1)*a1(ix2)*a1(ix3)*dpx/z*rp2
+       enddo
+       enddo
+       enddo
+       enddo
+      enddo
+      enddo
+      qglscr=qglscr/8.d0*pi*r3p/.0389d0/g3p**3
+     **dlog(sy/sgap/max(1.d0,xp*sgap))
+1     continue
+      if(iqq.eq.1)then
+       qglscr=qglscr+qglegc(sy,xp,bb,0.d0,icdp,icz,3)
+      elseif(iqq.eq.2)then
+       qglscr=qglscr+qglegc(sy,xp,bb,0.d0,icdp,icz,5)
+      elseif(iqq.eq.3)then
+       qglscr=qglscr+qglegc(sy,xp,bb,0.d0,icdp,icz,7)
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qglh(sy,xp,bb,vvx,icdp,icz,iqq)
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/    debug
+      common /arr3/     x1(7),a1(7)
+
+      qglh=0.d0
+      if(sy.le.max(1.d0,xp*sgap))goto 1
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr1=min(xp,1.d0/sgap)/(sy/max(1.d0,xp*sgap))
+     * **(.5d0+x1(ix1)*(mx1-1.5d0))
+       rp=(rq(icdp,icz)-alfp*log(xpomr1))*4.d0*.0389d0
+       rp1=alfp*log(xpomr1*sy/xp)*4.d0*.0389d0
+       rp2=rp*rp1/(rp+rp1)
+       do ix2=1,7
+       do mx2=1,2
+        z=.5d0+x1(ix2)*(mx2-1.5d0)
+        bb0=-rp2*log(z)
+       do ix3=1,7
+       do mx3=1,2
+        phi=pi*(.5d0+x1(ix3)*(mx3-1.5d0))
+        bb1=(dsqrt(bb)*rp1/(rp+rp1)-dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+        bb2=(dsqrt(bb)*rp/(rp+rp1)+dsqrt(bb0)*cos(phi))**2
+     *  +bb0*sin(phi)**2
+
+        vi=qgppdi(xp/xpomr1/sy,iqq)
+        vpf=qgfani(1.d0/xpomr1,bb2,vvx,0.d0,0.d0,icdp,icz,1)
+        vpl=qglegc(xp/xpomr1,xp,bb2,vvx,icdp,icz,10)
+
+        dpx=vpl*vi*((1.d0-vvx)**2*exp(-2.d0*vpf)-1.d0)
+     *  *(xpomr1/xp)**dels*exp(bb2/rp)*rp
+        qglh=qglh+a1(ix1)*a1(ix2)*a1(ix3)*dpx
+       enddo
+       enddo
+       enddo
+       enddo
+      enddo
+      enddo
+      qglh=qglh/8.d0*pi*r3p/.0389d0/g3p**2*dlog(sy/max(1.d0,xp*sgap))
+     */fp(icz)/cd(icdp,icz)/qgppdi(1.d0/sy,iqq)
+
+1     qglh=qglh+1.d0
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgcutp(sy,xp,xm,bb,vvx
+     *,icdp,icdt,icz,iqq)
+c-----------------------------------------------------------------------
+c qgcutp - unintegrated cut Pomeron eikonal
+c sy         - Pomeron mass squared,
+c xp,xm      - Pomeron light cone momenta,
+c b          - squared impact parameter,
+c vvx        - relative strenth of nuclear screening corrections,
+c icdp, icdt - proj. and targ. diffractive eigenstates,
+c icz        - hadron class
+c iqq=1 - total,
+c iqq=2 - soft contribution,
+c iqq=3  - (soft+gg+gq+qq) contribution
+c iqq=4  - (soft+gg+qq) contribution
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr25/ ahv(3)
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      qgcutp=0.d0
+      if(sy.le.max(1.d0,xp*sgap)*max(1.d0,xm*sgap))goto 2
+
+      do ix1=1,7
+      do mx1=1,2
+       xpomr1=xp/max(1.d0,xp*sgap)/(sy/max(1.d0,xp*sgap)
+     * /max(1.d0,xm*sgap))**(.5+x1(ix1)*(mx1-1.5))
+       rp1=(rq(icdp,icz)-alfp*log(xpomr1))*4.d0*.0389d0
+       rp2=(rq(icdt,2)+alfp*log(xpomr1*sy/xp/xm))*4.d0*.0389d0
+       rp=rp1*rp2/(rp1+rp2)
+      do ib1=1,7
+      do mb1=1,2
+       z=.5d0+x1(ib1)*(mb1-1.5d0)
+       bb0=-rp*dlog(z)
+      do ib2=1,7
+      do mb2=1,2
+       phi=pi*(.5d0+x1(ib2)*(mb2-1.5d0))
+       bb1=(dsqrt(bb)*rp1/(rp1+rp2)+dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+       bb2=(dsqrt(bb)*rp2/(rp1+rp2)-dsqrt(bb0)*cos(phi))**2
+     * +bb0*sin(phi)**2
+
+       vpf0=qgfani(1.d0/xpomr1,bb1,vvx,0.d0,0.d0,icdp,icz,1)
+       vtf0=qgfani(xpomr1*sy/xp/xm,bb2,vvx,0.d0,0.d0,icdt,2,1)
+       n=1
+1      n=n+1
+       vpf=qgfani(1.d0/xpomr1,bb1,1.d0-(1.d0-vvx)*exp(-vtf0)
+     * ,0.d0,0.d0,icdp,icz,1)
+       vtf=qgfani(xpomr1*sy/xp/xm,bb2,1.d0-(1.d0-vvx)*exp(-vpf0)
+     * ,0.d0,0.d0,icdt,2,1)
+       if(abs(1.d0-vpf/vpf0)+abs(1.d0-vtf/vtf0).gt.1.d-2.and.n.le.50)
+     * then
+        vpf0=vpf
+        vtf0=vtf
+        goto 1
+       endif
+
+       if(iqq.eq.1)then
+        vplt=qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,1)
+        vtlt=qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,1)
+        vpltloop0=min(vplt,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,4))
+        vpltloop=min(vpltloop0,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,3))
+        vtltloop0=min(vtlt,qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,4))
+        vtltloop=min(vtltloop0,qglegc(xpomr1*sy/xp,xm,bb2,0.d0
+     *  ,icdt,2,3))
+        vpltscr=min(vpltloop,qglegc(xp/xpomr1,xp,bb1
+     *  ,1.d0-(1.d0-vvx)*exp(-vtf),icdp,icz,9))
+        vtltscr=min(vtltloop,qglegc(xpomr1*sy/xp,xm,bb2
+     *  ,1.d0-(1.d0-vvx)*exp(-vpf),icdt,2,9))
+
+        dpx=(vpltscr*vtltloop+vtltscr*vpltloop)
+     *  *((1.d0-vvx)**2*exp(-2.d0*vpf-2.d0*vtf)-1.d0)
+     *  +vplt*(vtltloop-vtltloop0)+vtlt*(vpltloop-vpltloop0)
+       elseif(iqq.eq.2)then
+        vpls=qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,0)
+        vtls=qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,0)
+        vplsloop0=min(vpls,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,6))
+        vplsloop=min(vplsloop0,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,5))
+        vtlsloop0=min(vtls,qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,6))
+        vtlsloop=min(vtlsloop0,qglegc(xpomr1*sy/xp,xm,bb2,0.d0
+     *  ,icdt,2,5))
+        vplsscr=min(vplsloop,qglegc(xp/xpomr1,xp,bb1
+     *  ,1.d0-(1.d0-vvx)*exp(-vtf),icdp,icz,10))
+        vtlsscr=min(vtlsloop,qglegc(xpomr1*sy/xp,xm,bb2
+     *  ,1.d0-(1.d0-vvx)*exp(-vpf),icdt,2,10))
+
+        dpx=(vplsscr*vtlsloop+vtlsscr*vplsloop)
+     *  *((1.d0-vvx)**2*exp(-2.d0*vpf-2.d0*vtf)-1.d0)
+     *  +vpls*(vtlsloop-vtlsloop0)+vtls*(vplsloop-vplsloop0)
+       elseif(iqq.eq.3)then
+        vplq=qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,2)
+        vtlt=qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,1)
+        vplqloop0=min(vplq,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,8))
+        vplqloop=min(vplqloop0
+     *  ,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,7))
+        vtltloop0=min(vtlt,qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,4))
+        vtltloop=min(vtltloop0,qglegc(xpomr1*sy/xp,xm,bb2,0.d0
+     *  ,icdt,2,3))
+        vplqscr=min(vplqloop,qglegc(xp/xpomr1,xp,bb1
+     *  ,1.d0-(1.d0-vvx)*exp(-vtf),icdp,icz,11))
+        vtltscr=min(vtltloop,qglegc(xpomr1*sy/xp,xm,bb2
+     *  ,1.d0-(1.d0-vvx)*exp(-vpf),icdt,2,9))
+
+        dpx=(vplqscr*vtltloop+vtltscr*vplqloop)
+     *  *((1.d0-vvx)**2*exp(-2.d0*vpf-2.d0*vtf)-1.d0)
+     *  +vplq*(vtltloop-vtltloop0)+vtlt*(vplqloop-vplqloop0)
+       elseif(iqq.eq.4)then
+        vplq=qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,2)
+        vtlq=qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,2)
+        vplqloop0=min(vplq,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,8))
+        vplqloop=min(vplqloop0
+     *  ,qglegc(xp/xpomr1,xp,bb1,0.d0,icdp,icz,7))
+        vtlqloop0=min(vtlq,qglegc(xpomr1*sy/xp,xm,bb2,0.d0,icdt,2,8))
+        vtlqloop=min(vtlqloop0,qglegc(xpomr1*sy/xp,xm,bb2,0.d0
+     *  ,icdt,2,7))
+        vplqscr=min(vplqloop,qglegc(xp/xpomr1,xp,bb1
+     *  ,1.d0-(1.d0-vvx)*exp(-vtf),icdp,icz,11))
+        vtlqscr=min(vtlqloop,qglegc(xpomr1*sy/xp,xm,bb2
+     *  ,1.d0-(1.d0-vvx)*exp(-vpf),icdt,2,11))
+
+        dpx=(vplqscr*vtlqloop+vtlqscr*vplqloop)
+     *  *((1.d0-vvx)**2*exp(-2.d0*vpf-2.d0*vtf)-1.d0)
+     *  +vplq*(vtlqloop-vtlqloop0)+vtlq*(vplqloop-vplqloop0)
+       else
+        dpx=0.d0
+       endif
+       qgcutp=qgcutp+a1(ib1)*a1(ib2)*a1(ix1)/z*rp*dpx
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      enddo
+      qgcutp=qgcutp/16.d0*(r3p*pi/.0389d0)/g3p**3
+     **dlog(sy/max(1.d0,xp*sgap)/max(1.d0,xm*sgap))
+
+2     continue
+      rp=(rq(icdp,icz)+rq(icdt,2)+alfp*log(sy/xp/xm))
+      vs=sy**dels*fp(icz)*fp(2)*sigs/rp
+     **exp(-bb/rp/4.d0/.0389d0)*cd(icdp,icz)*cd(icdt,2)
+      vgg=qgpsh(sy,xp,xm,bb,icdp,icdt,icz,0)
+      vqq=qgpomc(sy,xp,xm,bb,0.d0,icdp,icdt,icz,5)
+      vqg=qgpsh(sy,xp,xm,bb,icdp,icdt,icz,1)
+     */dsqrt(xp)*(1.d0-xp)**(ahv(icz)-ahl(icz))
+      vgq=qgpsh(sy,xp,xm,bb,icdp,icdt,icz,2)
+     */dsqrt(xm)*(1.d0-xm)**(ahv(2)-ahl(2))
+      if(iqq.eq.1)then
+       qgcutp=qgcutp+vs+vgg+vqg+vgq+vqq
+      elseif(iqq.eq.2)then
+       qgcutp=qgcutp+vs
+      elseif(iqq.eq.3)then
+       qgcutp=qgcutp+vs+vgg+vgq+vqq
+      elseif(iqq.eq.4)then
+       qgcutp=qgcutp+vs+vgg+vqq
+      endif
+      return
+      end
+
+c=============================================================================
+      double precision function qgpsh(sy,xpp,xpm,bb,icdp,icdt,icz,iqq)
+c-----------------------------------------------------------------------------
+c qgpsh - unintegrated semihard Pomeron eikonal
+c sy         - Pomeron mass squared,
+c xpp, xpm   - Pomeron LC momenta,
+c b          - impact parameter,
+c icdp, icdt - proj. and targ. diffractive eigenstates,
+c icz        - hadron class,
+c iqq        - type of the hard interaction (0-gg, 1-q_vg, 2-gq_v)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /arr3/   x1(7),a1(7)
+      common /qgdebug/  debug
+
+      if(debug.ge.3)write (moniou,201)sy,xpp,xpm,b,vvx0,icdp,icdt
+     *,icz,iqq
+      qgpsh=0.d0
+      s2min=4.d0*fqscal*qt0               !energy threshold for hard interaction
+      if(s2min/sy.ge.1.d0)then
+       if(debug.ge.4)write (moniou,202)qgpsh
+       return
+      endif
+
+      if(iqq.ne.2)then
+       icv=icz
+       icq=2
+       xp=xpp
+       xm=xpm
+       icdv=icdp
+       icdq=icdt
+      else
+       icv=2
+       icq=icz
+       xp=xpm
+       xm=xpp
+       icdq=icdp
+       icdv=icdt
+      endif
+
+      xmin=(s2min/sy)**(delh-dels)
+      do i=1,7
+      do m=1,2
+       z1=(.5d0*(1.d0+xmin-(2*m-3)*x1(i)*(1.d0-xmin)))
+     * **(1.d0/(delh-dels))
+       ww=z1*sy
+       sjqq=qgjit(qt0,qt0,ww,2,2)
+       sjqg=qgjit(qt0,qt0,ww,1,2)
+       sjgg=qgjit(qt0,qt0,ww,1,1)
+
+       if(iqq.eq.0)then                                !gg-Pomeron
+        st2=0.d0
+        do j=1,7
+        do k=1,2
+         xx=.5d0*(1.d0+x1(j)*(2*k-3))
+         xph=z1**xx
+         xmh=z1/xph
+
+         glu1=qgppdi(xph,0)
+         sea1=qgppdi(xph,1)
+         glu2=qgppdi(xmh,0)
+         sea2=qgppdi(xmh,1)
+         st2=st2+a1(j)*(glu1*glu2*sjgg+(glu1*sea2+glu2*sea1)*sjqg
+     *   +sea1*sea2*sjqq)
+        enddo
+        enddo
+        rh=rq(icdp,icz)+rq(icdt,2)-alfp*dlog(xpp*xpm*z1)
+        qgpsh=qgpsh-a1(i)*dlog(z1)/z1**delh*st2
+     *  *exp(-bb/rh/4.d0/.0389d0)/rh
+
+       else                                !qg-Pomeron
+        xmh=z1
+        glu=qgppdi(xmh,0)
+        sea=qgppdi(xmh,1)
+        rh=rq(icdp,icz)+rq(icdt,2)-alfp*dlog(xm*xmh)
+
+        fst=(glu*sjqg+sea*sjqq)
+     *  *(qggrv(xp,qt0,icv,1)+qggrv(xp,qt0,icv,2))/dsqrt(xp)
+     *  *exp(-bb/rh/4.d0/.0389d0)/rh
+        qgpsh=qgpsh+a1(i)/z1**delh*fst
+       endif
+      enddo
+      enddo
+      qgpsh=qgpsh*(1.d0-xmin)/(delh-dels)
+      if(iqq.eq.0)then
+       qgpsh=qgpsh*rr**2*fp(icz)*fp(2)*factk/2.d0*pi
+     * *cd(icdp,icz)*cd(icdt,2)
+      else
+       qgpsh=qgpsh*rr*fp(icq)*factk/4.d0
+     * *cd(icdp,icz)*cd(icdt,2)
+      endif
+      if(debug.ge.4)write (moniou,202)qgpsh
+
+201   format(2x,'qgpsh - unintegrated semihard Pomeron eikonal:'
+     */4x,'sy=',e10.3,2x,'xpp=',e10.3,2x,'xpm=',e10.3,2x,'b=',e10.3
+     */4x,'vvx0=',e10.3,2x,'icdp=',i1,2x,'icdt=',i1,2x,'icz=',i1
+     *,2x,'iqq=',i1)
+202   format(2x,'qgpsh=',e10.3)
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qglegc(sy,xp,bb,vvx,icdp,icz,iqq)
+c-----------------------------------------------------------------------
+c qglegc - interpolation of cut Pomeron leg eikonal
+c sy   - Pomeron mass squared,
+c xp   - Pomeron LC momentum,
+c bb   - squared impact parameter,
+c vvx - relative strenth of screening corrections (0<vvx<1),
+c icdp - diffractive eigenstate for the hadron,
+c icz  - hadron class
+c iqq=0  - soft Pomeron,
+c iqq=1  - total Pomeron,
+c iqq=2  - (soft+g)-Pomeron,
+c iqq=3  - total loop,
+c iqq=4  - total loop with single Pomeron end,
+c iqq=5  - soft loop,
+c iqq=6  - soft loop with single Pomeron end,
+c iqq=7  - (soft+g)-loop,
+c iqq=8  - (soft+g)-loop with single Pomeron end,
+c iqq=9  - total screened,
+c iqq=10 - soft screened,
+c iqq=11 - (soft+g)-screened
+c iqq=12 - g-distribution,
+c iqq=13 - q-distribution
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wj(3),wi(3),wz(3)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr25/ ahv(3)
+      common /qgarr26/ factk,fqscal
+      common /qgarr35/ qlegc0(51,10,11,6,8),qlegc(51,10,11,11,30)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.3)write (moniou,201)sy,xp,bb,vvx,icdp,icz,iqq
+
+      qglegc=0.d0
+      clegm=0.d0
+      rp=(rq(icdp,icz)+alfp*log(max(1.d0,sy/xp)))*4.d0*.0389d0
+      z=exp(-bb/rp)
+      if(iqq.eq.0.or.iqq.le.11.and.sy.le.sgap*max(1.d0,xp*sgap)
+     *  .or.iqq.gt.11.and.sy.le.max(1.d0,xp*sgap))then
+       if(iqq.le.11)then
+        qglegc=sy**dels*fp(icz)*sigs*g3p/rp*4.d0*.0389d0*z*cd(icdp,icz)
+       else
+        qglegc=qgppdi(1.d0/sy,iqq-12)
+       endif
+       if(debug.ge.4)write (moniou,202)qglegc
+       return
+      endif
+
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-dlog(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      if(iqq.le.11)then
+       yl=max(0.d0,dlog(sy/xp/sgap**2)/dlog(spmax/sgap**2))*50.d0+1.d0
+      else
+       yl=max(0.d0,dlog(sy/xp/sgap)/dlog(spmax/sgap))*50.d0+1.d0
+      endif
+      k=max(1,int(yl))
+      k=min(k,49)
+      wk(2)=yl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+      iymax=3
+
+      if(xp.lt..2d0)then
+       if(iqq.le.11)then
+        xl=6.d0-5.d0*log(5.d0*xp)/log(5.d0*xp*sgap/sy)
+       elseif(sy.gt.1.01d0*xp*sgap)then
+        xl=6.d0-5.d0*log(5.d0*xp)/log(xp*sgap/sy)
+       else
+        xl=1.d0
+       endif
+      else
+       xl=5.d0*xp+5.d0
+      endif
+      i=min(8,int(xl))
+      i=max(1,i)
+      if(i.eq.5)i=4
+      wi(2)=xl-i
+      wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+      wi(1)=1.d0-wi(2)+wi(3)
+      wi(2)=wi(2)-2.d0*wi(3)
+      ixmax=3
+
+      if(iqq.lt.9)then
+       do k1=1,iymax
+        k2=k+k1-1
+       do i1=1,ixmax
+        i2=i+i1-1
+       do l1=1,izmax
+        l2=jz+l1-1
+        qglegc=qglegc+qlegc0(k2,i2,l2,icdp+2*(icz-1),iqq)
+     *  *wk(k1)*wi(i1)*wz(l1)
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do k1=1,iymax
+         k2=k+k1-1
+        do i1=1,ixmax
+         i2=i+i1-1
+         clegm=clegm+qlegc0(k2,i2,1,icdp+2*(icz-1),iqq)*wk(k1)*wi(i1)
+        enddo
+        enddo
+        qglegc=min(qglegc,clegm)
+       endif
+      else
+       vl=max(1.d0,vvx*10.d0+1.d0)
+       if(vl.lt.2.d0)then
+        j=1
+        wj(2)=vl-j
+        wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+        wj(1)=1.d0-wj(2)+wj(3)
+        wj(2)=wj(2)-2.d0*wj(3)
+        ivmax=3
+       else
+        j=min(int(vl),10)
+        wj(2)=vl-j
+        wj(1)=1.d0-wj(2)
+        ivmax=2
+       endif
+
+       do l1=1,izmax
+        l2=jz+l1-1
+       do j1=1,ivmax
+        j2=j+j1-1
+       do i1=1,ixmax
+        i2=i+i1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qglegc=qglegc+qlegc(k2,i2,j2,l2,icdp+2*(icz-1)+6*(iqq-9))
+     *  *wk(k1)*wi(i1)*wz(l1)*wj(j1)
+       enddo
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do j1=1,ivmax
+         j2=j+j1-1
+        do i1=1,ixmax
+         i2=i+i1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         clegm=clegm+qlegc(k2,i2,j2,1,icdp+2*(icz-1)+6*(iqq-9))
+     *   *wk(k1)*wi(i1)*wj(j1)
+        enddo
+        enddo
+        enddo
+        qglegc=min(qglegc,clegm)
+       endif
+      endif
+      if(iqq.le.11)then
+       qglegc=exp(qglegc)*qgls(sy,xp,bb,icdp,icz)
+      else
+       qglegc=exp(qglegc)*qgppdi(1.d0/sy,iqq-12)
+      endif
+      if(debug.ge.4)write (moniou,202)qglegc
+
+201   format(2x,'qglegc - interpolation of Pomeron leg eikonal:'
+     */4x,'sy=',e10.3,2x,'xp=',e10.3,2x,'b^2=',e10.3,2x,'vvx=',e10.3
+     *,2x,'icdp=',i1,2x,'icz=',i1,2x,'iqq=',i1)
+202   format(2x,'qglegc=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgpomc(sy,xp,xm,bb,vvx
+     *,icdp,icdt,icz,iqq)
+c-----------------------------------------------------------------------
+c qgpomc - unintegrated cut Pomeron eikonal
+c sy         - Pomeron mass squared,
+c xp,xm      - Pomeron light cone momenta,
+c bb         - squared impact parameter,
+c vvx        - relative strenth of nuclear screening corrections,
+c icdp, icdt - proj. and targ. diffractive eigenstates,
+c icz        - hadron class
+c iqq=1 - total,
+c iqq=2 - soft contribution,
+c iqq=3 - qg contribution
+c iqq=4 - gq contribution
+c iqq=5 - qq contribution
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wi(3),wj(3),wz(3),wm(3)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr19/ ahl(3)
+      common /qgarr20/ spmax
+      common /qgarr25/ ahv(3)
+      common /qgarr26/ factk,fqscal
+      common /qgarr38/ qpomc(11,100,11,11,48)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.3)write (moniou,201)sy,xp,xm,bb,vvx
+     *,icdp,icdt,icz,iqq
+
+      qgpomc=0.d0
+      pomm=0.d0
+      if(iqq.eq.5)then                          !qq contribution
+       s2min=4.d0*fqscal*qt0
+       if(sy.gt.1.001d0*s2min.and.xp.lt..99d0.and.xm.lt..99d0)then
+        sj=qgjit(qt0,qt0,sy,2,2)
+        qgpomc=sj*factk*(qggrv(xp,qt0,icz,1)+qggrv(xp,qt0,icz,2))
+     *  *(qggrv(xm,qt0,2,1)+qggrv(xm,qt0,2,2))/xp/xm
+     *  *(1.d0-xp)**(ahv(icz)-ahl(icz))*(1.d0-xm)**(ahv(2)-ahl(2))
+     *  *exp(-bb/(4.d0*.0389d0*(rq(icdp,icz)+rq(icdt,2))))
+     *  /(8.d0*pi*(rq(icdp,icz)+rq(icdt,2)))*cd(icdp,icz)*cd(icdt,2)
+       endif
+       if(debug.ge.4)write (moniou,202)qgpomc
+       return
+      endif
+
+      rp=(rq(icdp,icz)+rq(icdt,2)+alfp*log(sy/xp/xm))*4.d0*.0389d0
+      z=exp(-bb/rp)
+      if(sy.le.max(1.d0,xp*sgap)*max(1.d0,xm*sgap)*1.01d0)then
+       qgpomc=sy**dels*fp(icz)*fp(2)*sigs*z/rp
+     * *4.d0*.0389d0*cd(icdp,icz)*cd(icdt,2)
+       return
+      endif
+
+      if(z.gt..2d0)then
+       zz=5.d0*z+6.d0
+      else
+       zz=(-bb/rp-dlog(0.2d0))/2.d0+7.d0
+      endif
+      jz=min(9,int(zz))
+      jz=max(1,jz)
+      if(zz.lt.1.d0)then
+       wz(2)=zz-jz
+       wz(1)=1.d0-wz(2)
+       izmax=2
+      else
+       if(jz.eq.6)jz=5
+       wz(2)=zz-jz
+       wz(3)=wz(2)*(wz(2)-1.d0)*.5d0
+       wz(1)=1.d0-wz(2)+wz(3)
+       wz(2)=wz(2)-2.d0*wz(3)
+       izmax=3
+      endif
+
+      yl=max(0.d0,dlog(sy/xp/xm/sgap**2)
+     */dlog(spmax/sgap**2))*10.d0+1.d0
+      k=max(1,int(yl))
+      k=min(k,9)
+      wk(2)=yl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+      iymax=3
+
+      if(xp.lt..2d0)then
+       xl1=6.d0-5.d0*log(5.d0*xp)/log(5.d0*sgap*xp*xm/sy)
+      else
+       xl1=5.d0*xp+5.d0
+      endif
+      i=min(8,int(xl1))
+      i=max(1,i)
+      if(i.eq.5)i=4
+      wi(2)=xl1-i
+      wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+      wi(1)=1.d0-wi(2)+wi(3)
+      wi(2)=wi(2)-2.d0*wi(3)
+      ix1max=3
+
+      if(sgap/sy*xm.gt..99d0)then
+       j=1
+       wj(1)=1.d0
+       ix2max=1
+      else
+       if(xm.lt..2d0)then
+        xl2=6.d0-5.d0*log(5.d0*xm)/log(sgap/sy*xm)
+       else
+        xl2=5.d0*xm+5.d0
+       endif
+       j=min(8,int(xl2))
+       j=max(1,j)
+       if(j.eq.5)j=4
+       wj(2)=xl2-j
+       wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+       wj(1)=1.d0-wj(2)+wj(3)
+       wj(2)=wj(2)-2.d0*wj(3)
+       ix2max=3
+      endif
+
+      ml=icdp+2*(icdt-1)+4*(icz-1)+12*(iqq-1)
+      if(vvx.eq.0.d0)then                     !hadron-proton collision
+       do l1=1,izmax
+        l2=jz+l1-1
+       do j1=1,ix2max
+        j2=j+j1-2
+       do i1=1,ix1max
+        i2=i+i1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgpomc=qgpomc+qpomc(k2,i2+10*j2,l2,1,ml)
+     *  *wk(k1)*wi(i1)*wj(j1)*wz(l1)
+       enddo
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do j1=1,ix2max
+         j2=j+j1-2
+        do i1=1,ix1max
+         i2=i+i1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         pomm=pomm+qpomc(k2,i2+10*j2,1,1,ml)*wk(k1)*wi(i1)*wj(j1)
+        enddo
+        enddo
+        enddo
+        qgpomc=min(qgpomc,pomm)
+       endif
+
+      else                                    !hA (AA) collision
+       vl=max(1.d0,vvx*10.d0+1.d0)
+       if(vl.lt.2.d0)then
+        m=1
+        wm(2)=vl-m
+        wm(3)=wm(2)*(wm(2)-1.d0)*.5d0
+        wm(1)=1.d0-wm(2)+wm(3)
+        wm(2)=wm(2)-2.d0*wm(3)
+        ivmax=3
+       else
+        m=min(int(vl),10)
+        wm(2)=vl-m
+        wm(1)=1.d0-wm(2)
+        ivmax=2
+       endif
+
+       do m1=1,ivmax
+        m2=m+m1-1
+       do l1=1,izmax
+        l2=jz+l1-1
+       do j1=1,ix2max
+        j2=j+j1-2
+       do i1=1,ix1max
+        i2=i+i1-1
+       do k1=1,iymax
+        k2=k+k1-1
+        qgpomc=qgpomc+qpomc(k2,i2+10*j2,l2,m2,ml)
+     *  *wk(k1)*wi(i1)*wj(j1)*wz(l1)*wm(m1)
+       enddo
+       enddo
+       enddo
+       enddo
+       enddo
+       if(zz.lt.1.d0)then
+        do m1=1,ivmax
+         m2=m+m1-1
+        do j1=1,ix2max
+         j2=j+j1-2
+        do i1=1,ix1max
+         i2=i+i1-1
+        do k1=1,iymax
+         k2=k+k1-1
+         pomm=pomm+qpomc(k2,i2+10*j2,1,m2,ml)
+     *   *wk(k1)*wi(i1)*wj(j1)*wm(m1)
+        enddo
+        enddo
+        enddo
+        enddo
+        qgpomc=min(qgpomc,pomm)
+       endif
+      endif
+      qgpomc=exp(qgpomc)*z
+      if(debug.ge.4)write (moniou,202)qgpomc
+
+201   format(2x,'qgpomc - unintegrated cut Pomeron eikonal:'
+     */4x,'sy=',e10.3,2x,'xp=',e10.3,2x,'xm=',e10.3,2x,'b^2=',e10.3
+     */4x,'vvx=',e10.3,2x,'icdp=',i1,2x,'icdt=',i1,2x,'icz=',i1
+     *,2x,'iqq=',i1)
+202   format(2x,'qgpomc=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgsha(nbpom,ncola,ncolb,iret)
+c-----------------------------------------------------------------------------
+c qgsha - inelastic interaction (energy sharing and particle production)
+c nbpom - number of Pomeron blocks (nucleon(hadron)-nucleon collisions),
+c ncola - number of inel.-wounded proj. nucleons,
+c ncolb - number of inel.-wounded targ. nucleons
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208,npbmax=1000,npnmax=900,npmax=900
+     *,legmax=900,njmax=50000)
+      dimension wppr0(iapmax),wmtg0(iapmax),wppr1(iapmax),wmtg1(iapmax)
+     *,wppr2(iapmax),wmtg2(iapmax),izp(iapmax),izt(iapmax)
+     *,ila(iapmax),ilb(iapmax),lva(iapmax),lvb(iapmax)
+     *,lqa0(iapmax),lqb0(iapmax),ncola(iapmax),ncolb(iapmax)
+     *,ncola0(iapmax),ncolb0(iapmax)
+     *,xpomp0(npnmax,iapmax),xpomt0(npnmax,iapmax)
+     *,xpopin0(npmax,npbmax),xpomin0(npmax,npbmax)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr6/  pi,bm,amws
+      common /qgarr7/  xa(iapmax,3),xb(iapmax,3),b
+      common /qgarr9/  iwp(iapmax),iwt(iapmax),lqa(iapmax),lqb(iapmax)
+     *,iprcn(iapmax),itgcn(iapmax),ias(npbmax),ibs(npbmax),nqs(npbmax)
+     *,npompr(npbmax),npomtg(npbmax),npomin(npbmax),nnpr(npmax,npbmax)
+     *,nntg(npmax,npbmax),ilpr(legmax,npbmax),iltg(legmax,npbmax)
+     *,lnpr(legmax,npbmax),lntg(legmax,npbmax)
+     *,nbpi(npnmax,iapmax),nbti(npnmax,iapmax),idnpi(npnmax,iapmax)
+     *,idnti(npnmax,iapmax),nppi(npnmax,iapmax),npti(npnmax,iapmax)
+     *,nlpi(npnmax,iapmax),nlti(npnmax,iapmax)
+      common /qgarr11/ b10
+      common /qgarr12/ nsp
+      common /qgarr13/ nsf,iaf(iapmax)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr23/ bbpom(npbmax),vvxpom(npbmax)
+     *,bpompr(npnmax,iapmax),bpomtg(npnmax,iapmax)
+     *,vvxpr(npnmax,iapmax),vvxtg(npnmax,iapmax)
+     *,xpompr(npnmax,iapmax),xpomtg(npnmax,iapmax)
+     *,xpopin(npmax,npbmax),xpomin(npmax,npbmax),vvxin(npmax,npbmax)
+     *,bpomin(npmax,npbmax)
+      common /qgarr26/ factk,fqscal
+      common /qgarr37/ eqj(4,njmax),iqj(njmax),ncj(2,njmax),nj
+      common /qgarr40/ xppr(npnmax,iapmax),xmtg(npnmax,iapmax)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      external qgran
+
+      if(debug.ge.1)write (moniou,201)nbpom             !so161205
+      nsp0=nsp
+
+      do j=1,ia(1)
+       if(lqa(j).ne.0)then
+        do i=1,lqa(j)
+         if(idnpi(i,j).ne.0)xpomp0(i,j)=xpompr(i,j)
+        enddo
+       endif
+      enddo
+      do j=1,ia(2)
+       if(lqb(j).ne.0)then
+        do i=1,lqb(j)
+         if(idnti(i,j).ne.0)xpomt0(i,j)=xpomtg(i,j)
+        enddo
+       endif
+      enddo
+      if(nbpom.ne.0)then
+       do nb=1,nbpom                            !loop over collisions
+        if(npomin(nb).ne.0)then
+         do np=1,npomin(nb)         !loop over interm. Pomerons in the collision
+          xpopin0(np,nb)=xpopin(np,nb)
+          xpomin0(np,nb)=xpomin(np,nb)
+         enddo
+        endif
+       enddo
+      endif
+      iret=0
+      nret=0
+
+1     nsp=nsp0
+      nj=0
+
+      if(iret.ne.0)then             !rejection during energy-sharing
+       nret=nret+1
+       if(nret.gt.100)return        !too many rejections -> redo configuration
+      endif
+
+      do j=1,ia(1)
+       if(lqa(j).ne.0)then
+        do i=1,lqa(j)
+         if(idnpi(i,j).ne.0)xpompr(i,j)=xpomp0(i,j)
+        enddo
+       endif
+      enddo
+      do j=1,ia(2)
+       if(lqb(j).ne.0)then
+        do i=1,lqb(j)
+         if(idnti(i,j).ne.0)xpomtg(i,j)=xpomt0(i,j)
+        enddo
+       endif
+      enddo
+      if(nbpom.ne.0)then
+       do nb=1,nbpom                            !loop over collisions
+        if(npomin(nb).ne.0)then
+         do np=1,npomin(nb)         !loop over interm. Pomerons in the collision
+          xpopin(np,nb)=xpopin0(np,nb)
+          xpomin(np,nb)=xpomin0(np,nb)
+         enddo
+        endif
+       enddo
+      endif
+
+c-------------------------------------------------
+c initial nucleon (hadron) types
+      if(ia(1).ne.1)then
+       do i=1,ia(1)
+        izp(i)=int(2.5d0+qgran(b10))   !i-th projectile nucleon type
+       enddo
+      else
+       izp(1)=icp                      !projectile hadron type
+      endif
+      if(ia(2).ne.1)then
+       do i=1,ia(2)
+        izt(i)=int(2.5d0+qgran(b10))   !i-th target nucleon type
+       enddo
+      else
+       izt(1)=2                        !target proton
+      endif
+
+      do i=1,ia(1)
+       lqa0(i)=lqa(i)
+       lva(i)=0
+       ncola0(i)=ncola(i)
+      enddo
+      do i=1,ia(2)
+       lqb0(i)=lqb(i)
+       lvb(i)=0
+       ncolb0(i)=ncolb(i)
+      enddo
+
+c-------------------------------------------------
+c energy-momentum sharing between Pomerons
+      if(nbpom.ne.0)then
+       if(debug.ge.1)write (moniou,202)
+       call qgprox(0)        !initial x-configuration
+       gbl0=qgweix(nbpom)    !log-weight for the initial x-configuration
+       nrej=0
+       nchange=0
+       gbnorm=.1d0
+       gbhmax=-1000.d0
+
+2      continue
+       call qgprox(1)        !proposed x-configuration
+       gbl=qgweix(nbpom)     !log-weight for the proposed x-configuration
+       gbh=gbl-gbl0-gbnorm   !log of acceptance probability
+       gbhmax=max(gbhmax,gbh)
+
+       if(debug.ge.5)write (moniou,203)gbh,nrej,nchange
+       if(gbh.lt.-50.d0.or.qgran(b10).gt.exp(gbh))then
+        nrej=nrej+1
+        if(nrej.gt.100)then               !too many rejections
+         nrej=0
+         nchange=nchange+1
+         gbnorm=gbnorm+gbhmax+.5d0        !new normalization of acceptance
+         gbhmax=-1000.d0
+         if(debug.ge.4)write (moniou,204)nchange
+        endif
+        goto 2                            !rejection
+       endif
+      endif
+
+c-------------------------------------------------
+c leading remnant LC momenta
+      if(debug.ge.1)write (moniou,205)
+      do i=1,ia(1)                        !loop over proj. nucleons
+       wppr0(i)=wp0
+       wppr1(i)=0.d0
+       wppr2(i)=0.d0
+       if(lqa(i).ne.0)then
+        do l=1,lqa(i)                     !loop over constituent partons
+         wppr0(i)=wppr0(i)-wp0*xppr(l,i)  !subtract Pomeron LC momentum
+         if(wppr0(i).lt.0.d0)then
+          wppr0(i)=0.d0
+         endif
+        enddo
+       endif
+      enddo
+      do i=1,ia(2)                        !loop over targ. nucleons
+       wmtg0(i)=wm0
+       wmtg1(i)=0.d0
+       wmtg2(i)=0.d0
+       if(lqb(i).ne.0)then
+        do l=1,lqb(i)                     !loop over constituent partons
+         wmtg0(i)=wmtg0(i)-wm0*xmtg(l,i)  !subtract Pomeron LC momentum
+         if(wmtg0(i).lt.-1.d-15)stop'w^-<0!!!'
+         wmtg0(i)=max(0.d0,wmtg0(i))
+        enddo
+       endif
+      enddo
+
+c-------------------------------------------------
+c momentum conservation (correction for 3p-vertexes)
+      if(debug.ge.1)write (moniou,206)
+      if(nbpom.ne.0)then
+       do nb=1,nbpom                            !loop over collisions
+        ip=ias(nb)                              !proj. index
+        it=ibs(nb)                              !targ. index
+        if(nqs(nb).ne.0)then
+         do np=1,nqs(nb)             !loop over single Pomerons in the collision
+          lnp=nnpr(np,nb)                       !proj. constituent parton index
+          lnt=nntg(np,nb)                       !targ. constituent parton index
+          wppr1(ip)=wppr1(ip)+xppr(lnp,ip)*wp0  !count Pomeron LC momentum
+          wmtg1(it)=wmtg1(it)+xmtg(lnt,it)*wm0  !count Pomeron LC momentum
+         enddo
+        endif
+        if(npomin(nb).ne.0)then
+         do np=1,npomin(nb)         !loop over interm. Pomerons in the collision
+          xpp=xpopin(np,nb)
+          xpm=xpomin(np,nb)
+          if(xpp*xpm*scm.gt.1.d0)then
+           wppr2(ip)=wppr2(ip)+xpp*wp0          !count Pomeron LC momentum
+           wmtg2(it)=wmtg2(it)+xpm*wm0          !count Pomeron LC momentum
+          else
+           xpopin(np,nb)=0.d0
+           xpomin(np,nb)=0.d0
+          endif
+         enddo
+        endif
+        if(npompr(nb).ne.0)then
+         do np=1,npompr(nb)       !loop over proj. leg Pomerons in the collision
+          ipp=ilpr(np,nb)                       !proj. index
+          lnp=lnpr(np,nb)                       !proj. constituent parton index
+          xpp=xppr(lnp,ipp)
+          xpm=xpompr(lnp,ipp)
+          if(xpp*xpm*scm.gt.1.d0)then
+           wppr1(ipp)=wppr1(ipp)+xpp*wp0        !count Pomeron LC momentum
+           wmtg2(it)=wmtg2(it)+xpm*wm0          !count Pomeron LC momentum
+          else
+           xppr(lnp,ipp)=0.d0
+           xpompr(lnp,ipp)=0.d0
+          endif
+         enddo
+        endif
+        if(npomtg(nb).ne.0)then
+         do np=1,npomtg(nb)       !loop over targ. leg Pomerons in the collision
+          itt=iltg(np,nb)                       !targ. index
+          lnt=lntg(np,nb)                       !targ. constituent parton index
+          xpp=xpomtg(lnt,itt)
+          xpm=xmtg(lnt,itt)
+          if(xpp*xpm*scm.gt.1.d0)then
+           wppr2(ip)=wppr2(ip)+xpp*wp0                !count Pomeron LC momentum
+           wmtg1(itt)=wmtg1(itt)+xpm*wm0        !count Pomeron LC momentum
+          else
+           xmtg(lnt,itt)=0.d0
+           xpomtg(lnt,itt)=0.d0
+          endif
+         enddo
+        endif
+       enddo
+      endif
+
+      do ip=1,ia(1)
+       if(wppr1(ip)+wppr2(ip).ne.0.d0)then
+        if(lqa(ip).ne.0)then
+         do i=1,lqa(ip)
+          xppr(i,ip)=xppr(i,ip)*(wp0-wppr0(ip)) !renorm. for const. partons
+     *    /(wppr1(ip)+wppr2(ip))
+         enddo
+
+         do nb=1,nbpom
+          if(ias(nb).eq.ip.and.npomtg(nb)+npomin(nb).ne.0)then
+           if(npomin(nb).ne.0)then
+            do np=1,npomin(nb)
+             xpopin(np,nb)=xpopin(np,nb)*(wp0-wppr0(ip))
+     *       /(wppr1(ip)+wppr2(ip))
+            enddo
+           endif
+           if(npomtg(nb).ne.0)then
+            do np=1,npomtg(nb)
+             itt=iltg(np,nb)
+             lnt=lntg(np,nb)
+             xpomtg(lnt,itt)=xpomtg(lnt,itt)*(wp0-wppr0(ip))
+     *       /(wppr1(ip)+wppr2(ip))
+            enddo
+           endif
+          endif
+         enddo
+
+        elseif(wppr2(ip).gt.wp0)then
+         wpt=wp0/sgap/2.d0*4.d0**qgran(b10)
+         do nb=1,nbpom
+          if(ias(nb).eq.ip.and.npomtg(nb)+npomin(nb).ne.0)then
+           if(npomin(nb).ne.0)then
+            do np=1,npomin(nb)
+             xpopin(np,nb)=xpopin(np,nb)*wpt/wppr2(ip)
+            enddo
+           endif
+           if(npomtg(nb).ne.0)then
+            do np=1,npomtg(nb)
+             itt=iltg(np,nb)
+             lnt=lntg(np,nb)
+             xpomtg(lnt,itt)=xpomtg(lnt,itt)*wpt/wppr2(ip)
+            enddo
+           endif
+          endif
+         enddo
+         wppr0(ip)=wp0-wpt
+        else
+         wppr0(ip)=wp0-wppr2(ip)
+        endif
+       else                             !so230913
+        wppr0(ip)=wp0                   !so230913
+       endif
+      enddo
+
+      do it=1,ia(2)
+       if(wmtg1(it)+wmtg2(it).ne.0.d0)then
+        if(lqb(it).ne.0)then
+         do i=1,lqb(it)
+          xmtg(i,it)=xmtg(i,it)*(wm0-wmtg0(it))/(wmtg1(it)+wmtg2(it))
+         enddo
+
+         do nb=1,nbpom
+          if(ibs(nb).eq.it.and.npompr(nb)+npomin(nb).ne.0)then
+           if(npomin(nb).ne.0)then
+            do np=1,npomin(nb)
+             xpomin(np,nb)=xpomin(np,nb)*(wm0-wmtg0(it))
+     *       /(wmtg1(it)+wmtg2(it))
+            enddo
+           endif
+           if(npompr(nb).ne.0)then
+            do np=1,npompr(nb)
+             ipp=ilpr(np,nb)
+             lnp=lnpr(np,nb)
+             xpompr(lnp,ipp)=xpompr(lnp,ipp)*(wm0-wmtg0(it))
+     *       /(wmtg1(it)+wmtg2(it))
+            enddo
+           endif
+          endif
+         enddo
+
+        elseif(wmtg2(it).gt.wm0)then
+         wmt=wm0/sgap/2.d0*4.d0**qgran(b10)
+         do nb=1,nbpom
+          if(ibs(nb).eq.it.and.npompr(nb)+npomin(nb).ne.0)then
+           if(npomin(nb).ne.0)then
+            do np=1,npomin(nb)
+             xpomin(np,nb)=xpomin(np,nb)*wmt/wmtg2(it)
+            enddo
+           endif
+           if(npompr(nb).ne.0)then
+            do np=1,npompr(nb)
+             ipp=ilpr(np,nb)
+             lnp=lnpr(np,nb)
+             xpompr(lnp,ipp)=xpompr(lnp,ipp)*wmt/wmtg2(it)
+            enddo
+           endif
+          endif
+         enddo
+         wmtg0(it)=wm0-wmt
+        else
+         wmtg0(it)=wm0-wmtg2(it)
+        endif
+       else                             !so230913
+        wmtg0(it)=wm0                   !so230913
+       endif
+      enddo
+
+c-------------------------------------------------
+c treatment of low mass diffraction
+      if(debug.ge.1)write (moniou,207)
+      do ip=1,ia(1)                        !loop over proj. nucleons
+       if(iwp(ip).eq.2)then                !diffraction dissociation
+        it=iprcn(ip)
+        if(debug.ge.2)write (moniou,208)ip,it
+        if(iwt(it).eq.2)then
+         call qgdifr(wppr0(ip),wmtg0(it),izp(ip),izt(it),-2,-2,iret)
+        elseif(iwt(it).eq.-1)then
+         call qgdifr(wppr0(ip),wmtg0(it),izp(ip),izt(it),-2,0,iret)
+        elseif(iwt(it).gt.0)then
+         call qgdifr(wppr0(ip),wmtg0(it),izp(ip),izt(it),-2,-1,iret)
+        else
+         stop'wrong connection for diffraction'
+        endif
+        if(iret.eq.1)goto 1
+       endif
+      enddo
+
+      do it=1,ia(2)                        !loop over targ. nucleons
+       if(iwt(it).eq.2)then                !diffraction dissociation
+        ip=itgcn(it)
+        if(debug.ge.2)write (moniou,209)it,ip
+        if(iwp(ip).eq.-1)then
+         call qgdifr(wppr0(ip),wmtg0(it),izp(ip),izt(it),0,-2,iret)
+        elseif(iwp(ip).gt.0.and.iwp(ip).ne.2)then
+         call qgdifr(wppr0(ip),wmtg0(it),izp(ip),izt(it),-1,-2,iret)
+        endif
+        if(iret.eq.1)goto 1
+       endif
+      enddo
+
+c-------------------------------------------------
+c particle production for all cut Pomerons
+      s2min=4.d0*fqscal*qt0       !threshold energy for a hard process
+      if(nbpom.ne.0)then
+       if(debug.ge.1)write (moniou,210)
+       do npb=1,nbpom                            !loop over collisions
+        ip=ias(npb)                              !proj. index
+        it=ibs(npb)                              !targ. index
+        icdp=iddp(ip)                            !proj. diffr. eigenstate
+        icdt=iddt(it)                            !targ. diffr. eigenstate
+        bbp=bbpom(npb)                           !b^2 between proj. and targ.
+        vvx=vvxpom(npb)                          !nuclear screening factor
+        if(debug.ge.1)write (moniou,211)npb,ip,it,bbp,vvx,nqs(npb)
+     *  ,npomin(npb),npompr(npb),npomtg(npb)
+
+        if(npomin(npb).ne.0)then
+         do n=1,npomin(npb)                      !loop over interm. Pomerons
+          wpi=xpopin(n,npb)*wp0                  !LC+ for the Pomeron
+          wmi=xpomin(n,npb)*wm0                  !LC- for the Pomeron
+          if(debug.ge.2)write (moniou,212)n,wpi,wmi
+          if(wpi*wmi.ne.0.d0)then
+           ic11=0
+           ic12=0
+           ic21=0
+           ic22=0
+           call qgstr(wpi,wmi,wppr0(ip),wmtg0(it)
+     *     ,ic11,ic12,ic22,ic21,0,0)             !string hadronization
+          endif
+         enddo
+        endif
+
+        if(nqs(npb).ne.0)then
+         do n=1,nqs(npb)                         !loop over single Pomerons
+          lnp=nnpr(n,npb)                        !index for proj. constituent
+          lnt=nntg(n,npb)                        !index for targ. constituent
+          lqa0(ip)=lqa0(ip)-1
+          lqb0(it)=lqb0(it)-1
+          xpi=xppr(lnp,ip)
+          xmi=xmtg(lnt,it)
+          wpi=wp0*xpi                            !LC+ for the Pomeron
+          wmi=wm0*xmi                            !LC- for the Pomeron
+          sy=wpi*wmi
+          wtot=qgpomc(sy,xpi,xmi,bbp,vvx,icdp,icdt,icz,1) !total
+          wsoft=qgpomc(sy,xpi,xmi,bbp,vvx,icdp,icdt,icz,2)!soft interaction
+          wqg=qgpomc(sy,xpi,xmi,bbp,vvx,icdp,icdt,icz,3)  !qg-hard interaction
+          wgq=qgpomc(sy,xpi,xmi,bbp,vvx,icdp,icdt,icz,4)  !gq-hard interaction
+          wqq=qgpomc(sy,xpi,xmi,bbp,vvx,icdp,icdt,icz,5)  !qq-hard interaction
+          aks=qgran(b10)*wtot
+          if(debug.ge.2)write (moniou,213)n,wpi,wmi
+
+          if(aks.lt.wsoft.or.sy.lt.2.d0*s2min)then !soft string hadronization
+           if(lqa0(ip).eq.0.and.lva(ip).eq.0)then
+            call qgixxd(izp(ip),ic11,ic12,icz)
+           else
+            ic11=0
+            ic12=0
+           endif
+           if(lqb0(it).eq.0.and.lvb(it).eq.0)then
+            call qgixxd(izt(it),ic21,ic22,2)
+           else
+            ic21=0
+            ic22=0
+           endif
+           call qgstr(wpi,wmi,wppr0(ip),wmtg0(it),ic11,ic12,ic22,ic21
+     *     ,1,1)
+          else            !QCD evolution and hadronization for semi-hard Pomeron
+           if(lva(ip).eq.0.and.lvb(it).eq.0.and.aks.lt.wsoft+wqq)then
+            iqq=3
+            lva(ip)=1
+            lvb(it)=1
+           elseif(lva(ip).eq.0.and.aks.gt.wqg)then
+            iqq=1
+            lva(ip)=1
+           elseif(lvb(it).eq.0.and.aks.gt.wgq)then
+            iqq=2
+            lvb(it)=1
+           else
+            iqq=0
+           endif
+
+           call qghot(wpi,wmi,dsqrt(bbp),vvx,nva,nvb,izp(ip),izt(it)
+     *     ,icdp,icdt,icz,iqq,0)            !QCD evolution + jet hadronization
+           if(iqq.eq.1.or.iqq.eq.3)ila(ip)=nva
+           if(iqq.eq.2.or.iqq.eq.3)ilb(it)=nvb
+          endif
+         enddo
+        endif
+
+        if(npompr(npb).ne.0)then
+         do l=1,npompr(npb)                 !loop over proj. leg Pomerons
+          ipp=ilpr(l,npb)                  !proj. index
+          lnp=lnpr(l,npb)                  !index for proj. constituent
+          bbpr=bpompr(lnp,ipp)             !b^2 for the Pomeron
+          vvxp=vvxpr(lnp,ipp)              !screening factor
+          lqa0(ipp)=lqa0(ipp)-1
+          xpi=xppr(lnp,ipp)
+          xmi=xpompr(lnp,ipp)
+          wpi=wp0*xpi                      !LC+ for the Pomeron
+          wmi=wm0*xmi                      !LC- for the Pomeron
+          sy=wpi*wmi
+          if(sy.ne.0.d0)then
+           wtot=qglegc(sy,xpi,bbpr,vvxp,iddp(ipp),icz,9)   !total
+           wsoft=qglegc(sy,xpi,bbpr,vvxp,iddp(ipp),icz,10) !soft interaction
+           wqg=qglegc(sy,xpi,bbpr,vvxp,iddp(ipp),icz,11)   !qg-hard interaction
+          else
+           wsoft=1.d0
+           wtot=1.d0
+           wqg=0.d0
+          endif
+          aks=qgran(b10)*wtot
+          if(debug.ge.2)write (moniou,214)l,wpi,wmi
+
+          if(aks.le.wsoft.or.sy.lt.2.d0*s2min)then  !soft string hadronization
+           if(lqa0(ipp).eq.0.and.lva(ipp).eq.0.and.sy.ne.0.d0)then
+            call qgixxd(izp(ipp),ic11,ic12,icz)
+           else
+            ic11=0
+            ic12=0
+           endif
+           ic21=0
+           ic22=0
+           call qgstr(wpi,wmi,wppr0(ipp),wmtg0(it),ic11,ic12,ic22,ic21
+     *     ,1,0)
+
+          else        !QCD evolution and hadronization for semi-hard Pomeron
+           if(lva(ipp).eq.0.and.aks.gt.wqg)then
+            iqq=1
+            lva(ipp)=1
+           else
+            iqq=0
+           endif
+
+           call qghot(wpi,wmi,dsqrt(bbpr),vvxp,nva,nvb,izp(ipp),izt(it)
+     *     ,iddp(ipp),icdt,icz,iqq,1)         !QCD evolution + jet hadronization
+           if(iqq.eq.1)ila(ipp)=nva
+          endif
+          call qglead(wppr0(ipp),wmtg0(it),lqa(ipp)+1-iwp(ipp)
+     *    ,lqb(it)+1-iwt(it),lqa0(ipp)+ncola0(ipp),lqb0(it)+ncolb0(it)
+     *    ,lva(ipp),lvb(it),izp(ipp),izt(it),ila(ipp),ilb(it),iret)  !remnants
+          if(iret.ne.0)goto 1
+         enddo
+        endif
+
+        if(npomtg(npb).ne.0)then
+         do l=1,npomtg(npb)                !loop over targ. leg Pomerons
+          itt=iltg(l,npb)                  !targ. index
+          lnt=lntg(l,npb)                  !index for targ. constituent
+          bbtg=bpomtg(lnt,itt)             !b^2 for the Pomeron
+          vvxt=vvxtg(lnt,itt)              !screening factor
+          lqb0(itt)=lqb0(itt)-1
+          xmi=xmtg(lnt,itt)
+          wmi=wm0*xmi                      !LC- for the Pomeron
+          wpi=wp0*xpomtg(lnt,itt)          !LC+ for the Pomeron
+          sy=wpi*wmi
+          if(sy.ne.0.d0)then
+           wtot=qglegc(sy,xmi,bbtg,vvxt,iddt(itt),2,9)  !tot
+           wsoft=qglegc(sy,xmi,bbtg,vvxt,iddt(itt),2,10)!soft interaction
+           wqg=qglegc(sy,xmi,bbtg,vvxt,iddt(itt),2,11)  !qg-hard interaction
+          else
+           wtot=1.d0
+           wsoft=1.d0
+           wqg=0.d0
+          endif
+          aks=qgran(b10)*wtot
+          if(debug.ge.2)write (moniou,215)l,wpi,wmi
+
+          if(aks.le.wsoft.or.sy.lt.2.d0*s2min)then  !soft string hadronization
+           ic11=0
+           ic12=0
+           if(lqb0(itt).eq.0.and.lvb(itt).eq.0.and.sy.ne.0.d0)then
+            call qgixxd(izt(itt),ic21,ic22,2)
+           else
+            ic21=0
+            ic22=0
+           endif
+           call qgstr(wpi,wmi,wppr0(ip),wmtg0(itt),ic11,ic12,ic22,ic21
+     *     ,0,1)
+
+          else         !QCD evolution and hadronization for semi-hard Pomeron
+           if(lvb(itt).eq.0.and.aks.gt.wqg)then
+            iqq=2
+            lvb(itt)=1
+           else
+            iqq=0
+           endif
+
+           call qghot(wpi,wmi,dsqrt(bbtg),vvxt,nva,nvb,izp(ip),izt(itt)
+     *     ,icdp,iddt(itt),icz,iqq,2)         !QCD evolution + jet hadronization
+           if(iqq.eq.2)ilb(itt)=nvb
+          endif
+          call qglead(wppr0(ip),wmtg0(itt),lqa(ip)+1-iwp(ip),lqb(itt)
+     *    +1-iwt(itt),lqa0(ip)+ncola0(ip),lqb0(itt)+ncolb0(itt)
+     *    ,lva(ip),lvb(itt),izp(ip),izt(itt),ila(ip),ilb(itt),iret) !remnants
+          if(iret.ne.0)goto 1
+         enddo
+        endif
+        ncola0(ip)=ncola0(ip)-1
+        ncolb0(it)=ncolb0(it)-1
+        call qglead(wppr0(ip),wmtg0(it),lqa(ip)+1-iwp(ip),lqb(it)
+     *  +1-iwt(it),lqa0(ip)+ncola0(ip),lqb0(it)+ncolb0(it)
+     *  ,lva(ip),lvb(it),izp(ip),izt(it),ila(ip),ilb(it),iret) !remnants
+        if(iret.ne.0)goto 1
+       enddo                                           !end of collision loop
+      endif
+
+      if(nj.ne.0)then                   !arrangement of parton color connections
+       if(debug.ge.1)write (moniou,216)nj
+       call qgjarr(jfl)
+       if(jfl.eq.0)then
+        iret=1
+        goto 1
+       endif
+       if(debug.ge.1)write (moniou,217)
+       call qgxjet                      !jet hadronization
+      endif
+      if(debug.ge.1)write (moniou,218)
+
+201   format(2x,'qgsha - inelastic interaction, N of Pomeron blocks:'
+     *,i4)
+202   format(2x,'qgsha: energy-momentum sharing between Pomerons')
+203   format(2x,'qgsha: log of acceptance probability - ',e10.3
+     */4x,'N of rejections - ',i4,2x,'N of renorm. - ',i3)
+204   format(2x,'qgsha:  new normalization of acceptance,'
+     *,' N of renorm. - ',i3)
+205   format(2x,'qgsha: leading remnant LC momenta')
+206   format(2x,'qgsha: momentum conservation '
+     *,'(correction for 3p-vertexes)')
+207   format(2x,'qgsha: treatment of low mass diffraction')
+208   format(2x,'qgsha: diffraction of ',i3,'-th proj. nucleon,'
+     *,' recoil of ',i3,'-th targ. nucleon')
+209   format(2x,'qgsha: diffraction of ',i3,'-th targ. nucleon,'
+     *,' recoil of ',i3,'-th proj. nucleon')
+210   format(2x,'qgsha: particle production for all cut Pomerons')
+211   format(2x,'qgsha: ',i4,'-th collision,  proj. index - ',i3,2x
+     *,'targ. index - ',i3
+     */4x,'b^2=',e10.3,2x,'vvx=',e10.3,2x,'N of single Pomerons - ',i3
+     *,2x,' N of interm. Pomerons - ',i3
+     */4x,'N of proj. legs - ',i3,2x,'N of targ. legs - ',i3)
+212   format(2x,'qgsha: particle production for '
+     *,i3,'-th interm. Pomeron'
+     */4x,'light cone momenta for the Pomeron:',2e10.3)
+213   format(2x,'qgsha: particle production for '
+     *,i3,'-th single Pomeron'
+     */4x,'light cone momenta for the Pomeron:',2e10.3)
+214   format(2x,'qgsha: particle production for '
+     *,i3,'-th proj. leg Pomeron'
+     */4x,'light cone momenta for the Pomeron:',2e10.3)
+215   format(2x,'qgsha: particle production for '
+     *,i3,'-th targ. leg Pomeron'
+     */4x,'light cone momenta for the Pomeron:',2e10.3)
+216   format(2x,'qgsha: arrangement of color connections for '
+     *,i5,' final partons')
+217   format(2x,'qgsha: jet hadronization')
+218   format(2x,'qgsha - end')
+      return
+      end
+
+c=============================================================================
+      subroutine qgprox(imode)
+c-------------------------------------------------------------------------
+c qgprox - propose Pomeron end LC momenta
+c imod = 0 - to define normalization
+c imod = 1 - propose values according to x^delf * (1 - sum_i x_i)^ahl
+c-------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208,npbmax=1000,npnmax=900,npmax=900,legmax=900)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr6/  pi,bm,amws
+      common /qgarr9/  iwp(iapmax),iwt(iapmax),lqa(iapmax),lqb(iapmax)
+     *,iprcn(iapmax),itgcn(iapmax),ias(npbmax),ibs(npbmax),nqs(npbmax)
+     *,npompr(npbmax),npomtg(npbmax),npomin(npbmax),nnpr(npmax,npbmax)
+     *,nntg(npmax,npbmax),ilpr(legmax,npbmax),iltg(legmax,npbmax)
+     *,lnpr(legmax,npbmax),lntg(legmax,npbmax)
+     *,nbpi(npnmax,iapmax),nbti(npnmax,iapmax),idnpi(npnmax,iapmax)
+     *,idnti(npnmax,iapmax),nppi(npnmax,iapmax),npti(npnmax,iapmax)
+     *,nlpi(npnmax,iapmax),nlti(npnmax,iapmax)
+      common /qgarr11/ b10
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr19/ ahl(3)
+      common /qgarr23/ bbpom(npbmax),vvxpom(npbmax)
+     *,bpompr(npnmax,iapmax),bpomtg(npnmax,iapmax)
+     *,vvxpr(npnmax,iapmax),vvxtg(npnmax,iapmax)
+     *,xpompr(npnmax,iapmax),xpomtg(npnmax,iapmax)
+     *,xpopin(npmax,npbmax),xpomin(npmax,npbmax),vvxin(npmax,npbmax)
+     *,bpomin(npmax,npbmax)
+      common /qgarr40/ xppr(npnmax,iapmax),xmtg(npnmax,iapmax)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      external qgran
+
+      if(debug.ge.3)write (moniou,201)imode
+
+      delf=dels
+      if(imode.eq.0)then                    !0-configuration (for normalization)
+       do ip=1,ia(1)                        !loop over proj. nucleons
+        if(lqa(ip).ne.0)then
+         do n=1,lqa(ip)                     !loop over proj. constituents
+          if(idnpi(n,ip).eq.0)then
+           xppr(n,ip)=1.d0/wp0              !LC+ for single Pomeron
+          else
+           xppr(n,ip)=1.d0/xpompr(n,ip)/scm !LC+ for leg Pomeron
+          endif
+          enddo
+        endif
+       enddo
+       do it=1,ia(2)                        !loop over targ. nucleons
+        if(lqb(it).ne.0)then
+         do n=1,lqb(it)                     !loop over targ. constituents
+          if(idnti(n,it).eq.0)then
+           xmtg(n,it)=1.d0/wm0              !LC- for single Pomeron
+          else
+           xmtg(n,it)=1.d0/xpomtg(n,it)/scm !LC- for leg Pomeron
+          endif
+         enddo
+        endif
+       enddo
+
+      else                                  !proposed configuration
+       do ip=1,ia(1)                        !loop over proj. nucleons
+        if(lqa(ip).ne.0)then
+         xpt=1.d0
+         do n=1,lqa(ip)                     !loop over proj. constituents
+          nrej=0
+          alfl=ahl(icz)+(lqa(ip)-n)*(1.d0+delf)
+c          if(icz.eq.2)alfl=alfl-float(lqa(ip)-1)/lqa(ip)  !baryon "junction"
+          gb0=(1.d0-.11d0**(1.d0/(1.d0+delf)))**alfl
+     *    *exp(alfl*(1.d0+delf)*.11d0)*2.d0
+1         continue
+c proposal functions are chosen depending on the parameters
+c to assure an efficient procedure
+          if(delf.ge.0.d0.and.alfl.ge.0.d0
+     *    .or.delf.lt.0.d0.and.alfl.le.0.d0)then
+           up=1.d0-qgran(b10)**(1.d0/(1.d0+delf))
+           if(1.d0-up.lt.1.d-20)goto 1
+           tp=1.d0-up**(1.d0/(1.d0+alfl))
+           gb=(tp/(1.d0-up))**delf
+          elseif(delf.lt.0.d0.and.alfl.gt.0.d0)then
+           up=-log(1.d0-qgran(b10)*(1.d0-exp(-alfl*(1.d0+delf))))
+     *     /alfl/(1.d0+delf)
+           tp=up**(1.d0/(1.d0+delf))
+           gb=(1.d0-tp)**alfl*exp(alfl*(1.d0+delf)*up)/gb0
+          else
+           tp=1.d0-qgran(b10)**(1.d0/(1.d0+alfl))
+           gb=tp**delf
+          endif
+          if(qgran(b10).gt.gb)then
+           nrej=nrej+1
+           goto 1
+          endif
+          xppr(n,ip)=tp*xpt                 !proposed LC+ for the constituent
+          xpt=xpt-xppr(n,ip)                !LC+ of the remnant
+          enddo
+        endif
+       enddo
+
+       do it=1,ia(2)                        !loop over targ. nucleons
+        if(lqb(it).ne.0)then
+         xmt=1.d0
+         do n=1,lqb(it)                     !loop over targ. constituents
+          nrej=0
+          alfl=ahl(2)+(lqb(it)-n)*(1.d0+delf)
+c     *    -float(lqb(it)-1)/lqb(it)                       !baryon "junction"
+          gb0=(1.d0-.11d0**(1.d0/(1.d0+delf)))**alfl
+     *    *exp(alfl*(1.d0+delf)*.11d0)*2.d0
+2         continue
+          if(delf.ge.0.d0.and.alfl.ge.0.d0
+     *    .or.delf.lt.0.d0.and.alfl.le.0.d0)then
+           up=1.d0-qgran(b10)**(1.d0/(1.d0+delf))
+           if(1.d0-up.lt.1.d-20)goto 2
+           tp=1.d0-up**(1.d0/(1.d0+alfl))
+           gb=(tp/(1.d0-up))**delf
+          elseif(delf.lt.0.d0.and.alfl.gt.0.d0)then
+           up=-log(1.d0-qgran(b10)*(1.d0-exp(-alfl*(1.d0+delf))))
+     *     /alfl/(1.d0+delf)
+           tp=up**(1.d0/(1.d0+delf))
+           gb=(1.d0-tp)**alfl*exp(alfl*(1.d0+delf)*up)/gb0
+          else
+           tp=1.d0-qgran(b10)**(1.d0/(1.d0+alfl))
+           gb=tp**delf
+          endif
+          if(qgran(b10).gt.gb)then
+           nrej=nrej+1
+           goto 2
+          endif
+          if(qgran(b10).gt.gb)goto 2
+          xmtg(n,it)=tp*xmt                 !proposed LC- for the constituent
+          xmt=xmt-xmtg(n,it)                !LC- of the remnant
+          enddo
+        endif
+       enddo
+      endif
+      if(debug.ge.4)write (moniou,202)
+
+201   format(2x,'qgprox - propose Pomeron end LC momenta, imode=',i2)
+202   format(2x,'qgprox - end')
+      return
+      end
+
+c=============================================================================
+      double precision function qgweix(nbpom)
+c-------------------------------------------------------------------------
+c qgweix - log-weight of x-configuration
+c imod = 0 - to define normalization
+c imod = 1 - propose values according to x^delf * (1 - sum_i x_i)^ahl
+c-------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208,npbmax=1000,npnmax=900,npmax=900,legmax=900)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr6/  pi,bm,amws
+      common /qgarr9/  iwp(iapmax),iwt(iapmax),lqa(iapmax),lqb(iapmax)
+     *,iprcn(iapmax),itgcn(iapmax),ias(npbmax),ibs(npbmax),nqs(npbmax)
+     *,npompr(npbmax),npomtg(npbmax),npomin(npbmax),nnpr(npmax,npbmax)
+     *,nntg(npmax,npbmax),ilpr(legmax,npbmax),iltg(legmax,npbmax)
+     *,lnpr(legmax,npbmax),lntg(legmax,npbmax)
+     *,nbpi(npnmax,iapmax),nbti(npnmax,iapmax),idnpi(npnmax,iapmax)
+     *,idnti(npnmax,iapmax),nppi(npnmax,iapmax),npti(npnmax,iapmax)
+     *,nlpi(npnmax,iapmax),nlti(npnmax,iapmax)
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr23/ bbpom(npbmax),vvxpom(npbmax)
+     *,bpompr(npnmax,iapmax),bpomtg(npnmax,iapmax)
+     *,vvxpr(npnmax,iapmax),vvxtg(npnmax,iapmax)
+     *,xpompr(npnmax,iapmax),xpomtg(npnmax,iapmax)
+     *,xpopin(npmax,npbmax),xpomin(npmax,npbmax),vvxin(npmax,npbmax)
+     *,bpomin(npmax,npbmax)
+      common /qgarr40/ xppr(npnmax,iapmax),xmtg(npnmax,iapmax)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.3)write (moniou,201)nbpom
+
+      delf=dels
+      qgweix=0.d0
+      do npb=1,nbpom                              !loop over collisions
+       ip=ias(npb)                                !proj. index
+       it=ibs(npb)                                !targ. index
+       icdp=iddp(ip)                              !proj. diffr. eigenstate
+       icdt=iddt(it)                              !targ. diffr. eigenstate
+       bbp=bbpom(npb)                             !b^2 between proj. and targ.
+       vvx=vvxpom(npb)                            !nuclear screening factor
+       if(nqs(npb).ne.0)then
+        do n=1,nqs(npb)                           !loop over single Pomerons
+         lnp=nnpr(n,npb)                          !proj. constituent index
+         lnt=nntg(n,npb)                          !targ. constituent index
+         xpp=xppr(lnp,ip)                         !LC+ for the Pomeron
+         xpm=xmtg(lnt,it)                         !LC- for the Pomeron
+         qgweix=qgweix+dlog(qgpomc(scm*xpp*xpm,xpp,xpm,bbp,vvx
+     *   ,icdp,icdt,icz,1)/(xpp*xpm)**delf)       !add single Pomeron contrib.
+        enddo
+       endif
+       if(npompr(npb).ne.0)then
+        do l=1,npompr(npb)                         !loop over proj. leg Pomerons
+         ipp=ilpr(l,npb)                          !proj. index
+         lnp=lnpr(l,npb)                          !proj. constituent index
+         xpp=xppr(lnp,ipp)                        !LC+ for the Pomeron
+         xpomr=1.d0/xpompr(lnp,ipp)/scm           !LC+ for the 3P vertex
+         vvxp=vvxpr(lnp,ipp)                      !screening factor
+         bbpr=bpompr(lnp,ipp)                          !b^2 for the Pomeron
+         qgweix=qgweix+dlog(qglegc(xpp/xpomr,xpp,bbpr,vvxp
+     *   ,iddp(ipp),icz,9)/xpp**delf)             !add leg Pomeron contrib.
+        enddo
+       endif
+       if(npomtg(npb).ne.0)then
+        do l=1,npomtg(npb)                        !loop over targ. leg Pomerons
+         itt=iltg(l,npb)                          !targ. index
+         lnt=lntg(l,npb)                          !targ. constituent index
+         xpm=xmtg(lnt,itt)                        !LC- for the Pomeron
+         xpomr=xpomtg(lnt,itt)                    !LC+ for the 3P vertex
+         vvxt=vvxtg(lnt,itt)                      !screening factor
+         bbtg=bpomtg(lnt,itt)                          !b^2 for the Pomeron
+         qgweix=qgweix+dlog(qglegc(xpomr*scm*xpm,xpm,bbtg,vvxt
+     *   ,iddt(itt),2,9)/xpm**delf)               !add leg Pomeron contrib.
+        enddo
+       endif
+      enddo
+      if(debug.ge.4)write (moniou,202)qgweix
+
+201   format(2x,'qgweix - log-weight of x-configuration,'
+     *,' N of collisions - ',i4)
+202   format(2x,'qgweix=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qghot(wpp,wpm,b,vvx,nva,nvb,izp,izt,icdp,icdt,icz,iqq
+     *,jpt)
+c---------------------------------------------------------------------------
+c qghot - semi-hard process
+c wpp,wpm   - LC momenta for the constituent partons,
+c b         - impact parameter for the semi-hard Pomeron,
+c izp, izt  - types of proj. and targ. remnants,
+c icdp,icdt - proj. and targ.  diffractive eigenstates,
+c iqq - type of the semi-hard process: 0 - gg, 1 - q_vg, 2 - gq_v, 3 - q_vq_v
+c jpt=0 - single Pomeron,
+c jpt=1 - proj. leg Pomeron,
+c jpt=2 - targ. leg Pomeron
+c---------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      character*2 tyq
+      parameter(njmax=50000)
+      dimension ept(4),ep3(4),ey(3),ebal(4),
+     *qmin(2),wp(2),iqc(2),iqp(2),nqc(2),ncc(2,2),
+     *qv1(30,50),zv1(30,50),qm1(30,50),iqv1(30,50),
+     *ldau1(30,49),lpar1(30,50),
+     *qv2(30,50),zv2(30,50),qm2(30,50),iqv2(30,50),
+     *ldau2(30,49),lpar2(30,50)
+      parameter(iapmax=208,npbmax=1000,npnmax=900,npmax=900,legmax=900)
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr6/  pi,bm,amws
+      common /qgarr8/  wwm,be(4),dc(5),deta,almpt,ptdif,ptndi
+      common /qgarr10/ am(7),ammu
+      common /qgarr11/ b10
+      common /qgarr12/ nsp
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr37/ eqj(4,njmax),iqj(njmax),ncj(2,njmax),nj
+      common /qgarr42/ tyq(16)
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/ debug
+      external qgran
+
+      if(debug.ge.1)write (moniou,201)iqq,wpp,wpm,izp,izt,icdp,icdt
+     *,icz,jpt,nj
+
+      wwgg=0.d0
+      wwqg=0.d0
+      wwgq=0.d0
+      wwqq=0.d0
+      wpi=0.d0
+      wmi=0.d0
+      sjqg=0.d0
+      sjqq=0.d0
+      sea1=0.d0
+      sea2=0.d0
+      glu1=0.d0
+      glu2=0.d0
+      nj0=nj                       !store number of final partons
+      nsp0=nsp                     !store number of final particles
+
+1     sy=wpp*wpm  !energy squared for semi-hard inter. (including preevolution)
+      nj=nj0
+      nsp=nsp0
+      s2min=4.d0*fqscal*qt0       !threshold energy
+      if(sy.lt.s2min)stop'qghot: sy<s2min!!!'
+
+      if(iqq.eq.3)then             !q_vq_v-ladder
+       wpi=wpp                     !LC+ for the hard interaction
+       wmi=wpm                     !LC- for the hard interaction
+      else
+
+c-------------------------------------------------
+c normalization of acceptance
+       xmin=s2min/sy
+       iq=(iqq+1)/2+1              !auxilliary type of parton (1 - g, 2 - q(q~))
+       sj=qgjit(qt0,qt0,sy,1,iq)   !inclusive parton-parton cross-sections
+       if(iqq.eq.0)then
+        gb0=-dlog(xmin)*(1.d0-dsqrt(xmin))**(2.d0*betp)*sj
+       else
+        gb0=(1.d0-xmin)**betp*sj
+       endif
+       if(jpt.eq.0)then            !single Pomeron
+        if(iqq.eq.0)then
+         rp0=(rq(icdp,icz)+rq(icdt,2)+alfp*dlog(scm/s2min))
+     *   *4.d0*.0389d0
+         gb0=gb0/(rq(icdp,icz)+rq(icdt,2)+alfp*dlog(scm/sy))
+     *   *exp(-b*b/rp0)
+        elseif(iqq.eq.1)then
+         rp0=(rq(icdp,icz)+rq(icdt,2)+alfp*dlog(wpp*wm0/s2min))
+     *   *4.d0*.0389d0
+         gb0=gb0/(rq(icdp,icz)+rq(icdt,2)+alfp*dlog(wm0/wpm))
+     *   *exp(-b*b/rp0)
+        elseif(iqq.eq.2)then
+         rp0=(rq(icdp,icz)+rq(icdt,2)+alfp*dlog(wpm*wp0/s2min))
+     *   *4.d0*.0389d0
+         gb0=gb0/(rq(icdp,icz)+rq(icdt,2)+alfp*dlog(wp0/wpp))
+     *   *exp(-b*b/rp0)
+        endif
+       elseif(jpt.eq.1)then        !proj. leg Pomeron
+        if(iqq.eq.0)then
+         rp0=(rq(icdp,icz)+alfp*dlog(wp0*wpm/s2min))*4.d0*.0389d0
+         gb0=gb0/(rq(icdp,icz)+alfp*dlog(wp0/wpp))*exp(-b*b/rp0)
+        elseif(iqq.eq.1)then
+         rp0=(rq(icdp,icz)+alfp*dlog(sy/s2min))*4.d0*.0389d0
+         gb0=gb0/rq(icdp,icz)*exp(-b*b/rp0)
+        endif
+       elseif(jpt.eq.2)then        !targ. leg Pomeron
+        if(iqq.eq.0)then
+         rp0=(rq(icdt,2)+alfp*dlog(wm0*wpp/s2min))*4.d0*.0389d0
+         gb0=gb0/(rq(icdt,2)+alfp*dlog(wm0/wpm))*exp(-b*b/rp0)
+        elseif(iqq.eq.2)then
+         rp0=(rq(icdt,2)+alfp*dlog(sy/s2min))*4.d0*.0389d0
+         gb0=gb0/rq(icdt,2)*exp(-b*b/rp0)
+        endif
+       endif
+
+c-------------------------------------------------
+c sharing of LC momenta between soft preevolution and hard ladder
+2      zpm=(1.d0-qgran(b10)*(1.d0-xmin**(delh-dels)))
+     * **(1.d0/(delh-dels))
+       sjqq=qgjit(qt0,qt0,zpm*sy,2,2)  !inclusive qq cross-section
+       sjqg=qgjit(qt0,qt0,zpm*sy,1,2)  !inclusive qg cross-section
+       sjgg=qgjit(qt0,qt0,zpm*sy,1,1)  !inclusive gg cross-section
+
+       if(iqq.eq.0)then              !gg-ladder
+        xp=zpm**qgran(b10)           !LC+ momentum share
+        xm=zpm/xp                    !LC- momentum share
+        wpi=wpp*xp                   !LC+ for the hard interaction
+        wmi=wpm*xm                   !LC- for the hard interaction
+        if(jpt.eq.0)then             !single Pomeron
+         rp1=(rq(icdp,icz)+alfp*dlog(wp0/wpi))*4.d0*.0389d0
+         rp2=(rq(icdt,2)+alfp*dlog(wm0/wmi))*4.d0*.0389d0
+         rp=rp1*rp2/(rp1+rp2)
+         z=qgran(b10)
+         phi=pi*qgran(b10)
+         b0=dsqrt(-rp*dlog(z))
+         bb1=(b*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+         bb2=(b*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+
+         xpomr=wpi/wp0
+         if(xpomr*sgap.ge.1.d0.or.xpomr*scm.le.sgap)then
+          vvx1=0.d0
+         else
+          v1pnu0=qgfani(1.d0/xpomr,bb1,vvx,0.d0,0.d0,icdp,icz,1)
+          v1tnu0=qgfani(xpomr*scm,bb2,vvx,0.d0,0.d0,icdt,2,1)
+          nn=0
+21        nn=nn+1
+          vvxt=1.d0-exp(-v1pnu0)*(1.d0-vvx)
+          vvxp=1.d0-exp(-v1tnu0)*(1.d0-vvx)
+          v1pnu=qgfani(1.d0/xpomr,bb1,vvxp,0.d0,0.d0,icdp,icz,1)
+          v1tnu=qgfani(xpomr*scm,bb2,vvxt,0.d0,0.d0,icdt,2,1)
+          if((abs(v1pnu0-v1pnu).gt.1.d-1.or.abs(v1tnu0-v1tnu).gt.1.d-1)
+     *    .and.nn.lt.100)then
+           v1pnu0=v1pnu
+           v1tnu0=v1tnu
+           goto 21
+          endif
+          vvx1=1.d0-exp(-v1tnu)*(1.d0-vvx)
+         endif
+
+         xpomr=wm0/wmi/scm
+         if(xpomr*sgap.ge.1.d0.or.xpomr*scm.le.sgap)then
+          vvx2=0.d0
+         else
+          v1pnu0=qgfani(1.d0/xpomr,bb1,vvx,0.d0,0.d0,icdp,icz,1)
+          v1tnu0=qgfani(xpomr*scm,bb2,vvx,0.d0,0.d0,icdt,2,1)
+          nn=0
+22        nn=nn+1
+          vvxt=1.d0-exp(-v1pnu0)*(1.d0-vvx)
+          vvxp=1.d0-exp(-v1tnu0)*(1.d0-vvx)
+          v1pnu=qgfani(1.d0/xpomr,bb1,vvxp,0.d0,0.d0,icdp,icz,1)
+          v1tnu=qgfani(xpomr*scm,bb2,vvxt,0.d0,0.d0,icdt,2,1)
+          if((abs(v1pnu0-v1pnu).gt.1.d-1.or.abs(v1tnu0-v1tnu).gt.1.d-1)
+     *    .and.nn.lt.100)then
+           v1pnu0=v1pnu
+           v1tnu0=v1tnu
+           goto 22
+          endif
+          vvx2=1.d0-exp(-v1pnu)*(1.d0-vvx)
+         endif
+
+         glu1=qglegc(1.d0/xp,wpp/wp0,bb1,vvx1,icdp,icz,12) !upper gluon PDF
+         sea1=qglegc(1.d0/xp,wpp/wp0,bb1,vvx1,icdp,icz,13) !upper quark PDF
+         glu2=qglegc(1.d0/xm,wpm/wm0,bb2,vvx2,icdt,2,12)   !lower gluon PDF
+         sea2=qglegc(1.d0/xm,wpm/wm0,bb2,vvx2,icdt,2,13)   !lower quark PDF
+        elseif(jpt.eq.1)then                         !proj. leg Pomeron
+         rp1=(rq(icdp,icz)+alfp*dlog(wp0/wpi))*4.d0*.0389d0
+         rp2=-alfp*dlog(xm)*4.d0*.0389d0
+         rp=rp1*rp2/(rp1+rp2)
+         z=qgran(b10)
+         phi=pi*qgran(b10)
+         b0=dsqrt(-rp*dlog(z))
+         bb1=(b*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+         bb2=(b*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+
+         glu1=qglegc(1.d0/xp,wpp/wp0,bb1,vvx,icdp,icz,12) !upper gluon PDF
+         sea1=qglegc(1.d0/xp,wpp/wp0,bb1,vvx,icdp,icz,13) !upper quark PDF
+         glu2=qgppdi(xm,0)
+         sea2=qgppdi(xm,1)
+        elseif(jpt.eq.2)then                         !proj. leg Pomeron
+         rp1=(rq(icdt,2)+alfp*dlog(wm0/wmi))*4.d0*.0389d0
+         rp2=-alfp*dlog(xp)*4.d0*.0389d0
+         rp=rp1*rp2/(rp1+rp2)
+         z=qgran(b10)
+         phi=pi*qgran(b10)
+         b0=dsqrt(-rp*dlog(z))
+         bb1=(b*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+         bb2=(b*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+
+         glu1=qglegc(1.d0/xm,wpm/wm0,bb1,vvx,icdt,2,12) !upper gluon PDF
+         sea1=qglegc(1.d0/xm,wpm/wm0,bb1,vvx,icdt,2,13) !upper quark PDF
+         glu2=qgppdi(xp,0)
+         sea2=qgppdi(xp,1)
+        endif
+        wwgg=glu1*glu2*sjgg
+        wwqg=sea1*glu2*sjqg
+        wwgq=glu1*sea2*sjqg
+        wwqq=sea1*sea2*sjqq
+        gbyj=-dlog(zpm)*(wwgg+wwqg+wwgq+wwqq)
+        if(jpt.eq.0)then
+         rh=rq(icdp,icz)+rq(icdt,2)-alfp*dlog(zpm*sy/scm)
+        elseif(jpt.eq.1)then
+         rh=rq(icdp,icz)-alfp*dlog(wpp/wp0*zpm)
+        elseif(jpt.eq.2)then
+         rh=rq(icdt,2)-alfp*dlog(wpm/wm0*zpm)
+        else
+         rh=0.d0
+         stop 'Should not happen in qghot'
+        endif
+        gbyj=gbyj/rh*exp(-b*b/(4.d0*.0389d0*rh))
+
+       else                          !q_vg-(gq_v-)ladder
+        if(iqq.eq.1)then             !q_vg-ladder
+         wpi=wpp
+         wmi=wpm*zpm
+         xm=zpm
+         if(jpt.eq.0)then            !single Pomeron
+          rp1=rq(icdp,icz)*4.d0*.0389d0
+          rp2=(rq(icdt,2)+alfp*dlog(wm0/wmi))*4.d0*.0389d0
+          rp=rp1*rp2/(rp1+rp2)
+          z=qgran(b10)
+          phi=pi*qgran(b10)
+          b0=dsqrt(-rp*dlog(z))
+          bb1=(b*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+          bb2=(b*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+
+          xpomr=wm0/wmi/scm
+          if(xpomr*sgap.ge.1.d0.or.xpomr*scm.le.sgap)then
+           vvx2=0.d0
+          else
+           v1pnu0=qgfani(1.d0/xpomr,bb1,vvx,0.d0,0.d0,icdp,icz,1)
+           v1tnu0=qgfani(xpomr*scm,bb2,vvx,0.d0,0.d0,icdt,2,1)
+           nn=0
+23         nn=nn+1
+           vvxt=1.d0-exp(-v1pnu0)*(1.d0-vvx)
+           vvxp=1.d0-exp(-v1tnu0)*(1.d0-vvx)
+           v1pnu=qgfani(1.d0/xpomr,bb1,vvxp,0.d0,0.d0,icdp,icz,1)
+           v1tnu=qgfani(xpomr*scm,bb2,vvxt,0.d0,0.d0,icdt,2,1)
+           if((abs(v1pnu0-v1pnu).gt.1.d-1.or.abs(v1tnu0-v1tnu).gt.1.d-1)
+     *     .and.nn.lt.100)then
+            v1pnu0=v1pnu
+            v1tnu0=v1tnu
+            goto 23
+           endif
+           vvx2=1.d0-exp(-v1pnu)*(1.d0-vvx)
+          endif
+
+          glu2=qglegc(1.d0/xm,wpm/wm0,bb2,vvx2,icdt,2,12) !upper gluon PDF
+          sea2=qglegc(1.d0/xm,wpm/wm0,bb2,vvx2,icdt,2,13) !upper quark PDF
+          wwqg=glu2*sjqg
+          wwqq=sea2*sjqq
+         else                        !leg Pomeron
+          wwqg=qgppdi(xm,0)*sjqg
+          wwqq=qgppdi(xm,1)*sjqq
+         endif
+        elseif(iqq.eq.2)then         !gq_v-ladder
+         wpi=wpp*zpm
+         wmi=wpm
+         xp=zpm
+         if(jpt.eq.0)then            !single Pomeron
+          rp1=(rq(icdp,icz)+alfp*dlog(wp0/wpi))*4.d0*.0389d0
+          rp2=rq(icdt,2)*4.d0*.0389d0
+          rp=rp1*rp2/(rp1+rp2)
+          z=qgran(b10)
+          phi=pi*qgran(b10)
+          b0=dsqrt(-rp*dlog(z))
+          bb1=(b*rp1/(rp1+rp2)+b0*cos(phi))**2+(b0*sin(phi))**2
+          bb2=(b*rp2/(rp1+rp2)-b0*cos(phi))**2+(b0*sin(phi))**2
+
+          xpomr=wpi/wp0
+          if(xpomr*sgap.ge.1.d0.or.xpomr*scm.le.sgap)then
+           vvx1=0.d0
+          else
+           v1pnu0=qgfani(1.d0/xpomr,bb1,vvx,0.d0,0.d0,icdp,icz,1)
+           v1tnu0=qgfani(xpomr*scm,bb2,vvx,0.d0,0.d0,icdt,2,1)
+           nn=0
+24         nn=nn+1
+           vvxt=1.d0-exp(-v1pnu0)*(1.d0-vvx)
+           vvxp=1.d0-exp(-v1tnu0)*(1.d0-vvx)
+           v1pnu=qgfani(1.d0/xpomr,bb1,vvxp,0.d0,0.d0,icdp,icz,1)
+           v1tnu=qgfani(xpomr*scm,bb2,vvxt,0.d0,0.d0,icdt,2,1)
+           if((abs(v1pnu0-v1pnu).gt.1.d-1.or.abs(v1tnu0-v1tnu).gt.1.d-1)
+     *     .and.nn.lt.100)then
+            v1pnu0=v1pnu
+            v1tnu0=v1tnu
+            goto 24
+           endif
+           vvx1=1.d0-exp(-v1tnu)*(1.d0-vvx)
+          endif
+
+          glu1=qglegc(1.d0/xp,wpp/wp0,bb1,vvx1,icdp,icz,12) !upper gluon PDF
+          sea1=qglegc(1.d0/xp,wpp/wp0,bb1,vvx1,icdp,icz,13) !upper quark PDF
+          wwqg=glu1*sjqg
+          wwqq=sea1*sjqq
+         else                        !leg Pomeron
+          wwqg=qgppdi(xp,0)*sjqg
+          wwqq=qgppdi(xp,1)*sjqq
+         endif
+        endif
+        gbyj=wwqg+wwqq
+        if(jpt.eq.0)then
+         if(iqq.eq.1)then
+          rh=rq(icdp,icz)+rq(icdt,2)-alfp*dlog(wpm/wm0*zpm)
+         else
+          rh=rq(icdp,icz)+rq(icdt,2)-alfp*dlog(wpp/wp0*zpm)
+         endif
+        elseif(jpt.eq.1)then
+         rh=rq(icdp,icz)-alfp*dlog(zpm)
+        elseif(jpt.eq.2)then
+         rh=rq(icdt,2)-alfp*dlog(zpm)
+        else
+         rh=0.d0
+         stop 'Should not happen in qghot'
+        endif
+        gbyj=gbyj/rh*exp(-b*b/(4.d0*.0389d0*rh))
+       endif
+
+       gbyj=gbyj/gb0/zpm**delh
+       if(qgran(b10).gt.gbyj)goto 2
+      endif
+      if(debug.ge.2)write (moniou,202)wpi*wmi
+
+11    wpi1=wpi
+      wmi1=wmi
+      wpq=0.d0
+      wmq=0.d0
+      nj=nj0                     !initialization for the number of final partons
+      rrr=qgran(b10)
+      jqq=0                                  !gg-ladder
+      if(iqq.eq.1.or.iqq.eq.2)then
+       if(rrr.lt.wwqq/(wwqg+wwqq))jqq=1      !q_vq_s-laddder
+      elseif(iqq.eq.0)then
+       if(rrr.lt.wwqg/(wwgg+wwqg+wwgq+wwqq))then
+        jqq=1                                !q_sg-ladder
+       elseif(rrr.lt.(wwqg+wwgq)/(wwgg+wwqg+wwgq+wwqq))then
+        jqq=2                                !gq_s-ladder
+       elseif(rrr.lt.(wwqg+wwgq+wwqq)/(wwgg+wwqg+wwgq+wwqq))then
+        jqq=3                                !q_sq_s-ladder
+       endif
+      endif
+
+c-------------------------------------------------
+c parton types for the ladder legs and for the leading jets
+c iqc(1) - flavor for the upper quark (0 in case of gluon),
+c iqc(2) - the same for the lower one
+      if(iqq.ne.0.and.iqq.ne.2)then          !q_v from the proj.
+       call qgvdef(izp,ic1,ic2,icz)          !leading state flavor
+       iqc(1)=ic1                            !upper leg parton
+       nj=nj+1
+       if(nj.gt.njmax)stop'increase njmax!!!'
+       nva=nj
+       iqj(nj)=ic2                           !leading jet parton
+       ncc(1,1)=nj                           !color connection with leading jet
+       ncc(2,1)=0
+      else                                   !g(q_s) from the proj.
+       nj=nj+1
+       if(nj.gt.njmax)stop'increase njmax!!!'
+       if(qgran(b10).lt.dc(2))then
+        iqj(nj)=-4
+       else
+        iqj(nj)=-int(2.d0*qgran(b10)+1.d0)
+       endif
+       iqj(nj+1)=-iqj(nj)
+       wp1=wpp-wpi
+       wp2=wp1*qgran(b10)
+       wp1=wp1-wp2
+       eqj(1,nj)=.5d0*wp1
+       eqj(2,nj)=eqj(1,nj)
+       eqj(3,nj)=0.d0
+       eqj(4,nj)=0.d0
+       eqj(1,nj+1)=.5d0*wp2
+       eqj(2,nj+1)=eqj(1,nj+1)
+       eqj(3,nj+1)=0.d0
+       eqj(4,nj+1)=0.d0
+       if(jqq.eq.0.or.iqq.eq.0.and.jqq.eq.2)then
+        iqc(1)=0
+        ncc(1,1)=nj
+        ncc(2,1)=nj+1
+        nj=nj+1
+        if(nj.gt.njmax)stop'increase njmax!!!'
+       else
+        if(qgran(b10).lt..3333d0)then
+         iqc(1)=3*(2.d0*int(.5d0+qgran(b10))-1.d0)
+        else
+         iqc(1)=int(2.d0*qgran(b10)+1.d0)
+     *   *(2.d0*int(.5d0+qgran(b10))-1.d0)
+        endif
+12      zg=xp+qgran(b10)*(1.d0-xp)           !gluon splitting into qq~
+        if(qgran(b10).gt.zg**dels*((1.d0-xp/zg)/ (1.d0-xp))**betp)
+     *  goto 12
+        xg=xp/zg
+        wpq0=wpp*(xg-xp)
+        wmq=1.d0/wpq0
+        wmi1=wmi1-wmq
+        if(wmi1*wpi1.le.s2min)goto 11
+        nj=nj+2
+        if(nj.gt.njmax)stop'increase njmax!!!'
+        iqj(nj)=-iqc(1)
+        if(iabs(iqc(1)).eq.3)iqj(nj)=iqj(nj)*4/3
+        eqj(1,nj)=.5d0*wmq
+        eqj(2,nj)=-.5d0*wmq
+        eqj(3,nj)=0.d0
+        eqj(4,nj)=0.d0
+        if(iqc(1).gt.0)then
+         ncj(1,nj)=nj-1
+         ncj(1,nj-1)=nj
+         ncj(2,nj)=0
+         ncj(2,nj-1)=0
+         ncc(1,1)=nj-2
+         ncc(2,1)=0
+        else
+         ncj(1,nj)=nj-2
+         ncj(1,nj-2)=nj
+         ncj(2,nj)=0
+         ncj(2,nj-2)=0
+         ncc(1,1)=nj-1
+         ncc(2,1)=0
+        endif
+       endif
+      endif
+
+      if((iqq-2)*(iqq-3)*(iqq-4).eq.0)then     !q_v from the targ.
+       call qgvdef(izt,ic1,ic2,2)              !leading state flavor
+       iqc(2)=ic1                              !lower leg parton
+       nj=nj+1
+       if(nj.gt.njmax)stop'increase njmax!!!'
+       nvb=nj
+       iqj(nj)=ic2
+       ncc(1,2)=nj
+       ncc(2,2)=0
+      else
+       nj=nj+1
+       if(nj.gt.njmax)stop'increase njmax!!!'
+       if(qgran(b10).lt.dc(2))then
+        iqj(nj)=-4
+       else
+        iqj(nj)=-int(2.d0*qgran(b10)+1.d0)
+       endif
+       iqj(nj+1)=-iqj(nj)
+       wm1=wpm-wmi
+       wm2=wm1*qgran(b10)
+       wm1=wm1-wm2
+       eqj(1,nj)=.5d0*wm1
+       eqj(2,nj)=-eqj(1,nj)
+       eqj(3,nj)=0.d0
+       eqj(4,nj)=0.d0
+       eqj(1,nj+1)=.5d0*wm2
+       eqj(2,nj+1)=-eqj(1,nj+1)
+       eqj(3,nj+1)=0.d0
+       eqj(4,nj+1)=0.d0
+       if(jqq.eq.0.or.iqq.eq.0.and.jqq.eq.1)then
+        iqc(2)=0
+        ncc(1,2)=nj
+        ncc(2,2)=nj+1
+        nj=nj+1
+        if(nj.gt.njmax)stop'increase njmax!!!'
+       else
+        if(qgran(b10).lt..3333d0)then
+         iqc(2)=3*(2.d0*int(.5d0+qgran(b10))-1.d0)
+        else
+         iqc(2)=int(2.d0*qgran(b10)+1.d0)
+     *   *(2.d0*int(.5d0+qgran(b10))-1.d0)
+        endif
+14      zg=xm+qgran(b10)*(1.d0-xm)           !gluon splitting into qq~
+        if(qgran(b10).gt.zg**dels*((1.d0-xm/zg)/ (1.d0-xm))**betp)
+     *  goto 14
+        xg=xm/zg
+        wmq0=wpm*(xg-xm)
+        wpq=1.d0/wmq0
+        wpi1=wpi1-wpq
+        if(wmi1*wpi1.le.s2min)goto 11
+        nj=nj+2
+        if(nj.gt.njmax)stop'increase njmax!!!'
+        iqj(nj)=-iqc(2)
+        if(iabs(iqc(2)).eq.3)iqj(nj)=iqj(nj)*4/3
+        eqj(1,nj)=.5d0*wpq
+        eqj(2,nj)=.5d0*wpq
+        eqj(3,nj)=0.d0
+        eqj(4,nj)=0.d0
+        if(iqc(2).gt.0)then
+         ncj(1,nj)=nj-1
+         ncj(1,nj-1)=nj
+         ncj(2,nj)=0
+         ncj(2,nj-1)=0
+         ncc(1,2)=nj-2
+         ncc(2,2)=0
+        else
+         ncj(1,nj)=nj-2
+         ncj(1,nj-2)=nj
+         ncj(2,nj)=0
+         ncj(2,nj-2)=0
+         ncc(1,2)=nj-1
+         ncc(2,2)=0
+        endif
+       endif
+      endif
+
+      if(jqq.ne.0)then
+       if(iqq.ne.0.or.iqq.eq.0.and.jqq.eq.3)then
+        sjqq1=qgjit(qt0,qt0,wpi1*wmi1,2,2)
+        gbs=sjqq1/sjqq
+       else
+        sjqg1=qgjit(qt0,qt0,wpi1*wmi1,1,2)
+        gbs=sjqg1/sjqg
+       endif
+       if(qgran(b10).gt.gbs)goto 11
+      endif
+      wpi=wpi1
+      wmi=wmi1
+
+      ept(1)=.5d0*(wpi+wmi)      !ladder 4-momentum
+      ept(2)=.5d0*(wpi-wmi)
+      ept(3)=0.d0
+      ept(4)=0.d0
+      qmin(1)=qt0                !q^2 cutoff for the upper leg
+      qmin(2)=qt0                !q^2 cutoff for the downer leg
+      qminn=max(qmin(1),qmin(2)) !overall q^2 cutoff
+      si=qgnrm(ept)
+      jini=1
+      jj=int(1.5d0+qgran(b10)) !1st parton at upper (jj=1) or downer (jj=2) leg
+
+3     continue
+
+      aaa=qgnrm(ept)             !ladder mass squared
+      if(debug.ge.3)write (moniou,203)si,iqc,ept,aaa
+
+      pt2=ept(3)**2+ept(4)**2
+      pt=dsqrt(pt2)
+      ww=si+pt2
+
+      iqp(1)=min(1,iabs(iqc(1)))+1
+      iqp(2)=min(1,iabs(iqc(2)))+1
+      wp(1)=ept(1)+ept(2)                 !LC+ for the ladder
+      wp(2)=ept(1)-ept(2)                 !LC- for the ladder
+      s2min=4.d0*fqscal*qminn   !minimal energy squared for 2-parton production
+      if(jini.eq.1)then                   !general ladder
+       sj=qgjit(qmin(jj),qmin(3-jj),si,iqp(jj),iqp(3-jj))   !total ladder contribution
+       sj1=qgjit1(qmin(3-jj),qmin(jj),si,iqp(3-jj),iqp(jj)) !one-way ordered
+       sjb=qgbit(qmin(1),qmin(2),si,iqp(1),iqp(2))          !born contribution
+       aks=qgran(b10)
+       if(aks.lt.sjb/sj)then
+        goto 6      !born process sampled
+       elseif(aks.lt.sj1/sj)then       !change to one-way ordered ladder
+        jj=3-jj
+        sj=sj1
+        jini=0
+       endif
+      else                                !one-way ordered ladder
+       sj=qgjit1(qmin(jj),qmin(3-jj),si,iqp(jj),iqp(3-jj)) !one-way ordered
+       sjb=qgbit(qmin(1),qmin(2),si,iqp(1),iqp(2))         !born contribution
+       if(qgran(b10).lt.sjb/sj)goto 6      !born process sampled
+      endif
+      wwmin=(s2min+qmin(jj)+pt2-2.d0*pt*dsqrt(qmin(jj)*epsxmn))
+     */(1.d0-epsxmn)           !minimal energy squared for 3-parton production
+
+      if(debug.ge.3)write (moniou,204)s2min,wwmin,sj,sjb
+
+      if(ww.lt.1.1d0*wwmin)goto 6         !energy too low -> born process
+
+      xxx=pt*dsqrt(qmin(jj))/ww
+      xmin=(s2min+qmin(jj)+pt2)/ww
+      xmin=xmin-2.d0*xxx*(xxx+dsqrt(xxx**2+1.d0-xmin))
+
+      xmax=1.d0-epsxmn
+      if(debug.ge.3)write (moniou,205)xmin,xmax
+
+      qqmax=(pt*dsqrt(epsxmn)+dsqrt(max(0.d0,pt2*epsxmn
+     *+(1.d0+4.d0*fqscal)*(xmax*ww-pt2))))/(1.d0+4.d0*fqscal)
+      qqmin=qmin(jj)        !minimal parton virtuality in the current rung
+      if(debug.ge.3)write (moniou,206)qqmin,qqmax
+
+      qm0=qqmin
+      xm0=xmax
+      s2max=xm0*ww
+
+      if(jini.eq.1)then
+       sj0=qgjit(qm0,qmin(3-jj),s2max,1,iqp(3-jj))*qgfap(xm0,iqp(jj),1)
+     * +qgjit(qm0,qmin(3-jj),s2max,2,iqp(3-jj))*qgfap(xm0,iqp(jj),2)
+      else
+       sj0=qgjit1(qm0,qmin(3-jj),s2max,1,iqp(3-jj))
+     * *qgfap(xm0,iqp(jj),1)
+     * +qgjit1(qm0,qmin(3-jj),s2max,2,iqp(3-jj))*qgfap(xm0,iqp(jj),2)
+      endif
+
+      gb0=sj0*qm0*qgalf(qm0/alm)*qgsudx(qm0,iqp(jj)) *4.5d0  !normal. of accept.
+      if(xm0.le..5d0)then
+       gb0=gb0*xm0**(1.d0-delh)
+      else
+       gb0=gb0*(1.d0-xm0)*2.d0**delh
+      endif
+      if(debug.ge.3)write (moniou,208)xm0,xmin,xmax,gb0
+
+      xmin2=max(.5d0,xmin)
+      xmin1=xmin**delh
+      xmax1=min(xmax,.5d0)**delh
+      if(xmin.ge..5d0)then                             !choose proposal function
+       djl=1.d0
+      elseif(xmax.lt..5d0)then
+       djl=0.d0
+      else
+       djl=1.d0/(1.d0+((2.d0*xmin)**delh-1.d0)/delh
+     * /dlog(2.d0*(1.d0-xmax)))
+      endif
+
+c-------------------------------------------------
+c propose x, q^2
+4     continue
+      if(qgran(b10).gt.djl)then
+       x=(xmin1+qgran(b10)*(xmax1-xmin1))**(1.d0/delh) !parton LC share
+      else
+       x=1.d0-(1.d0-xmin2)*((1.d0-xmax)/(1.d0-xmin2))**qgran(b10)
+      endif
+      qq=qqmin/(1.d0+qgran(b10)*(qqmin/qqmax-1.d0))    !parton virtuality
+      qt2=qq*(1.d0-x)                                  !parton p_t^2
+      if(debug.ge.4)write (moniou,209)qq,qqmin,qqmax,x,qt2
+
+      if(qq.gt.qminn)then                  !update virtuality cutoff
+       qmin2=qq
+      else
+       qmin2=qminn
+      endif
+      qt=dsqrt(qt2)
+      call qgcs(c,s)
+      ep3(3)=qt*c                          !final parton p_x, p_y
+      ep3(4)=qt*s
+      pt2new=(ept(3)-ep3(3))**2+(ept(4)-ep3(4))**2!p_t^2 for the remained ladder
+      s2min2=max(s2min,4.d0*fqscal*qmin2)  !new ladder kinematic limit
+      s2=x*ww-qt2*x/(1.d0-x)-pt2new        !mass squared for the remained ladder
+      if(s2.lt.s2min2)goto 4           !ladder mass below threshold -> rejection
+
+      if(jini.eq.1)then                    !weights for g- and q-legs
+       sj1=qgjit(qq,qmin(3-jj),s2,1,iqp(3-jj))*qgfap(x,iqp(jj),1)
+       sj2=qgjit(qq,qmin(3-jj),s2,2,iqp(3-jj))*qgfap(x,iqp(jj),2)
+      else
+       sj1=qgjit1(qq,qmin(3-jj),s2,1,iqp(3-jj))*qgfap(x,iqp(jj),1)
+       sj2=qgjit1(qq,qmin(3-jj),s2,2,iqp(3-jj))*qgfap(x,iqp(jj),2)
+      endif
+      gb7=(sj1+sj2)*qgalf(qq/alm)*qq*qgsudx(qq,iqp(jj))/gb0  /2.d0
+                               !acceptance probability for x and q**2 simulation
+      if(x.le..5d0)then
+       gb7=gb7*x**(1.d0-delh)
+      else
+       gb7=gb7*(1.d0-x)*2.d0**delh
+      endif
+      if(debug.ge.4)write (moniou,210)gb7,s2,sj1,sj2,jj,jini
+      if(qgran(b10).gt.gb7)goto 4          !rejection
+
+c-------------------------------------------------
+c define color flow for the emitted jet; perform final state emission
+      nqc(2)=0
+      if(qgran(b10).lt.sj1/(sj1+sj2))then         !new gluon-leg ladder
+       if(iqc(jj).eq.0)then                       !g -> gg
+        jt=1
+        jq=int(1.5d0+qgran(b10))
+        nqc(1)=ncc(jq,jj)                         !color connection for the jet
+        nqc(2)=0
+       else                                       !q -> qg
+        jt=2
+        if(iqc(jj).gt.0)then                      !orientation of color flow
+         jq=1
+        else
+         jq=2
+        endif
+        nqc(1)=0
+        ncc(jq,jj)=ncc(1,jj)                      !color connection for the jet
+       endif
+       iq1=iqc(jj)                                !jet flavor (type)
+       iqc(jj)=0                                  !new ladder leg flavor (type)
+
+      else                                        !new quark-leg ladder
+       if(iqc(jj).ne.0)then                       !q -> gq
+        iq1=0
+        jt=3
+        if(iqc(jj).gt.0)then                      !orientation of color flow
+         jq=1
+        else
+         jq=2
+        endif
+        nqc(1)=ncc(1,jj)                          !color connection for the jet
+        nqc(2)=0
+
+       else                                       !g -> qq~
+        jq=int(1.5d0+qgran(b10))                  !orientation of color flow
+        iq1=int(3.d0*qgran(b10)+1.d0)*(3-2*jq)    !jet flavor (type)
+        iqc(jj)=-iq1                              !new ladder leg flavor (type)
+        jt=4
+        nqc(1)=ncc(jq,jj)                         !color connections for the jet
+        ncc(1,jj)=ncc(3-jq,jj)
+       endif
+      endif
+      if(debug.ge.3)write (moniou,211)jt
+
+      call qgcjet(qt2,iq1,qv1,zv1,qm1,iqv1,ldau1,lpar1,jq) !final state emission
+      si=x*ww-(qt2+qm1(1,1))*x/(1.d0-x)-pt2new  !mass squared for the new ladder
+      if(si.gt.s2min2)then
+       iq=min(1,iabs(iqc(jj)))+1
+       if(jini.eq.1)then
+        gb=qgjit(qq,qmin(3-jj),si,iq,iqp(3-jj))
+     *  /qgjit(qq,qmin(3-jj),s2,iq,iqp(3-jj))
+       else
+        gb=qgjit1(qq,qmin(3-jj),si,iq,iqp(3-jj))
+     *  /qgjit1(qq,qmin(3-jj),s2,iq,iqp(3-jj))
+       endif
+       if(qgran(b10).gt.gb)goto 1        !jet mass correction for the acceptance
+      else                                        !below threshold -> rejection
+       goto 1
+      endif
+
+      wp3=wp(jj)*(1.d0-x)
+      wm3=(qt2+qm1(1,1))/wp3
+      ep3(1)=.5d0*(wp3+wm3)                       !jet 4-momentum
+      ep3(2)=.5d0*(wp3-wm3)*(3-2*jj)
+      call qgrec(ep3,nqc,qv1,zv1,qm1,iqv1,ldau1,lpar1,jq)
+                               !reconstruction of 4-momenta of all final partons
+c-------------------------------------------------
+c define color connections for the new ladder
+      if(jt.eq.1)then
+       if(ncc(1,jj).eq.0.and.ncc(2,jj).eq.0)ncc(3-jq,jj)=nqc(1)
+       ncc(jq,jj)=nqc(2)
+      elseif(jt.eq.2)then
+       ncc(3-jq,jj)=nqc(1)
+      elseif(jt.eq.3)then
+       ncc(1,jj)=nqc(2)
+      elseif(jt.eq.4.and.ncc(1,jj).eq.0.and.ncc(2,jj).eq.0)then
+       ncc(1,jj)=nqc(1)
+      endif
+
+      if(iabs(iq1).eq.3)then
+       iqqq=8+iq1/3*4
+      else
+       iqqq=8+iq1
+      endif
+      if(debug.ge.3)write (moniou,212)tyq(iqqq),qt2,ep3
+      do i=1,4
+       ept(i)=ept(i)-ep3(i)                       !new ladder 4-momentum
+      enddo
+      qmin(jj)=qq                                 !new virtuality cutoffs
+      qminn=qmin2
+      goto 3                                      !consider next parton emission
+
+c------------------------------------------------
+c born process - last parton pair production in the ladder
+6     continue
+      if(debug.ge.2)write (moniou,214)si,qminn,iqc
+      tmin=qminn*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qminn*fqscal/si)))
+      qtmin=tmin*(1.d0-tmin/si)
+      if(iqc(1).ne.0.or.iqc(2).ne.0)then
+       gb0=tmin**2*qgalf(qtmin/fqscal/alm)**2
+     * *qgfbor(si,tmin,iqc(1),iqc(2),1)    *1.1d0
+      else
+       gb0=.25d0*si**2*qgalf(qtmin/fqscal/alm)**2
+     * *qgfbor(si,.5d0*si,iqc(1),iqc(2),1)
+      endif
+      gb0=gb0*qgsudx(qtmin/fqscal,iqp(1))*qgsudx(qtmin/fqscal,iqp(2))
+                                                    !normalization of acceptance
+      if(debug.ge.3)write (moniou,215)gb0
+
+7     q2=tmin/(1.d0-qgran(b10)*(1.d0-2.d0*tmin/si))   !proposed q^2
+      z=q2/si                                         !parton LC momentum share
+      qt2=q2*(1.d0-z)                                 !parton p_t^2
+      if(qgran(b10).lt..5d0)then
+       jm=2
+       tq=si-q2
+      else
+       jm=1
+       tq=q2
+      endif
+      gb=q2**2*qgalf(qt2/fqscal/alm)**2*qgfbor(si,tq,iqc(1),iqc(2),1)
+     **qgsudx(qt2/fqscal,iqp(1))*qgsudx(qt2/fqscal,iqp(2))/gb0
+                                                      !acceptance probabilty
+      if(debug.ge.4)write (moniou,216)gb,q2,z,qt2
+      if(qgran(b10).gt.gb)goto 7                      !rejection
+
+c-------------------------------------------------
+c define color connections for the 1st emitted jet
+      nqc(2)=0
+      if(iqc(1).eq.0.and.iqc(2).eq.0)then             !gg-process
+       jq=int(1.5d0+qgran(b10))                       !orientation of color flow
+       nqc(1)=ncc(jq,jm)
+
+       if(qgran(b10).lt..5d0)then
+        jt=1                                          !gg -> gg
+        nqc(2)=0
+        njc1=ncc(3-jq,jm)                         !color connections for 1st jet
+        njc2=ncc(jq,3-jm)
+        if(ncc(1,1).eq.0.and.ncc(2,1).eq.0)then
+         if(jm.eq.1)nqc(1)=njc2
+        else
+         if(iqj(njc1).ne.0)then
+          ncj(1,njc1)=njc2
+         else
+          ncj(jq,njc1)=njc2
+         endif
+         if(iqj(njc2).ne.0)then
+          ncj(1,njc2)=njc1
+         else
+          ncj(3-jq,njc2)=njc1
+         endif
+        endif
+       else                                 !gg -> gg (inverse color connection)
+        jt=2
+        nqc(2)=ncc(3-jq,3-jm)
+       endif
+
+      elseif(iqc(1)*iqc(2).eq.0)then                  !qg -> qg
+       if(iqc(1)+iqc(2).gt.0)then                     !orientation of color flow
+        jq=1
+       else
+        jq=2
+       endif
+       if(qgran(b10).lt..5d0)then
+        if(iqc(jm).eq.0)then
+         jt=3
+         nqc(1)=ncc(jq,jm)
+         nqc(2)=0
+         njc1=ncc(3-jq,jm)
+         njc2=ncc(1,3-jm)
+         if(ncc(1,jm).eq.0.and.ncc(2,jm).eq.0)then
+          nqc(1)=njc2
+         else
+          if(iqj(njc1).ne.0)then
+           ncj(1,njc1)=njc2
+          else
+           ncj(jq,njc1)=njc2
+          endif
+          if(iqj(njc2).ne.0)then
+           ncj(1,njc2)=njc1
+          else
+           ncj(3-jq,njc2)=njc1
+          endif
+         endif
+        else
+         jt=4
+         nqc(1)=0
+         njc1=ncc(1,jm)
+         njc2=ncc(3-jq,3-jm)
+         if(njc2.ne.0)then
+          if(iqj(njc1).ne.0)then
+           ncj(1,njc1)=njc2
+          else
+           ncj(3-jq,njc1)=njc2
+          endif
+          if(iqj(njc2).ne.0)then
+           ncj(1,njc2)=njc1
+          else
+           ncj(jq,njc2)=njc1
+          endif
+         endif
+        endif
+       else
+        if(iqc(jm).eq.0)then
+         jt=5
+         nqc(2)=ncc(3-jq,jm)
+         nqc(1)=ncc(1,3-jm)
+        else
+         jt=6
+         nqc(1)=ncc(jq,3-jm)
+        endif
+       endif
+
+      elseif(iqc(1)*iqc(2).gt.0)then                  !qq (q~q~) -> qq (q~q~)
+       jt=7
+       if(iqc(1).gt.0)then
+        jq=1
+       else
+        jq=2
+       endif
+       nqc(1)=ncc(1,3-jm)
+      else                                            !qq~ -> qq~
+       jt=8
+       if(iqc(jm).gt.0)then
+        jq=1
+       else
+        jq=2
+       endif
+       nqc(1)=0
+       njc1=ncc(1,jm)
+       njc2=ncc(1,3-jm)
+       if(iqj(njc1).ne.0)then
+        ncj(1,njc1)=njc2
+       else
+        ncj(3-jq,njc1)=njc2
+       endif
+       if(iqj(njc2).ne.0)then
+        ncj(1,njc2)=njc1
+       else
+        ncj(jq,njc2)=njc1
+       endif
+      endif
+      if(jt.ne.8)then
+       jq2=jq
+      else
+       jq2=3-jq
+      endif
+      if(debug.ge.3)write (moniou,211)jt
+      call qgcjet(qt2,iqc(jm),qv1,zv1,qm1,iqv1,ldau1,lpar1,jq)!final state emis.
+      call qgcjet(qt2,iqc(3-jm),qv2,zv2,qm2,iqv2,ldau2,lpar2,jq2)
+      amt1=qt2+qm1(1,1)
+      amt2=qt2+qm2(1,1)
+      if(dsqrt(si).gt.dsqrt(amt1)+dsqrt(amt2))then
+       z=qgtwd(si,amt1,amt2)
+      else
+       if(debug.ge.4)write (moniou,217)dsqrt(si),dsqrt(amt1),dsqrt(amt2)
+       goto 1                                      !below threshold -> rejection
+      endif
+
+      call qgdeft(si,ept,ey)
+      wp3=z*dsqrt(si)
+      wm3=(qt2+qm1(1,1))/wp3
+      ep3(1)=.5d0*(wp3+wm3)                        !1st jet 4-momentum
+      ep3(2)=.5d0*(wp3-wm3)
+      qt=dsqrt(qt2)
+      call qgcs(c,s)
+      ep3(3)=qt*c
+      ep3(4)=qt*s
+
+      call qgtran(ep3,ey,1)
+      call qgrec(ep3,nqc,qv1,zv1,qm1,iqv1,ldau1,lpar1,jq)
+                               !reconstruction of 4-momenta of all final partons
+      if(iabs(iqc(jm)).eq.3)then
+       iqqq=8+iqc(jm)/3*4
+      else
+       iqqq=8+iqc(jm)
+      endif
+      if(debug.ge.3)write (moniou,212)tyq(iqqq),qt2,ep3
+
+      wp3=(1.d0-z)*dsqrt(si)
+      wm3=(qt2+qm2(1,1))/wp3
+      ep3(1)=.5d0*(wp3+wm3)                        !2nd jet 4-momentum
+      ep3(2)=.5d0*(wp3-wm3)
+      ep3(3)=-qt*c
+      ep3(4)=-qt*s
+      call qgtran(ep3,ey,1)
+
+c-------------------------------------------------
+c define color connections for the 2nd emitted jet
+      if(jt.eq.1)then
+       nqc(1)=nqc(2)
+       if(ncc(1,3-jm).eq.0.and.ncc(2,3-jm).eq.0)then
+        nqc(2)=ncc(3-jq,jm)
+       else
+        nqc(2)=ncc(3-jq,3-jm)
+       endif
+      elseif(jt.eq.2)then
+       if(ncc(1,1).eq.0.and.ncc(2,1).eq.0)then
+        if(jm.eq.1)then
+         nqc(2)=nqc(1)
+         nqc(1)=ncc(jq,3-jm)
+        else
+         nqc(1)=nqc(2)
+         nqc(2)=ncc(3-jq,jm)
+        endif
+       else
+        nqc(2)=ncc(3-jq,jm)
+        nqc(1)=ncc(jq,3-jm)
+       endif
+      elseif(jt.eq.3)then
+       nqc(1)=nqc(2)
+      elseif(jt.eq.4)then
+       nqc(2)=nqc(1)
+       if(ncc(1,1).eq.0.and.ncc(2,1).eq.0)then
+        nqc(1)=ncc(1,jm)
+       else
+        nqc(1)=ncc(jq,3-jm)
+       endif
+      elseif(jt.eq.5)then
+       if(ncc(1,jm).eq.0.and.ncc(2,jm).eq.0)then
+        nqc(1)=nqc(2)
+       else
+        nqc(1)=ncc(jq,jm)
+       endif
+      elseif(jt.eq.6)then
+       if(ncc(1,3-jm).eq.0.and.ncc(2,3-jm).eq.0)then
+        nqc(2)=nqc(1)
+       else
+        nqc(2)=ncc(3-jq,3-jm)
+       endif
+       nqc(1)=ncc(1,jm)
+      elseif(jt.eq.7)then
+       nqc(1)=ncc(1,jm)
+      endif
+      call qgrec(ep3,nqc,qv2,zv2,qm2,iqv2,ldau2,lpar2,jq2)
+                               !reconstruction of 4-momenta of all final partons
+      if(iabs(iqc(3-jm)).eq.3)then
+       iqqq=8+iqc(3-jm)/3*4
+      else
+       iqqq=8+iqc(3-jm)
+      endif
+      if(debug.ge.3)write (moniou,212)tyq(iqqq),qt2,ep3
+
+      ebal(1)=.5d0*(wpp+wpm)                          !balans of 4-momentum
+      ebal(2)=.5d0*(wpp-wpm)
+      ebal(3)=0.d0
+      ebal(4)=0.d0
+      do i=nj0+1,nj
+       if(iqq.eq.0.or.iqq.eq.1.and.i.ne.nva.or.iqq.eq.2
+     * .and.i.ne.nvb.or.iqq.eq.3.and.i.ne.nva.and.i.ne.nvb)then
+        do j=1,4
+         ebal(j)=ebal(j)-eqj(j,i)
+        enddo
+       endif
+      enddo
+      if(debug.ge.2)write (moniou,218)nj
+      if(debug.ge.5)write (moniou,219)ebal
+      if(debug.ge.1)write (moniou,220)
+
+201   format(2x,'qghot - semihard interaction:'/
+     *4x,'type of the interaction - ',i2/
+     *4x,'initial light cone momenta - ',2e10.3/
+     *4x,'remnant types - ',2i3,2x,'diffr. eigenstates - ',2i2/
+     *4x,'proj. class - ',i2,2x,'Pomeron type - ',i2/
+     *4x,'initial number of final partons - ',i4)
+202   format(2x,'qghot: mass squared for parton ladder - ',e10.3)
+203   format(2x,'qghot: ',' mass squared for the laddder:',e10.3/
+     *4x,'ladder end flavors:',2i3/4x,'ladder 5-momentum: ',5e10.3)
+204   format(2x,'qghot: kinematic bounds s2min=',e10.3,
+     *2x,'wwmin=',e10.3/4x,'jet cross section sj=',e10.3,
+     *2x,'born cross section sjb=',e10.3)
+205   format(2x,'qghot: xmin=',e10.3,2x,'xmax=',e10.3)
+206   format(2x,'qghot: qqmin=',e10.3,2x,'qqmax=',e10.3)
+208   format(2x,'qghot: xm0=',e10.3,2x,'xmin=',e10.3,2x,
+     *'xmax=',e10.3,2x,'gb0=',e10.3)
+209   format(2x,'qghot: qq=',e10.3,2x,'qqmin=',e10.3,2x,
+     *'qqmax=',e10.3,2x,'x=',e10.3,2x,'qt2=',e10.3)
+210   format(2x,'qghot: gb7=',e10.3,2x,'s2=',e10.3,2x,'sj1=',e10.3
+     *,2x,'sj2=',e10.3,2x,'jj=',i2,2x,'jini=',i2)
+211   format(2x,'qghot: colour connection jt=:',i1)
+212   format(2x,'qghot: new jet flavor:',a2,
+     *' pt squared for the jet:',e10.3/4x,'jet 4-momentum:',4e10.3)
+214   format(2x,'qghot - highest virtuality subprocess in the ladder:'/
+     *4x,'mass squared for the process:',e10.3/4x,'q^2-cutoff:',e10.3
+     *,2x,'iqc=',2i3)
+215   format(2x,'qghot - normalization of acceptance:',' gb0=',e10.3)
+216   format(2x,'qghot - acceptance probabilty:'/
+     *4x,'gb=',e10.3,2x,'q2=',e10.3,2x,'z=',e10.3,2x,'qt2=',e10.3)
+217   format(2x,'qghot: ecm=',e10.3,2x,'mt1=',e10.3,2x,'mt2=',e10.3)
+218   format(2x,'qghot: total number of jets - ',i4)
+219   format(2x,'qghot: 4-momentum balans - ',4e10.3)
+220   format(2x,'qghot - end')
+      return
+      end
+
+c------------------------------------------------------------------------
+      function npgen(vv,npmin,npmax)
+c-----------------------------------------------------------------------
+c npgen -  Poisson distribution
+c vv    - average number
+c npmin - minimal number
+c npmax - maximal number
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr11/ b10
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(npmin.eq.0)then
+       aks=qgran(b10)
+       vvn=exp(-vv)
+       do n=1,npmax
+         aks=aks-vvn
+        if(aks.lt.0.d0)goto 1
+         vvn=vvn*vv/dble(n)
+       enddo
+      elseif(npmin.eq.1)then
+       aks=qgran(b10)*(1.d0-exp(-vv))
+       vvn=exp(-vv)
+       do n=1,npmax
+         vvn=vvn*vv/dble(n)
+         aks=aks-vvn
+        if(aks.lt.0.d0)goto 2
+       enddo
+      elseif(npmin.eq.2)then
+       aks=qgran(b10)*(1.d0-exp(-vv)*(1.d0+vv))
+       vvn=vv*exp(-vv)
+       do n=2,npmax
+         vvn=vvn*vv/dble(n)
+         aks=aks-vvn
+        if(aks.lt.0.d0)goto 2
+       enddo
+      else
+       stop'npgen'
+      endif
+1     n=n-1
+2     npgen=n
+      return
+      end
+
+c=============================================================================
+      subroutine qglead(wppr0,wmtg0,lqa,lqb,lqa0,lqb0,lva,lvb
+     *,izp,izt,ila,ilb,iret)
+c-------------------------------------------------------------------------
+c qglead-treatment of leading hadron states
+c-------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(njmax=50000)
+      common /qgdebug/ debug
+      common /qgarr37/ eqj(4,njmax),iqj(njmax),ncj(2,njmax),nj
+
+      iret=0
+      if(lqa0.eq.0.and.lqb0.eq.0)then
+       if(lva.eq.0.and.lvb.eq.0)then
+        call qgdifr(wppr0,wmtg0,izp,izt,lqa,lqb,iret)
+       elseif(lva.eq.0)then
+        call qgdifr(wppr0,wmtg0,izp,izt,lqa,-1,iret)
+       elseif(lvb.eq.0)then
+        call qgdifr(wppr0,wmtg0,izp,izt,-1,lqb,iret)
+       endif
+       if(lva.eq.1)then
+        eqj(1,ila)=.5d0*wppr0
+        eqj(2,ila)=eqj(1,ila)
+        eqj(3,ila)=0.d0
+        eqj(4,ila)=0.d0
+       endif
+       if(lvb.eq.1)then
+        eqj(1,ilb)=.5d0*wmtg0
+        eqj(2,ilb)=-eqj(1,ilb)
+        eqj(3,ilb)=0.d0
+        eqj(4,ilb)=0.d0
+       endif
+      elseif(lqa0.eq.0)then
+       if(lva.eq.0)then
+        call qgdifr(wppr0,wmtg0,izp,izt,lqa,-1,iret)
+       else
+        eqj(1,ila)=.5d0*wppr0
+        eqj(2,ila)=eqj(1,ila)
+        eqj(3,ila)=0.d0
+        eqj(4,ila)=0.d0
+       endif
+      elseif(lqb0.eq.0)then
+       if(lvb.eq.0)then
+        call qgdifr(wppr0,wmtg0,izp,izt,-1,lqb,iret)
+       else
+        eqj(1,ilb)=.5d0*wmtg0
+        eqj(2,ilb)=-eqj(1,ilb)
+        eqj(3,ilb)=0.d0
+        eqj(4,ilb)=0.d0
+       endif
+      endif
+      return
+      end
+
+c=============================================================================
+      double precision function qgbit(qi,qj,s,m,l)
+c------------------------------------------------------------------------
+c qgbit - born cross-section interpolation
+c qi,qj - effective momentum cutoffs for the scattering,
+c s - total c.m. energy squared for the scattering,
+c m - parton type at current end of the ladder (1 - g, 2 - q)
+c l - parton type at opposite end of the ladder (1 - g, 2 - q)
+c------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wi(3),wk(3)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr20/ spmax
+      common /qgarr26/ factk,fqscal
+      common /qgarr31/ csj(40,160)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)qi,qj,s,m,l
+      qgbit=0.d0
+      qq=max(qi,qj)
+      s2min=qq*4.d0*fqscal
+      if(s.le..99d0*s2min)then
+       if(debug.ge.3)write (moniou,202)qgbit
+       return
+      endif
+
+      tmin=qq*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qq*fqscal/s)))
+      ml=40*(m-1)+80*(l-1)
+      qli=dlog(qq)/dlog(spmax/4.d0/fqscal)*39.d0+1.d0
+      sl=dlog(s/s2min)/dlog(spmax/s2min)*39.d0+1.d0
+      i=min(38,int(qli))
+      k=min(38,int(sl))
+
+      wk(2)=sl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+      wi(2)=qli-i
+      wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+      wi(1)=1.d0-wi(2)+wi(3)
+      wi(2)=wi(2)-2.d0*wi(3)
+      do k1=1,3
+       k2=k+k1-1+ml
+      do i1=1,3
+       qgbit=qgbit+csj(i+i1-1,k2)*wi(i1)*wk(k1)
+      enddo
+      enddo
+      qgbit=exp(qgbit)*(1.d0/tmin-2.d0/s)
+      if(qi.lt.qq)qgbit=qgbit*qgsudx(qq,m)/qgsudx(qi,m)
+      if(qj.lt.qq)qgbit=qgbit*qgsudx(qq,l)/qgsudx(qj,l)
+
+      if(debug.ge.3)write (moniou,202)qgbit
+201   format(2x,'qgbit: qi=',e10.3,2x,'qj=',e10.3
+     *,2x,'s= ',e10.3,2x,'m= ',i1,2x,'l= ',i1)
+202   format(2x,'qgbit=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgfbor(s,t,iq1,iq2,n)
+c---------------------------------------------------------------------------
+c qgfbor - integrand for the born cross-section (matrix element squared)
+c s - total c.m. energy squared for the scattering,
+c t - invariant variable for the scattering abs[(p1-p3)**2],
+c iq1 - parton type at current end of the ladder (0 - g, 1,2 - q)
+c iq2 - parton type at opposite end of the ladder (0 - g, 1,2 - q)
+c---------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)s,t,iq1,iq2
+
+      u=s-t
+      if(n.eq.1)then
+       if(iq1.eq.0.and.iq2.eq.0)then        !gluon-gluon
+        qgfbor=(3.d0-t*u/s**2+s*u/t**2+s*t/u**2)*4.5d0
+       elseif(iq1*iq2.eq.0)then             !gluon-quark
+        qgfbor=(s**2+u**2)/t**2+(s/u+u/s)/2.25d0
+       elseif(iq1.eq.iq2)then               !quark-quark (same flavor)
+        qgfbor=((s**2+u**2)/t**2+(s**2+t**2)/u**2)/2.25d0
+     *  -s**2/t/u/3.375d0
+       elseif(iq1+iq2.eq.0)then             !quark-antiquark (same flavor)
+        qgfbor=((s**2+u**2)/t**2+(u**2+t**2)/s**2)/2.25d0
+     *  +u**2/t/s/3.375d0
+       else                                 !quark-antiquark (different flavors)
+        qgfbor=(s**2+u**2)/t**2/2.25d0
+       endif
+      elseif(n.eq.2)then
+       if(iq1.eq.0.and.iq2.eq.0)then        !gluon-gluon->quark-antiquark
+        qgfbor=.5d0*(t/u+u/t)-1.125d0*(t*t+u*u)/s**2
+       elseif(iq1+iq2.eq.0)then             !quark-antiquark->quark-antiquark
+        qgfbor=(t*t+u*u)/s**2/1.125d0       !(different flavor)
+       else
+        qgfbor=0.d0
+       endif
+      elseif(n.eq.3)then
+       if(iq1.ne.0.and.iq1+iq2.eq.0)then    !quark-antiquark->gluon-gluon
+        qgfbor=32.d0/27.d0*(t/u+u/t)-(t*t+u*u)/s**2/.375d0
+       else
+        qgfbor=0.d0
+       endif
+      endif
+
+      if(debug.ge.2)write (moniou,202)qgfbor
+201   format(2x,'qgfbor - hard scattering matrix element squared:'/
+     *4x,'s=',e10.3,2x,'|t|=',e10.3,2x,'iq1=',i1,2x,'iq2=',i1)
+202   format(2x,'qgfbor=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgborn(qi,qj,s,iq1,iq2)
+c-----------------------------------------------------------------------------
+c qgborn - hard 2->2 parton scattering born cross-section
+c s is the c.m. energy square for the scattering process,
+c iq1 - parton type at current end of the ladder (0 - g, 1,2 etc. - q)
+c iq2 - parton type at opposite end of the ladder (0 - g, 1,2 etc. - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      common /arr3/  x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)qi,qj,s,iq1,iq2
+
+      qgborn=0.d0
+      qq=max(qi,qj)
+      tmin=qq*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qq*fqscal/s)))
+      do i=1,7
+      do m=1,2
+       t=2.d0*tmin/(1.d0+2.d0*tmin/s-x1(i)*(2*m-3)*(1.d0-2.d0*tmin/s))
+       qt=t*(1.d0-t/s)
+
+       fb=0.d0
+       do n=1,3
+        fb=fb+qgfbor(s,t,iq1,iq2,n)+qgfbor(s,s-t,iq1,iq2,n)
+       enddo
+       fb=fb*qgsudx(qt/fqscal,iabs(iq1)+1)
+     * *qgsudx(qt/fqscal,iabs(iq2)+1)
+
+       qgborn=qgborn+a1(i)*fb*qgalf(qt/fqscal/alm)**2*t**2
+      enddo
+      enddo
+      qgborn=qgborn*2.d0*pi**3/s**2
+
+      qgborn=qgborn/qgsudx(qi,iabs(iq1)+1)/qgsudx(qj,iabs(iq2)+1)
+      if(iq1.eq.iq2)qgborn=qgborn*.5d0
+
+      if(debug.ge.3)write (moniou,202)qgborn
+201   format(2x,'qgborn: qi=',e10.3,2x,'qj=',e10.3,2x,
+     *'s= ',e10.3,2x,'iq1= ',i1,2x,'iq2= ',i1)
+202   format(2x,'qgborn=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgcjet(qq,iq1,qv,zv,qm,iqv,ldau,lpar,jq)
+c-----------------------------------------------------------------------------
+c final state emission process (all branchings as well as parton masses
+c are determined)
+c qq - maximal effective momentum transfer for the first branching
+c iq1 - initial jet flavour (0 - for gluon)
+c qv(i,j) - effective momentum for the branching of the parton in i-th row
+c on j-th level (0 - in case of no branching)  - to be determined
+c zv(i,j) - z-value for the branching of the parton in i-th row
+c on j-th level - to be determined
+c qm(i,j) - mass squared for the parton in i-th row
+c on j-th level - to be determined
+c iqv(i,j) - flavour for the parton in i-th row on j-th level
+c - to be determined
+c ldau(i,j) - first daughter row for the branching of the parton in i-th row
+c on j-th level - to be determined
+c lpar(i,j) - the parent row for the parton in i-th row
+c on j-th level - to be determined
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension qmax(30,50),iqm(2),lnv(50),
+     *qv(30,50),zv(30,50),qm(30,50),iqv(30,50),
+     *ldau(30,49),lpar(30,50)
+      common /qgarr11/ b10
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)qq,iq1,jq
+
+      do i=2,50
+       lnv(i)=0
+      enddo
+      lnv(1)=1
+      qmax(1,1)=qq
+      iqv(1,1)=iq1
+      nlev=1
+      nrow=1
+
+2     qlmax=dlog(qmax(nrow,nlev)/qtf/16.d0)
+      iq=min(1,iabs(iqv(nrow,nlev)))+1
+
+      if(qgran(b10).gt.qgsudi(qlmax,iq))then
+       q=qgqint(qlmax,qgran(b10),iq)
+       z=qgzsim(q,iq)
+       ll=lnv(nlev+1)+1
+       ldau(nrow,nlev)=ll
+       lpar(ll,nlev+1)=nrow
+       lpar(ll+1,nlev+1)=nrow
+       lnv(nlev+1)=ll+1
+
+       if(iq.ne.1)then
+        if((3-2*jq)*iqv(nrow,nlev).gt.0)then
+         iqm(1)=0
+         iqm(2)=iqv(nrow,nlev)
+        else
+         iqm(2)=0
+         iqm(1)=iqv(nrow,nlev)
+         z=1.d0-z
+        endif
+       else
+        wg=qgfap(z,1,1)
+        wg=wg/(wg+qgfap(z,1,2))
+        if(qgran(b10).lt.wg)then
+         iqm(1)=0
+         iqm(2)=0
+        else
+         iqm(1)=int(3.d0*qgran(b10)+1.d0)*(3-2*jq)
+         iqm(2)=-iqm(1)
+        endif
+        if(qgran(b10).lt..5d0)z=1.d0-z
+       endif
+       qv(nrow,nlev)=q
+       zv(nrow,nlev)=z
+       nrow=ll
+       nlev=nlev+1
+       qmax(nrow,nlev)=q*z**2
+       qmax(nrow+1,nlev)=q*(1.d0-z)**2
+       iqv(nrow,nlev)=iqm(1)
+       iqv(nrow+1,nlev)=iqm(2)
+       if(debug.ge.3)write (moniou,203)nlev,nrow,q,z
+       goto 2
+      else
+       qv(nrow,nlev)=0.d0
+       zv(nrow,nlev)=0.d0
+       qm(nrow,nlev)=0.d0
+       if(debug.ge.3)write (moniou,204)nlev,nrow
+      endif
+
+3     continue
+      if(nlev.eq.1)then
+       if(debug.ge.3)write (moniou,202)
+       return
+      endif
+
+      lprow=lpar(nrow,nlev)
+      if(ldau(lprow,nlev-1).eq.nrow)then
+       nrow=nrow+1
+       goto 2
+      else
+       z=zv(lprow,nlev-1)
+       qm(lprow,nlev-1)=z*(1.d0-z)*qv(lprow,nlev-1)
+     * +qm(nrow-1,nlev)/z+qm(nrow,nlev)/(1.d0-z)
+       nrow=lprow
+       nlev=nlev-1
+       if(debug.ge.3)write (moniou,205)nlev,nrow,qm(lprow,nlev)
+       goto 3
+      endif
+
+201   format(2x,'qgcjet: qq=',e10.3,2x,'iq1= ',i1,2x,'jq=',i1)
+202   format(2x,'qgcjet - end')
+203   format(2x,'qgcjet: new branching at level nlev=',i2,' nrow=',i2
+     */4x,' effective momentum q=',e10.3,2x,' z=',e10.3)
+204   format(2x,'qgcjet: new final jet at level nlev=',i2,' nrow=',i2)
+205   format(2x,'qgcjet: jet mass at level nlev=',i2,' nrow=',i2
+     *,' - qm=',e10.3)
+      end
+
+c===========================================================================
+      subroutine qgcs(c,s)
+c---------------------------------------------------------------------------
+c c,s - cos and sin generation for uniformly distributed angle 0<fi<2*pi
+c---------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr11/ b10
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)
+1     s1=2.d0*qgran(b10)-1.d0
+      s2=2.d0*qgran(b10)-1.d0
+      s3=s1*s1+s2*s2
+      if(s3.gt.1.d0)goto 1
+      s3=dsqrt(s3)
+      c=s1/s3
+      s=s2/s3
+
+      if(debug.ge.3)write (moniou,202)c,s
+201   format(2x,'qgcs - cos(fi) and sin(fi) are generated',
+     *' (0<fi<2*pi)')
+202   format(2x,'qgcs: c=',e10.3,2x,'s=',e10.3)
+      return
+      end
+
+c===========================================================================
+      subroutine qgdeft(s,ep,ey)
+c---------------------------------------------------------------------------
+c determination of the parameters for the lorentz transform to the rest frame
+c system for 4-vector ep
+c---------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ey(3),ep(4)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)ep,s
+
+      do i=1,3
+       if(ep(i+1).eq.0.d0)then
+        ey(i)=1.d0
+       else
+        wp=ep(1)+ep(i+1)
+        wm=ep(1)-ep(i+1)
+        if(wm/wp.lt.1.d-8)then
+         ww=s
+         do l=1,3
+          if(l.ne.i)ww=ww+ep(l+1)**2
+         enddo
+         wm=ww/wp
+        endif
+        ey(i)=dsqrt(wm/wp)
+        ep(1)=wp*ey(i)
+        ep(i+1)=0.d0
+       endif
+      enddo
+
+      if(debug.ge.3)write (moniou,202)ey
+201   format(2x,'qgdeft - lorentz boost parameters:'
+     */4x,'4-vector ep=',4e10.3/4x,'4-vector squared s=',e10.3)
+202   format(2x,'qgdeft: lorentz boost parameters ey(i)=',2x,3e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgdefr(ep,s0x,c0x,s0,c0)
+c-----------------------------------------------------------------------------
+c determination of the parameters the spacial rotation to the lab. system
+c for 4-vector ep
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ep(4)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)ep
+
+c transverse momentum square for the current parton (ep)
+      pt2=ep(3)**2+ep(4)**2
+      if(pt2.ne.0.d0)then
+       pt=dsqrt(pt2)
+c system rotation to get pt=0 - euler angles are determined (c0x = cos theta,
+c s0x = sin theta, c0 = cos phi, s0 = sin phi)
+       c0x=ep(3)/pt
+       s0x=ep(4)/pt
+c total momentum for the gluon
+       pl=dsqrt(pt2+ep(2)**2)
+       s0=pt/pl
+       c0=ep(2)/pl
+      else
+       c0x=1.d0
+       s0x=0.d0
+       pl=abs(ep(2))
+       s0=0.d0
+       c0=ep(2)/pl
+      endif
+      ep(2)=pl
+      ep(3)=0.d0
+      ep(4)=0.d0
+
+      if(debug.ge.3)write (moniou,202)s0x,c0x,s0,c0,ep
+201   format(2x,'qgdefr - spacial rotation parameters'/4x,
+     *'4-vector ep=',2x,4(e10.3,1x))
+202   format(2x,'qgdefr: spacial rotation parameters'/
+     *4x,'s0x=',e10.3,2x,'c0x=',e10.3,2x,'s0=',e10.3,2x,'c0=',e10.3/
+     *4x,'rotated 4-vector ep=',4(e10.3,1x))
+      return
+      end
+
+c=============================================================================
+      double precision function qgfap(x,j,l)
+c------------------------------------------------------------------------
+c qgfap - altarelli-parisi function (multiplied by x)
+c x - light cone momentum share value,
+c j - type of the parent parton (1-g,2-q)
+c l - type of the daughter parton (1-g,2-q)
+c------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)x,j,l
+
+      if(j.eq.1)then
+       if(l.eq.1)then
+        qgfap=((1.d0-x)/x+x/(1.d0-x)+x*(1.d0-x))*6.d0
+       else
+        qgfap=(x**2+(1.d0-x)**2)*3.d0
+       endif
+      else
+       if(l.eq.1)then
+        qgfap=(1.d0+(1.d0-x)**2)/x/.75d0
+       else
+        qgfap=(x**2+1.d0)/(1.d0-x)/.75d0
+       endif
+      endif
+
+      if(debug.ge.3)write (moniou,202)qgfap
+201   format(2x,'qgfap - altarelli-parisi function:'
+     *,2x,'x=',e10.3,2x,'j=',i1,2x,'l=',i1)
+202   format(2x,'qgfap=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qggea(ia,xa,jj)
+c-----------------------------------------------------------------------------
+c qggea - nuclear configuration simulation (nucleons positions)
+c ia - number of nucleons to be considered
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      dimension xa(iapmax,3)
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr11/ b10
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)jj,ia
+
+      if(ia.ge.10)then
+       do i=1,ia
+1       zuk=qgran(b10)*cr1(jj)-1.d0
+c        if(zuk)2,2,3
+        if(zuk.le.0.d0)then
+         tt=rnuc(jj)/wsnuc(jj)*(qgran(b10)**.3333d0-1.d0)
+         goto 6
+        else
+         if(zuk.gt.cr2(jj))goto 4
+         tt=-dlog(qgran(b10))
+         goto 6
+4        if(zuk.gt.cr3(jj))goto 5
+         tt=-dlog(qgran(b10))-dlog(qgran(b10))
+         goto 6
+5        tt=-dlog(qgran(b10))-dlog(qgran(b10))-dlog(qgran(b10))
+        endif
+6       rim=tt*wsnuc(jj)+rnuc(jj)
+        if(qgran(b10).gt.(1.d0+wbnuc(jj)*rim**2/rnuc(jj)**2)
+     *  /(1.d0+exp(-abs(tt))))goto 1
+        z=rim*(2.d0*qgran(b10)-1.d0)
+        rim=dsqrt(rim*rim-z*z)
+        xa(i,3)=z
+        call qgcs(c,s)
+        xa(i,1)=rim*c
+        xa(i,2)=rim*s
+       enddo
+      else
+       do l=1,3
+        summ=0.d0
+        do i=1,ia-1
+         j=ia-i
+         aks=rnuc(jj)*(qgran(b10)+qgran(b10)+qgran(b10)-1.5d0)
+         k=j+1
+         xa(k,l)=summ-aks*sqrt(float(j)/k)
+         summ=summ+aks/sqrt(float(j*k))
+        enddo
+        xa(1,l)=summ
+       enddo
+      endif
+
+      if(debug.ge.3)then
+       write (moniou,203)
+       do i=1,ia
+        write (moniou,204)i,(xa(i,l),l=1,3)
+       enddo
+       write (moniou,202)
+      endif
+201   format(2x,'qggea - configuration of the nucleus ',i1,';',2x,
+     *'coordinates for ',i2,' nucleons')
+202   format(2x,'qggea - end')
+203   format(2x,'qggea:  positions of the nucleons')
+204   format(2x,'qggea: ',i2,' - ',3(e10.3,1x))
+      return
+      end
+
+c=============================================================================
+      double precision function qgapi(x,j,l)
+c-----------------------------------------------------------------------------
+c qgapi - integrated altarelli-parisi function
+c x - light cone momentum share value,
+c j - type of initial parton (1 - g, 2 - q)
+c l - type of final parton (1 - g, 2 - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)x,j,l
+
+      if(j.eq.1)then
+       if(l.eq.1)then
+        qgapi=6.d0*(dlog(x/(1.d0-x))-x**3/3.d0+x**2/2.d0-2.d0*x)
+       else
+        qgapi=3.d0*(x+x**3/1.5d0-x*x)
+       endif
+      else
+       if(l.eq.1)then
+        qgapi=(dlog(x)-x+.25d0*x*x)/.375d0
+       else
+        z=1.d0-x
+        qgapi=-(dlog(z)-z+.25d0*z*z)/.375d0
+       endif
+      endif
+
+      if(debug.ge.2)write (moniou,202)qgapi
+201   format(2x,'qgapi: x=',e10.3,2x,'j= ',i1,2x,'l= ',i1)
+202   format(2x,'qgapi=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgjarr(jfl)
+c-----------------------------------------------------------------------------
+c final jets rearrangement according to their colour connections
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(njmax=50000)
+      dimension mark(njmax),ept(4)
+      common /qgarr10/ am(7),ammu
+      common /qgarr36/ epjet(4,njmax),ipjet(njmax),njtot
+      common /qgarr37/ eqj(4,njmax),iqj(njmax),ncj(2,njmax),nj
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)nj
+      if(debug.ge.2.and.nj.ne.0)then
+       do i=1,nj
+        write (moniou,203)i,iqj(i),(eqj(l,i),l=1,4)
+        if(iqj(i).eq.0)then
+         write (moniou,204)ncj(1,i),ncj(2,i)
+        else
+         ncdum=0
+         write (moniou,204)ncj(1,i),ncdum
+        endif
+       enddo
+      endif
+
+      njpar=0
+      jfl=0
+      do i=1,nj
+       mark(i)=1
+      enddo
+      njtot=0
+
+2     continue
+      do ij=1,nj
+       if(mark(ij).ne.0.and.iqj(ij).ne.0)goto 4
+      enddo
+4     continue
+
+      jfirst=1
+      if(iabs(iqj(ij)).le.2)then
+       am1=am(1)
+      elseif(iabs(iqj(ij)).eq.4)then
+       am1=am(3)
+      else
+       am1=am(2)
+      endif
+      do i=1,4
+       ept(i)=0.d0
+      enddo
+
+6     mark(ij)=0
+      njtot=njtot+1
+      ipjet(njtot)=iqj(ij)
+      do i=1,4
+       ept(i)=ept(i)+eqj(i,ij)
+       epjet(i,njtot)=eqj(i,ij)
+      enddo
+
+      if(iqj(ij).ne.0)then
+       if(jfirst.ne.1)then
+        if(iabs(iqj(ij)).le.2)then
+         am2=am(1)
+        elseif(iabs(iqj(ij)).eq.4)then
+         am2=am(3)
+        else
+         am2=am(2)
+        endif
+        amj=(am1+am2)**2
+        if(amj.gt.qgnrm(ept))then
+         if(debug.ge.3)write (moniou,202)jfl
+         return
+        endif
+
+        if(njtot.lt.nj)then
+         goto 2
+        else
+         jfl=1
+         nj=0
+         if(debug.ge.3)write (moniou,202)jfl
+         return
+        endif
+       else
+        jfirst=0
+        njpar=ij
+        ij=ncj(1,ij)
+        goto 6
+       endif
+      else
+       if(ncj(1,ij).eq.njpar)then
+        njdau=ncj(2,ij)
+       else
+        njdau=ncj(1,ij)
+       endif
+       njpar=ij
+       ij=njdau
+       goto 6
+      endif
+
+201   format(2x,'qgjarr: total number of jets nj=',i4)
+202   format(2x,'qgjarr - end,jfl=',i2)
+203   format(2x,'qgjarr: ij=',i3,2x,'iqj=',i2,2x,'eqj=',4e10.3)
+204   format(2x,'qgjarr: ncj=',2i3)
+      end
+
+c=============================================================================
+      double precision function qgjet(q1,q2,s,s2min,j,l)
+c-----------------------------------------------------------------------------
+c qgjet - inclusive hard cross-section calculation (one more run is added
+c to the ladder) - for any ordering
+c q1 - effective momentum cutoff for current end of the ladder,
+c q2 - effective momentum cutoff for opposide end of the ladder,
+c s - total c.m. energy squared for the ladder,
+c s2min - minimal c.m. energy squared for born process (above q1 and q2)
+c j - parton type at current end of the ladder (1 - g, 2 - q)
+c l - parton type at opposite end of the ladder (1 - g, 2 - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)s,q1,q2,s2min,j,l
+
+      qgjet=0.d0
+      qmax=s/4.d0/fqscal*(1.d0-epsxmn)
+      qmin=q1
+      if(debug.ge.3)write (moniou,203)qmin,qmax
+
+      if(qmax.gt.qmin)then
+c numerical integration over transverse momentum square;
+c gaussian integration is used
+       do i=1,7
+       do m=1,2
+        qi=2.d0*qmin/(1.d0+qmin/qmax+(2*m-3)*x1(i)*(1.d0-qmin/qmax))
+        zmax=(1.d0-epsxmn)**delh
+        zmin=(max(4.d0*fqscal*qi,s2min)/s)**delh
+        fsj=0.d0
+        if(debug.ge.3)write (moniou,204)qi,zmin,zmax
+
+        if(zmax.gt.zmin)then
+         do i1=1,7
+         do m1=1,2
+          z=(.5d0*(zmax+zmin+(2*m1-3)*x1(i1)*(zmax-zmin)))**(1.d0/delh)
+          s2=z*s
+
+          sj=0.d0
+          do k=1,2
+           sj=sj+qgjit(qi,q2,s2,k,l)*qgfap(z,j,k)*z
+          enddo
+          fsj=fsj+a1(i1)*sj/z**delh
+         enddo
+         enddo
+         fsj=fsj*(zmax-zmin)
+        endif
+        qgjet=qgjet+a1(i)*fsj*qi*qgsudx(qi,j)*qgalf(qi/alm)
+       enddo
+       enddo
+       qgjet=qgjet*(1.d0/qmin-1.d0/qmax)/qgsudx(q1,j)/delh/4.d0
+      endif
+
+      if(debug.ge.3)write (moniou,202)qgjet
+201   format(2x,'qgjet - unordered ladder cross section:'
+     */4x,'s=',e10.3,2x,'q1=',e10.3,2x,'q2=',e10.3,2x,'s2min=',
+     *e10.3,2x,'j=',i1,2x,'l=',i1)
+202   format(2x,'qgjet=',e10.3)
+203   format(2x,'qgjet:',2x,'qmin=',e10.3,2x,'qmax=',e10.3)
+204   format(2x,'qgjet:',2x,'qi=',e10.3,2x,'zmin=',e10.3
+     *,2x,'zmax=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgjet1(q1,q2,s,s2min,j,l)
+c-----------------------------------------------------------------------------
+c qgjet1 - inclusive hard cross-section calculation (one more run is added
+c to the ladder) - for strict ordering
+c q1 - effective momentum cutoff for current end of the ladder,
+c q2 - effective momentum cutoff for opposide end of the ladder,
+c s - total c.m. energy squared for the ladder,
+c s2min - minimal c.m. energy squared for born process (above q1 and q2)
+c j - parton type at current end of the ladder (1 - g, 2 - q)
+c l - parton type at opposite end of the ladder (1 - g, 2 - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/  debug
+      common /arr3/   x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)s,q1,q2,s2min,j,l
+
+      qgjet1=0.d0
+      qmax=s/4.d0/fqscal*(1.d0-epsxmn)
+      qmin=q1
+      if(debug.ge.3)write (moniou,203)qmin,qmax
+
+      if(qmax.gt.qmin)then
+c numerical integration over transverse momentum square;
+c gaussian integration is used
+       do i=1,7
+       do m=1,2
+        qi=2.d0*qmin/(1.d0+qmin/qmax+(2*m-3)*x1(i)*(1.d0-qmin/qmax))
+        zmax=(1.d0-epsxmn)**delh
+        zmin=(max(4.d0*fqscal*qi,s2min)/s)**delh
+        fsj=0.d0
+        if(debug.ge.3)write (moniou,204)qi,zmin,zmax
+
+        if(zmax.gt.zmin)then
+         do i1=1,7
+         do m1=1,2
+          z=(.5d0*(zmax+zmin+(2*m1-3)*x1(i1)*(zmax-zmin)))**(1.d0/delh)
+          s2=z*s
+
+          sj=0.d0
+          do k=1,2
+           sj=sj+qgjit1(qi,q2,s2,k,l)*qgfap(z,j,k)*z
+          enddo
+          fsj=fsj+a1(i1)*sj/z**delh
+         enddo
+         enddo
+         fsj=fsj*(zmax-zmin)
+        endif
+        qgjet1=qgjet1+a1(i)*fsj*qi*qgsudx(qi,j)*qgalf(qi/alm)
+       enddo
+       enddo
+       qgjet1=qgjet1*(1.d0/qmin-1.d0/qmax)/qgsudx(q1,j)/delh/4.d0
+      endif
+
+      if(debug.ge.3)write (moniou,202)qgjet1
+201   format(2x,'qgjet1 - strictly ordered ladder cross section:'
+     */4x,'s=',e10.3,2x,'q1=',e10.3,2x,'q2=',e10.3,2x,'s2min=',
+     *e10.3,2x,'j=',i1,2x,'l=',i1)
+202   format(2x,'qgjet1=',e10.3)
+203   format(2x,'qgjet1:',2x,'qmin=',e10.3,2x,'qmax=',e10.3)
+204   format(2x,'qgjet1:',2x,'qi=',e10.3,2x,'zmin=',e10.3
+     *,2x,'zmax=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgjit(q1,q2,s,m,l)
+c-----------------------------------------------------------------------------
+c qgjit - inclusive hard cross-section interpolation - for any ordering
+c in the ladder
+c q1 - effective momentum cutoff for current end of the ladder,
+c q2 - effective momentum cutoff for opposide end of the ladder,
+c s - total c.m. energy squared for the ladder,
+c m - parton type at current end of the ladder (1 - g, 2 - q)
+c l - parton type at opposite end of the ladder (1 - g, 2 - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wi(3),wj(3),wk(3)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr20/ spmax
+      common /qgarr26/ factk,fqscal
+      common /qgarr29/ csj(40,40,160)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)s,q1,q2,m,l
+
+      qgjit=0.d0
+      qq=max(q1,q2)
+      s2min=qq*4.d0*fqscal
+      if(s.le..99d0*s2min)then
+       if(debug.ge.3)write (moniou,202)qgjit
+       return
+      endif
+
+      if(q1.le.q2)then
+       qi=q1
+       qj=q2
+       ml=40*(m-1)+80*(l-1)
+      else
+       qi=q2
+       qj=q1
+       ml=40*(l-1)+80*(m-1)
+      endif
+
+      tmin=qq*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qq*fqscal/s)))
+      qli=dlog(qi)/dlog(spmax/4.d0/fqscal)*39.d0+1.d0
+      if(qi.lt..99d0*spmax/4.d0/fqscal)then
+       qlj=dlog(qj/qi)/dlog(spmax/4.d0/fqscal/qi)*39.d0+1.d0
+      else
+       qlj=1.d0
+      endif
+      sl=dlog(s/s2min)/dlog(spmax/s2min)*39.d0+1.d0
+      i=min(38,int(qli))
+      j=min(38,int(qlj))
+      k=min(38,int(sl))
+
+      wk(2)=sl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+      wi(2)=qli-i
+      wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+      wi(1)=1.d0-wi(2)+wi(3)
+      wi(2)=wi(2)-2.d0*wi(3)
+      wj(2)=qlj-j
+      wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+      wj(1)=1.d0-wj(2)+wj(3)
+      wj(2)=wj(2)-2.d0*wj(3)
+      do k1=1,3
+       k2=k+k1-1+ml
+      do i1=1,3
+      do j1=1,3
+       qgjit=qgjit+csj(i+i1-1,j+j1-1,k2)*wi(i1)*wj(j1)*wk(k1)
+      enddo
+      enddo
+      enddo
+      qgjit=exp(qgjit)*(1.d0/tmin-2.d0/s)
+
+      if(debug.ge.3)write (moniou,202)qgjit
+201   format(2x,'qgjit - unordered ladder cross section interpol.:'/4x,
+     *'s=',e10.3,2x,'q1=',e10.3,2x,'q2=',e10.3,2x,2x,'m=',i1,2x,'l=',i1)
+202   format(2x,'qgjit=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgjit1(q1,q2,s,m,l)
+c-----------------------------------------------------------------------------
+c qgjit1 - inclusive hard cross-section interpolation - for strict ordering
+c in the ladder
+c q1 - effective momentum cutoff for current end of the ladder,
+c q2 - effective momentum cutoff for opposide end of the ladder,
+c s - total c.m. energy squared for the ladder,
+c m - parton type at current end of the ladder (1 - g, 2 - q)
+c l - parton type at opposite end of the ladder (1 - g, 2 - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wi(3),wj(3),wk(3)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr20/ spmax
+      common /qgarr26/ factk,fqscal
+      common /qgarr30/ csj(40,40,160)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)s,q1,q2,m,l
+
+      qgjit1=0.d0
+      qq=max(q1,q2)
+      s2min=qq*4.d0*fqscal
+      if(s.le.s2min)then
+       if(debug.ge.3)write (moniou,202)qgjit1
+       return
+      endif
+
+      tmin=qq*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qq*fqscal/s)))
+      ml=40*(m-1)+80*(l-1)
+      qli=dlog(q1)/dlog(spmax/4.d0/fqscal)*39.d0+1.d0
+      if(q1.lt..99d0*spmax/4.d0/fqscal)then
+       qlj=dlog(qq/q1)/dlog(spmax/4.d0/fqscal/q1)*39.d0+1.d0
+      else
+       qlj=1.d0
+      endif
+      sl=dlog(s/s2min)/dlog(spmax/s2min)*39.d0+1.d0
+      i=min(38,int(qli))
+      j=min(38,int(qlj))
+      k=min(38,int(sl))
+      wk(2)=sl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+      wi(2)=qli-i
+      wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+      wi(1)=1.d0-wi(2)+wi(3)
+      wi(2)=wi(2)-2.d0*wi(3)
+      wj(2)=qlj-j
+      wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+      wj(1)=1.d0-wj(2)+wj(3)
+      wj(2)=wj(2)-2.d0*wj(3)
+
+      do k1=1,3
+       k2=k+k1-1+ml
+      do i1=1,3
+      do j1=1,3
+       qgjit1=qgjit1+csj(i+i1-1,j+j1-1,k2)*wi(i1)*wj(j1)*wk(k1)
+      enddo
+      enddo
+      enddo
+      qgjit1=exp(qgjit1)*(1.d0/tmin-2.d0/s)
+      if(q2.lt.q1)qgjit1=qgjit1*qgsudx(q1,l)/qgsudx(q2,l)
+
+      if(debug.ge.3)write (moniou,202)qgjit1
+201   format(2x,'qgjit1 - ordered ladder cross section interpol.:'/4x,
+     *'s=',e10.3,2x,'q1=',e10.3,2x,'q2=',e10.3,2x,2x,'m=',i1,2x,'l=',i1)
+202   format(2x,'qgjit1=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qglam(s,a,b)
+c-----------------------------------------------------------------------------
+c kinematical function for two particle decay - maximal pt-value
+c a - first particle mass squared,
+c b - second particle mass squared,
+c s - two particle invariant mass
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)s,a,b
+
+      qglam=max(0.d0,.25d0/s*(s+a-b)**2-a)
+
+      if(debug.ge.3)write (moniou,202)qglam
+201   format(2x,'qglam - kinematical function s=',e10.3,2x,'a='
+     *,e10.3,2x,'b=',e10.3)
+202   format(2x,'qglam=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgnrm(ep)
+c-----------------------------------------------------------------------------
+c 4-vector squared calculation
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ep(4)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)ep
+      qgnrm=(ep(1)-ep(2))*(ep(1)+ep(2))-ep(3)**2-ep(4)**2
+
+      if(debug.ge.3)write (moniou,202)qgnrm
+201   format(2x,'qgnrm - 4-vector squared for ','ep=',4(e10.3,1x))
+202   format(2x,'qgnrm=',e10.3)
+      return
+      end
+
+c===========================================================================
+      subroutine qgrec(ep,nqc,qv,zv,qm,iqv,ldau,lpar,jq)
+c---------------------------------------------------------------------------
+c jet reconstructuring procedure - 4-momenta for all final jets are determ.
+c ep(i) - jet 4-momentum
+c---------------------------------------------------------------------------
+c qv(i,j) - effective momentum for the branching of the parton in i-th row
+c on j-th level (0 - in case of no branching)
+c zv(i,j) - z-value for the branching of the parton in i-th row
+c on j-th level
+c qm(i,j) - mass squared for the parton in i-th row
+c on j-th level
+c iqv(i,j) - flavours for the parton in i-th row on j-th level
+c ldau(i,j) - first daughter row for the branching of the parton in i-th row
+c on j-th level
+c lpar(i,j) - the parent row for the parton in i-th row on j-th level
+c----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(njmax=50000)
+      dimension ep(4),ep3(4),epv(4,30,50),nqc(2),ncc(2,30,50),
+     *qv(30,50),zv(30,50),qm(30,50),iqv(30,50),
+     *ldau(30,49),lpar(30,50)
+c eqj(i,nj) - 4-momentum for the final jet nj
+c iqj(nj) - flavour for the final jet nj
+c ncj(m,nj) - colour connections for the final jet nj
+      common /qgarr37/ eqj(4,njmax),iqj(njmax),ncj(2,njmax),nj
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)jq,ep,iqv(1,1),nqc
+
+      do i=1,4
+       epv(i,1,1)=ep(i)
+      enddo
+      ncc(1,1,1)=nqc(1)
+      if(iqv(1,1).eq.0)ncc(2,1,1)=nqc(2)
+      nlev=1
+      nrow=1
+
+2     continue
+      if(qv(nrow,nlev).eq.0.d0)then
+       nj=nj+1
+       do i=1,4
+        eqj(i,nj)=epv(i,nrow,nlev)
+       enddo
+       iqj(nj)=iqv(nrow,nlev)
+       if(iabs(iqj(nj)).eq.3)iqj(nj)=iqj(nj)*4/3
+
+       if(iqj(nj).ne.0)then
+        njc=ncc(1,nrow,nlev)
+        if(njc.ne.0)then
+         ncj(1,nj)=njc
+         iqc=iqj(njc)
+         if(iqc.ne.0)then
+          ncj(1,njc)=nj
+         else
+          if(iqj(nj).gt.0)then
+           ncj(2,njc)=nj
+          else
+           ncj(1,njc)=nj
+          endif
+         endif
+        else
+         ncc(1,nrow,nlev)=nj
+        endif
+       else
+
+        do m=1,2
+         if(jq.eq.1)then
+          m1=m
+         else
+          m1=3-m
+         endif
+         njc=ncc(m1,nrow,nlev)
+         if(njc.ne.0)then
+          ncj(m,nj)=njc
+          iqc=iqj(njc)
+          if(iqc.ne.0)then
+           ncj(1,njc)=nj
+          else
+           ncj(3-m,njc)=nj
+          endif
+         else
+          ncc(m1,nrow,nlev)=nj
+         endif
+        enddo
+       endif
+       if(debug.ge.3)write (moniou,204)
+     * nj,nlev,nrow,iqj(nj),(eqj(i,nj),i=1,4)
+
+      else
+       do i=1,4
+         ep3(i)=epv(i,nrow,nlev)
+       enddo
+       call qgdefr(ep3,s0x,c0x,s0,c0)
+       z=zv(nrow,nlev)
+       qt2=(z*(1.d0-z))**2*qv(nrow,nlev)
+       ldrow=ldau(nrow,nlev)
+
+       wp0=ep3(1)+ep3(2)
+       wpi=z*wp0
+       wmi=(qt2+qm(ldrow,nlev+1))/wpi
+       ep3(1)=.5d0*(wpi+wmi)
+       ep3(2)=.5d0*(wpi-wmi)
+       qt=dsqrt(qt2)
+       call qgcs(c,s)
+       ep3(3)=qt*c
+       ep3(4)=qt*s
+       call qgrota(ep3,s0x,c0x,s0,c0)
+       do i=1,4
+        epv(i,ldrow,nlev+1)=ep3(i)
+       enddo
+       if(debug.ge.3)write (moniou,206)nlev+1,ldrow,ep3
+
+       wpi=(1.d0-z)*wp0
+       wmi=(qt2+qm(ldrow+1,nlev+1))/wpi
+       ep3(1)=.5d0*(wpi+wmi)
+       ep3(2)=.5d0*(wpi-wmi)
+       ep3(3)=-qt*c
+       ep3(4)=-qt*s
+       call qgrota(ep3,s0x,c0x,s0,c0)
+       do i=1,4
+        epv(i,ldrow+1,nlev+1)=ep3(i)
+       enddo
+       if(debug.ge.3)write (moniou,206)nlev+1,ldrow+1,ep3
+
+       if(iqv(nrow,nlev).eq.0)then
+        if(iqv(ldrow,nlev+1).ne.0)then
+         ncc(1,ldrow,nlev+1)=ncc(1,nrow,nlev)
+         ncc(1,ldrow+1,nlev+1)=ncc(2,nrow,nlev)
+        else
+         ncc(1,ldrow,nlev+1)=ncc(1,nrow,nlev)
+         ncc(2,ldrow,nlev+1)=0
+         ncc(1,ldrow+1,nlev+1)=0
+         ncc(2,ldrow+1,nlev+1)=ncc(2,nrow,nlev)
+        endif
+       else
+        if(iqv(ldrow,nlev+1).eq.0)then
+         ncc(1,ldrow,nlev+1)=ncc(1,nrow,nlev)
+         ncc(2,ldrow,nlev+1)=0
+         ncc(1,ldrow+1,nlev+1)=0
+        else
+         ncc(1,ldrow,nlev+1)=0
+         ncc(1,ldrow+1,nlev+1)=0
+         ncc(2,ldrow+1,nlev+1)=ncc(1,nrow,nlev)
+        endif
+       endif
+
+       nrow=ldrow
+       nlev=nlev+1
+       goto 2
+      endif
+
+8     continue
+      if(nlev.eq.1)then
+       if(nqc(1).eq.0)nqc(1)=ncc(1,1,1)
+       if(iqv(1,1).eq.0.and.nqc(2).eq.0)nqc(2)=ncc(2,1,1)
+       if(debug.ge.3)write (moniou,202)
+       return
+      endif
+
+      lprow=lpar(nrow,nlev)
+      if(ldau(lprow,nlev-1).eq.nrow)then
+       if(iqv(nrow,nlev).eq.0)then
+        if(ncc(1,lprow,nlev-1).eq.0)ncc(1,lprow,nlev-1)=ncc(1,nrow,nlev)
+        ncc(1,nrow+1,nlev)=ncc(2,nrow,nlev)
+       else
+        if(iqv(lprow,nlev-1).eq.0)then
+         if(ncc(1,lprow,nlev-1).eq.0)
+     *   ncc(1,lprow,nlev-1)=ncc(1,nrow,nlev)
+        else
+         ncc(1,nrow+1,nlev)=ncc(1,nrow,nlev)
+        endif
+       endif
+       nrow=nrow+1
+       goto 2
+      else
+       if(iqv(nrow,nlev).eq.0)then
+        if(iqv(lprow,nlev-1).eq.0)then
+         if(ncc(2,lprow,nlev-1).eq.0)
+     *   ncc(2,lprow,nlev-1)=ncc(2,nrow,nlev)
+        else
+         if(ncc(1,lprow,nlev-1).eq.0)
+     *   ncc(1,lprow,nlev-1)=ncc(2,nrow,nlev)
+        endif
+       else
+        if(iqv(lprow,nlev-1).eq.0.and.ncc(2,lprow,nlev-1).eq.0)
+     *  ncc(2,lprow,nlev-1)=ncc(1,nrow,nlev)
+       endif
+       nrow=lprow
+       nlev=nlev-1
+       goto 8
+      endif
+
+201   format(2x,'qgrec - jet reconstructuring: jq=',i1
+     */4x,'jet 4-momentum ep=',4(e10.3,1x)
+     */4x,'jet flavor: ',i2,2x,'colour connections: ',2i3)
+202   format(2x,'qgrec - end')
+204   format(2x,'qgrec: ',i3,'-th final jet at level nlev=',i2,' nrow='
+     *,i2/4x,'jet flavor: ',i3,2x,'jet 4-momentum:',4(e10.3,1x))
+206   format(2x,'qgrec: jet at level nlev='
+     *,i2,' nrow=',i2/4x,'jet 4-momentum:',4(e10.3,1x))
+      end
+
+c=============================================================================
+      double precision function qgroot(qlmax,g,j)
+c-----------------------------------------------------------------------------
+c qgroot - effective momentum tabulation for given set of random number
+c values and maximal effective momentum qmax values - according to the
+c probability of branching: (1 - timelike sudakov formfactor)
+c qlmax - ln qmax/16/qtf,
+c g - dzeta number (some function of ksi)
+c j - type of the parton (1-g,2-q)
+c------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)qlmax,g,j
+
+      ql0=0.d0
+      ql1=qlmax
+      f0=-g
+      f1=1.d0-g
+      sud0=-dlog(qgsudi(qlmax,j))
+
+1     ql2=ql1-(ql1-ql0)*f1/(f1-f0)
+      if(ql2.lt.0.d0)then
+       ql2=0.d0
+       f2=-g
+      elseif(ql2.gt.qlmax)then
+       ql2=qlmax
+       f2=1.d0-g
+      else
+       f2=-dlog(qgsudi(ql2,j))/sud0-g
+      endif
+      if(abs(f2).gt.1.d-3)then
+       if(f1*f2.lt.0.d0)then
+        ql0=ql1
+        f0=f1
+       endif
+       ql1=ql2
+       f1=f2
+       goto 1
+      else
+       qgroot=ql2
+      endif
+
+      if(debug.ge.3)write (moniou,202)qgroot
+201   format(2x,'qgqint - branching momentum tabulation:'
+     */4x,'qlmax=',e10.3,2x,'g=',e10.3,2x,'j=',i1)
+202   format(2x,'qgroot=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgrota(ep,s0x,c0x,s0,c0)
+c-----------------------------------------------------------------------------
+c spacial rotation to the lab. system for 4-vector ep
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ep(4),ep1(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)ep,s0x,c0x,s0,c0
+
+      ep1(3)=ep(4)
+      ep1(2)=ep(2)*s0+ep(3)*c0
+      ep1(1)=ep(2)*c0-ep(3)*s0
+      ep(2)=ep1(1)
+      ep(4)=ep1(2)*s0x+ep1(3)*c0x
+      ep(3)=ep1(2)*c0x-ep1(3)*s0x
+
+      if(debug.ge.3)write (moniou,202)ep
+201   format(2x,'qgrota - spacial rotation:'/4x,'4-vector ep=',4(e10.3
+     *,1x)/4x,'s0x=',e10.3,'c0x=',e10.3,2x,'s0=',e10.3,'c0=',e10.3)
+202   format(2x,'qgrota: rotated 4-vector ep=',2x,4e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgqint(qlmax,g,j)
+c-----------------------------------------------------------------------------
+c qgqint - effective momentum interpolation for given random number g
+c and maximal effective momentum qmax
+c qlmax - ln qmax/16/qtf,
+c g - random number (0<g<1)
+c j - type of the parton (1-g,2-q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wi(3),wk(3)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr34/ qrt(10,101,2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)qlmax,g,j
+
+      qli=qlmax/1.38629d0
+      sud0=1.d0/qgsudi(qlmax,j)
+      sl=100.d0*dlog(1.d0-g*(1.d0-sud0))/dlog(sud0)
+      i=int(qli)
+      k=int(sl)
+      if(k.gt.98)k=98
+      wk(2)=sl-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+      qgqint=0.d0
+      if(i.gt.7)i=7
+      wi(2)=qli-i
+      wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+      wi(1)=1.d0-wi(2)+wi(3)
+      wi(2)=wi(2)-2.d0*wi(3)
+      do k1=1,3
+      do i1=1,3
+       qgqint=qgqint+qrt(i+i1,k+k1,j)*wi(i1)*wk(k1)
+      enddo
+      enddo
+      if(qgqint.le.0.d0)qgqint=0.d0
+      qgqint=16.d0*qtf*exp(qgqint)
+
+      if(debug.ge.3)write (moniou,202)qgqint
+201   format(2x,'qgqint - branching momentum interpolation:'
+     */4x,'qlmax=',e10.3,2x,'g=',e10.3,2x,'j=',i1)
+202   format(2x,'qgqint=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgalf(qq)
+c-----------------------------------------------------------------------------
+c qgalf - alpha_s(qq)/2/pi
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      qgalf=2.d0/9.d0/dlog(qq)
+      return
+      end
+
+c=============================================================================
+      subroutine qgtran(ep,ey,jj)
+c-----------------------------------------------------------------------------
+c lorentz transform according to parameters ey ( determining lorentz shift
+c along the z,x,y-axis respectively (ey(1),ey(2),ey(3)))
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ey(3),ep(4)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)ep,ey
+
+      if(jj.eq.1)then
+c lorentz transform to lab. system according to 1/ey(i) parameters
+       do i=1,3
+        if(ey(4-i).ne.1.d0)then
+         wp=(ep(1)+ep(5-i))/ey(4-i)
+         wm=(ep(1)-ep(5-i))*ey(4-i)
+         ep(1)=.5d0*(wp+wm)
+         ep(5-i)=.5d0*(wp-wm)
+        endif
+       enddo
+      else
+c lorentz transform to lab. system according to ey(i) parameters
+       do i=1,3
+        if(ey(i).ne.1.d0)then
+         wp=(ep(1)+ep(i+1))*ey(i)
+         wm=(ep(1)-ep(i+1))/ey(i)
+         ep(1)=.5d0*(wp+wm)
+         ep(i+1)=.5d0*(wp-wm)
+        endif
+       enddo
+      endif
+
+      if(debug.ge.3)write (moniou,202)ep
+201   format(2x,'qgtran - lorentz boost for 4-vector'/4x,'ep='
+     *,2x,4(e10.3,1x)/4x,'boost parameters ey=',3e10.3)
+202   format(2x,'qgtran: transformed 4-vector ep=',2x,4(e10.3,1x))
+      return
+      end
+
+c=============================================================================
+      double precision function qgsudi(qlmax,j)
+c-----------------------------------------------------------------------------
+c qgsudi - timelike sudakov formfactor interpolation
+c qlmax - ln qmax/16/qtf,
+c j - type of the parton (1-g,2-q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3)
+      common /qgarr33/ fsud(10,2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)j,qlmax
+
+      ql=qlmax/1.38629d0
+      if(ql.le.0.d0)then
+       qgsudi=1.d0
+      else
+       k=int(ql)
+       if(k.gt.7)k=7
+       wk(2)=ql-k
+       wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+       wk(1)=1.d0-wk(2)+wk(3)
+       wk(2)=wk(2)-2.d0*wk(3)
+
+       qgsudi=0.d0
+       do k1=1,3
+        qgsudi=qgsudi+fsud(k+k1,j)*wk(k1)
+       enddo
+       if(qgsudi.le.0.d0)qgsudi=0.d0
+       qgsudi=exp(-qgsudi)
+      endif
+
+      if(debug.ge.3)write (moniou,202)qgsudi
+201   format(2x,'qgsudi - spacelike form factor interpolation:'
+     */4x,'parton type j=',i1,2x,'momentum logarithm qlmax=',e10.3)
+202   format(2x,'qgsudi=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgsudx(q,j)
+c-----------------------------------------------------------------------------
+c qgsudx - spacelike sudakov formfactor
+c q - maximal value of the effective momentum,
+c j - type of parton (1 - g, 2 - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)j,q
+
+      if(q.gt.1.d0)then
+       qgsudx=dlog(dlog(q/alm)/dlog(1.d0/alm))*(.75d0+dlog(epsxmn))
+       if(j.eq.1)then
+        qgsudx=exp(qgsudx/.75d0)
+       else
+        qgsudx=exp(qgsudx*16.d0/27.d0)
+       endif
+      else
+       qgsudx=1.d0
+      endif
+
+      if(debug.ge.3)write (moniou,202)qgsudx
+201   format(2x,'qgsudx - spacelike form factor: parton type j='
+     *,i1,2x,'momentum q=',e10.3)
+202   format(2x,'qgsudx=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgsudt(qmax,j)
+c-----------------------------------------------------------------------------
+c qgsudt - timelike sudakov formfactor
+c qmax - maximal value of the effective momentum,
+c j - type of parton (1 - g, 2 - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common/arr3/x1(7),a1(7)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)j,qmax
+
+      qgsudt=0.d0
+      qlmax=dlog(dlog(qmax/16.d0/alm))
+      qfl=dlog(dlog(qtf/alm))
+c numerical integration over transverse momentum square;
+c gaussian integration is used
+      do i=1,7
+      do m=1,2
+       qtl=.5d0*(qlmax+qfl+(2*m-3)*x1(i)*(qlmax-qfl))
+       qt=alm*exp(exp(qtl))
+       if(qt.ge.qmax/16.d0)qt=qmax/16.0001d0
+       zmin=.5d0-dsqrt((.25d0-dsqrt(qt/qmax)))
+       zmax=1.d0-zmin
+
+       if(j.eq.1)then
+        ap=(qgapi(zmax,1,1)-qgapi(zmin,1,1)+
+     *  qgapi(zmax,1,2)-qgapi(zmin,1,2))*.5d0
+       else
+        ap=qgapi(zmax,2,1)-qgapi(zmin,2,1)
+       endif
+       qgsudt=qgsudt+a1(i)*ap
+      enddo
+      enddo
+      qgsudt=qgsudt*(qlmax-qfl)/9.d0
+
+      if(debug.ge.3)write (moniou,202)qgsudt
+201   format(2x,'qgsudt - timelike form factor: parton type j='
+     *,i1,2x,'momentum qmax=',e10.3)
+202   format(2x,'qgsudt=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgtwd(s,a,b)
+c-----------------------------------------------------------------------------
+c kinematical function for two particle decay - light cone momentum share
+c for the particle of mass squared a,
+c b - partner's mass squared,
+c s - two particle invariant mass
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)s,a,b
+
+      x=.5d0*(1.d0+(a-b)/s)
+      dx=x-dsqrt(a/s)
+      if(dx.gt.0.d0)then
+       x=x+dsqrt(dx)*dsqrt(x+dsqrt(a/s))
+      else
+       x=dsqrt(a/s)
+      endif
+      qgtwd=x
+
+      if(debug.ge.3)write (moniou,202)qgtwd
+201   format(2x,'qgtwd: s=',e10.3,2x,'a=',e10.3,2x,'b=',e10.3)
+202   format(2x,'qgtwd=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgvdef(ich,ic1,ic2,icz)
+c-----------------------------------------------------------------------------
+c determination of valence quark flavour -
+c for valence quark hard scattering
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr11/ b10
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)ich,icz
+
+      is=iabs(ich)/ich
+      if(icz.eq.1)then
+       ic1=ich*(1-3*int(.5d0+qgran(b10)))
+       ic2=-ic1-ich
+      elseif(icz.eq.2)then
+       if(qgran(b10).gt..33333d0.or.ich.lt.0)then
+        ic1=ich-is
+        ic2=3*is
+       else
+        ic1=4*is-ich
+        ic2=ich+4*is
+       endif
+      elseif(icz.eq.3)then
+       ic1=ich-3*is
+       ic2=-4*is
+      elseif(icz.eq.4)then
+       ic1=ich-9*is
+       ic2=5*is
+      endif
+
+      if(debug.ge.3)write (moniou,202)ic1,ic2
+201   format(2x,'qgvdef: hadron type ich=',i2,' auxilliary type icz='
+     *,i1)
+202   format(2x,'qgvdef-end: parton flavors ic1=',i2,
+     *'ic2=',i2)
+      return
+      end
+
+c=============================================================================
+      double precision function qgzsim(qq,j)
+c-----------------------------------------------------------------------------
+c qgzsim - light cone momentum share simulation (for the timelike
+c branching)
+c qq - effective momentum value,
+c j - type of the parent parton (1-g,2-q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr11/ b10
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)qq,j
+
+      zmin=.5d0-dsqrt(.25d0-dsqrt(qtf/qq))
+      qlf=dlog(qtf/alm)
+1     continue
+      if(j.eq.1)then
+       qgzsim=.5d0*(2.d0*zmin)**qgran(b10)
+       gb=qgzsim*(qgfap(qgzsim,1,1)+qgfap(qgzsim,1,2))/7.5d0
+      else
+       qgzsim=zmin*((1.d0-zmin)/zmin)**qgran(b10)
+       gb=qgzsim*qgfap(qgzsim,2,1)*.375d0
+      endif
+      qt=qq*(qgzsim*(1.d0-qgzsim))**2
+      gb=gb/dlog(qt/alm)*qlf
+      if(debug.ge.3)write (moniou,203)qt,gb
+      if(qgran(b10).gt.gb)goto 1
+
+      if(debug.ge.3)write (moniou,202)qgzsim
+201   format(2x,'qgzsim - z-share simulation: qq=',e10.3,2x,'j=',i1)
+202   format(2x,'qgzsim=',e10.3)
+203   format(2x,'qgzsim: qt=',e10.3,2x,'gb=',e10.3)
+      return
+      end
+
+c===========================================================================
+      subroutine qgixxd(ich,ic1,ic2,icz)
+c---------------------------------------------------------------------------
+c determination of parton flavours for valence quark soft interaction
+c (charge exchange)
+c---------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr8/  wwm,be(4),dc(5),deta,almpt,ptdif,ptndi
+      common /qgarr11/ b10
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)ich,icz
+
+      is=iabs(ich)/ich
+      if(icz.eq.1)then                      !pion
+       ic1=ich*(1-3*int(.5d0+qgran(b10)))
+       if(qgran(b10).lt.dc(2))then
+        ic2=-4*ic1/iabs(ic1)
+        if(iabs(ic1).eq.1)then
+         ich1=-5*is
+        else
+         ich1=4*is
+        endif
+       else
+        ich1=ich*int(.5d0+qgran(b10))
+        ic2=-ic1*iabs(ich1)-(ich+ic1)*iabs(ich-ich1)
+       endif
+      elseif(icz.eq.2)then
+c valence quark type simulation ( for proton )
+       ic1=int(1.3333d0+qgran(b10))
+c leading nucleon type simulation ( flavors combinatorics )
+       if(ic1.eq.1)then
+        ich1=int(qgran(b10)+.5d0)+2
+        ic2=1-ich1
+       elseif(qgran(b10).lt..5d0)then
+        ich1=2
+        ic2=-2
+       else
+        ich1=7                   !uuu
+        ic2=-1
+       endif
+       if(iabs(ich).eq.3)then    !neutron
+        ic1=3-ic1
+        ic2=-3-ic2
+        if(ich1.eq.7)then
+         ich1=8                  !ddd
+        else
+         ich1=5-ich1
+        endif
+       endif
+       if(ich.lt.0)then
+        ic1=-ic1
+        ic2=-ic2
+        ich1=-ich1
+       endif
+      elseif(icz.eq.3)then
+       ic1=ich-3*is
+       ic2=-is*int(1.5d0+qgran(b10))
+       ich1=3*is-ic2
+      elseif(icz.eq.4)then
+       ic1=ich-9*is
+       ic2=is*int(1.5d0+qgran(b10))
+       ich1=9*is-ic2
+      elseif(icz.eq.5)then
+       ic1=is*int(1.5d0+qgran(b10))
+       ic2=-ic1
+       ich1=ich
+      else
+       ich1=0
+       stop 'Should not happen in qgixxd !'
+      endif
+      ich=ich1
+
+      if(debug.ge.3)write (moniou,202)ic1,ic2,ich
+201   format(2x,'qgixxd: hadron type ich=',i2,' auxilliary type icz='
+     *,i1)
+202   format(2x,'qgixxd-end: parton flavors ic1=',i2,' ic2='
+     *,i2,'new hadron type ich=',i2)
+      return
+      end
+
+c=============================================================================
+      subroutine qgdifr(wppr,wmtg,izp,izt,jexpr,jextg,iret)
+c-----------------------------------------------------------------------------
+c qgdifr - treatment of diffraction dissociation / leading hadron states
+c wppr - LC momentum for projectile remnant;
+c wptg - LC momentum for target remnant;
+c izp  - projectile remnant type;
+c izt  - target remnant type;
+c jexpr/jextg = -2 - low mass diffraction;
+c             = -1 - more collisions to follow;
+c             =  0 - no excitation;
+c             >  0 - low mass excitation
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ey(3),ep(4)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr2/  scm,wp0,wm0
+      common /qgarr6/  pi,bm,amws
+      common /qgarr8/  wwm,be(4),dc(5),deta,almpt,ptdif,ptndi
+      common /qgarr10/ am(7),ammu
+      common /qgarr11/ b10
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr21/ dmmin(3),wex(3),dmres(3),wdres(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)izp,izt,wppr,wmtg
+
+      iret=0
+      jexip=0
+      jexit=0
+      ddmin1=0.d0
+      ddmax1=0.d0
+c check if remnants are excited to low mass states
+      if(jexpr.eq.-2.or.jexpr.gt.0.and.qgran(b10)
+     *.lt.1.d0-(1.d0-wex(icz))**dble(jexpr).and.iabs(izp).lt.7)jexip=1
+      if(jextg.eq.-2.or.jextg.gt.0.and.qgran(b10)
+     *.lt.1.d0-(1.d0-wex(2))**dble(jextg).and.iabs(izt).lt.7)jexit=1
+c add low mass excitations if no particles produced before
+      if(wppr.ge.wp0.and.jexpr.gt.0.and.jexip.eq.0.and.iabs(izp).lt.7)
+     *jexip=1
+      if(wmtg.ge.wm0.and.jextg.gt.0.and.jexit.eq.0.and.iabs(izt).lt.7)
+     *jexit=1
+
+      sd0=wppr*wmtg                          !energy squared available
+      if(jextg.eq.-1)then                    !more collisions to follow
+       dmass2=0.d0
+       ddmin2=0.d0
+      elseif(jexit.eq.0)then                 !no excitation
+       if(iabs(izt).eq.7.or.iabs(izt).eq.8)then  !delta++/-
+        dmass2=dmmin(2)
+       else
+        dmass2=am(2)
+       endif
+       ddmin2=dmass2
+      else                                   !low mass excitation
+       ddmin2=dmmin(2)
+       if(jextg.eq.-2)ddmin2=dmres(2)        !low mass diffraction
+      endif
+      if(jexpr.eq.-1)then                    !more collisions to follow
+       dmass1=0.d0
+      elseif(jexip.eq.0)then                 !no excitation
+       if(iabs(izp).eq.7.or.iabs(izp).eq.8)then  !delta++/-
+        dmass1=dmmin(2)
+       elseif(izp.eq.0)then                      !rho0
+        dmass1=dmmin(1)
+        izp=-10
+       else
+        dmass1=am(icz)
+       endif
+      else                                   !low mass excitation
+       ddmin1=dmmin(icz)
+       if(jexpr.eq.-2)ddmin1=dmres(icz)        !low mass diffraction
+       ddmax1=dsqrt(sd0)-ddmin2
+      endif
+
+
+c determine mass for projectile excited remnant
+      if(jexip.eq.1)then
+       if(jexpr.ne.-2)then                   !low mass excitation (dM/M^2)
+        if(ddmax1.gt.ddmin1)then
+         dmass1=ddmin1/(1.d0-qgran(b10)*(1.d0-ddmin1/ddmax1))
+        else
+         dmass1=ddmin1
+        endif
+       else                                  !low mass diffraction (res. + PPR)
+        ddmin=dmmin(icz)+am(1)
+        ddmax=min(ddmax1,dmres(icz)+.5d0*wdres(icz))
+        ddmax=max(ddmax,ddmin)
+        wres=1.d0/(1.d0+.5d0*(1.d0+2.d0*dmres(icz)/wdres(icz))
+     *  *(1.d0-(dmres(icz)+.5d0*wdres(icz))
+     *  /max(ddmax1,dmres(icz)+.5d0*wdres(icz)))
+     *  /(.25d0*pi+atan(2.d0*(dmres(icz)-ddmin)/wdres(icz))))
+        if(qgran(b10).gt.wres)then           !PPR contribution
+         dmass1=ddmax/(1.d0-qgran(b10)*(1.d0-ddmax/ddmax1))
+        else                                 !resonance contribution
+         dmass1=dmres(icz)+.5d0*wdres(icz)
+     *   *tan(atan(2.d0*(ddmax-dmres(icz))/wdres(icz))
+     *   -qgran(b10)*(atan(2.d0*(ddmax-dmres(icz))/wdres(icz))
+     *   +atan(2.d0*(dmres(icz)-ddmin)/wdres(icz))))
+         jexip=0
+         izp=izp+10*izp/iabs(izp)
+        endif
+       endif
+      endif
+
+c determine mass for target excited remnant
+      if(jexit.eq.1)then
+       ddmax2=dsqrt(sd0)-dmass1
+       if(jextg.ne.-2)then                   !low mass excitation (dM/M^2)
+        if(ddmax2.gt.ddmin2)then
+         dmass2=ddmin2/(1.d0-qgran(b10)*(1.d0-ddmin2/ddmax2))
+        else                                  !low mass diffraction
+         dmass2=ddmin2
+        endif
+       else                                  !low mass diffraction (res. + PPR)
+        ddmin=dmmin(2)+am(1)
+        ddmax=min(ddmax2,dmres(2)+.5d0*wdres(2))
+        ddmax=max(ddmax,ddmin)
+        wres=1.d0/(1.d0+.5d0*(1.d0+2.d0*dmres(2)/wdres(2))
+     *  *(1.d0-(dmres(2)+.5d0*wdres(2))/max(ddmax2,dmres(2)+.5d0
+     *  *wdres(2)))/(.25d0*pi+atan(2.d0*(dmres(2)-ddmin)/wdres(2))))
+        if(qgran(b10).gt.wres)then           !PPR contribution
+         dmass2=ddmax/(1.d0-qgran(b10)*(1.d0-ddmax/ddmax2))
+        else                                 !resonance contribution
+         dmass2=dmres(2)+.5d0*wdres(2)*tan(atan(2.d0*(ddmax-dmres(2))
+     *   /wdres(2))-qgran(b10)*(atan(2.d0*(ddmax-dmres(2))/wdres(2))
+     *   +atan(2.d0*(dmres(2)-ddmin)/wdres(2))))
+         izt=izt+10*izt/iabs(izt)
+         jexit=0
+        endif
+       endif
+      endif
+
+      wpp=wppr
+      wpm=wmtg
+      if(sd0.lt.(dmass1+dmass2)**2)then
+       iret=1
+       return
+      endif
+      dmass1=dmass1**2
+      dmass2=dmass2**2
+
+      if(jexpr.ne.-1.and.jextg.ne.-1)then
+       ptmax=max(0.d0,qglam(sd0,dmass1,dmass2))
+       if(jexpr.eq.-2.or.jextg.eq.-2)then
+        ptmean=ptdif
+       else
+        ptmean=ptndi*dsqrt(dble(max(jexpr,jextg)))
+       endif
+       if(ptmax.lt.ptmean**2)then
+1       pti=ptmax*qgran(b10)
+        if(qgran(b10).gt.exp(-dsqrt(pti)/ptmean))goto 1
+       else
+2       pti=(ptmean*dlog(qgran(b10)*qgran(b10)))**2
+        if(pti.gt.ptmax)goto 2
+       endif
+      else
+       pti=0.d0
+      endif
+      amt1=dmass1+pti
+      amt2=dmass2+pti
+      wpd1=wpp*qgtwd(sd0,amt1,amt2)
+      if(wpd1.gt.0.d0)then
+       wmd1=amt1/wpd1
+      else
+       wmd1=0.d0
+      endif
+      wmd2=wpm-wmd1
+      if(wmd2.gt.0.d0)then
+       wpd2=amt2/wmd2
+      else
+       wpd2=0.d0
+      endif
+      pt=dsqrt(pti)
+      call qgcs(c,s)
+
+      if(jexpr.eq.-1)then
+       wppr=wpd1
+       if(wmd1.ne.0.d0)stop'wmd1.ne.0!!!'
+      else
+       ep(1)=.5d0*(wpd1+wmd1)
+       ep(2)=.5d0*(wpd1-wmd1)
+       ep(3)=pt*c
+       ep(4)=pt*s
+       wppr=0.d0
+       if(jexip.eq.0)then
+        call qgreg(ep,izp)
+       else
+        is=0
+        if(izp.ne.0)is=iabs(izp)/izp
+        if(icz.eq.1)then
+         if(iabs(izp).ge.4)then
+          ic2=-4*is
+          ic1=izp-3*is
+         elseif(izp.ne.0)then
+          ic1=izp*(1-3*int(.5d0+qgran(b10)))
+          ic2=-izp-ic1
+         else
+          ic1=int(1.5d0+qgran(b10))*(2*int(.5d0+qgran(b10))-1)
+          ic2=-ic1
+         endif
+        elseif(icz.eq.2)then
+         if(qgran(b10).gt..33333d0)then
+          ic1=3*is
+          ic2=izp-is
+         else
+          ic1=izp+4*is
+          ic2=4*is-izp
+         endif
+        elseif(icz.eq.3)then
+         ic1=-4*is
+         ic2=izp-3*is
+        endif
+        call qgdeft(dmass1,ep,ey)
+        call qggene(dsqrt(dmass1),dsqrt(dmass1),ey
+     *  ,0.d0,1.d0,0.d0,1.d0,ic1,ic2)
+       endif
+      endif
+
+      if(jextg.eq.-1)then
+       wmtg=wmd2
+       if(wpd2.ne.0.d0)stop'wpd2.ne.0!!!'
+      else
+       ep(1)=.5d0*(wpd2+wmd2)
+       ep(2)=.5d0*(wpd2-wmd2)
+       ep(3)=-pt*c
+       ep(4)=-pt*s
+       wmtg=0.d0
+       if(jexit.eq.0)then
+        call qgreg(ep,izt)
+       else
+        is=iabs(izt)/izt
+        if(qgran(b10).gt..33333d0)then
+         ic1=3*is
+         ic2=izt-is
+        else
+         ic1=izt+4*is
+         ic2=4*is-izt
+        endif
+        call qgdeft(dmass2,ep,ey)
+        call qggene(dsqrt(dmass2),dsqrt(dmass2),ey
+     *  ,0.d0,1.d0,0.d0,1.d0,ic2,ic1)
+       endif
+      endif
+
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qgdifr - leading clusters hadronization:'
+     */4x,'cluster types izp=',i2,2x,
+     *'izt=',i2/4x,'available light cone momenta: wppr=',e10.3,
+     *' wmtg=',e10.3)
+202   format(2x,'qgdifr - end')
+      return
+      end
+
+c=============================================================================
+      subroutine qgfau(b,gz)
+c-----------------------------------------------------------------------------
+c integrands for hadron-hadron and hadron-nucleus cross-sections calculation
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      dimension gz(3),gz0(5)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)b
+
+      do l=1,3
+       gz(l)=0.d0
+      enddo
+
+      ab=float(ia(2))
+      do iddp1=1,2
+      do iddp2=1,2
+       call qgfz(b,gz0,iddp1,iddp2)
+       if(iddp1.eq.iddp2)gz(1)=gz(1)+(1.d0-gz0(1)*anorm)**ab
+     * *cc(iddp1,icz)
+       do l=2,3
+        gz(l)=gz(l)+(1.d0-gz0(l-1)*anorm)**ab
+     *  *cc(iddp1,icz)*cc(iddp2,icz)
+       enddo
+      enddo
+      enddo
+
+      gz(3)=gz(2)-gz(3)
+      gz(2)=gz(1)-gz(2)
+      gz(1)=1.d0-gz(1)
+
+      if(debug.ge.2)write (moniou,203)gz
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qgfau - integrands for hadron-hadron and hadron'
+     *,'-nucleus cross-sections calculation'/4x,'b=',e10.3)
+202   format(2x,'qgfau - end')
+203   format(2x,'qgfau: gz=',3e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgfrag(sa,na,rc)
+c-----------------------------------------------------------------------------
+c connected nucleon clasters extraction - used for the nuclear spectator part
+c multifragmentation
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(iapmax=208)
+      dimension sa(iapmax,3)
+      common /qgarr13/ nsf,iaf(iapmax)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)na
+      if(debug.ge.3)then
+       write (moniou,203)
+       do i=1,na
+        write (moniou,204)(sa(i,l),l=1,3)
+       enddo
+      endif
+
+      ni=1
+      ng=1
+      j=0
+1     j=j+1
+      j1=ni+1
+
+      do 4 i=j1,na
+       ri=0.d0
+       do m=1,3
+        ri=ri+(sa(j,m)-sa(i,m))**2
+       enddo
+       if(ri.gt.rc)goto 4
+
+       ni=ni+1
+       ng=ng+1
+       if(i.eq.ni)goto 4
+       do m=1,3
+        s0=sa(ni,m)
+        sa(ni,m)=sa(i,m)
+        sa(i,m)=s0
+       enddo
+4     continue
+
+      if(j.lt.ni.and.na-ni.gt.0)goto 1
+      nsf=nsf+1
+      iaf(nsf)=ng
+      if(debug.ge.3)write (moniou,206)nsf,iaf(nsf)
+
+      ng=1
+      j=ni
+      ni=ni+1
+      if(na.eq.ni)then
+       nsf=nsf+1
+       iaf(nsf)=1
+       if(debug.ge.3)write (moniou,206)nsf,iaf(nsf)
+      elseif(na.gt.ni)then
+       goto 1
+      endif
+
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qgfrag-multifragmentation: nucleus mass number: na='
+     *,i2)
+202   format(2x,'qgfrag - end')
+203   format(2x,'nucleons coordinates:')
+204   format(2x,3e10.3)
+206   format(2x,'qgfrag: fragment n',i2,2x,'fragment mass - ',i2)
+      return
+      end
+
+c=============================================================================
+      subroutine qgfrgm(ns,xa)
+c-----------------------------------------------------------------------------
+c fragmentation of the spectator part of the nucleus
+c xa - array for spectator nucleons positions
+c ns - total number of spectators
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      parameter(iapmax=208)
+      dimension xa(iapmax,3)
+      integer debug
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr3/  rmin,emax,eev
+      common /qgarr11/ b10
+c nsf - number of secondary fragments;
+c iaf(i) - mass of the i-th fragment
+      common /qgarr13/ nsf,iaf(iapmax)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)ns
+
+      nsf=0
+      if(ns.eq.0)then                  !no fragments
+       return
+      elseif(ns.eq.1)then              !single spectator nucleon recorded
+       nsf=nsf+1
+       iaf(nsf)=1
+       if(debug.ge.3)write (moniou,205)
+       return
+      endif
+
+      eex=0.d0                         !excitation energy for spectator part
+           !sum of excitations due to wounded nucleons (including diffractive)
+      do i=1,ia(1)-ns
+c partial excitation according to f(e) ~ 1/sqrt(e) * exp(-e/(2*<e>))
+       eex=eex+(qgran(b10)+qgran(b10)+qgran(b10)+
+     * qgran(b10)+qgran(b10)-2.5d0)**2*2.4d0
+      enddo
+      if(debug.ge.3)write (moniou,203)eex
+
+      if(eex/ns.gt.emax)then    !if eex>emax -> multifragmentation
+       call qgfrag(xa,ns,rmin)  !multifragmentation (percolation algorithm)
+      else                      !otherwise eveporation
+       nf=npgen(eex/eev,0,ns-1) !number of eveporated nucleons (mean=eex/eev)
+       nsf=nsf+1
+       iaf(nsf)=ns-nf           !recording of the fragment produced
+       if(debug.ge.3)write (moniou,206)iaf(nsf)
+
+       nal=nf/4                 !number of evapotared alphas (taken as nf/4)
+       if(nal.ne.0)then
+        do i=1,nal              !recording the evaporated alphas
+         nsf=nsf+1
+         iaf(nsf)=4
+        enddo
+       endif
+       nf=nf-4*nal
+
+       if(nf.ne.0)then
+        do i=1,nf               !recording the evaporated nucleons
+         nsf=nsf+1
+         iaf(nsf)=1
+        enddo
+       endif
+       if(debug.ge.3)write (moniou,204)nf,nal
+      endif
+c6     continue
+
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qgfrgm: number of spectators: ns=',i2)
+202   format(2x,'qgfrgm - end')
+203   format(2x,'qgfrgm: excitation energy: eex=',e10.3)
+204   format(2x,'qgfrgm - evaporation: number of nucleons nf='
+     *,i2,'number of alphas nal=',i2)
+205   format(2x,'qgfrgm - single spectator')
+206   format(2x,'qgfrgm - evaporation: mass number of the fragment:',i2)
+      return
+      end
+
+c=============================================================================
+      subroutine qggau(gz)
+c-----------------------------------------------------------------------------
+c impact parameter integration for impact parameters <bm -
+c for hadron-hadron and hadron-nucleus cross-sections calculation
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension gz(3),gz0(3)
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr6/  pi,bm,amws
+      common /arr3/   x1(7),a1(7)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)
+
+      do i=1,3
+       gz(i)=0.d0
+      enddo
+      do i=1,7
+      do m=1,2
+       b=bm*dsqrt(.5d0+x1(i)*(m-1.5d0))
+       call qgfau(b,gz0)
+       do l=1,3
+        gz(l)=gz(l)+gz0(l)*a1(i)
+       enddo
+      enddo
+      enddo
+
+      do l=1,3
+       gz(l)=gz(l)*bm**2*pi*.5d0
+      enddo
+
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qggau - nuclear cross-sections calculation')
+202   format(2x,'qggau - end')
+      return
+      end
+
+c=============================================================================
+      subroutine qggau1(gz)
+c-----------------------------------------------------------------------------
+c impact parameter integration for impact parameters >bm -
+c for hadron-hadron and hadron-nucleus cross-sections calculation
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension gz(3),gz0(3)
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr43/ moniou
+      common /arr3/   x1(7),a1(7)
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)
+
+      do i=1,7
+      do m=1,2
+       b=bm-wsnuc(2)*dlog(.5d0+x1(i)*(m-1.5d0))
+       call qgfau(b,gz0)
+       do l=1,3
+        gz(l)=gz(l)+gz0(l)*a1(i)*exp((b-bm)/wsnuc(2))*b*pi*wsnuc(2)
+       enddo
+      enddo
+      enddo
+
+      if(debug.ge.3)write (moniou,202)
+201   format(2x,'qggau1 - nuclear cross-sections calculation')
+202   format(2x,'qggau1 - end')
+      return
+      end
+
+c=============================================================================
+      double precision function qganrm(rnuc,wsnuc,wbnuc)
+c-----------------------------------------------------------------------------
+c impact parameter integration for impact parameters <bm -
+c for hadron-hadron and hadron-nucleus cross-sections calculation
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /arr3/   x1(7),a1(7)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)
+
+      qganrm=0.d0
+      do i=1,7
+      do m=1,2
+       r=rnuc*(.5d0+x1(i)*(m-1.5d0))**(1.d0/3.d0)
+       quq=(r-rnuc)/wsnuc
+       if(quq.lt.1.d80)qganrm=qganrm+a1(i)/(1.d0+exp(quq))
+     * *(1.d0+wbnuc*(r/rnuc)**2)
+      enddo
+      enddo
+      qganrm=qganrm*rnuc**3*pi/1.5d0
+
+      dnrm=0.d0
+      do i=1,7
+      do m=1,2
+       t=.5d0+x1(i)*(m-1.5d0)
+       r=rnuc-wsnuc*log(t)
+       dnrm=dnrm+a1(i)/(1.d0+t)*r*r
+     * *(1.d0+wbnuc*(r/rnuc)**2)
+      enddo
+      enddo
+      qganrm=1.d0/(qganrm+dnrm*2.d0*pi*wsnuc)
+
+      if(debug.ge.3)write (moniou,202)qganrm
+201   format(2x,'qganrm - nuclear density normalization')
+202   format(2x,'qganrm=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qggene(wp0,wm0,ey0,s0x,c0x,s0,c0,ic1,ic2)
+c-----------------------------------------------------------------------------
+c to simulate the fragmentation of the string into secondary hadrons
+c the algorithm conserves energy-momentum;
+c wp0, wm0 are initial longitudinal momenta ( e+p, e-p ) of the quarks
+c at the ends of the string; ic1, ic2 - their types
+c the following partons types are used: 1 - u, -1 - U, 2 - d, -2 - D,
+c 3 - ud, -3 - UD, 4 - s, -4 - S, 6 - uu, -6 - UU, 7 - dd, -7 - DD,
+c 8 - us, -8 - US
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      character *2 tyq
+      dimension wp(2),ic(2),ept(4),ep(4),ey(3),ey0(3)
+c wp(1), wp(2) - current longitudinal momenta of the partons at the string
+c ends, ic(1), ic(2) - their types
+      common /qgarr8/  wwm,bep,ben,bek,bec,dc(5),deta,almpt,ptdif
+     *,ptndi
+      common /qgarr10/ am0,amn,amk,amc,amlamc,amlam,ameta,ammu
+      common /qgarr11/ b10
+      common /qgarr19/ ahl(3)
+      common /qgarr28/ arr(5)
+      common /qgarr42/ tyq(16)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      external qgran
+
+      if(debug.ge.2)write (moniou,201)tyq(8+ic1),tyq(8+ic2)
+     *,wp0,wm0,ey0,s0x,c0x,s0,c0
+
+      ww=wp0*wm0                              !mass squared for the string
+      ept(1)=.5d0*(wp0+wm0)                   !4-momentum for the string
+      ept(2)=.5d0*(wp0-wm0)
+      ept(3)=0.d0
+      ept(4)=0.d0
+
+      if(iabs(ic1).eq.5.or.iabs(ic2).eq.5.or.iabs(ic1).gt.8
+     *.or.iabs(ic2).gt.8)stop'qggene: problem with parton types'
+
+      ic(1)=ic1                               !parton types at string ends
+      ic(2)=ic2
+
+1     sww=dsqrt(ww)
+      call qgdeft(ww,ept,ey)                  !boost to c.m.  for the string
+      j=int(2.d0*qgran(b10))+1                !choose string end to start
+
+      if(debug.ge.3)then
+       iqt=8+ic(j)
+       write (moniou,203)j,tyq(iqt),ww
+      endif
+
+      iab=iabs(ic(j))
+      is=ic(j)/iab
+      if(iab.eq.8)then
+       iab=6
+      elseif(iab.gt.5)then
+       iab=3
+      endif
+      iaj=iabs(ic(3-j))
+      if(iaj.eq.8)then
+       iaj=6
+      elseif(iaj.gt.5)then
+       iaj=3
+      endif
+      if(iab.eq.5)stop'no charm anymore!'
+
+      if(iaj.eq.3)then
+       restm=amn
+      elseif(iaj.eq.4)then
+       restm=amk
+      elseif(iaj.eq.5)then
+       stop'no charm anymore!'
+      elseif(iaj.eq.6)then
+       restm=amlam
+      else
+       restm=am0
+      endif
+
+      if(iab.le.2.and.sww.gt.restm+2.d0*am0+wwm
+     *.or.iab.eq.3.and.sww.gt.restm+am0+amn+wwm
+     *.or.iab.eq.4.and.sww.gt.restm+am0+amk+wwm
+     *.or.iab.eq.6.and.sww.gt.restm+am0+amlam+wwm)then !more than 2 particles
+       blf=0.d0
+       bet=0.d0
+       alf=0.d0
+       if(iab.le.2)then                                !light quark string end
+        if(iab.eq.2.and.iabs(ic(3-j)).ne.7
+     *  .and.sww.gt.restm+2.d0*amlam.and.qgran(b10).lt.dc(1)*dc(2))then
+c lambda generation
+         restm=(restm+amlam)**2
+         bet=ben
+         ami=amlam**2
+         alf=almpt-arr(2)+arr(1)-arr(3)
+         blf=1.d0-arr(2)-arr(3)
+         ic0=6*is                                      !(anti-)lambda
+         ic(j)=-8*is                                   !US(us)
+        elseif(sww.gt.restm+2.d0*amn.and.qgran(b10).lt.dc(1))then
+c nucleon generation
+         restm=(restm+amn)**2
+         bet=ben
+         ami=amn**2
+         alf=almpt-arr(2)
+         blf=1.d0-arr(1)-arr(2)
+         ic0=ic(j)+is
+         ic(j)=-3*is
+        elseif(sww.gt.restm+2.d0*amk.and.qgran(b10).lt.dc(2))then
+c kaon generation
+         restm=(restm+amk)**2
+         bet=bek
+         ami=amk**2
+         alf=almpt-arr(3)
+         blf=1.d0-arr(1)-arr(3)
+         ic0=ic(j)+3*is
+         ic(j)=4*is
+        elseif(sww.gt.restm+ameta+am0.and.qgran(b10).lt.deta)then
+c eta generation
+         restm=(restm+am0)**2
+         bet=bek
+         ami=ameta**2
+         alf=almpt-arr(1)
+         blf=1.d0-2.d0*arr(1)
+         ic0=10
+        else
+c pion generation
+         restm=(restm+am0)**2
+         bet=bep
+         ami=am0**2
+         alf=almpt-arr(1)
+         blf=1.d0-2.d0*arr(1)
+         if(qgran(b10).lt..3333d0)then
+          ic0=0
+         else
+          ic0=3*is-2*ic(j)
+          ic(j)=3*is-ic(j)
+         endif
+        endif
+
+       elseif(iab.eq.3)then
+        if(sww.gt.restm+amk+amlam.and.qgran(b10).lt.dc(4)
+     *  .and.iabs(ic(j)).eq.3)then
+c lambda generation
+         restm=(restm+amk)**2
+         bet=bek
+         ami=amlam**2
+         alf=almpt-arr(3)
+         blf=1.d0-arr(2)-arr(3)
+         ic0=6*is
+         ic(j)=-4*is
+        else
+c nucleon generation
+         restm=(restm+am0)**2
+         bet=ben
+         ami=amn**2
+         alf=almpt-arr(1)
+         blf=1.d0-arr(1)-arr(2)
+         if(iabs(ic(j)).eq.3)then
+          ic0=is*int(2.5d0+qgran(b10))
+          ic(j)=is-ic0
+         else
+          ic0=ic(j)-4*is
+          ic(j)=ic0-4*is
+         endif
+        endif
+
+       elseif(iab.eq.4)then
+        if(sww.gt.restm+amn+amlam.and.qgran(b10).lt.dc(1))then
+c lambda generation
+         restm=(restm+amn)**2
+         bet=ben
+         ami=amlam**2
+         alf=almpt-arr(2)
+         blf=1.d0-arr(2)-arr(3)
+         ic0=6*is
+         ic(j)=-3*is
+        else
+c kaon generation
+         restm=(restm+am0)**2
+         bet=bep
+         ami=amk**2
+         alf=almpt-arr(1)
+         blf=1.d0-arr(1)-arr(3)
+         ic(j)=is*int(1.5d0+qgran(b10))
+         ic0=-3*is-ic(j)
+        endif
+
+       elseif(iab.eq.6)then
+c lambda generation
+        restm=(restm+am0)**2
+        bet=bep
+        ami=amlam**2
+        alf=almpt-arr(1)
+        blf=1.d0-arr(2)-arr(3)
+        ic0=6*is
+        ic(j)=-2*is
+       endif
+
+       ptmax=qglam(ww,restm,ami)
+       if(ptmax.lt.0.)ptmax=0.
+
+       if(ptmax.lt.bet**2)then
+2       pti=ptmax*qgran(b10)
+        if(qgran(b10).gt.exp(-dsqrt(pti)/bet))goto 2
+       else
+3       pti=(bet*dlog(qgran(b10)*qgran(b10)))**2
+        if(pti.gt.ptmax)goto 3
+       endif
+
+       amt=ami+pti
+       restm1=restm+pti
+       zmin=1.d0-qgtwd(ww,restm1,amt)
+       zmax=qgtwd(ww,amt,restm1)
+
+       z1=(1.d0-zmax)**alf
+       z2=(1.d0-zmin)**alf
+4      z=1.-(z1+(z2-z1)*qgran(b10))**(1./alf)
+       if(qgran(b10).gt.(z/zmax)**blf)goto 4
+       wp(j)=z*sww
+       wp(3-j)=amt/wp(j)
+       ep(1)=.5d0*(wp(1)+wp(2))
+       ep(2)=.5d0*(wp(1)-wp(2))
+       pti=dsqrt(pti)
+       call qgcs(c,s)
+       ep(3)=pti*c
+       ep(4)=pti*s
+       ept(1)=sww-ep(1)
+       do i=2,4
+        ept(i)=-ep(i)
+       enddo
+       ww=qgnrm(ept)
+       if(ww.lt.restm)goto 4
+
+       call qgtran(ep,ey,1)
+       call qgtran(ept,ey,1)
+       if(s0x.ne.0.d0.or.s0.ne.0.d0)then
+        call qgrota(ep,s0x,c0x,s0,c0)
+       endif
+       if(ey0(1)*ey0(2)*ey0(3).ne.1.d0)then
+        call qgtran(ep,ey0,1)
+       endif
+       call qgreg(ep,ic0)
+
+      else
+       ami2=restm**2
+       bet=bep
+       if(iab.eq.6.or.iaj.eq.6)then
+        if(iab.eq.6)then
+         ami=amlam**2
+         ic(j)=6*is
+         if(iaj.eq.6)then
+          ic(3-j)=-6*is
+         elseif(iaj.eq.4)then
+          ic(3-j)=-5*is
+         elseif(iaj.le.2)then
+          ic(3-j)=2*is-ic(3-j)
+         else
+          if(iabs(ic(3-j)).eq.3)then
+           ic(3-j)=-3*is
+          elseif(iabs(ic(3-j)).eq.6)then
+           ic(3-j)=-2*is
+          else
+           stop'wrong parton types'
+          endif
+         endif
+        elseif(iab.eq.4)then
+         ami=amk**2
+         ic(j)=-5*is
+         ic(3-j)=6*is
+        elseif(iab.le.2)then
+         ami=am0**2
+         ic(j)=2*is-ic(j)
+         ic(3-j)=6*is
+        else
+         ami=amn**2
+         ic(3-j)=-6*is
+         if(iabs(ic(j)).eq.3)then
+          ic(j)=3*is
+         elseif(iabs(ic(j)).eq.6)then
+          ic(j)=2*is
+         else
+          stop'wrong parton types'
+         endif
+        endif
+
+       elseif(iab.le.2.and.iaj.le.2)then
+        if(sww.gt.2.d0*amk.and.qgran(b10).lt.dc(2))then
+         bet=bek
+         ami=amk**2
+         ami2=ami
+         ic(j)=ic(j)+3*is
+         ic(3-j)=ic(3-j)-3*is
+        else
+         ami=am0**2
+         ic0=-ic(1)-ic(2)
+         if(ic0.ne.0)then
+          ic(j)=ic0*int(.5d0+qgran(b10))
+          ic(3-j)=ic0-ic(j)
+         else
+          if(qgran(b10).lt..2d0)then
+           ic(j)=0
+           ic(3-j)=0
+          else
+           ic(j)=3*is-2*ic(j)
+           ic(3-j)=-ic(j)
+          endif
+         endif
+        endif
+
+       elseif(iab.eq.3.or.iaj.eq.3)then
+        if(iab.eq.3)then
+         ami=amn**2
+         if(iabs(ic(j)).eq.3)then
+          if(iaj.eq.3)then
+           if(iabs(ic(3-j)).eq.3)then
+            if(sww.gt.2.d0*amlam.and.qgran(b10).lt.dc(4))then
+             bet=bek
+             ami=amlam**2
+             ami2=ami
+             ic(j)=6*is
+             ic(3-j)=-6*is
+            else
+             ic(j)=is*int(2.5d0+qgran(b10))
+             ic(3-j)=-ic(j)
+            endif
+           else
+            ic(3-j)=ic(3-j)+4*is
+            ic(j)=5*is+ic(3-j)
+           endif
+          elseif(iaj.lt.3)then
+           if(sww.gt.amlam+amk.and.qgran(b10).lt.dc(4))then
+            bet=bek
+            ami=amlam**2
+            ami2=amk**2
+            ic(j)=6*is
+            ic(3-j)=ic(3-j)+3*is
+           else
+            if(qgran(b10).lt..3333d0)then
+             ic(j)=ic(3-j)+is
+             ic(3-j)=0
+            else
+             ic(j)=is*(4-iaj)
+             ic(3-j)=is*(3-2*iaj)
+            endif
+           endif
+          elseif(iaj.eq.4)then
+           ic(j)=is*int(2.5d0+qgran(b10))
+           ic(3-j)=-ic(j)-2*is
+          endif
+         else
+          if(iabs(ic(3-j)).gt.4)stop'qggene: problem with parton types'
+          ic(j)=ic(j)-4*is
+          ic0=ic(j)-4*is
+          if(iaj.eq.3)then
+           ic(3-j)=ic0-is
+          elseif(iaj.lt.3)then
+           ic(3-j)=-ic(3-j)-ic0
+          elseif(iaj.eq.4)then
+           ic(3-j)=ic0-3*is
+          endif
+         endif
+        else
+         if(iabs(ic(3-j)).eq.3)then
+          if(iab.lt.3)then
+           if(sww.gt.amlam+amk.and.qgran(b10).lt.dc(4))then
+            bet=bek
+            ami2=amlam**2
+            ami=amk**2
+            ic(j)=ic(j)+3*is
+            ic(3-j)=6*is
+           else
+            ami=am0**2
+            if(qgran(b10).lt..3333d0)then
+             ic(3-j)=ic(j)+is
+             ic(j)=0
+            else
+             ic(3-j)=is*(4-iab)
+             ic(j)=is*(3-2*iab)
+            endif
+           endif
+          elseif(iab.eq.4)then
+           ami=amk**2
+           ic(3-j)=is*int(2.5d0+qgran(b10))
+           ic(j)=-ic(3-j)-2*is
+          endif
+         else
+          ic(3-j)=ic(3-j)-4*is
+          ic0=ic(3-j)-4*is
+          if(iab.lt.3)then
+           ami=am0**2
+           ic(j)=-ic0-ic(j)
+          elseif(iab.eq.4)then
+           ami=amk**2
+           ic(j)=ic0-3*is
+          endif
+         endif
+        endif
+       elseif(iab.eq.4.or.iaj.eq.4)then
+        if(iab.eq.4)then
+         ami=amk**2
+         if(iaj.eq.4)then
+          ic(j)=-is*int(4.5d0+qgran(b10))
+          ic(3-j)=-ic(j)
+         else
+          ic0=ic(3-j)+int(.6667d0+qgran(b10))*(-3*is-2*ic(3-j))
+          ic(j)=ic0-3*is
+          ic(3-j)=ic0-ic(3-j)
+         endif
+        else
+         ami=am0**2
+         ic0=ic(j)+int(.6667d0+qgran(b10))*(3*is-2*ic(j))
+         ic(j)=ic0-ic(j)
+         ic(3-j)=ic0+3*is
+        endif
+       endif
+
+       ptmax=qglam(ww,ami2,ami)
+       if(ptmax.lt.0.)ptmax=0.
+       if(ptmax.lt.bet**2)then
+5       pti=ptmax*qgran(b10)
+        if(qgran(b10).gt.exp(-dsqrt(pti)/bet))goto 5
+       else
+6       pti=(bet*dlog(qgran(b10)*qgran(b10)))**2
+        if(pti.gt.ptmax)goto 6
+       endif
+       amt1=ami+pti
+       amt2=ami2+pti
+       z=qgtwd(ww,amt1,amt2)
+       wp(j)=z*sww
+       wp(3-j)=amt1/wp(j)
+       ep(1)=.5d0*(wp(1)+wp(2))
+       ep(2)=.5d0*(wp(1)-wp(2))
+       pti=dsqrt(pti)
+       call qgcs(c,s)
+       ep(3)=pti*c
+       ep(4)=pti*s
+       ept(1)=sww-ep(1)
+       do i=2,4
+        ept(i)=-ep(i)
+       enddo
+       call qgtran(ep,ey,1)
+       call qgtran(ept,ey,1)
+       if(s0x.ne.0.d0.or.s0.ne.0.d0)then
+        call qgrota(ep,s0x,c0x,s0,c0)
+        call qgrota(ept,s0x,c0x,s0,c0)
+       endif
+       if(ey0(1)*ey0(2)*ey0(3).ne.1.d0)then
+        call qgtran(ep,ey0,1)
+        call qgtran(ept,ey0,1)
+       endif
+
+       call qgreg(ep,ic(j))
+       call qgreg(ept,ic(3-j))
+       if(debug.ge.3)write (moniou,202)
+       return
+      endif
+      goto 1
+
+201   format(2x,'qggene: parton flavors at the ends of the string:'
+     *,2x,a2,2x,a2/4x,'light cone momenta of the string: ',e10.3
+     *,2x,e10.3/4x,'ey0=',3e10.3/4x,'s0x=',e10.3,2x,'c0x=',e10.3
+     *,2x,'s0=',e10.3,2x,'c0=',e10.3)
+202   format(2x,'qggene - end')
+203   format(2x,'qggene: current parton flavor at the end '
+     *,i1,' of the string: ',a2/4x,' string mass: ',e10.3)
+      end
+
+c=============================================================================
+      subroutine qgxjet
+c-----------------------------------------------------------------------------
+c procedure for jet hadronization
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(njmax=50000)
+      dimension ep(4),ept(4),ept1(4),ey(3)
+     *,epj(4,2,2*njmax),ipj(2,2*njmax)
+      common /qgarr8/  wwm,be(4),dc(5),deta,almpt,ptdif,ptndi
+      common /qgarr10/ am(7),ammu
+      common /qgarr11/ b10
+      common /qgarr36/ epjet(4,njmax),ipjet(njmax),njtot
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      external qgran
+
+      if(debug.ge.2)write (moniou,201)njtot
+201   format(2x,'qgxjet: total number of jets njtot=',i4)
+
+      nj0=1
+      njet0=0
+      nrej=0
+
+1     njet=njet0
+      do i=1,4
+       ept(i)=epjet(i,nj0)
+       epj(i,1,njet+1)=ept(i)
+      enddo
+      iq1=ipjet(nj0)
+      ipj(1,njet+1)=iq1
+
+      if(iabs(iq1).le.2)then
+       am1=am(1)
+       if(iq1.gt.0)then
+        jq=1
+       else
+        jq=2
+       endif
+      elseif(iabs(iq1).eq.4)then
+       am1=am(3)
+       if(iq1.gt.0)then
+        jq=1
+       else
+        jq=2
+       endif
+      else
+       am1=am(2)
+       if(iq1.gt.0)then
+        jq=2
+       else
+        jq=1
+       endif
+      endif
+
+      ij=nj0
+2     ij=ij+1
+      njet=njet+1
+      iq2=ipjet(ij)
+
+      if(iq2.eq.0)then
+       aks=qgran(b10)
+       do i=1,4
+        epi=epjet(i,ij)*aks
+        epj(i,2,njet)=epi
+        ept(i)=ept(i)+epi
+       enddo
+       if(qgran(b10).lt.dc(2))then
+        ipj(2,njet)=4*(2*jq-3)
+        amj=am(3)
+       else
+        ipj(2,njet)=int(1.5d0+qgran(b10))*(2*jq-3)
+        amj=am(1)
+       endif
+
+       if(qgnrm(ept).gt.(am1+amj)**2)then
+        if(debug.ge.3)write (moniou,211)njet,ipj(1,njet),ipj(2,njet)
+     *  ,qgnrm(ept),ept
+
+        ipj(1,njet+1)=-ipj(2,njet)
+        do i=1,4
+         ept(i)=epjet(i,ij)-epj(i,2,njet)
+         epj(i,1,njet+1)=ept(i)
+        enddo
+        am1=amj
+        goto 2
+       elseif(nrej.lt.100000)then
+        nrej=nrej+1
+        goto 1
+       else
+3       continue
+        do i=1,4
+         ept(i)=epjet(i,ij)+epjet(i,ij-1)+epjet(i,ij+1)
+         ep(i)=epjet(i,ij-1)
+         ept1(i)=ept(i)
+        enddo
+        ww=qgnrm(ept1)
+        if(ww.le.0.)then
+         if(ij.gt.nj0+1)then
+          ij=ij-1
+          goto 3
+         else
+          ij=ij+1
+          goto 3
+         endif
+        endif
+        ipjet(ij)=ipjet(ij+1)
+        sww=sqrt(ww)
+        call qgdeft(ww,ept1,ey)
+        call qgtran(ep,ey,-1)
+        call qgdefr(ep,s0x,c0x,s0,c0)
+        ep(1)=.5d0*sww
+        ep(2)=.5d0*sww
+        ep(3)=0.d0
+        ep(4)=0.d0
+        call qgrota(ep,s0x,c0x,s0,c0)
+        call qgtran(ep,ey,1)
+        do i=1,4
+         epjet(i,ij-1)=ep(i)
+         epjet(i,ij)=ept(i)-ep(i)
+        enddo
+
+        if(njtot.gt.ij+1)then
+         do j=ij+1,njtot-1
+          ipjet(j)=ipjet(j+1)
+         do i=1,4
+          epjet(i,j)=epjet(i,j+1)
+         enddo
+         enddo
+        endif
+        nrej=0
+        njtot=njtot-1
+        goto 1
+       endif
+
+      else
+       ipj(2,njet)=iq2
+       do i=1,4
+        epi=epjet(i,ij)
+        epj(i,2,njet)=epi
+        ept(i)=ept(i)+epi
+       enddo
+
+       if(iabs(iq2).le.2)then
+        am2=am(1)
+       elseif(iabs(iq2).eq.4)then
+        am2=am(3)
+       else
+        am2=am(2)
+       endif
+
+       if(qgnrm(ept).gt.(am1+am2)**2)then
+        if(debug.ge.3)write (moniou,211)njet,ipj(1,njet),ipj(2,njet)
+     *  ,qgnrm(ept),ept
+
+        nj0=ij+1
+        njet0=njet
+        nrej=0
+        if(ij.lt.njtot)then
+         goto 1
+        else
+         goto 5
+        endif
+       elseif(nrej.lt.100000)then
+        nrej=nrej+1
+        goto 1
+       else
+4       continue
+        do i=1,4
+         ept(i)=epjet(i,ij)+epjet(i,ij-1)+epjet(i,ij-2)
+         ep(i)=epjet(i,ij-2)
+         ept1(i)=ept(i)
+        enddo
+        ww=qgnrm(ept1)
+        if(ww.lt.0.d0)then
+         ij=ij-1
+         goto 4
+        endif
+        ipjet(ij-1)=ipjet(ij)
+        sww=sqrt(ww)
+        call qgdeft(ww,ept1,ey)
+        call qgtran(ep,ey,-1)
+        call qgdefr(ep,s0x,c0x,s0,c0)
+        ep(1)=.5d0*sww
+        ep(2)=.5d0*sww
+        ep(3)=0.d0
+        ep(4)=0.d0
+        call qgrota(ep,s0x,c0x,s0,c0)
+        call qgtran(ep,ey,1)
+        do i=1,4
+         epjet(i,ij-2)=ep(i)
+         epjet(i,ij-1)=ept(i)-ep(i)
+        enddo
+
+        if(ij.lt.njtot)then
+         do j=ij,njtot-1
+          ipjet(j)=ipjet(j+1)
+         do i=1,4
+          epjet(i,j)=epjet(i,j+1)
+         enddo
+         enddo
+        endif
+
+        nrej=0
+        njtot=njtot-1
+        goto 1
+       endif
+      endif
+
+5     continue
+      do ij=1,njet
+       do i=1,4
+        ep(i)=epj(i,1,ij)
+        ept(i)=ep(i)+epj(i,2,ij)
+       enddo
+c invariant mass squared for the jet
+       ww=qgnrm(ept)
+
+       if(debug.ge.3)write (moniou,208)
+     * ij,njet,ww,ipj(1,ij),ipj(2,ij)
+
+       sww=dsqrt(ww)
+       call qgdeft(ww,ept,ey)
+       call qgtran(ep,ey,-1)
+       call qgdefr(ep,s0x,c0x,s0,c0)
+       call qggene(sww,sww,ey,s0x,c0x,s0,c0,ipj(1,ij),ipj(2,ij))
+      enddo
+
+      if(debug.ge.3)write (moniou,202)
+202   format(2x,'qgxjet - end')
+208   format(2x,'qgxjet: ij=',i2,2x,'njet=',i3,2x,'ww=',e10.3
+     *,2x,'ic=',2i3)
+211   format(2x,'qgxjet: njet=',i3,2x,'ic=',2i2,2x,'mass=',e10.3
+     *,2x,'ep=',4e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgrot(b,s)
+c-----------------------------------------------------------------------------
+c convolution of nuclear profile functions (axial angle integration)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /arr8/  x2(4),a2
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)b,s
+
+      qgrot=0.d0
+      do i=1,4
+       sb1=b**2+s**2-2.*b*s*(2.*x2(i)-1.)
+       sb2=b**2+s**2-2.*b*s*(1.-2.*x2(i))
+       qgrot=qgrot+(qgt(sb1)+qgt(sb2))
+      enddo
+      qgrot=qgrot*a2
+
+      if(debug.ge.2)write (moniou,202)qgrot
+201   format(2x,'qgrot - axial angle integration of the ',
+     *'nuclear profile function'/4x,
+     *'impact parameter b=',e10.3,2x,'nucleon coordinate s=',e10.3)
+202   format(2x,'qgrot=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgstr(wpi0,wmi0,wp0,wm0,ic10,ic120,ic210,ic20,jp,jt)
+c-----------------------------------------------------------------------------
+c fragmentation process for the pomeron ( quarks and antiquarks types at the
+c ends of the two strings are determined, energy-momentum is shared
+c between them and strings fragmentation is simulated )
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ey(3)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr8/  wwm,be(4),dc(5),deta,almpt,ptdif,ptndi
+      common /qgarr10/ am(7),ammu
+      common /qgarr11/ b10
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)wpi0,wmi0,wp0,wm0
+
+      do i=1,3
+       ey(i)=1.d0
+      enddo
+      wpi=wpi0
+      wmi=wmi0
+c quark-antiquark types (1 - u, 2 - d, -1 - u~, -2 - d~); s- and d- quarks are
+c taken into consideration at the fragmentation step
+      if(ic10.eq.0)then
+       if(qgran(b10).lt.dc(2))then
+        ic1=4
+        ic12=-4
+       else
+        ic1=int(1.5+qgran(b10))
+        ic12=-ic1
+       endif
+      elseif(ic10.gt.0)then
+       ic1=ic10
+       ic12=ic120
+      else
+       ic1=ic120
+       ic12=ic10
+      endif
+
+      if(ic20.eq.0)then
+       if(qgran(b10).lt.dc(2))then
+        ic2=4
+        ic21=-4
+       else
+        ic2=int(1.5+qgran(b10))
+        ic21=-ic2
+       endif
+      elseif(ic20.gt.0)then
+       ic2=ic20
+       ic21=ic210
+      else
+       ic2=ic210
+       ic21=ic20
+      endif
+
+c longitudinal momenta for the strings
+      if(jp.eq.0)then
+       wp1=wpi*cos(pi*qgran(b10))**2
+      else
+1      xp=.5d0*qgran(b10)**2
+       if(qgran(b10).gt.(2.d0*(1.d0-xp))**(-.5d0))goto 1
+       wp1=wpi*xp
+       if(qgran(b10).lt..5d0)wp1=wpi-wp1
+      endif
+      if(jt.eq.0)then
+       wm1=wmi*cos(pi*qgran(b10))**2
+      else
+2      xm=.5d0*qgran(b10)**2
+       if(qgran(b10).gt.(2.d0*(1.d0-xm))**(-.5d0))goto 2
+       wm1=wmi*xm
+       if(qgran(b10).lt..5d0)wm1=wmi-wm1
+      endif
+      wpi=wpi-wp1
+      wmi=wmi-wm1
+c string masses
+      sm1=wp1*wm1
+      sm2=wpi*wmi
+
+c mass thresholds
+      if(iabs(ic1).le.2)then
+       am1=am(1)
+      elseif(iabs(ic1).eq.3)then
+       am1=am(2)
+      elseif(iabs(ic1).eq.4)then
+       am1=am(3)
+      else
+       am1=0.d0
+       stop 'should not happen in qgstr 1 !'
+      endif
+      if(iabs(ic2).le.2)then
+       am2=am(1)
+      elseif(iabs(ic2).eq.3)then
+       am2=am(2)
+      elseif(iabs(ic2).eq.4)then
+       am2=am(3)
+      else
+       am2=0.d0
+       stop 'should not happen in qgstr 2 !'
+      endif
+      if(iabs(ic12).le.2)then
+       am12=am(1)
+      elseif(iabs(ic12).eq.3)then
+       am12=am(2)
+      elseif(iabs(ic12).eq.4)then
+       am12=am(3)
+      else
+       am12=0.d0
+       stop 'should not happen in qgstr 3 !'
+      endif
+      if(iabs(ic21).le.2)then
+       am21=am(1)
+      elseif(iabs(ic21).eq.3)then
+       am21=am(2)
+      elseif(iabs(ic21).eq.4)then
+       am21=am(3)
+      else
+       am21=0.d0
+       stop 'should not happen in qgstr 4 !'
+      endif
+
+c too short strings are neglected (energy is given to partner string
+c or to the hadron (nucleon) to which the pomeron is connected)
+      if(sm1.gt.am1+am21.and.sm2.gt.am2+am12)then
+c strings fragmentation is simulated - gener
+       call qggene(wp1,wm1,ey,0.d0,1.d0,0.d0,1.d0,ic1,ic21)
+       call qggene(wpi,wmi,ey,0.d0,1.d0,0.d0,1.d0,ic12,ic2)
+      elseif((wpi+wp1)*(wmi+wm1).gt.am1+am21)then
+       call qggene(wp1+wpi,wm1+wmi,ey,0.d0,1.d0,0.d0,1.d0,ic1,ic21)
+      elseif((wpi+wp1)*(wmi+wm1).gt.am2+am12)then
+       call qggene(wp1+wpi,wm1+wmi,ey,0.d0,1.d0,0.d0,1.d0,ic12,ic2)
+      else
+       wp0=wp0+wp1+wpi
+       wm0=wm0+wm1+wmi
+      endif
+
+      if(debug.ge.3)write (moniou,202)wp0,wm0
+201   format(2x,'qgstr: wpi0=',e10.3,2x,'wmi0=',e10.3
+     *,2x,'wp0=',e10.3,2x,'wm0=',e10.3)
+202   format(2x,'qgstr - returned light cone momenta:'
+     *,2x,'wp0=',e10.3,2x,'wm0=',e10.3)
+      return
+      end
+
+c===========================================================================
+      double precision function qgt(b)
+c---------------------------------------------------------------------------
+c nuclear profile function value at impact parameter squared b
+c---------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr6/  pi,bm,amws
+      common /arr3/   x1(7),a1(7)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+
+      if(debug.ge.2)write (moniou,201)b
+
+      qgt=0.
+      zm=rnuc(2)**2-b
+      if(zm.gt.4.*b)then
+       zm=dsqrt(zm)
+      else
+       zm=2.*dsqrt(b)
+      endif
+
+      do i=1,7
+      do m=1,2
+       z1=zm*(.5d0+x1(i)*(m-1.5d0))
+       r=dsqrt(b+z1**2)
+       quq=(r-rnuc(2))/wsnuc(2)
+       if (quq.lt.85.)qgt=qgt+a1(i)/(1.+exp(quq))
+     * *(1.d0+wbnuc(2)*(r/rnuc(2))**2)
+      enddo
+      enddo
+      qgt=qgt*zm*0.5d0
+
+      dt=0.
+      do i=1,7
+      do m=1,2
+       z1=zm-wsnuc(2)*log(.5d0+x1(i)*(m-1.5d0))
+       r=dsqrt(b+z1**2)
+       quq=(r-rnuc(2)-z1+zm)/wsnuc(2)
+       if (quq.lt.85.)dt=dt+a1(i)/(exp((zm-z1)/wsnuc(2))+exp(quq))
+     * *(1.d0+wbnuc(2)*(r/rnuc(2))**2)
+      enddo
+      enddo
+      qgt=qgt+dt*wsnuc(2)/2.d0
+
+      if(debug.ge.3)write (moniou,202)qgt
+201   format(2x,'qgt - nuclear profile function value at impact'
+     *,' parameter squared b=',e10.3)
+202   format(2x,'qgt=',e10.3)
+      return
+      end
+
+c=============================================================================
+      block data qgdata
+c-----------------------------------------------------------------------------
+c constants for numerical integration (gaussian weights)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /arr1/ trnuc(56),twsnuc(56),twbnuc(56)
+      common /arr3/ x1(7),a1(7)
+      common /arr4/ x4(2),a4(2)
+      common /arr5/ x5(2),a5(2)
+      common /arr8/ x2(4),a2
+      common /arr9/ x9(3),a9(3)
+      data x1/.9862838d0,.9284349d0,.8272013d0,.6872929d0,.5152486d0,
+     *.3191124d0,.1080549d0/
+      data a1/.03511946d0,.08015809d0,.1215186d0,.1572032d0,
+     *.1855384d0,.2051985d0,.2152639d0/
+      data x2/.00960736d0,.0842652d0,.222215d0,.402455d0/
+      data a2/.392699d0/
+      data x4/ 0.339981,0.861136/
+      data a4/ 0.652145,0.347855/
+      data x5/.585786d0,3.41421d0/
+      data a5/.853553d0,.146447d0/
+      data x9/.93247d0,.661209d0,.238619d0/
+      data a9/.171324d0,.360762d0,.467914d0/
+      data trnuc/0.69d0,1.71d0,1.53d0,1.37d0,1.37d0,2.09d0,1.95d0
+     *,1.95d0,2.06d0,1.76d0,1.67d0,1.74d0,1.66d0,2.57d0,2.334d0
+     *,2.608d0,2.201d0,2.331d0,2.58d0,2.791d0,2.791d0,2.782d0,2.74d0
+     *,3.192d0,3.22d0,3.05d0,3.07d0,3.34d0,3.338d0,3.252d0
+     *,3.369d0,3.244d0,3.244d0,3.313d0,3.476d0,3.54d0,3.554d0
+     *,3.554d0,3.743d0,3.73d0,3.744d0,3.759d0,3.774d0,3.788d0
+     *,3.802d0,3.815d0,3.829d0,3.843d0,3.855d0,3.941d0
+     *,3.94d0,3.984d0,4.d0,4.074d0,3.89d0,4.111d0/
+      data twsnuc/0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0
+     *,0.55d0,0.55d0,0.56d0,0.56d0,0.5052d0,0.498d0,0.513d0
+     *,0.55d0,0.55d0,0.567d0,0.698d0,0.698d0,0.549d0,0.55d0
+     *,0.604d0,0.58d0,0.523d0,0.519d0,0.58d0,0.547d0,0.553d0
+     *,0.582d0,0.55d0,0.55d0,0.7d0,0.599d0,0.507d0,0.588d0
+     *,0.588d0,0.585d0,0.62d0,0.55d0,0.55d0,0.55d0,0.55d0
+     *,0.55d0,0.55d0,0.55d0,0.588d0,0.588d0
+     *,0.566d0,0.505d0,0.542d0,0.557d0,0.536d0,0.567d0,0.558d0/
+      data twbnuc/0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0
+     *,0.d0,0.d0,0.d0,0.d0,-0.18d0,0.139d0,-0.051d0,0.d0,0.d0
+     *,0.d0,-0.168d0,0.d0,0.d0,0.d0,-0.249d0,-0.236d0,0.d0,0.d0
+     *,0.233d0,-0.203d0,-0.078d0,-0.173d0,0.d0,0.d0,0.d0,-0.1d0
+     *,0.d0,-0.13d0,-0.13d0,-0.201d0,-0.19d0,0.d0,0.d0,0.d0,0.d0
+     *,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0,0.d0
+     *,0.d0,0.d0/
+      end
+
+c-----------------------------------------------------------------------
+      real function qggamfun(x)
+c-----------------------------------------------------------------------
+c     gamma fctn
+c-----------------------------------------------------------------------
+      dimension c(13)
+      data c
+     1/ 0.00053 96989 58808, 0.00261 93072 82746, 0.02044 96308 23590,
+     2  0.07309 48364 14370, 0.27964 36915 78538, 0.55338 76923 85769,
+     3  0.99999 99999 99998,-0.00083 27247 08684, 0.00469 86580 79622,
+     4  0.02252 38347 47260,-0.17044 79328 74746,-0.05681 03350 86194,
+     5  1.13060 33572 86556/
+      qggamfun=0
+      z=x
+      if(x .gt. 0.0) goto1
+      if(x .eq. aint(x)) goto5
+      z=1.0-z
+    1 f=1.0/z
+      if(z .le. 1.0) goto4
+      f=1.0
+    2 continue
+      if(z .lt. 2.0) goto3
+      z=z-1.0
+      f=f*z
+      goto2
+    3 z=z-1.0
+    4 qggamfun=
+     1 f*((((((c(1)*z+c(2))*z+c(3))*z+c(4))*z+c(5))*z+c(6))*z+c(7))/
+     2   ((((((c(8)*z+c(9))*z+c(10))*z+c(11))*z+c(12))*z+c(13))*z+1.0)
+      if(x .gt. 0.0) return
+      qggamfun=3.141592653589793/(sin(3.141592653589793*x)*qggamfun)
+      return
+    5 write(*,10)x
+   10 format(1x,'argument of gamma fctn = ',e20.5)
+      stop
+      end
+
+c-------------------------------------------------------------------------------
+      subroutine qgcrossc(niter,gtot,gprod,gabs,gdd,gqel,gcoh)
+c-------------------------------------------------------------------------------
+c nucleus-nucleus (nucleus-hydrogen) interaction cross sections
+c gtot  - total cross section
+c gprod - production cross section (projectile diffraction included)
+c gabs  - cut pomerons cross section
+c gdd   - projectile diffraction cross section
+c gqel  - quasielastic (projectile nucleon knock-out) cross section
+c gcoh  - coherent (elastic with respect to the projectile) cross section
+c (target diffraction is not treated explicitely and contributes to
+c gdd, gqel, gcoh).
+c-------------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      parameter(iapmax=208)
+      dimension wabs(28),wdd(28),wqel(28),wcoh(28)
+     *,wprod(28),b0(28),ai(28),xa(iapmax,3),xb(iapmax,3)
+      common /qgarr1/  ia(2),icz,icp
+      common /qgarr5/  rnuc(2),wsnuc(2),wbnuc(2),anorm
+     *,cr1(2),cr2(2),cr3(2)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr11/ b10
+      common /qgarr16/ cc(2,3),iddp(iapmax),iddt(iapmax)
+      common /arr3/   x1(7),a1(7)
+      EXTERNAL qgran
+
+      e1=exp(-1.d0)
+
+      do i=1,7
+       b0(15-i)=bm*sqrt((1.d0+x1(i))/2.d0)
+       b0(i)=bm*sqrt((1.d0-x1(i))/2.d0)
+       ai(i)=a1(i)*bm**2*5.d0*pi
+       ai(15-i)=ai(i)
+      enddo
+
+      do i=1,7
+       tp=(1.d0+x1(i))/2.d0
+       tm=(1.d0-x1(i))/2.d0
+       b0(14+i)=bm-log(tp)*max(wsnuc(1),wsnuc(2))
+       b0(29-i)=bm-log(tm)*max(wsnuc(1),wsnuc(2))
+       ai(14+i)=a1(i)*b0(14+i)/tp*10.d0*max(wsnuc(1),wsnuc(2))*pi
+       ai(29-i)=a1(i)*b0(29-i)/tm*10.d0*max(wsnuc(1),wsnuc(2))*pi
+      enddo
+
+      do i=1,28
+       wabs(i)=0.
+       wdd(i)=0.
+       wqel(i)=0.
+       wcoh(i)=0.
+      enddo
+
+      do nc=1,niter
+       do i=1,ia(2)
+        iddt(i)=1+int(qgran(b10)+cc(2,2))
+       enddo
+
+       if(ia(1).eq.1)then
+        xa(1,1)=0.d0
+        xa(1,2)=0.d0
+        xa(1,3)=0.d0
+       else
+        call qggea(ia(1),xa,1)
+       endif
+       if(ia(2).eq.1)then
+        xb(1,1)=0.d0
+        xb(1,2)=0.d0
+        xb(1,3)=0.d0
+       else
+        call qggea(ia(2),xb,2)
+       endif
+
+       do i=1,28
+        call qggcr(b0(i),gabs,gdd,gqel,gcoh,xa,xb,ia(1))
+        wabs(i)=wabs(i)+gabs
+        wdd(i)=wdd(i)+gdd
+        wqel(i)=wqel(i)+gqel
+        wcoh(i)=wcoh(i)+gcoh
+       enddo
+      enddo
+
+      gabs=0.
+      gdd=0.
+      gqel=0.
+      gcoh=0.
+      do i=1,28
+       wabs(i)=wabs(i)/niter
+       wdd(i)=wdd(i)/niter
+       wqel(i)=wqel(i)/niter
+       wcoh(i)=wcoh(i)/niter
+       wprod(i)=wabs(i)+wdd(i)
+       gabs=gabs+ai(i)*wabs(i)
+       gdd=gdd+ai(i)*wdd(i)
+       gqel=gqel+ai(i)*wqel(i)
+       gcoh=gcoh+ai(i)*wcoh(i)
+      enddo
+      gprod=gabs+gdd
+      gtot=gprod+gqel+gcoh
+      return
+      end
+
+c-------------------------------------------------------------------------------
+      subroutine qggcr(b,gabs,gdd,gqel,gcoh,xa,xb,ia)
+c-------------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      parameter(iapmax=208)
+      dimension xa(iapmax,3),xb(iapmax,3),vabs(2)
+
+      gabs=1.
+      gdd=1.
+      gqel=1.
+      gcoh=1.
+      do n=1,ia
+       call qgv(xa(n,1)+b,xa(n,2),xb,vin,vdd,vabs)
+       gabs=gabs*(vdd-vin+1.d0)          !prod_n^A [sum_i c_i exp(-2chi_i(n))]
+       gdd=gdd*(1.-vin)                  !prod_n^A [sum_i c_i exp(-chi_i(n))]^2
+       gqel=gqel*(2.d0*dsqrt(1.d0-vin)-1.d0)
+                                       !prod_n^A [sum_i c_i exp(-chi_i(n)) - 1]
+       gcoh=gcoh*dsqrt(1.d0-vin)
+      enddo
+      gcoh=1.-2.*gcoh+gqel
+      gqel=gdd-gqel
+      gdd=gabs-gdd
+      gabs=1.-gabs
+      return
+      end
+
+c-------------------------------------------------------------------------------
+      double precision function qgsect(e0n,icz,iap0,iat0)    !so18032013
+c-------------------------------------------------------------------------------
+c qgsect - hadron-nucleus (hadron-nucleus) particle production cross section
+c e0n - lab. energy per projectile nucleon (hadron),
+c icz - hadron class,
+c iap - projectile mass number (1=<iap<=iapmax),
+c iat - target mass number     (1=<iat<=iapmax)
+c-------------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension wk(3),wa(3),wb(3)
+      common /qgarr47/ gsect(10,5,6)
+      common /qgarr48/ qgsasect(10,6,6)
+      common /qgarr43/ moniou
+      common /qgdebug/    debug
+
+      if(debug.ge.3)write (moniou,201)e0n,icz,iap0,iat0
+      qgsect=0.d0
+
+      iap=iap0                                              !so18032013-beg
+      iat=iat0
+      if(iat.eq.1.and.iap.ne.1)then
+       iap=iat0
+       iat=iap0
+      endif                                                 !so18032013-end
+
+      ye=dlog10(e0n)
+      if(ye.lt.1.d0)ye=1.d0
+      je=int(ye)
+      if(je.gt.8)je=8
+
+      wk(2)=ye-je
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+
+      yb=iat
+      yb=dlog(yb)/1.38629d0+1.d0
+      jb=min(int(yb),2)
+      wb(2)=yb-jb
+      wb(3)=wb(2)*(wb(2)-1.d0)*.5d0
+      wb(1)=1.d0-wb(2)+wb(3)
+      wb(2)=wb(2)-2.d0*wb(3)
+
+      if(iap.eq.1)then
+       if(iat.eq.14)then
+        do i=1,3
+         qgsect=qgsect+gsect(je+i-1,icz,5)*wk(i)
+        enddo
+       elseif(iat.eq.40)then
+        do i=1,3
+         qgsect=qgsect+gsect(je+i-1,icz,6)*wk(i)
+        enddo
+       else
+        do i=1,3
+        do l=1,3
+         qgsect=qgsect+gsect(je+i-1,icz,jb+l-1)*wk(i)*wb(l)
+        enddo
+        enddo
+       endif
+      else
+       ya=iap
+       ya=dlog(ya/2.d0)/.69315d0+1.d0
+       ja=min(int(ya),4)
+       wa(2)=ya-ja
+       wa(3)=wa(2)*(wa(2)-1.d0)*.5d0
+       wa(1)=1.d0-wa(2)+wa(3)
+       wa(2)=wa(2)-2.d0*wa(3)
+       if(iat.eq.14)then
+        do i=1,3
+        do m=1,3
+         qgsect=qgsect+qgsasect(je+i-1,ja+m-1,5)*wk(i)*wa(m)
+        enddo
+        enddo
+       elseif(iat.eq.40)then
+        do i=1,3
+        do m=1,3
+         qgsect=qgsect+qgsasect(je+i-1,ja+m-1,6)*wk(i)*wa(m)
+        enddo
+        enddo
+       else
+        do i=1,3
+        do m=1,3
+        do l=1,3
+         qgsect=qgsect+qgsasect(je+i-1,ja+m-1,jb+l-1)*wk(i)*wa(m)*wb(l)
+        enddo
+        enddo
+        enddo
+       endif
+      endif
+      qgsect=exp(qgsect)
+      if(debug.ge.4)write (moniou,202)
+
+201   format(2x,'qgsect - nucleus-nucleus production cross section'
+     */4x,'lab. energy per nucleon - ',e10.3,2x,'hadron class - ',i2
+     */4x,'proj. mass N - ',i3,2x,'targ. mass N - ',i3)
+202   format(2x,'qgsect=',e10.3)
+      return
+      end
+
+c=============================================================================
+      subroutine qgreg(ep0,ic)
+c-----------------------------------------------------------------------
+c qgreg - registration of produced hadron
+c ep0 - 4-momentum,
+c ic  - hadron type
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      parameter(nptmax=95000)
+      dimension ep(4),ep0(4),ep1(4),ep2(4),ep3(4)
+      common /qgarr4/  ey0(3)
+      common /qgarr10/ am0,amn,amk,amc,amlamc,amlam,ameta,ammu
+      common /qgarr11/ b10
+      common /qgarr12/ nsh
+      common /qgarr14/ esp(4,nptmax),ich(nptmax)
+      common /qgarr21/ dmmin(3),wex(3),dmres(3),wdres(3)
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      external qgran
+
+      if(debug.ge.3)write (moniou,201)ic,ep0,nsh
+      nsh=nsh+1
+
+      nstprev = nsh
+
+      if(nsh.gt.nptmax)stop'increase nptmax!!!'
+      iab=iabs(ic)
+      do i=1,4
+       ep(i)=ep0(i)
+      enddo
+
+c       call qgtran(ep,ey0,1)
+
+      if(iab.eq.7.or.iab.eq.8)then         !delta++(-)
+       call qgdec2(ep,ep1,ep2,dmmin(2)**2,amn**2,am0**2)
+       ich(nsh)=ic-5*ic/iab
+       do i=1,4
+        esp(i,nsh)=ep1(i)
+        ep(i)=ep2(i)
+       enddo
+       nsh=nsh+1
+       ich(nsh)=15*ic/iab-2*ic
+
+ctp      elseif(iab.eq.-10)then                   !rho0 -> pi+ + pi-
+ctp       call qgdec2(ep,ep1,ep2,dmmin(1)**2,am0**2,am0**2)
+ctp       ich(nsh)=2*int(.5d0+qgran(b10))-1
+ctp       do i=1,4
+ctp        esp(i,nsh)=ep1(i)
+ctp        ep(i)=ep2(i)
+ctp       enddo
+ctp       nsh=nsh+1
+ctp       ich(nsh)=-ich(nsh-1)
+
+      elseif(iab.eq.11)then                  !pi* -> rho + pi
+       am2=qgnrm(ep)
+       call qgdec2(ep,ep1,ep2,am2,dmmin(1)**2,am0**2)
+ctp       call qgdec2(ep1,ep3,ep,dmmin(1)**2,am0**2,am0**2)
+       if(qgran(b10).lt..5d0)then  !rho0 + pi+/-
+        ich(nsh)=-10
+        ich(nsh+1)=ic/iab
+ctp        ich(nsh+1)=2*int(.5d0+qgran(b10))-1
+ctp        ich(nsh+2)=-ich(nsh+1)
+        do i=1,4
+          esp(i,nsh)=ep1(i)
+          ep(i)=ep2(i)
+        enddo
+        nsh=nsh+1
+       else      !rho+/- + pi0 -> pi+/- + 2 pi0
+        call qgdec2(ep1,ep3,ep,dmmin(1)**2,am0**2,am0**2)
+        ich(nsh)=0
+        ich(nsh+1)=ic/iab
+        ich(nsh+2)=0
+        do i=1,4
+          esp(i,nsh)=ep2(i)
+          esp(i,nsh+1)=ep3(i)
+        enddo
+        nsh=nsh+2
+       endif
+ctp       do i=1,4
+ctp        esp(i,nsh)=ep2(i)
+ctp        esp(i,nsh+1)=ep3(i)
+ctp       enddo
+ctp       nsh=nsh+2
+
+      elseif(iab.eq.12.or.iab.eq.13)then       !N*
+       am2=qgnrm(ep)
+       if(6.d0*qgran(b10).lt.1.d0)then         !delta + pi
+        call qgdec2(ep,ep1,ep2,am2,dmmin(2)**2,am0**2)
+        call qgdec2(ep1,ep3,ep,dmmin(2)**2,amn**2,am0**2)
+        ich(nsh)=2*ic-25*ic/iab
+        ich(nsh+1)=ic-10*ic/iab
+        ich(nsh+2)=-ich(nsh)
+        do i=1,4
+         esp(i,nsh)=ep2(i)
+         esp(i,nsh+1)=ep3(i)
+        enddo
+        nsh=nsh+2
+       else                                    !N + pi
+        call qgdec2(ep,ep1,ep2,am2,amn**2,am0**2)
+        do i=1,4
+         esp(i,nsh)=ep1(i)
+         ep(i)=ep2(i)
+        enddo
+        if(qgran(b10).lt..4d0)then
+         ich(nsh)=ic-10*ic/iab
+         ich(nsh+1)=0
+        else
+         ich(nsh)=15*ic/iab-ic
+         ich(nsh+1)=25*ic/iab-2*ic
+        endif
+        nsh=nsh+1
+       endif
+
+      elseif(iab.eq.14.or.iab.eq.15)then       !K1
+       am2=qgnrm(ep)
+       if(dsqrt(am2).gt.dmmin(1)+amk)then      !rho + K
+        call qgdec2(ep,ep1,ep2,am2,dmmin(1)**2,amk**2)
+ctp        call qgdec2(ep1,ep3,ep,dmmin(1)**2,am0**2,am0**2)
+        if(3.d0*qgran(b10).lt.1.d0)then  !rho0
+         ich(nsh)=ic-10*ic/iab
+         ich(nsh+1)=-10
+c         ich(nsh+1)=2*int(.5d0+qgran(b10))-1
+c         ich(nsh+2)=-ich(nsh+1)
+         do i=1,4
+           esp(i,nsh)=ep2(i)
+           ep(i)=ep1(i)
+         enddo
+         nsh=nsh+1
+        else                             !rho+/-
+         call qgdec2(ep1,ep3,ep,dmmin(1)**2,am0**2,am0**2)
+         ich(nsh)=19*ic/iab-ic
+         ich(nsh+1)=29*ic/iab-2*ic
+         ich(nsh+2)=0
+         do i=1,4
+          esp(i,nsh)=ep2(i)
+          esp(i,nsh+1)=ep3(i)
+         enddo
+         nsh=nsh+2
+        endif
+       else                                    !K* + pi
+        call qgdec2(ep,ep1,ep2,am2,dmmin(3)**2,am0**2)
+        call qgdec2(ep1,ep3,ep,dmmin(3)**2,amk**2,am0**2)
+        if(3.d0*qgran(b10).lt.1.d0)then
+         ich(nsh)=0
+         if(3.d0*qgran(b10).lt.1.d0)then
+          ich(nsh+1)=ic-10*ic/iab
+          ich(nsh+2)=0
+         else
+          ich(nsh+1)=19*ic/iab-ic
+          ich(nsh+2)=29*ic/iab-2*ic
+         endif
+        else
+         ich(nsh)=29*ic/iab-2*ic
+         if(3.d0*qgran(b10).lt.1.d0)then
+          ich(nsh+1)=19*ic/iab-ic
+          ich(nsh+2)=0
+         else
+          ich(nsh+1)=ic-10*ic/iab
+          ich(nsh+2)=2*ic-29*ic/iab
+         endif
+        endif
+        do i=1,4
+         esp(i,nsh)=ep2(i)
+         esp(i,nsh+1)=ep3(i)
+        enddo
+        nsh=nsh+2
+       endif
+ctp       do i=1,4
+ctp        esp(i,nsh)=ep2(i)
+ctp        esp(i,nsh+1)=ep3(i)
+ctp       enddo
+ctp       nsh=nsh+2
+
+      elseif(iab.eq.5)then                     !K0,K0~
+       ich(nsh)=10*int(.5d0+qgran(b10))-5
+
+c      elseif(iab.eq.6)then                !lambda decay (switch on in CONEX!)
+c       ic2=-ic/iab*int(.64d0+qgran(b10))
+c       ic1=3*ic/iab+ic2
+c       call qgdec2(ep,ep1,ep2,amlam**2,amn**2,am0**2)
+c       do i=1,4
+c        esp(i,nsh)=ep1(i)
+c        ep(i)=ep2(i)
+c       enddo
+c       ich(nsh)=ic1
+c       ich(nsh+1)=ic2
+c       nsh=nsh+1
+
+      else
+       ich(nsh)=ic
+      endif
+
+      do i=1,4
+       esp(i,nsh)=ep(i)
+      enddo
+
+      do n=nstprev,nsh
+        do i=1,4
+          ep(i)=esp(i,n)
+        enddo
+        call qgtran(ep,ey0,1)
+        do i=1,4
+          esp(i,n)=ep(i)
+        enddo
+      enddo
+
+      if(debug.ge.4)write (moniou,202)
+
+201   format(2x,'qgreg: ic=',i2,2x,'c.m. 4-momentum:',2x,4(e10.3,1x)/
+     * 4x,'number of particles in the storage: ',i5)
+202   format(2x,'qgreg - end')
+      return
+      end
+
+c-----------------------------------------------------------------------------
+      subroutine qgdec2(ep,ep1,ep2,ww,a,b)
+c two particle decay
+      implicit double precision (a-h,o-z)
+      integer debug
+      dimension ep(4),ep1(4),ep2(4),ey(3)
+      common /qgarr11/ b10
+      common /qgarr43/ moniou
+      common /qgdebug/  debug
+      EXTERNAL qgran
+
+      if(debug.ge.2)write (moniou,201)ep,ww,a,b
+201   format(2x,'qgdec2: 4-momentum:',2x,4(e10.3,1x)
+     */4x,'ww=',e10.3,2x,'a=',e10.3,2x,'b=',e10.3)
+
+      pl=qglam(ww,a,b)
+      ep1(1)=dsqrt(pl+a)
+      ep2(1)=dsqrt(pl+b)
+      pl=dsqrt(pl)
+      cosz=2.d0*qgran(b10)-1.d0
+      pt=pl*dsqrt(1.d0-cosz**2)
+      ep1(2)=pl*cosz
+      call qgcs(c,s)
+      ep1(3)=pt*c
+      ep1(4)=pt*s
+      do i=2,4
+       ep2(i)=-ep1(i)
+      enddo
+      call qgdeft(ww,ep,ey)
+      call qgtran(ep1,ey,1)
+      call qgtran(ep2,ey,1)
+      if(debug.ge.3)write (moniou,203)
+203   format(2x,'qgdec2 - end')
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qggrv(x,qqs,icq,iq)
+c------------------------------------------------------------------------
+c qggrv - GRV structure functions
+c------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr25/ ahv(3)
+
+      qggrv=0.
+      if(x.gt..99999d0.and.(qqs.ne.qt0.or.iq.ne.1.and.iq.ne.2))return
+
+      if(icq.eq.2)then
+       sq=dlog(dlog(qqs/.232d0**2)/dlog(.23d0/.232d0**2))
+       if(iq.eq.0)then                                 !gluon
+        alg=.524d0
+        betg=1.088d0
+        aag=1.742d0-.93d0*sq
+        bbg=-.399d0*sq**2
+        ag=7.486d0-2.185d0*sq
+        bg=16.69d0-22.74d0*sq+5.779d0*sq*sq
+        cg=-25.59d0+29.71d0*sq-7.296d0*sq*sq
+        dg=2.792d0+2.215d0*sq+.422d0*sq*sq-.104d0*sq*sq*sq
+        eg=.807d0+2.005d0*sq
+        eeg=3.841d0+.361d0*sq
+        qggrv=(1.d0-x)**dg*(x**aag*(ag+bg*x+cg*x**2)*log(1.d0/x)**bbg
+     *  +sq**alg*exp(-eg+sqrt(eeg*sq**betg*log(1.d0/x))))
+       elseif(iq.eq.1.or.iq.eq.2)then                  !u_v or d_v
+        aau=.59d0-.024d0*sq
+        bbu=.131d0+.063d0*sq
+        auu=2.284d0+.802d0*sq+.055d0*sq*sq
+        au=-.449d0-.138d0*sq-.076d0*sq*sq
+        bu=.213d0+2.669d0*sq-.728d0*sq*sq
+        cu=8.854d0-9.135d0*sq+1.979d0*sq*sq
+        du=2.997d0+.753d0*sq-.076d0*sq*sq
+        uv=auu*x**aau*(1.d0+au*x**bbu+bu*x+cu*x**1.5d0)
+        if(qqs.ne.qt0)uv=uv*(1.d0-x)**du
+
+        aad=.376d0
+        bbd=.486d0+.062d0*sq
+        add=.371d0+.083d0*sq+.039d0*sq*sq
+        ad=-.509d0+3.31d0*sq-1.248d0*sq*sq
+        bd=12.41d0-10.52d0*sq+2.267d0*sq*sq
+        ccd=6.373d0-6.208d0*sq+1.418d0*sq*sq
+        dd=3.691d0+.799d0*sq-.071d0*sq*sq
+        dv=add*x**aad*(1.d0+ad*x**bbd+bd*x+ccd*x**1.5d0)
+        if(qqs.ne.qt0)then
+         dv=dv*(1.d0-x)**dd
+        elseif(x.gt..99999d0)then
+         dv=0.d0
+        else
+         dv=dv*(1.d0-x)**(dd-ahv(2))
+        endif
+        if(iq.eq.1)then                              !u_v
+         qggrv=uv
+        elseif(iq.eq.2)then                          !d_v
+         qggrv=dv
+        endif
+
+       elseif(iq.eq.-3)then                           !s_sea
+        als=.914
+        bets=.577
+        aas=1.798-.596*sq
+        as=-5.548+3.669*sqrt(sq)-.616*sq
+        bs=18.92-16.73*sqrt(sq)+5.168*sq
+        ds=6.379-.35*sq+.142*sq*sq
+        es=3.981+1.638*sq
+        ees=6.402
+        qggrv=(1.-x)**ds*sq**als/log(1./x)**aas*(1.+as*sqrt(x)
+     *  +bs*x)*exp(-es+sqrt(ees*sq**bets*log(1./x)))
+       elseif(iabs(iq).lt.3)then                      !u_sea or d_sea
+        aadel=.409-.005*sq
+        bbdel=.799+.071*sq
+        addel=.082+.014*sq+.008*sq*sq
+        adel=-38.07+36.13*sq-.656*sq*sq
+        bdel=90.31-74.15*sq+7.645*sq*sq
+        ccdel=0.
+        ddel=7.486+1.217*sq-.159*sq*sq
+        delv=addel*x**aadel*(1.-x)**ddel
+     *  *(1.+adel*x**bbdel+bdel*x+ccdel*x**1.5)
+
+        alud=1.451
+        betud=.271
+        aaud=.41-.232*sq
+        bbud=.534-.457*sq
+        aud=.89-.14*sq
+        bud=-.981
+        cud=.32+.683*sq
+        dud=4.752+1.164*sq+.286*sq*sq
+        eud=4.119+1.713*sq
+        eeud=.682+2.978*sq
+        udsea=(1.-x)**dud*(x**aaud*(aud+bud*x+cud*x**2)
+     *  *log(1./x)**bbud+sq**alud*exp(-eud+sqrt(eeud*sq**betud
+     *  *log(1./x))))
+
+        if(iq.eq.-1)then                           !u_sea
+         qggrv=(udsea-delv)/2.
+        elseif(iq.eq.-2)then                       !d_sea
+         qggrv=(udsea+delv)/2.
+        endif
+       else
+        qggrv=0.
+       endif
+
+      elseif(icq.eq.1.or.icq.eq.3)then
+       sq=dlog(dlog(qqs/.204d0**2)/dlog(.26d0/.204d0**2))
+       if(iq.eq.1.or.iq.eq.2)then
+        aapi=.517-.02*sq
+        api=-.037-.578*sq
+        bpi=.241+.251*sq
+        dpi=.383+.624*sq
+        anorm=1.212+.498*sq+.009*sq**2
+        qggrv=.5*anorm*x**aapi*(1.+api*sqrt(x)+bpi*x)
+        if(qqs.ne.qt0)qggrv=qggrv*(1.d0-x)**dpi
+       elseif(iq.eq.0)then
+          alfpi=.504
+          betpi=.226
+          aapi=2.251-1.339*sqrt(sq)
+          api=2.668-1.265*sq+.156*sq**2
+          bbpi=0.
+          bpi=-1.839+.386*sq
+          cpi=-1.014+.92*sq-.101*sq**2
+          dpi=-.077+1.466*sq
+          epi=1.245+1.833*sq
+          eppi=.51+3.844*sq
+          qggrv=(1.-x)**dpi*(x**aapi*(api+bpi*sqrt(x)+cpi*x)*
+     *    log(1./x)**bbpi+sq**alfpi*
+     *    exp(-epi+sqrt(eppi*sq**betpi*log(1./x))))
+        elseif(iq.eq.-3)then
+          alfpi=.823
+          betpi=.65
+          aapi=1.036-.709*sq
+          api=-1.245+.713*sq
+          bpi=5.58-1.281*sq
+          dpi=2.746-.191*sq
+          epi=5.101+1.294*sq
+          eppi=4.854-.437*sq
+          qggrv=sq**alfpi/log(1./x)**aapi*(1.-x)**dpi*
+     *    (1.+api*sqrt(x)+bpi*x)*
+     *    exp(-epi+sqrt(eppi*sq**betpi*log(1./x)))
+        elseif(iabs(iq).lt.3)then
+          alfpi=1.147
+          betpi=1.241
+          aapi=.309-.134*sqrt(sq)
+          api=.219-.054*sq
+          bbpi=.893-.264*sqrt(sq)
+          bpi=-.593+.24*sq
+          cpi=1.1-.452*sq
+          dpi=3.526+.491*sq
+          epi=4.521+1.583*sq
+          eppi=3.102
+          qggrv=(1.-x)**dpi*(x**aapi*(api+bpi*sqrt(x)+cpi*x)*
+     *    log(1./x)**bbpi+sq**alfpi*
+     *    exp(-epi+sqrt(eppi*sq**betpi*log(1./x))))
+        else
+          qggrv=0.
+        endif
+      else
+       qggrv=0.
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgev(q1,qj,qq,xx,j,l)
+c------------------------------------------------------------------------
+c qgev - PDF evolution
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr51/ epsxmn
+      common /arr3/   x1(7),a1(7)
+
+      qgev=0.d0
+      zmax=1.d0-epsxmn
+      zmin=xx/zmax
+      if(zmin.ge.zmax)return
+
+      if(qj.eq.qq)then
+       do i1=1,7
+       do m1=1,2
+        qi=q1*(qq/q1)**(.5d0+x1(i1)*(m1-1.5d0))
+
+        fz1=0.d0
+        fz2=0.d0
+        fz3=0.d0
+        zmin1=max(.2d0,zmin)
+        zmax1=min(.2d0,zmax)
+        zmax1=min(5.d0*xx,zmax1)
+        zmax2=min(zmin1,zmax)
+        zmin2=max(zmax1,zmin)
+
+        if(zmax1.gt.zmin)then
+         do i=1,7
+         do m=1,2
+          z=xx+(zmin-xx)*((zmax1-xx)/(zmin-xx))**(.5d0+(m-1.5d0)*x1(i))
+          do k=1,2
+           if(j.ne.3.or.k.ne.1)then
+            fz1=fz1+a1(i)*qgevi(q1,qi,xx/z,j,k)*qgfap(z,k,l)*(1.d0-xx/z)
+           endif
+          enddo
+         enddo
+         enddo
+         fz1=fz1*dlog((zmax1-xx)/(zmin-xx))
+        endif
+        if(zmin1.lt.zmax)then
+         do i=1,7
+         do m=1,2
+          z=1.d0-(1.d0-zmax)*((1.d0-zmin1)/(1.d0-zmax))
+     *    **(.5d0+x1(i)*(m-1.5d0))
+          do k=1,2
+           if(j.ne.3.or.k.ne.1)then
+            fz2=fz2+a1(i)*qgevi(q1,qi,xx/z,j,k)*qgfap(z,k,l)
+     *      *(1.d0/z-1.d0)
+           endif
+          enddo
+         enddo
+         enddo
+         fz2=fz2*dlog((1.d0-zmin1)/(1.d0-zmax))
+        endif
+        if(zmax2.gt.zmin2)then
+         do i=1,7
+         do m=1,2
+          z=zmin2*(zmax2/zmin2)**(.5d0+x1(i)*(m-1.5d0))
+          do k=1,2
+           if(j.ne.3.or.k.ne.1)then
+            fz3=fz3+a1(i)*qgevi(q1,qi,xx/z,j,k)*qgfap(z,k,l)
+           endif
+          enddo
+         enddo
+         enddo
+         fz3=fz3*dlog(zmax2/zmin2)
+        endif
+        qgev=qgev+a1(i1)*(fz1+fz2+fz3)/qgsudx(qi,l)*qgalf(qi/alm)
+       enddo
+       enddo
+       qgev=qgev*dlog(qq/q1)/4.d0*qgsudx(qq,l)
+
+      else
+       fz1=0.d0
+       fz2=0.d0
+       fz3=0.d0
+       zmin1=max(.2d0,zmin)
+       zmax1=min(.2d0,zmax)
+       zmax1=min(5.d0*xx,zmax1)
+       zmax2=min(zmin1,zmax)
+       zmin2=max(zmax1,zmin)
+
+       if(zmax1.gt.zmin)then
+        do i=1,7
+        do m=1,2
+         z=xx+(zmin-xx)*((zmax1-xx)/(zmin-xx))**(.5d0+(m-1.5d0)*x1(i))
+         do k=1,2
+          if(j.ne.3)then
+           fz1=fz1+a1(i)*qgevi(q1,qj,xx/z,j,k)*qgevi(qj,qq,z,k,l)
+     *     *(1.d0-xx/z)
+          elseif(k.ne.1)then
+           fz1=fz1+a1(i)*qgevi(q1,qj,xx/z,3,2)*qgevi(qj,qq,z,3,2)
+     *     *(1.d0-xx/z)
+          endif
+         enddo
+        enddo
+        enddo
+        fz1=fz1*dlog((zmax1-xx)/(zmin-xx))
+       endif
+       if(zmin1.lt.zmax)then
+        do i=1,7
+        do m=1,2
+         z=1.d0-(1.d0-zmax)*((1.d0-zmin1)/(1.d0-zmax))
+     *   **(.5d0+x1(i)*(m-1.5d0))
+         do k=1,2
+          if(j.ne.3)then
+           fz2=fz2+a1(i)*qgevi(q1,qj,xx/z,j,k)*qgevi(qj,qq,z,k,l)
+     *     *(1.d0/z-1.d0)
+          elseif(k.ne.1)then
+           fz2=fz2+a1(i)*qgevi(q1,qj,xx/z,3,2)*qgevi(qj,qq,z,3,2)
+     *     *(1.d0/z-1.d0)
+          endif
+         enddo
+        enddo
+        enddo
+        fz2=fz2*dlog((1.d0-zmin1)/(1.d0-zmax))
+       endif
+       if(zmax2.gt.zmin2)then
+        do i=1,7
+        do m=1,2
+         z=zmin2*(zmax2/zmin2)**(.5d0+x1(i)*(m-1.5d0))
+         do k=1,2
+          if(j.ne.3)then
+           fz2=fz2+a1(i)*qgevi(q1,qj,xx/z,j,k)*qgevi(qj,qq,z,k,l)
+          elseif(k.ne.1)then
+           fz2=fz2+a1(i)*qgevi(q1,qj,xx/z,3,2)*qgevi(qj,qq,z,3,2)
+          endif
+         enddo
+        enddo
+        enddo
+        fz3=fz3*dlog(zmax2/zmin2)
+       endif
+       qgev=(fz1+fz2+fz3)/2.d0
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgevi(q1,qq,xx,m,l)
+c------------------------------------------------------------------------
+c qgevi - PDF evolution - interpolation
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      dimension wi(3),wj(3),wk(3)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr20/ spmax
+      common /qgarr51/ epsxmn
+      common /qgarr52/ evk(40,40,100,3,2)
+
+      qgevi=0.d0
+      if(q1.ge..9999d0*spmax)goto 1
+
+      if(xx.le..1d0)then
+       yx=37.d0-dlog(.1d0/xx)/dlog(.1d0*spmax)*36.d0
+       k=max(1,int(yx))
+       k=min(k,35)
+      elseif(xx.le..9d0)then
+       yx=(xx-.1d0)*40.d0+37.d0
+       k=max(37,int(yx))
+       k=min(k,67)
+      else
+       yx=dlog(10.d0*(1.d0-xx))/log(10.d0*epsxmn)*31.d0+69.d0
+       k=max(69,int(yx))
+       k=min(k,98)
+      endif
+      wk(2)=yx-k
+      wk(3)=wk(2)*(wk(2)-1.d0)*.5d0
+      wk(1)=1.d0-wk(2)+wk(3)
+      wk(2)=wk(2)-2.d0*wk(3)
+
+      qli=log(q1)/dlog(spmax)*39.d0+1.d0
+      qlj=log(qq/q1)/dlog(spmax/q1)*39.d0+1.d0
+      i=max(1,int(1.0001d0*qli))
+      i=min(i,38)
+      wi(2)=qli-i
+      wi(3)=wi(2)*(wi(2)-1.d0)*.5d0
+      wi(1)=1.d0-wi(2)+wi(3)
+      wi(2)=wi(2)-2.d0*wi(3)
+
+      j=max(1,int(1.0001d0*qlj))
+      j=min(j,38)
+      wj(2)=qlj-j
+      wj(3)=wj(2)*(wj(2)-1.d0)*.5d0
+      wj(1)=1.d0-wj(2)+wj(3)
+      wj(2)=wj(2)-2.d0*wj(3)
+
+      do i1=1,3
+      do j1=1,3
+      do k1=1,3
+       k2=k+k1-1
+       qgevi=qgevi+evk(i+i1-1,j+j1-1,k2,m,l)*wi(i1)*wj(j1)*wk(k1)
+      enddo
+      enddo
+      enddo
+1     qgevi=exp(qgevi)*qgfap(xx,m,l)
+      if(m.eq.1.and.l.eq.1.or.m.ne.1.and.l.ne.1)then
+       qgevi=qgevi/4.5d0/qgsudx(q1,m)*qgsudx(qq,m)
+     * *dlog(dlog(qq/alm)/dlog(q1/alm))
+      else
+       qgevi=qgevi*.3d0/(dlog(epsxmn)+.75d0)
+     * *(qgsudx(qq,1)/qgsudx(q1,1)-qgsudx(qq,2)/qgsudx(q1,2))
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgpdf(xx,qq,icz,jj)
+c-----------------------------------------------------------------------
+c qgpdf - parton distribution function for proton
+c qq  - virtuality scale,
+c xx  - light cone x,
+c icz - hadron type,
+c jj  - parton type (0 - gluon, 1 - u_v, 2 - d_v, -1 - q_sea)
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr25/ ahv(3)
+      common /qgarr51/ epsxmn
+      common /arr3/   x1(7),a1(7)
+
+      if(jj.eq.0)then
+       qgpdf=qggpdf(xx,icz)
+      elseif(jj.eq.1.or.jj.eq.2)then
+       qgpdf=qggrv(xx,qt0,icz,jj)*(1.d0-xx)**ahv(icz)
+      else
+       qgpdf=qgspdf(xx,icz)
+      endif
+      qgpdf=qgpdf*qgsudx(qq,iabs(jj)+1)/qgsudx(qt0,iabs(jj)+1)
+
+      xmin=xx/(1.d0-epsxmn)
+      if(xmin.lt.1.d0.and.qq.gt.qt0)then
+       dpd1=0.d0
+       dpd2=0.d0
+       xm=max(xmin,.3d0)
+       do i=1,7         !numerical integration over zx
+       do m=1,2
+        zx=1.d0-(1.d0-xm)*(.5d0+(m-1.5d0)*x1(i))**.25d0
+        z=xx/zx
+
+        gl=qggpdf(zx,icz)
+        uv=qggrv(zx,qt0,icz,1)*(1.d0-zx)**ahv(icz)
+        dv=qggrv(zx,qt0,icz,2)*(1.d0-zx)**ahv(icz)
+        sea=qgspdf(zx,icz)
+        if(jj.eq.0)then
+         fz=qgevi(qt0,qq,z,1,1)*gl+qgevi(qt0,qq,z,2,1)*(uv+dv+sea)
+        elseif(jj.eq.1)then
+         fz=qgevi(qt0,qq,z,3,2)*uv
+        elseif(jj.eq.2)then
+         fz=qgevi(qt0,qq,z,3,2)*dv
+        else
+         akns=qgevi(qt0,qq,z,3,2)              !nonsinglet contribution
+         aks=(qgevi(qt0,qq,z,2,2)-akns)        !singlet contribution
+         fz=(qgevi(qt0,qq,z,1,2)*gl+aks*(uv+dv+sea)+akns*sea)
+        endif
+        dpd1=dpd1+a1(i)*fz/zx**2/(1.d0-zx)**3
+       enddo
+       enddo
+       dpd1=dpd1*(1.d0-xm)**4/8.d0*xx
+
+       if(xm.gt.xmin)then
+        do i=1,7         !numerical integration
+        do m=1,2
+         zx=xx+(xm-xx)*((xmin-xx)/(xm-xx))**(.5d0-(m-1.5d0)*x1(i))
+         z=xx/zx
+
+         gl=qggpdf(zx,icz)
+         uv=qggrv(zx,qt0,icz,1)*(1.d0-zx)**ahv(icz)
+         dv=qggrv(zx,qt0,icz,2)*(1.d0-zx)**ahv(icz)
+         sea=qgspdf(zx,icz)
+         if(jj.eq.0)then
+          fz=qgevi(qt0,qq,z,1,1)*gl+qgevi(qt0,qq,z,2,1)*(uv+dv+sea)
+         elseif(jj.eq.1)then
+          fz=qgevi(qt0,qq,z,3,2)*uv
+         elseif(jj.eq.2)then
+          fz=qgevi(qt0,qq,z,3,2)*dv
+         else
+          akns=qgevi(qt0,qq,z,3,2)              !nonsinglet contribution
+          aks=(qgevi(qt0,qq,z,2,2)-akns)        !singlet contribution
+          fz=(qgevi(qt0,qq,z,1,2)*gl+aks*(uv+dv+sea)+akns*sea)
+         endif
+         dpd2=dpd2+a1(i)*fz*(1.d0-xx/zx)/zx
+        enddo
+        enddo
+        dpd2=dpd2*dlog((xm-xx)/(xmin-xx))*.5d0*xx
+       endif
+       qgpdf=qgpdf+dpd2+dpd1
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgpdfd(xx,xpomr,qq,icz)
+c-----------------------------------------------------------------------
+c qgpdfd - diffractive sf f2_d^(3)
+c qq    - virtuality scale,
+c xx    - parton light cone x,
+c xpomr - pomeron lc x,
+c icz   - hadron type
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /qgarr6/  pi,bm,amws
+      common /qgarr15/ fp(3),rq(2,3),cd(2,3),gsoft(3)
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr25/ ahv(3)
+      common /qgarr51/ epsxmn
+      common /arr3/   x1(7),a1(7)
+
+      qgpdfd=(qgdpdf(xx,xpomr,icz,1)+qgdpdf(xx,xpomr,icz,2))
+     **qgsudx(qq,2)/qgsudx(qt0,2)
+      xmin=xx/(1.d0-epsxmn)
+      if(xmin.lt.xpomr.and.qq.gt.qt0)then
+       dpd1=0.d0
+       dpd2=0.d0
+       xm=max(xmin,.3d0)
+       if(xm.lt.xpomr)then
+        do i=1,7         !numerical integration over zx
+        do m=1,2
+         zx=1.d0-(1.d0-xm)*(1.d0-(.5d0+(m-1.5d0)*x1(i))
+     *   *(1.d0-((1.d0-xpomr)/(1.d0-xm))**4))**.25d0
+         z=xx/zx
+
+         glu=(qgdgdf(zx,xpomr,icz,1)+qgdgdf(zx,xpomr,icz,2))/4.5d0
+         sea=qgdpdf(zx,xpomr,icz,1)+qgdpdf(zx,xpomr,icz,2)
+         fz=qgevi(qt0,qq,z,1,2)*glu+qgevi(qt0,qq,z,2,2)*sea
+         dpd1=dpd1+a1(i)*fz/zx**2/(1.d0-zx)**3
+        enddo
+        enddo
+        dpd1=dpd1*((1.d0-xm)**4-(1.d0-xpomr)**4)/8.d0*xx
+       endif
+
+       xm=min(xm,xpomr)
+       if(xm.gt.xmin)then
+        do i=1,7         !numerical integration
+        do m=1,2
+         zx=xx+(xm-xx)*((xmin-xx)/(xm-xx))**(.5d0-(m-1.5d0)*x1(i))
+         z=xx/zx
+
+         glu=(qgdgdf(zx,xpomr,icz,1)+qgdgdf(zx,xpomr,icz,2))/4.5d0
+         sea=qgdpdf(zx,xpomr,icz,1)+qgdpdf(zx,xpomr,icz,2)
+         fz=qgevi(qt0,qq,z,1,2)*glu+qgevi(qt0,qq,z,2,2)*sea
+         dpd2=dpd2+a1(i)*fz*(1.d0-xx/zx)/zx
+        enddo
+        enddo
+        dpd2=dpd2*dlog((xm-xx)/(xmin-xx))*.5d0*xx
+       endif
+       qgpdfd=qgpdfd+dpd2+dpd1
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgf2c(xx,qq,icz)
+c-----------------------------------------------------------------------
+c qgf2c - c-quark contribution to f2
+c qq  - virtuality scale,
+c xx  - light cone x,
+c icz - hadron type,
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /arr3/   x1(7),a1(7)
+
+      qgf2c=0.d0
+      qcmass=1.3d0
+      s2min=4.*qcmass**2+qq
+      xmin=s2min*xx/qq
+
+      if(xmin.lt.1.d0)then
+       do i=1,7          !numerical integration over z1
+       do m=1,2
+        z1=xmin**(.5d0+x1(i)*(m-1.5d0))
+        sdc=qgdbor(qq,xx/z1,qcmass**2)
+        glu=qgpdf(z1,s2min-qq,icz,0)
+        qgf2c=qgf2c+a1(i)*sdc*glu
+       enddo
+       enddo
+       qgf2c=-qgf2c*dlog(xmin)*.5d0
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgf2cd(xx,xpomr,qq,icz)
+c-----------------------------------------------------------------------
+c qgf2cd - c-quark contribution to diffractive sf
+c qq  - virtuality scale,
+c xx  - light cone x,
+c icz - hadron type,
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /arr3/   x1(7),a1(7)
+
+      qgf2cd=0.d0
+      qcmass=1.3d0
+      s2min=4.*qcmass**2+qq
+      xmin=s2min*xx/qq
+
+      if(xmin.lt.xpomr)then
+       do i=1,7          !numerical integration over z1
+       do m=1,2
+        z1=xpomr*(xmin/xpomr)**(.5d0+x1(i)*(m-1.5d0))
+        sdc=qgdbor(qq,xx/z1,qcmass**2)
+        glu=qgdgdf(z1,xpomr,icz,1)+qgdgdf(z1,xpomr,icz,2)
+        qgf2cd=qgf2cd+a1(i)*sdc*glu
+       enddo
+       enddo
+       qgf2cd=qgf2cd*dlog(xpomr/xmin)*.5d0
+      endif
+      return
+      end
+
+c------------------------------------------------------------------------
+      double precision function qgdbor(qq,zz,q2mass)
+c-----------------------------------------------------------------------
+c qgdbor - DIS c-quark cross-section
+c qq      - photon virtuality
+c s=2(pq) - s_true + qq,
+c-----------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+
+      qgdbor=0.
+      qtq=4.d0*q2mass*zz/qq/(1.d0-zz)
+      if(qtq.ge.1.d0)return
+      bet=dsqrt(1.d0-qtq)
+
+      qgdbor=qgalf(4.d0*q2mass/alm)/2.25d0*zz
+     **(dlog((1.d0+bet)/(1.d0-bet))*(1.d0-2.d0*zz*(1.d0-zz)
+     *-8.d0*(zz*q2mass/qq)**2+4.d0*zz*(1.d0-3.d0*zz)*q2mass/qq)
+     *+bet*(-1.d0-4.d0*zz*(1.d0-zz)*q2mass/qq+8.d0*zz*(1.d0-zz)))
+      return
+      end
+
+c=============================================================================
+      double precision function qgjeto(qi,qj,s,iq1,iq2)
+c-----------------------------------------------------------------------------
+c qgjeto - hard 2->2 parton scattering born cross-section
+c s is the c.m. energy square for the scattering process,
+c iq1 - parton type at current end of the ladder (0 - g, 1,2 etc. - q)
+c iq2 - parton type at opposite end of the ladder (0 - g, 1,2 etc. - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/    debug
+      common /arr3/     x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)qi,qj,s,iq1,iq2
+
+      qgjeto=0.d0
+      qq=max(qi,qj)
+
+      zmin=qq*fqscal*4.d0/s
+      zmax=1.d0-epsxmn
+      if(zmin.ge.zmax)return
+
+      dpx1=0.d0
+      zmin1=min(.2d0,1.d0-zmin)
+      do i1=1,7
+      do m1=1,2
+       z=1.d0-epsxmn*(zmin1/epsxmn)**(.5d0+x1(i1)*(m1-1.5d0))
+
+       si=z*s
+       fb=qgjeti(qi,qj,si,z,1.d0,iq1,iq2,1)
+       dpx1=dpx1+a1(i1)*fb*(1.d0-z)
+      enddo
+      enddo
+      dpx1=dpx1*dlog(zmin1/epsxmn)
+
+      dpx2=0.d0
+      if(zmin.lt..8d0)then
+       zmin1=zmin**(-delh)
+       zmax1=.8d0**(-delh)
+       do i1=1,7
+       do m1=1,2
+        z=(.5d0*(zmax1+zmin1+(zmax1-zmin1)*x1(i1)*(2*m1-3)))
+     *  **(-1.d0/delh)
+
+        si=z*s
+        fb=qgjeti(qi,qj,si,z,1.d0,iq1,iq2,1)
+        dpx2=dpx2+a1(i1)*fb*z**(1.d0+delh)
+       enddo
+       enddo
+       dpx2=dpx2*(zmin1-zmax1)/delh
+      endif
+      qgjeto=(dpx1+dpx2)/qgsudx(qj,iabs(iq2)+1)*pi**3
+
+      if(debug.ge.3)write (moniou,202)qgjeto
+201   format(2x,'qgjeto: qi=',e10.3,2x,'qj=',e10.3,2x,
+     *'s= ',e10.3,2x,'iq1= ',i1,2x,'iq2= ',i1)
+202   format(2x,'qgjeto=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgjett(qi,qj,s,iq1,iq2)
+c-----------------------------------------------------------------------------
+c qgjett - hard 2->2 parton scattering born cross-section
+c s is the c.m. energy square for the scattering process,
+c iq1 - parton type at current end of the ladder (0 - g, 1,2 etc. - q)
+c iq2 - parton type at opposite end of the ladder (0 - g, 1,2 etc. - q)
+c-----------------------------------------------------------------------------
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr17/ dels,alfp,sigs,rr,r3p,g3p,delh,sgap
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/    debug
+      common /arr3/     x1(7),a1(7)
+
+      if(debug.ge.2)write (moniou,201)qi,qj,s,iq1,iq2
+
+      qgjett=0.d0
+      qq=max(qi,qj)
+
+      zmin=qq*fqscal*4.d0/s
+      zmax=(1.d0-epsxmn)**2
+      if(zmin.ge.zmax)return
+      zmin1=zmin**(-delh)
+      zmax1=zmax**(-delh)
+      do i1=1,7
+      do m1=1,2
+       z=(.5d0*(zmax1+zmin1+(zmax1-zmin1)*x1(i1)*(2*m1-3)))
+     * **(-1.d0/delh)
+
+       si=z*s
+       fb1=0.d0
+       zmin2=min(.2d0,1.d0-dsqrt(z))
+       do i2=1,7
+       do m2=1,2
+        z1=1.d0-epsxmn*(zmin2/epsxmn)**(.5d0+x1(i2)*(m2-1.5d0))
+        z2=z/z1
+
+        fb1=fb1+a1(i2)*(qgjeti(qi,qj,si,z1,z2,iq1,iq2,2)
+     *  +qgjeti(qi,qj,si,z2,z1,iq1,iq2,2))*(1.d0/z1-1.d0)
+       enddo
+       enddo
+       fb1=fb1*dlog(zmin2/epsxmn)
+
+       fb2=0.d0
+       if(z.lt..64d0)then
+        do i2=1,7
+        do m2=1,2
+         z1=.8d0*(dsqrt(z)/.8d0)**(.5d0+x1(i2)*(m2-1.5d0))
+          z2=z/z1
+
+         fb2=fb2+a1(i2)*(qgjeti(qi,qj,si,z1,z2,iq1,iq2,2)
+     *   +qgjeti(qi,qj,si,z2,z1,iq1,iq2,2))
+        enddo
+        enddo
+        fb2=fb2*dlog(.64d0/z)/2.d0
+       endif
+
+       qgjett=qgjett+a1(i1)*(fb1+fb2)*z**(1.d0+delh)
+      enddo
+      enddo
+      qgjett=qgjett*(zmin1-zmax1)/delh*pi**3/2.d0
+
+      if(debug.ge.3)write (moniou,202)qgjett
+201   format(2x,'qgjett: qi=',e10.3,2x,'qj=',e10.3,2x,
+     *'s= ',e10.3,2x,'iq1= ',i1,2x,'iq2= ',i1)
+202   format(2x,'qgjett=',e10.3)
+      return
+      end
+
+c=============================================================================
+      double precision function qgjeti(qi,qj,si,z1,z2,iq1,iq2,jj)
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/    debug
+      common /arr3/     x1(7),a1(7)
+
+      qgjeti=0.d0
+      qq=max(qi,qj)
+      tmin=qq*fqscal/(.5d0+dsqrt(max(0.d0,.25d0-qq*fqscal/si)))
+      if(tmin.ge.si/2.d0)return
+      do i=1,7
+      do m=1,2
+       t=2.d0*tmin/(1.d0+2.d0*tmin/si
+     *   -x1(i)*(2*m-3)*(1.d0-2.d0*tmin/si))
+       qt=t*(1.d0-t/si)
+
+       fb=0.d0
+       if(jj.eq.1)then
+        do iql=1,2
+         iq=2*iql-2
+         dfb=0.d0
+         do n=1,3
+          dfb=dfb+qgfbor(si,t,iq,iq2,n)+qgfbor(si,si-t,iq,iq2,n)
+         enddo
+         if(iq.eq.iq2)dfb=dfb/2.d0
+         fb=fb+dfb*qgevi(qi,qt/fqscal,z1,iabs(iq1)+1,iql)
+        enddo
+        fb=fb*qgsudx(qt/fqscal,iabs(iq2)+1)
+       else
+        do iql=1,2
+         iq=2*iql-2
+        do iqr=1,2
+         dfb=0.d0
+         do n=1,3
+          dfb=dfb+qgfbor(si,t,iq,iqr-1,n)+qgfbor(si,si-t,iq,iqr-1,n)
+         enddo
+         if(iq.eq.iqr-1)dfb=dfb/2.d0
+         fb=fb+dfb*qgevi(qi,qt/fqscal,z1,iabs(iq1)+1,iql)
+     *   *qgevi(qj,qt/fqscal,z2,iabs(iq2)+1,iqr)
+        enddo
+        enddo
+       endif
+
+       qgjeti=qgjeti+a1(i)*fb*qgalf(qt/fqscal/alm)**2*t**2
+      enddo
+      enddo
+      qgjeti=qgjeti*(1.d0/tmin-2.d0/si)/si**2
+      return
+      end
+
+c=============================================================================
+      double precision function qgptj(s,pt,y0,sigin)
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr6/  pi,bm,amws
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgarr51/ epsxmn
+      common /qgdebug/    debug
+      common /arr3/     x1(7),a1(7)
+
+      qgptj=0.d0
+      zmin=4.d0*pt**2/s
+      xt=2.d0*pt*exp(y0)/dsqrt(s)
+      zmax=min(1.d0,xt**2/(2.d0*xt-zmin))
+      if(zmax.le.zmin)return
+
+      qq=pt**2/fqscal
+      do i1=1,7
+      do m1=1,2
+       z=zmax*(zmin/zmax)**(.5d0+x1(i1)*(m1-1.5d0))
+       si=z*s
+       t=2.d0*pt**2/(1.d0+dsqrt(max(0.d0,1.d0-zmin/z)))
+
+       xmax=min(1.d0,xt/(1.d0+dsqrt(max(0.d0,1.d0-zmin/z))))
+       xmin=max(z,xmax*exp(-2.d0*y0))
+       do i2=1,7
+       do m2=1,2
+        xp=xmax*(xmin/xmax)**(.5d0+x1(i2)*(m2-1.5d0))
+        xm=z/xp
+
+        glu1=qgpdf(xp,qq,2,0)
+        glu2=qgpdf(xm,qq,2,0)
+        seav2=qgpdf(xm,qq,2,-1)+qgpdf(xm,qq,2,1)+qgpdf(xm,qq,2,2)
+
+        qgptj=qgptj+a1(i1)*a1(i2)*(qgptjb(si,pt**2,t,1)*glu1*glu2
+     *  +qgptjb(si,pt**2,t,2)*glu1*seav2)
+     *  *dlog(xmax/xmin)/(1.d0-2.d0*t/si)
+       enddo
+       enddo
+      enddo
+      enddo
+      qgptj=qgptj*dlog(zmax/zmin)*pi**3*.39d0/sigin  *2.  !2 jets
+      return
+      end
+
+c=============================================================================
+      double precision function qgptjb(si,qt,t,jj)
+      implicit double precision (a-h,o-z)
+      integer debug
+      common /qgarr18/ alm,qt0,qtf,betp,dgqq
+      common /qgarr26/ factk,fqscal
+      common /qgarr43/ moniou
+      common /qgdebug/    debug
+
+      if(jj.eq.1)then
+       qgptjb=qgfbor(si,t,0,0,1)
+      else       !if(jj.eq.2)then
+       qgptjb=qgfbor(si,t,0,1,1)
+      endif
+      qgptjb=qgptjb*qgalf(qt/fqscal/alm)**2/si**2
+      return
+      end
diff --git a/Processes/QGSJetII/qgsjet-II-04.h b/Processes/QGSJetII/qgsjet-II-04.h
new file mode 100644
index 0000000000000000000000000000000000000000..352ce650dc845e3c2f30dba35eadc7d637e65eaa
--- /dev/null
+++ b/Processes/QGSJetII/qgsjet-II-04.h
@@ -0,0 +1,112 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#ifndef _include_qgsjetII_interface_h_
+#define _include_qgsjetII_interface_h_
+
+#include <string>
+
+//----------------------------------------------
+//  C++ interface for the QGSJetII event generator
+//----------------------------------------------
+// wrapper
+
+extern "C" {
+
+// data memory layout
+
+extern struct { int nsp; } qgarr12_;
+
+const int nptmax = 95000;
+const int iapmax = 208;
+
+extern struct {
+  double esp[nptmax][4];
+  int ich[nptmax];
+} qgarr14_;
+
+extern struct {
+  // c nsf - number of secondary fragments;
+  // c iaf(i) - mass of the i-th fragment
+  int nsf;
+  int iaf[iapmax];
+} qgarr13_;
+
+extern struct {
+  int nwt;
+  int nwp;
+} qgarr55_;
+
+/**
+   Small helper class to provide a data-directory name in the format qgsjetII expects
+ */
+class datadir {
+private:
+  datadir operator=(const std::string& dir);
+  datadir operator=(const datadir&);
+
+public:
+  datadir(const std::string& dir);
+  char data[132];
+};
+
+// functions
+void qgset_();
+void qgaini_(
+    const char* datdir); // Note: there is a length limiation 132 from fortran-qgsjet here
+
+/**
+   @function qgini_
+
+   additional initialization procedure per event
+
+   @parameter e0n  - interaction energy (per hadron/nucleon),
+   @parameter icp0 - hadron type (+-1 - pi+-, +-2 - p(p~), +-3 - n(n~), +-4 - K+-, +-5 -
+   K_l/s),
+   @parameter iap  - projectile mass number (1 - for a hadron),
+   @parameter iat  - target mass number
+*/
+void qgini_(const double& e0n, const int& icp0, const int& iap, const int& iat);
+
+/**
+   @function qgconf_
+
+   generate one event configuration
+*/
+void qgconf_();
+
+/**
+   @function qgsect_
+
+   hadron-nucleus (hadron-nucleus) particle production cross section
+
+   @parameter e0n lab. energy per projectile nucleon (hadron)
+   @parameter icz hadron class (1 - pion, 2 - nucleon, 3 - kaon)
+   @parameter iap projectile mass number (1=<iap<=iapmax),
+   @parameter iat target mass number     (1=<iat<=iapmax)
+ */
+double qgsect_(const double& e0n, const int& icz, const int& iap0, const int& iat0);
+
+/**
+   @function qgran
+
+   link to random number generation
+ */
+double qgran_(int&);
+
+/**
+   dummy function from CRMC
+ */
+void lzmaopenfile_(const char* name, int length);
+void lzmaclosefile_();
+void lzmafillarray_(const double& dum, const int& idum);
+}
+
+#endif
diff --git a/Processes/QGSJetII/testQGSJetII.cc b/Processes/QGSJetII/testQGSJetII.cc
new file mode 100644
index 0000000000000000000000000000000000000000..4f284e056992a9987ae4cd70b4a5f471f5caca6a
--- /dev/null
+++ b/Processes/QGSJetII/testQGSJetII.cc
@@ -0,0 +1,126 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#include <corsika/process/qgsjetII/Interaction.h>
+#include <corsika/process/qgsjetII/ParticleConversion.h>
+
+#include <corsika/random/RNGManager.h>
+
+#include <corsika/particles/ParticleProperties.h>
+
+#include <corsika/geometry/Point.h>
+#include <corsika/units/PhysicalUnits.h>
+
+#include <catch2/catch.hpp>
+
+using namespace corsika;
+using namespace corsika::process::qgsjetII;
+
+TEST_CASE("QgsjetII", "[processes]") {
+
+  SECTION("QgsjetII -> Corsika") {
+    REQUIRE(particles::PiPlus::GetCode() == process::qgsjetII::ConvertFromQgsjetII(
+                                                process::qgsjetII::QgsjetIICode::PiPlus));
+  }
+
+  SECTION("Corsika -> QgsjetII") {
+    REQUIRE(process::qgsjetII::ConvertToQgsjetII(particles::PiMinus::GetCode()) ==
+            process::qgsjetII::QgsjetIICode::PiMinus);
+    REQUIRE(process::qgsjetII::ConvertToQgsjetIIRaw(particles::Proton::GetCode()) == 2);
+  }
+
+  SECTION("canInteractInQgsjetII") {
+
+    REQUIRE(process::qgsjetII::CanInteract(particles::Proton::GetCode()));
+    REQUIRE(process::qgsjetII::CanInteract(particles::Code::KPlus));
+    REQUIRE(process::qgsjetII::CanInteract(particles::Nucleus::GetCode()));
+    // REQUIRE(process::qgsjetII::CanInteract(particles::Helium::GetCode()));
+
+    REQUIRE_FALSE(process::qgsjetII::CanInteract(particles::EtaC::GetCode()));
+    REQUIRE_FALSE(process::qgsjetII::CanInteract(particles::SigmaC0::GetCode()));
+  }
+
+  SECTION("cross-section type") {
+
+    REQUIRE(process::qgsjetII::GetQgsjetIIXSCode(particles::Code::Neutron) == 2);
+    REQUIRE(process::qgsjetII::GetQgsjetIIXSCode(particles::Code::K0Long) == 3);
+    REQUIRE(process::qgsjetII::GetQgsjetIIXSCode(particles::Code::Proton) == 2);
+    REQUIRE(process::qgsjetII::GetQgsjetIIXSCode(particles::Code::PiMinus) == 1);
+  }
+}
+
+#include <corsika/geometry/Point.h>
+#include <corsika/geometry/RootCoordinateSystem.h>
+#include <corsika/geometry/Vector.h>
+
+#include <corsika/units/PhysicalUnits.h>
+
+#include <corsika/particles/ParticleProperties.h>
+#include <corsika/setup/SetupStack.h>
+#include <corsika/setup/SetupTrajectory.h>
+
+#include <corsika/environment/Environment.h>
+#include <corsika/environment/HomogeneousMedium.h>
+#include <corsika/environment/NuclearComposition.h>
+#include <corsika/process/qgsjetII/qgsjet-II-04.h>
+
+using namespace corsika::units::si;
+using namespace corsika::units;
+
+TEST_CASE("QgsjetIIInterface", "[processes]") {
+
+  // setup environment, geometry
+  environment::Environment<environment::IMediumModel> env;
+  auto& universe = *(env.GetUniverse());
+
+  auto theMedium =
+      environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>(
+          geometry::Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m},
+          1_km * std::numeric_limits<double>::infinity());
+
+  using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>;
+  theMedium->SetModelProperties<MyHomogeneousModel>(
+      1_kg / (1_m * 1_m * 1_m),
+      environment::NuclearComposition(
+          std::vector<particles::Code>{particles::Code::Oxygen}, std::vector<float>{1.}));
+
+  auto const* nodePtr = theMedium.get();
+  universe.AddChild(std::move(theMedium));
+
+  const geometry::CoordinateSystem& cs = env.GetCoordinateSystem();
+
+  random::RNGManager::GetInstance().RegisterRandomStream("qgran");
+
+  SECTION("InteractionInterface") {
+
+    setup::Stack stack;
+    const HEPEnergyType E0 = 100_GeV;
+    HEPMomentumType P0 =
+        sqrt(E0 * E0 - particles::Proton::GetMass() * particles::Proton::GetMass());
+    auto plab = corsika::stack::MomentumVector(cs, {0_GeV, 0_GeV, -P0});
+    geometry::Point pos(cs, 0_m, 0_m, 0_m);
+    auto particle =
+        stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType,
+                                     corsika::stack::MomentumVector, geometry::Point,
+                                     units::si::TimeType, unsigned int, unsigned int>{
+            particles::Code::Nucleus, E0, plab, pos, 0_ns, 16, 8});
+    // corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
+    //	  particles::Code::PiPlus, E0, plab, pos, 0_ns});
+
+    particle.SetNode(nodePtr);
+    corsika::stack::SecondaryView view(particle);
+    auto projectile = view.GetProjectile();
+
+    Interaction model;
+    model.Init();
+    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(projectile);
+    [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle);
+  }
+}