Some General Comments:

For our Final Exercise Set (prior to our “Final Project”), select ONE of the three options below. Only one option will be accepted for grading:

  1. Option 1: Dynamic Aperture Calculation (below)

  2. Option 2: Beam-Beam Interaction Calculation (below)

  3. Option 3: Re-write and re-submit TWO of your previous homework problems (not complete assignments; rather, two problems from previous assignments). They must be problems for which you received less than half-credit (e.g., 3/10 points, for example). Simply copying the answers from the web site is not acceptable; a good-faith attempt must be made to write and explain the solutions in your own words, with a demonstration of your mastery of the methods you’ve learned during the course.

As usual, the assignment must be submitted as an html R notebook (yourfirstname8.nb.html) which will include all code (R and/or python) produced by the author.

Dynamic Aperture Calculation

L  = 15
mu = 80.3*pi/180
F  = L/2/sin(mu/2)
Ncells = 26
nu = mu*Ncells/2/pi
C = 2*L*Ncells

Consider a FODO-style synchrotron, made up of 26 FODO cells, with a lens spacing of 15 m and with a cell phase advance of 80.3 degrees. Presume equal bending through angle \(\theta\) between each of the quadrupoles of the FODO system.

  1. Give formulas for and compute the maximum and minimum values for \(\beta\) and \(D\) (dispersion) for such a FODO cell.
Mdf =  matrix( c( 1, L, -1/F, 1-L/F), byrow = TRUE, ncol = 2)
Mfd =  matrix( c( 1, L,  1/F, 1+L/F), byrow = TRUE, ncol = 2)

ang = 2*pi/Ncells/2
Dmax = L*ang/sin(mu/2)^2*(1+1/2*sin(mu/2))
Dmin = L*ang/sin(mu/2)^2*(1-1/2*sin(mu/2))
betMax = 2*F*sqrt((1+L/2/F)/(1-L/2/F))
betMin = 2*F*sqrt((1-L/2/F)/(1+L/2/F))
  1. To the extent that the natural chromaticity (in the absence of errors) of a FODO-style synchrotron is \(\xi \approx -\nu\), what would be the values \(\xi_x\) and \(\xi_y\) for our system?
xix = -Ncells*mu/2/pi
xiy = -Ncells*mu/2/pi  # from symmetry, they will be the same
xix; xiy
[1] -5.799444
[1] -5.799444
  1. Suppose sextupoles are placed at the locations of the quadrupoles for chromaticity control, with strengths \(S_1\) at the focusing quadrupoles and \(S_2\) at the defocusing quadruoples. Write a matrix equation that shows how the chromaticity would be adjusted in our system for these two given strengths.

  2. If the change desired is to set both of the chromaticity values to zero, what numerical strengths \(S_1\) and \(S_2\) are required?

dxix = mu/2/pi  #  need to make "positive" changes to each cell
dxiy = mu/2/pi  #   this correction in each cell would give full 
                #   correction for Ncells

A = matrix(c( betMax*Dmax,  betMin*Dmin,
             -betMin*Dmax, -betMax*Dmin), 
    byrow=TRUE, ncol=2)/4/pi
Sxt = solve(A,c(dxix,dxiy))
S1 = Sxt[1] # 1/m^2  here, S = B''L_sxt/(Brho)
S2 = Sxt[2] # 1/m^2
S1; S2
[1] 0.01238819
[1] -0.02417646
Ntrk = 5000
x0  = seq(-100,100, 2)
xp0 = 0
xmax = 100
  1. With these values of sextupole strengths, we now have a nonlinear system, which can affect the available stable phase space area. For an initial condition of \(x = x_0\) and \(x'\) = 0, at some value of \(x_0\) the motion is likely to become unstable. Track particles through the FODO system, including the effects of all the sextupoles, for a variety of values for \(x_0\), up to 5000 turns, and determine at what value(s) of \(x_0\) the motion becomes unstable. (Let’s call a particle unstable if its position \(x\) exceeds 100 mm within 5000 turns.) The region of \(x\) which contains stable motion could be called the 5000-turn dynamic aperture.

Note: \(\Delta x' = -\frac12 B''\ell/(B\rho)\)

Nlast = 0

i=0
while(i<length(x0)){
   i=i+1
   V = c(x0[i],xp0)

   j = 0
   while(j<Ntrk){
      j = j+1
      m = 0
      while(m<Ncells){  # once around the ring
         m=m+1
         V = Mfd %*% V
         V[2] = V[2] - 1/2*S2*V[1]^2/1e3  # convert to mr
         V = Mdf %*% V
         V[2] = V[2] - 1/2*S1*V[1]^2/1e3  # convert to mr
         if(abs(V[1]) > xmax) break
      }
      Nlast[i]=j
      if(abs(V[1]) > 100) break
   }
}
plot(x0,Nlast,typ="l")

min(x0[Nlast>1000]); max(x0[Nlast>1000])
[1] -42
[1] 40

Beam-Beam Interaction

N   = 1e11
Ec  = 1e12      # collision energy, eV
mc2 = 938e6     # eV
gam = Ec/mc2
eps = 3*pi*1e-6 # m
betStar = 0.3   # m
sigx = sqrt(betStar*eps/gam)*1000  # mm
nu   = 20.5809
Qe   = 1.6e-19       # Coul
epsilon0 = 8.85e-12  # F/m
r0  = Qe/(4*pi*epsilon0*mc2)  # note: one "e" in `mc2` cancels one "e" in `Qe`^2
xibb  = N*r0/4/eps

Suppose a collider is operating with \(N\) = \(10^{11}\) protons in each bunch at a collision energy of \(1000\) GeV, colliding with similar counter-rotating proton bunches. The rms, normalized transverse emittance of each bunch is \(\epsilon_N\) = \(3\) \(\pi\) mm-mrad, and the amplitude function at the collision point is \(\beta^*\) = 0.3 m. The betatron tune of the collider is \(\nu\) = 20.99091.

The beam-beam interaction generates a shift in the tune of the collider, by an amount \(\Delta\nu = \xi\), where \[ \xi \equiv \pm\frac{r_0N}{4\epsilon_N} \] and \(r_0\) is called the “classical radius” of the particle, \[ r_0 = \frac{e^2}{4\pi\epsilon_0mc^2}. \] Here, we are actually considering a “round” beam, but will only study motion in one direction — \(x\).

  1. For the situation described above, should we use the “positive” sign or “negative” sign for our tune shift? Justify your answer.
             # -1 if defocuses, tune goes down;  +1 if focuses, tune goes up
signXi = -1  #    if pos x pos or neg x neg, then -1;  if pos x neg, then +1
             #        here, we have protons on protons:  -1
xibb = xibb*ifelse(signXi <0, -1, 1)
  1. As a particle passes through the interaction point, what would be the effective focal length, in the linear approximation, of the focusing field created by the oncoming bunch, in terms of \(\xi\) and \(\beta^*\)? Provide a numerical estimate.

\[ \Delta\nu = \frac{1}{4\pi}\beta q ~~~~~ \rightarrow ~~~~~q_{eff} = \frac{1}{F_{eff}} = \frac{4\pi\xi}{\beta^*} \]

Feff = betStar/4/pi/xibb
Feff  # m
[1] -5.867843
  1. This extra focusing field would change the value of the beta function at the collision point from its design value of \(\beta^*\) = 0.3 m. By how much would it change?
dqEff   = 4*pi*xibb/betStar
dbonbAmp = dqEff*betStar/2/sin(2*pi*nu)
dbonbStar = -dbonbAmp*cos(2*pi*nu)
dbonbStar
[1] 0.04588251
  1. We have seen that the beam-beam force (and space charge force) for a round beam has a functional form of \[ F \sim {\cal F}(u) = \frac{1-e^{-u^2/2}}{u} \] in terms of \(u \equiv x/\sigma\). Using R or python, make a plot of this functional form and its deriviate, and determine the value of \(x/\sigma\) that produces the maximum force.
Fbb  = function(u){ (1-exp(-u^2/2))/u}
Fpbb = function(u){ ( (1+u^2)*exp(-u^2/2) - 1 )/u^2 }
uMax = uniroot(Fpbb,c(1,4))$root
uMax
[1] 1.58521
curve(Fbb,0,10)
abline(h=c(0),v=uMax,lty=c(1,2),col=c("black","red"))

curve(Fpbb,0,10)
abline(h=c(0),v=uMax,lty=c(1,2),col=c("black","red"))

  1. To study the phase space of the beam-beam interaction, note that the change in angle of a particle passing through an oncoming bunch will be \[ \Delta x' = \frac{F\cdot\ell}{pv} = \frac{e^2N'\cdot\ell}{\pi\epsilon_0 \sigma \;\; pv}\cdot {\cal F}(u) \] Noting also that the interaction region will be half the length of one of the beam bunches (due to the fact that the bunches are traveling toward each other), then \(N'\ell = N/2\) and \[ \Delta x' = \frac{e^2 \cdot (\frac12 N)}{\pi\epsilon_0 \beta^2\gamma mc^2\sigma}\cdot{\cal F}(u) = 2\;\frac{e^2}{4\pi\epsilon_0 mc^2}\;\frac{N}{\beta^2\gamma\sigma}\;{\cal F} = \frac{2r_0N}{\gamma\sigma} {\cal F} ~~~(\beta = v/c\approx 1) \] where we let \(\beta = 1\), which is most common for colliding beams storage rings.

If we now use our usual phase space variables \(x\) and \(P \equiv \beta x' + \alpha x\), then when passing through the oncoming bunch a particle’s \(P\) variable will change by \(\Delta P = \beta^*\Delta x'\), where \(\beta^*\) is the value of the Courant-Snyder parameter at the collision point. But, let’s re-write everything in terms of the rms beam size: define \(u \equiv x/\sigma\) and \(v \equiv P/\sigma\). Then,

\[ \Delta v = \Delta (P/\sigma) = \beta^*\Delta x'/\sigma = \frac{2\beta^*r_0N}{\gamma\sigma^2} {\cal F} = \frac{2\pi r_0N}{1}\frac{\beta^*}{\gamma\pi\sigma^2} {\cal F} = 2\pi\frac{r_0N}{\epsilon_N} {\cal F}(u) \] where we recognize \(\epsilon_N\) as the rms normalized beam emittance. The coordinates of a particle thus will change according to \[ \Delta u = 0 \\ \Delta v= 8\pi\xi\;{\cal F}(u) = 8\pi\xi \cdot\frac{1-e^{-u^2/2}}{u} \] when passing through the oncoming bunch. For a single pass around the collider, the particle’s phase space would evolve according to

\[ \begin{pmatrix} u \\ v \end{pmatrix}_{n+1} = \begin{pmatrix} ~~\cos (2\pi\nu) & \sin (2\pi\nu) \\ -\sin (2\pi\nu) & \cos (2\pi\nu) \end{pmatrix} \begin{pmatrix} u \\ v+\Delta v(u) \end{pmatrix}_{n} \]

dv = function(x){8*pi*xibb*(1-exp(-x^2/2))/x}

Now: Plot the \((u,v)\) phase space in a single figure for values of \(u_0\) = 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 and for \(v_0\) = 0, where each condition is tracked for 2000 turns.

cn = cos(2*pi*nu)
sn = sin(2*pi*nu)
plot(0,0,typ="n",xlim=c(-alim,alim),ylim=c(-alim,alim),asp=1,xlab="u",ylab="v")
symbols(0,0,circles=sqrt(6),add=TRUE,fg="red",inches = FALSE)
m=0
while(m<length(u0)){
   m=m+1
   u = u0[m]
   v = 0
   i=0
   while(i<Ntrk0){
      points(u,v,pch=".")
      i=i+1
      u1 =  u
      v1 =  v + dv(u)
      u  =  cn*u1 + sn*v1
      v  = -sn*u1 + cn*v1
   }
}

ktune = c(20.50291, 20.580902, 20.6672073, 20.7498, 20.800776, 20.99091)
u0 = c(2:10)/2
NTplts = 4000
  1. Now, create a grid of six phase space plots, one for each of the following values of betatron tune: \(\nu\) = 20.50291, 20.580902, 20.6672073, 20.7498, 20.800776, 20.99091. For each plot, track a collection of particles with initial conditions \(u_0\) = 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, \(v_0\) = 0, and track each particle for 4000 turns. In each phase space plot, indicate with a red circle the area which would contain 95% of the particles in the beam (in the absence of the beam-beam kick itself).
par(mfrow=c(2,3))
kpl = 0
while(kpl<length(ktune)){
   kpl=kpl+1
   alim = 10
   nu = ktune[kpl]
   cn = cos(2*pi*nu)
   sn = sin(2*pi*nu)
   plot(0,0,typ="n",xlim=c(-alim,alim),ylim=c(-alim,alim),asp=1,xlab="u",ylab="v",
      main=paste("nu =",round(nu,4)))
   symbols(0,0,circles=sqrt(6),add=TRUE,fg="red",inches = FALSE,lwd=3)
   m=0
   while(m<length(u0)){
      m=m+1
      u = u0[m]
      v = 0
      i=0
      while(i<NTplts){
         points(u,v,pch=".")
         i=i+1
         u1 =  u
         v1 =  v + dv(u)
         u  =  cn*u1 + sn*v1
         v  = -sn*u1 + cn*v1
      }
   }
}


  1. Northern Illinois University and Fermi National Accelerator Laboratory

LS0tCnRpdGxlOiAiSG9tZXdvcmsgOCBEaXNjdXNzaW9uIgphdXRob3I6IE1pa2UgU3lwaGVyc15bTm9ydGhlcm4gSWxsaW5vaXMgVW5pdmVyc2l0eSBhbmQgRmVybWkgTmF0aW9uYWwgQWNjZWxlcmF0b3IKICBMYWJvcmF0b3J5XQpkYXRlOiAnbGFzdCB1cGRhdGU6IGByIGZvcm1hdCgoU3lzLkRhdGUoKSksICIlZCAlYiAlWSIpYCcKb3V0cHV0OiAgaHRtbF9ub3RlYm9vawotLS0KCioqU29tZSBHZW5lcmFsIENvbW1lbnRzOioqCgotIGdyYWRlOiAgMjAgcG9zc2libGUgIAogICAgICArIDIwIHB0cyBlYWNoIHByb2JsZW0gKDEwIGVhY2gsIGlmICJyZS1kb25lIikgIAogICAgICArIGF2ZSBzY29yZTogIDE4LzIwICAKCi0gICBub3RlIHRoYXQgaWYgYSBncmFkaWVudCBmaWVsZCAiZGVmb2N1c2VzIiwgdGhlbiBpdCBkZWNyZWFzZXMgdGhlIHR1bmU7IGlmIGl0IGZvY3VzZXMsIHRoZW4gaW4gKmluY3JlYXNlcyogdGhlIHR1bmUKCgoKRm9yIG91ciBGaW5hbCBFeGVyY2lzZSBTZXQgKHByaW9yIHRvIG91ciAiRmluYWwgUHJvamVjdCIpLCBzZWxlY3QgKipPTkUqKiBvZiB0aGUgdGhyZWUgb3B0aW9ucyBiZWxvdy4gIE9ubHkgb25lIG9wdGlvbiB3aWxsIGJlIGFjY2VwdGVkIGZvciBncmFkaW5nOgoKMS4gT3B0aW9uIDE6ICAqKkR5bmFtaWMgQXBlcnR1cmUgQ2FsY3VsYXRpb24qKiAoYmVsb3cpICAKCjIuIE9wdGlvbiAyOiAgKipCZWFtLUJlYW0gSW50ZXJhY3Rpb24gQ2FsY3VsYXRpb24qKiAoYmVsb3cpICAKCjMuIE9wdGlvbiAzOiAgUmUtd3JpdGUgYW5kIHJlLXN1Ym1pdCAqVFdPKiBvZiB5b3VyIHByZXZpb3VzIGhvbWV3b3JrIHByb2JsZW1zIChub3QgY29tcGxldGUgYXNzaWdubWVudHM7IHJhdGhlciwgdHdvICpwcm9ibGVtcyogZnJvbSBwcmV2aW91cyBhc3NpZ25tZW50cykuICBUaGV5IG11c3QgYmUgcHJvYmxlbXMgZm9yIHdoaWNoIHlvdSByZWNlaXZlZCBsZXNzIHRoYW4gaGFsZi1jcmVkaXQgKGUuZy4sIDMvMTAgcG9pbnRzLCBmb3IgZXhhbXBsZSkuICBTaW1wbHkgY29weWluZyB0aGUgYW5zd2VycyBmcm9tIHRoZSB3ZWIgc2l0ZSBpcyBub3QgYWNjZXB0YWJsZTsgYSBnb29kLWZhaXRoIGF0dGVtcHQgbXVzdCBiZSBtYWRlIHRvIHdyaXRlIGFuZCBleHBsYWluIHRoZSBzb2x1dGlvbnMgaW4geW91ciBvd24gd29yZHMsIHdpdGggYSBkZW1vbnN0cmF0aW9uIG9mIHlvdXIgbWFzdGVyeSBvZiB0aGUgbWV0aG9kcyB5b3UndmUgbGVhcm5lZCBkdXJpbmcgdGhlIGNvdXJzZS4gIAoKQXMgdXN1YWwsIHRoZSBhc3NpZ25tZW50IG11c3QgYmUgc3VibWl0dGVkIGFzIGFuIGh0bWwgKipSKiogbm90ZWJvb2sgKCp5b3VyZmlyc3RuYW1lKjgubmIuaHRtbCkgd2hpY2ggd2lsbCBpbmNsdWRlIGFsbCBjb2RlICgqUiogYW5kL29yICpweXRob24qKSBwcm9kdWNlZCBieSB0aGUgYXV0aG9yLgoKCmBgYHtyLCBlY2hvPUZBTFNFfQpybShsaXN0PWxzKCkpCmBgYAoKIyMgKipEeW5hbWljIEFwZXJ0dXJlIENhbGN1bGF0aW9uKioKCmBgYHtyfQpMICA9IDE1Cm11ID0gODAuMypwaS8xODAKRiAgPSBMLzIvc2luKG11LzIpCk5jZWxscyA9IDI2Cm51ID0gbXUqTmNlbGxzLzIvcGkKQyA9IDIqTCpOY2VsbHMKYGBgCgpDb25zaWRlciBhIEZPRE8tc3R5bGUgc3luY2hyb3Ryb24sIG1hZGUgdXAgb2YgYHIgTmNlbGxzYCBGT0RPIGNlbGxzLCB3aXRoIGEgbGVucyBzcGFjaW5nIG9mIGByIExgIG0gYW5kIHdpdGggYSBjZWxsIHBoYXNlIGFkdmFuY2Ugb2YgYHIgbXUqMTgwL3BpYCBkZWdyZWVzLiAgUHJlc3VtZSBlcXVhbCBiZW5kaW5nIHRocm91Z2ggYW5nbGUgJFx0aGV0YSQgYmV0d2VlbiBlYWNoIG9mIHRoZSBxdWFkcnVwb2xlcyBvZiB0aGUgRk9ETyBzeXN0ZW0uCgphLiBHaXZlIGZvcm11bGFzIGZvciBhbmQgY29tcHV0ZSB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgZm9yICRcYmV0YSQgYW5kICREJCAoZGlzcGVyc2lvbikgZm9yIHN1Y2ggYSBGT0RPIGNlbGwuCgpgYGB7cn0KTWRmID0gIG1hdHJpeCggYyggMSwgTCwgLTEvRiwgMS1ML0YpLCBieXJvdyA9IFRSVUUsIG5jb2wgPSAyKQpNZmQgPSAgbWF0cml4KCBjKCAxLCBMLCAgMS9GLCAxK0wvRiksIGJ5cm93ID0gVFJVRSwgbmNvbCA9IDIpCgphbmcgPSAyKnBpL05jZWxscy8yCkRtYXggPSBMKmFuZy9zaW4obXUvMileMiooMSsxLzIqc2luKG11LzIpKQpEbWluID0gTCphbmcvc2luKG11LzIpXjIqKDEtMS8yKnNpbihtdS8yKSkKYmV0TWF4ID0gMipGKnNxcnQoKDErTC8yL0YpLygxLUwvMi9GKSkKYmV0TWluID0gMipGKnNxcnQoKDEtTC8yL0YpLygxK0wvMi9GKSkKYGBgCgpiLiAgVG8gdGhlIGV4dGVudCB0aGF0IHRoZSBuYXR1cmFsIGNocm9tYXRpY2l0eSAoaW4gdGhlIGFic2VuY2Ugb2YgZXJyb3JzKSBvZiBhIEZPRE8tc3R5bGUgc3luY2hyb3Ryb24gaXMgJFx4aSBcYXBwcm94IC1cbnUkLCB3aGF0IHdvdWxkIGJlIHRoZSB2YWx1ZXMgJFx4aV94JCBhbmQgJFx4aV95JCBmb3Igb3VyIHN5c3RlbT8KCmBgYHtyfQp4aXggPSAtTmNlbGxzKm11LzIvcGkKeGl5ID0gLU5jZWxscyptdS8yL3BpICAjIGZyb20gc3ltbWV0cnksIHRoZXkgd2lsbCBiZSB0aGUgc2FtZQp4aXg7IHhpeQpgYGAKCmMuICBTdXBwb3NlIHNleHR1cG9sZXMgYXJlIHBsYWNlZCBhdCB0aGUgbG9jYXRpb25zIG9mIHRoZSBxdWFkcnVwb2xlcyBmb3IgY2hyb21hdGljaXR5IGNvbnRyb2wsIHdpdGggc3RyZW5ndGhzICRTXzEkIGF0IHRoZSBmb2N1c2luZyBxdWFkcnVwb2xlcyBhbmQgJFNfMiQgYXQgdGhlIGRlZm9jdXNpbmcgcXVhZHJ1b3BsZXMuICBXcml0ZSBhIG1hdHJpeCBlcXVhdGlvbiB0aGF0IHNob3dzIGhvdyB0aGUgY2hyb21hdGljaXR5IHdvdWxkIGJlIGFkanVzdGVkIGluIG91ciBzeXN0ZW0gZm9yIHRoZXNlIHR3byBnaXZlbiBzdHJlbmd0aHMuCgpkLiAgSWYgdGhlIGNoYW5nZSBkZXNpcmVkIGlzIHRvIHNldCBib3RoIG9mIHRoZSBjaHJvbWF0aWNpdHkgdmFsdWVzIHRvIHplcm8sIHdoYXQgbnVtZXJpY2FsIHN0cmVuZ3RocyAkU18xJCBhbmQgJFNfMiQgYXJlIHJlcXVpcmVkPwoKYGBge3J9CmR4aXggPSBtdS8yL3BpICAjICBuZWVkIHRvIG1ha2UgInBvc2l0aXZlIiBjaGFuZ2VzIHRvIGVhY2ggY2VsbApkeGl5ID0gbXUvMi9waSAgIyAgIHRoaXMgY29ycmVjdGlvbiBpbiBlYWNoIGNlbGwgd291bGQgZ2l2ZSBmdWxsIAogICAgICAgICAgICAgICAgIyAgIGNvcnJlY3Rpb24gZm9yIE5jZWxscwoKQSA9IG1hdHJpeChjKCBiZXRNYXgqRG1heCwgIGJldE1pbipEbWluLAogICAgICAgICAgICAgLWJldE1pbipEbWF4LCAtYmV0TWF4KkRtaW4pLCAKICAgIGJ5cm93PVRSVUUsIG5jb2w9MikvNC9waQpTeHQgPSBzb2x2ZShBLGMoZHhpeCxkeGl5KSkKUzEgPSBTeHRbMV0gIyAxL21eMiAgaGVyZSwgUyA9IEInJ0xfc3h0LyhCcmhvKQpTMiA9IFN4dFsyXSAjIDEvbV4yClMxOyBTMgpgYGAKCmBgYHtyfQpOdHJrID0gNTAwMAp4MCAgPSBzZXEoLTEwMCwxMDAsIDIpCnhwMCA9IDAKeG1heCA9IDEwMApgYGAKCmUuICBXaXRoIHRoZXNlIHZhbHVlcyBvZiBzZXh0dXBvbGUgc3RyZW5ndGhzLCB3ZSBub3cgaGF2ZSBhIG5vbmxpbmVhciBzeXN0ZW0sIHdoaWNoIGNhbiBhZmZlY3QgdGhlIGF2YWlsYWJsZSBzdGFibGUgcGhhc2Ugc3BhY2UgYXJlYS4gIEZvciBhbiBpbml0aWFsIGNvbmRpdGlvbiBvZiAkeCA9IHhfMCQgYW5kICR4JyQgPSAwLCBhdCBzb21lIHZhbHVlIG9mICR4XzAkIHRoZSBtb3Rpb24gaXMgbGlrZWx5IHRvIGJlY29tZSB1bnN0YWJsZS4KVHJhY2sgcGFydGljbGVzIHRocm91Z2ggdGhlIEZPRE8gc3lzdGVtLCBpbmNsdWRpbmcgdGhlIGVmZmVjdHMgb2YgYWxsIHRoZSBzZXh0dXBvbGVzLCBmb3IgYSB2YXJpZXR5IG9mIHZhbHVlcyBmb3IgJHhfMCQsIHVwIHRvIGByIE50cmtgIHR1cm5zLCBhbmQgZGV0ZXJtaW5lIGF0IHdoYXQgdmFsdWUocykgb2YgJHhfMCQgdGhlIG1vdGlvbiBiZWNvbWVzIHVuc3RhYmxlLiAgKExldCdzIGNhbGwgYSBwYXJ0aWNsZSAqdW5zdGFibGUqIGlmIGl0cyBwb3NpdGlvbiAkeCQgZXhjZWVkcyBgciB4bWF4YCBtbSB3aXRoaW4gYHIgTnRya2AgdHVybnMuKSAgVGhlIHJlZ2lvbiBvZiAkeCQgd2hpY2ggY29udGFpbnMgc3RhYmxlIG1vdGlvbiBjb3VsZCBiZSBjYWxsZWQgdGhlIGByIE50cmtgLXR1cm4gKipkeW5hbWljIGFwZXJ0dXJlKiouCgoKTm90ZTogICRcRGVsdGEgeCcgPSAtXGZyYWMxMiBCJydcZWxsLyhCXHJobykkLi4uCgpgYGB7cn0KTmxhc3QgPSAwCgppPTAKd2hpbGUoaTxsZW5ndGgoeDApKXsKICAgaT1pKzEKICAgViA9IGMoeDBbaV0seHAwKQoKICAgaiA9IDAKICAgd2hpbGUoajxOdHJrKXsKICAgICAgaiA9IGorMQogICAgICBtID0gMAogICAgICB3aGlsZShtPE5jZWxscyl7ICAjIG9uY2UgYXJvdW5kIHRoZSByaW5nCiAgICAgICAgIG09bSsxCiAgICAgICAgIFYgPSBNZmQgJSolIFYKICAgICAgICAgVlsyXSA9IFZbMl0gLSAxLzIqUzIqVlsxXV4yLzFlMyAgIyBjb252ZXJ0IHRvIG1yCiAgICAgICAgIFYgPSBNZGYgJSolIFYKICAgICAgICAgVlsyXSA9IFZbMl0gLSAxLzIqUzEqVlsxXV4yLzFlMyAgIyBjb252ZXJ0IHRvIG1yCiAgICAgICAgIGlmKGFicyhWWzFdKSA+IHhtYXgpIGJyZWFrCiAgICAgIH0KICAgICAgTmxhc3RbaV09agogICAgICBpZihhYnMoVlsxXSkgPiAxMDApIGJyZWFrCiAgIH0KfQpwbG90KHgwLE5sYXN0LHR5cD0ibCIpCm1pbih4MFtObGFzdD4xMDAwXSk7IG1heCh4MFtObGFzdD4xMDAwXSkKYGBgCgoKIyMgKipCZWFtLUJlYW0gSW50ZXJhY3Rpb24qKgoKYGBge3J9Ck4gICA9IDFlMTEKRWMgID0gMWUxMiAgICAgICMgY29sbGlzaW9uIGVuZXJneSwgZVYKbWMyID0gOTM4ZTYgICAgICMgZVYKZ2FtID0gRWMvbWMyCmVwcyA9IDMqcGkqMWUtNiAjIG0KYmV0U3RhciA9IDAuMyAgICMgbQpzaWd4ID0gc3FydChiZXRTdGFyKmVwcy9nYW0pKjEwMDAgICMgbW0KbnUgICA9IDIwLjU4MDkKUWUgICA9IDEuNmUtMTkgICAgICAgIyBDb3VsCmVwc2lsb24wID0gOC44NWUtMTIgICMgRi9tCnIwICA9IFFlLyg0KnBpKmVwc2lsb24wKm1jMikgICMgbm90ZTogb25lICJlIiBpbiBgbWMyYCBjYW5jZWxzIG9uZSAiZSIgaW4gYFFlYF4yCnhpYmIgID0gTipyMC80L2VwcwpgYGAKClN1cHBvc2UgYSBjb2xsaWRlciBpcyBvcGVyYXRpbmcgd2l0aCAkTiQgPSAkYHIgTmAkIHByb3RvbnMgaW4gZWFjaCBidW5jaCBhdCBhIGNvbGxpc2lvbiBlbmVyZ3kgb2YgJGByIEVjLzFlOWAkIEdlViwgY29sbGlkaW5nIHdpdGggc2ltaWxhciBjb3VudGVyLXJvdGF0aW5nIHByb3RvbiBidW5jaGVzLiAgVGhlIHJtcywgbm9ybWFsaXplZCB0cmFuc3ZlcnNlIGVtaXR0YW5jZSBvZiBlYWNoIGJ1bmNoIGlzICRcZXBzaWxvbl9OJCA9ICRgciBlcHMvcGkvMWUtNmAkICRccGkkIG1tLW1yYWQsIGFuZCB0aGUgYW1wbGl0dWRlIGZ1bmN0aW9uIGF0IHRoZSBjb2xsaXNpb24gcG9pbnQgaXMgJFxiZXRhXiokID0gYHIgYmV0U3RhcmAgbS4gIFRoZSBiZXRhdHJvbiB0dW5lIG9mIHRoZSBjb2xsaWRlciBpcyAkXG51JCA9IGByIG51YC4KClRoZSBiZWFtLWJlYW0gaW50ZXJhY3Rpb24gZ2VuZXJhdGVzIGEgc2hpZnQgaW4gdGhlIHR1bmUgb2YgdGhlIGNvbGxpZGVyLCBieSBhbiBhbW91bnQgJFxEZWx0YVxudSA9IFx4aSQsIHdoZXJlCiQkClx4aSBcZXF1aXYgXHBtXGZyYWN7cl8wTn17NFxlcHNpbG9uX059CiQkCmFuZCAkcl8wJCBpcyBjYWxsZWQgdGhlICJjbGFzc2ljYWwgcmFkaXVzIiBvZiB0aGUgcGFydGljbGUsCiQkCnJfMCA9IFxmcmFje2VeMn17NFxwaVxlcHNpbG9uXzBtY14yfS4KJCQKSGVyZSwgd2UgYXJlIGFjdHVhbGx5IGNvbnNpZGVyaW5nIGEgInJvdW5kIiBiZWFtLCBidXQgd2lsbCBvbmx5IHN0dWR5IG1vdGlvbiBpbiBvbmUgZGlyZWN0aW9uIC0tLSAkeCQuCgphLiAgRm9yIHRoZSBzaXR1YXRpb24gZGVzY3JpYmVkIGFib3ZlLCBzaG91bGQgd2UgdXNlIHRoZSAicG9zaXRpdmUiIHNpZ24gb3IgIm5lZ2F0aXZlIiBzaWduIGZvciBvdXIgdHVuZSBzaGlmdD8gIEp1c3RpZnkgeW91ciBhbnN3ZXIuCgpgYGB7cn0KICAgICAgICAgICAgICMgLTEgaWYgZGVmb2N1c2VzLCB0dW5lIGdvZXMgZG93bjsgICsxIGlmIGZvY3VzZXMsIHR1bmUgZ29lcyB1cApzaWduWGkgPSAtMSAgIyAgICBpZiBwb3MgeCBwb3Mgb3IgbmVnIHggbmVnLCB0aGVuIC0xOyAgaWYgcG9zIHggbmVnLCB0aGVuICsxCiAgICAgICAgICAgICAjICAgICAgICBoZXJlLCB3ZSBoYXZlIHByb3RvbnMgb24gcHJvdG9uczogIC0xCnhpYmIgPSB4aWJiKmlmZWxzZShzaWduWGkgPDAsIC0xLCAxKQpgYGAKCgphLiBBcyBhIHBhcnRpY2xlIHBhc3NlcyB0aHJvdWdoIHRoZSBpbnRlcmFjdGlvbiBwb2ludCwgd2hhdCB3b3VsZCBiZSB0aGUgZWZmZWN0aXZlIGZvY2FsIGxlbmd0aCwgaW4gdGhlIGxpbmVhciBhcHByb3hpbWF0aW9uLCBvZiB0aGUgZm9jdXNpbmcgZmllbGQgY3JlYXRlZCBieSB0aGUgb25jb21pbmcgYnVuY2gsIGluIHRlcm1zIG9mICRceGkkIGFuZCAkXGJldGFeKiQ/ICBQcm92aWRlIGEgbnVtZXJpY2FsIGVzdGltYXRlLgoKJCQKXERlbHRhXG51ID0gXGZyYWN7MX17NFxwaX1cYmV0YSBxIH5+fn5+IFxyaWdodGFycm93IH5+fn5+cV97ZWZmfSA9IFxmcmFjezF9e0Zfe2VmZn19ID0gXGZyYWN7NFxwaVx4aX17XGJldGFeKn0KJCQKCmBgYHtyfQpGZWZmID0gYmV0U3Rhci80L3BpL3hpYmIKRmVmZiAgIyBtCmBgYAoKYi4gIFRoaXMgZXh0cmEgZm9jdXNpbmcgZmllbGQgd291bGQgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYmV0YSBmdW5jdGlvbiBhdCB0aGUgY29sbGlzaW9uIHBvaW50IGZyb20gaXRzIGRlc2lnbiB2YWx1ZSBvZiAkXGJldGFeKiQgPSBgciBiZXRTdGFyYCBtLiAgQnkgaG93IG11Y2ggd291bGQgaXQgY2hhbmdlPwoKYGBge3J9CmRxRWZmICAgPSA0KnBpKnhpYmIvYmV0U3RhcgpkYm9uYkFtcCA9IGRxRWZmKmJldFN0YXIvMi9zaW4oMipwaSpudSkKZGJvbmJTdGFyID0gLWRib25iQW1wKmNvcygyKnBpKm51KQpkYm9uYlN0YXIKYGBgCgpjLiAgV2UgaGF2ZSBzZWVuIHRoYXQgdGhlIGJlYW0tYmVhbSBmb3JjZSAoYW5kIHNwYWNlIGNoYXJnZSBmb3JjZSkgZm9yIGEgcm91bmQgYmVhbSBoYXMgYSBmdW5jdGlvbmFsIGZvcm0gb2YKJCQKRiBcc2ltIHtcY2FsIEZ9KHUpID0gXGZyYWN7MS1lXnstdV4yLzJ9fXt1fQokJAppbiB0ZXJtcyBvZiAkdSBcZXF1aXYgeC9cc2lnbWEkLiAgVXNpbmcgKlIqIG9yICpweXRob24qLCBtYWtlIGEgcGxvdCBvZiB0aGlzIGZ1bmN0aW9uYWwgZm9ybSBhbmQgaXRzIGRlcml2aWF0ZSwgYW5kIGRldGVybWluZSB0aGUgdmFsdWUgb2YgJHgvXHNpZ21hJCB0aGF0IHByb2R1Y2VzIHRoZSBtYXhpbXVtIGZvcmNlLgoKYGBge3J9CkZiYiAgPSBmdW5jdGlvbih1KXsgKDEtZXhwKC11XjIvMikpL3V9CkZwYmIgPSBmdW5jdGlvbih1KXsgKCAoMSt1XjIpKmV4cCgtdV4yLzIpIC0gMSApL3VeMiB9CnVNYXggPSB1bmlyb290KEZwYmIsYygxLDQpKSRyb290CnVNYXgKY3VydmUoRmJiLDAsMTApCmFibGluZShoPWMoMCksdj11TWF4LGx0eT1jKDEsMiksY29sPWMoImJsYWNrIiwicmVkIikpCmN1cnZlKEZwYmIsMCwxMCkKYWJsaW5lKGg9YygwKSx2PXVNYXgsbHR5PWMoMSwyKSxjb2w9YygiYmxhY2siLCJyZWQiKSkKYGBgCgoKZC4gIFRvIHN0dWR5IHRoZSBwaGFzZSBzcGFjZSBvZiB0aGUgYmVhbS1iZWFtIGludGVyYWN0aW9uLCBub3RlIHRoYXQgdGhlIGNoYW5nZSBpbiBhbmdsZSBvZiBhIHBhcnRpY2xlIHBhc3NpbmcgdGhyb3VnaCBhbiBvbmNvbWluZyBidW5jaCB3aWxsIGJlCiQkClxEZWx0YSB4JyA9IFxmcmFje0ZcY2RvdFxlbGx9e3B2fSA9IFxmcmFje2VeMk4nXGNkb3RcZWxsfXtccGlcZXBzaWxvbl8wIFxzaWdtYSBcO1w7IHB2fVxjZG90IHtcY2FsIEZ9KHUpCiQkCk5vdGluZyBhbHNvIHRoYXQgdGhlIGludGVyYWN0aW9uIHJlZ2lvbiB3aWxsIGJlIGhhbGYgdGhlIGxlbmd0aCBvZiBvbmUgb2YgdGhlIGJlYW0gYnVuY2hlcyAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGJ1bmNoZXMgYXJlIHRyYXZlbGluZyB0b3dhcmQgZWFjaCBvdGhlciksIHRoZW4gJE4nXGVsbCA9IE4vMiQgYW5kCiQkClxEZWx0YSB4JyA9IFxmcmFje2VeMiBcY2RvdCAoXGZyYWMxMiBOKX17XHBpXGVwc2lsb25fMCBcYmV0YV4yXGdhbW1hIG1jXjJcc2lnbWF9XGNkb3R7XGNhbCBGfSh1KSA9IDJcO1xmcmFje2VeMn17NFxwaVxlcHNpbG9uXzAgbWNeMn1cO1xmcmFje059e1xiZXRhXjJcZ2FtbWFcc2lnbWF9XDt7XGNhbCBGfSA9IFxmcmFjezJyXzBOfXtcZ2FtbWFcc2lnbWF9IHtcY2FsIEZ9IH5+fihcYmV0YSA9IHYvY1xhcHByb3ggMSkKJCQKd2hlcmUgd2UgbGV0ICRcYmV0YSA9IDEkLCB3aGljaCBpcyBtb3N0IGNvbW1vbiBmb3IgY29sbGlkaW5nIGJlYW1zIHN0b3JhZ2UgcmluZ3MuCgpJZiB3ZSBub3cgdXNlIG91ciB1c3VhbCBwaGFzZSBzcGFjZSB2YXJpYWJsZXMgJHgkIGFuZCAkUCBcZXF1aXYgXGJldGEgeCcgKyBcYWxwaGEgeCQsIHRoZW4gd2hlbiBwYXNzaW5nIHRocm91Z2ggdGhlIG9uY29taW5nIGJ1bmNoIGEgcGFydGljbGUncyAkUCQgdmFyaWFibGUgd2lsbCBjaGFuZ2UgYnkgJFxEZWx0YSBQID0gXGJldGFeKlxEZWx0YSB4JyQsIHdoZXJlICRcYmV0YV4qJCBpcyB0aGUgdmFsdWUgb2YgdGhlIENvdXJhbnQtU255ZGVyIHBhcmFtZXRlciBhdCB0aGUgY29sbGlzaW9uIHBvaW50LiAgQnV0LCBsZXQncyByZS13cml0ZSBldmVyeXRoaW5nIGluIHRlcm1zIG9mIHRoZSBybXMgYmVhbSBzaXplOiAgZGVmaW5lICR1IFxlcXVpdiB4L1xzaWdtYSQgYW5kICR2IFxlcXVpdiBQL1xzaWdtYSQuICBUaGVuLAoKJCQKXERlbHRhIHYgPSBcRGVsdGEgKFAvXHNpZ21hKSA9IFxiZXRhXipcRGVsdGEgeCcvXHNpZ21hID0gXGZyYWN7MlxiZXRhXipyXzBOfXtcZ2FtbWFcc2lnbWFeMn0ge1xjYWwgRn0gPSAKICAgXGZyYWN7MlxwaSByXzBOfXsxfVxmcmFje1xiZXRhXip9e1xnYW1tYVxwaVxzaWdtYV4yfSB7XGNhbCBGfSA9IDJccGlcZnJhY3tyXzBOfXtcZXBzaWxvbl9OfSB7XGNhbCBGfSh1KSAKJCQKd2hlcmUgd2UgcmVjb2duaXplICRcZXBzaWxvbl9OJCBhcyB0aGUgcm1zIG5vcm1hbGl6ZWQgYmVhbSBlbWl0dGFuY2UuICBUaGUgY29vcmRpbmF0ZXMgb2YgYSBwYXJ0aWNsZSB0aHVzIHdpbGwgY2hhbmdlIGFjY29yZGluZyB0bwokJApcRGVsdGEgdSA9IDAgXFwKXERlbHRhIHY9IDhccGlceGlcO3tcY2FsIEZ9KHUpID0gOFxwaVx4aSBcY2RvdFxmcmFjezEtZV57LXVeMi8yfX17dX0KJCQKd2hlbiBwYXNzaW5nIHRocm91Z2ggdGhlIG9uY29taW5nIGJ1bmNoLiAgRm9yIGEgc2luZ2xlIHBhc3MgYXJvdW5kIHRoZSBjb2xsaWRlciwgdGhlIHBhcnRpY2xlJ3MgcGhhc2Ugc3BhY2Ugd291bGQgZXZvbHZlIGFjY29yZGluZyB0bwoKCiQkClxiZWdpbntwbWF0cml4fSB1IFxcIHYgXGVuZHtwbWF0cml4fV97bisxfSA9IApcYmVnaW57cG1hdHJpeH0gIH5+XGNvcyAoMlxwaVxudSkgJiBcc2luICgyXHBpXG51KSBcXAogICAgICAgICAgICAgICAgLVxzaW4gKDJccGlcbnUpICYgXGNvcyAoMlxwaVxudSkgXGVuZHtwbWF0cml4fQpcYmVnaW57cG1hdHJpeH0gdSBcXCB2K1xEZWx0YSB2KHUpIFxlbmR7cG1hdHJpeH1fe259CiQkCmBgYHtyfQpkdiA9IGZ1bmN0aW9uKHgpezgqcGkqeGliYiooMS1leHAoLXheMi8yKSkveH0KYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KTnRyazAgPSAyMDAwCnUwID0gYygxLDIsMyw0LDUpCmFsaW0gPSA4CmBgYAoKTm93OiAgUGxvdCB0aGUgJCh1LHYpJCBwaGFzZSBzcGFjZSBpbiBhIHNpbmdsZSBmaWd1cmUgZm9yIHZhbHVlcyBvZiAkdV8wJCA9IGByIHUwYCBhbmQgZm9yICR2XzAkID0gMCwgd2hlcmUgZWFjaCBjb25kaXRpb24gaXMgdHJhY2tlZCBmb3IgYHIgTnRyazBgIHR1cm5zLgoKCmBgYHtyfQpjbiA9IGNvcygyKnBpKm51KQpzbiA9IHNpbigyKnBpKm51KQpwbG90KDAsMCx0eXA9Im4iLHhsaW09YygtYWxpbSxhbGltKSx5bGltPWMoLWFsaW0sYWxpbSksYXNwPTEseGxhYj0idSIseWxhYj0idiIpCnN5bWJvbHMoMCwwLGNpcmNsZXM9c3FydCg2KSxhZGQ9VFJVRSxmZz0icmVkIixpbmNoZXMgPSBGQUxTRSkKbT0wCndoaWxlKG08bGVuZ3RoKHUwKSl7CiAgIG09bSsxCiAgIHUgPSB1MFttXQogICB2ID0gMAogICBpPTAKICAgd2hpbGUoaTxOdHJrMCl7CiAgICAgIHBvaW50cyh1LHYscGNoPSIuIikKICAgICAgaT1pKzEKICAgICAgdTEgPSAgdQogICAgICB2MSA9ICB2ICsgZHYodSkKICAgICAgdSAgPSAgY24qdTEgKyBzbip2MQogICAgICB2ICA9IC1zbip1MSArIGNuKnYxCiAgIH0KfQpgYGAKCgpgYGB7cn0Ka3R1bmUgPSBjKDIwLjUwMjkxLCAyMC41ODA5MDIsIDIwLjY2NzIwNzMsIDIwLjc0OTgsIDIwLjgwMDc3NiwgMjAuOTkwOTEpCnUwID0gYygyOjEwKS8yCk5UcGx0cyA9IDQwMDAKYGBgCgplLiAgTm93LCBjcmVhdGUgYSBncmlkIG9mIHNpeCBwaGFzZSBzcGFjZSBwbG90cywgb25lIGZvciBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG9mIGJldGF0cm9uIHR1bmU6ICAkXG51JCA9IGByIGt0dW5lYC4gIEZvciAqKmVhY2ggcGxvdCoqLCB0cmFjayBhIGNvbGxlY3Rpb24gb2YgcGFydGljbGVzIHdpdGggaW5pdGlhbCBjb25kaXRpb25zICR1XzAkID0gYHIgdTBgLCAkdl8wJCA9IDAsIGFuZCB0cmFjayBlYWNoIHBhcnRpY2xlIGZvciBgciBOVHBsdHNgIHR1cm5zLiAgSW4gZWFjaCBwaGFzZSBzcGFjZSBwbG90LCBpbmRpY2F0ZSB3aXRoIGEgcmVkIGNpcmNsZSB0aGUgYXJlYSB3aGljaCB3b3VsZCBjb250YWluIDk1JSBvZiB0aGUgcGFydGljbGVzIGluIHRoZSBiZWFtIChpbiB0aGUgYWJzZW5jZSBvZiB0aGUgYmVhbS1iZWFtIGtpY2sgaXRzZWxmKS4KCmBgYHtyfQpwYXIobWZyb3c9YygyLDMpKQprcGwgPSAwCndoaWxlKGtwbDxsZW5ndGgoa3R1bmUpKXsKICAga3BsPWtwbCsxCiAgIGFsaW0gPSAxMAogICBudSA9IGt0dW5lW2twbF0KICAgY24gPSBjb3MoMipwaSpudSkKICAgc24gPSBzaW4oMipwaSpudSkKICAgcGxvdCgwLDAsdHlwPSJuIix4bGltPWMoLWFsaW0sYWxpbSkseWxpbT1jKC1hbGltLGFsaW0pLGFzcD0xLHhsYWI9InUiLHlsYWI9InYiLAogICAgICBtYWluPXBhc3RlKCJudSA9Iixyb3VuZChudSw0KSkpCiAgIHN5bWJvbHMoMCwwLGNpcmNsZXM9c3FydCg2KSxhZGQ9VFJVRSxmZz0icmVkIixpbmNoZXMgPSBGQUxTRSxsd2Q9MykKICAgbT0wCiAgIHdoaWxlKG08bGVuZ3RoKHUwKSl7CiAgICAgIG09bSsxCiAgICAgIHUgPSB1MFttXQogICAgICB2ID0gMAogICAgICBpPTAKICAgICAgd2hpbGUoaTxOVHBsdHMpewogICAgICAgICBwb2ludHModSx2LHBjaD0iLiIpCiAgICAgICAgIGk9aSsxCiAgICAgICAgIHUxID0gIHUKICAgICAgICAgdjEgPSAgdiArIGR2KHUpCiAgICAgICAgIHUgID0gIGNuKnUxICsgc24qdjEKICAgICAgICAgdiAgPSAtc24qdTEgKyBjbip2MQogICAgICB9CiAgIH0KfQpgYGAKCgo=