Beta Plot

L  = 30
F  = 25
N2cells = 48    # No. of half-cells; = 2x no. of full FODO cells

Consider a set of FODO cells, where each cell is made up of a drift of length \(L\) = 30 m followed by a defocusing quadrupole of focal length \(F\) = -25 m followed by a drift of length \(L\) followed by a focusing quadrupole of focal length \(F\) = +25 m.

Mf = matrix(c(  1,  0,
              -1/F, 1), nrow=2, ncol=2, byrow=TRUE)
Md = matrix(c(  1,  0,
               1/F, 1), nrow=2, ncol=2, byrow=TRUE)
Mo = matrix(c(  1,  L,
                0,  1), nrow=2, ncol=2, byrow=TRUE)
Mc = Mf %*% Mo %*% Md %*% Mo        # note the order, right-to-left
# Initial values of beta,alpha,gamma:
alpha0 = 1.2
beta0  = 60    # m
gamma0 = (1+alpha0[1]^2)/beta0[1]  # 1/m

Let’s assume that the Courant-Snyder parameters describing the horizontal motion upon entrance to the first FODO cell are \(\alpha_0\) = 1.2 and \(\beta_0\) = 60 m.

  1. Create the matrix \(K\) using the parameters above, and compute the values of the CS parameters at the end of each \(F\) and \(D\) quadrupole through a system of 24 FODO cells by propagating the \(K\) matrix according to \[ K_2 = M K_1 M^T \]
# Compute beta through a series of (drift + quad)'s:
MoF = Mf %*% Mo
MoD = Md %*% Mo

alpha = alpha0
beta  = beta0
gamma = gamma0

K = array(0,dim=c(2,2,N2cells+1))
# Initial K matrix:
K[,,1] = matrix(c(  beta[1], -alpha[1] ,
                  -alpha[1],  gamma[1] ),nrow=2,ncol=2,byrow=TRUE)
K[,,1]
 [,1]        [,2]

[1,] 60.0 -1.20000000 [2,] -1.2 0.04066667

# iterate through the beam line:   
i = 2
while(i<(N2cells+1)){
   K[,,i]   = MoD %*% K[,,i-1] %*% t(MoD)
   K[,,i+1] = MoF %*% K[,,i]   %*% t(MoF)
   i = i+2
}

# compute the Courant-Snyder parameters at each quad:
i = 1
while(i<(N2cells+1)){
   i = i+1
   beta[i]  =  K[1,1,i]
   alpha[i] = -K[1,2,i]
   gamma[i] =  K[2,2,i]
}
  1. Plot the results as a function of distance along the FODO system, including the functional form of the amplitude function (\(\beta\)) between the quadrupoles.
# Path length along the FODO system:
s = cumsum( rep(L,N2cells+2) ) 
# i.e., repeat L N2cells+2 times, and make a vector of the cummulative sum

# Write a Function to plot beta
bet_0 = beta[1]; alph_0 = alpha[1]
bet <- function(x){ 
   bet_0 - 2*alph_0*x + (1+alph_0^2)/bet_0*x^2
}

# initialize the plot; typ="n" means do not plot any points
plot(0,0, xlim=c(0,L*length(s)), ylim=c(0,1.5*max(beta)), typ="n",
   xlab="distance, s [m]", ylab="beta(s) [ m]")

i = 1
while(i<(N2cells+2)){
   i = i+1
   alph_0 = alpha[i-1]; bet_0 = beta[i-1]
   curve( bet(x-s[i-1]), s[i-1], s[i], add=TRUE)
}

Beta Track

# Create a particle distribution
Npar  = 200   # number of particles in our distribution
rms0  =   1   # mm    initial beam size (rms)
  1. Create a collection of 200 particles which has a Gaussian distribution in \(x\) with rms width 1 mm, and which has a phase space distribution consistent with the initial set of Courant-Snyder parameters found in the previous section. Plot the phase space distribution and histograms of the \(x\) and \(x'\) variables just created.
#  xt, xtp (= x') will be 2-D arrays to be tracked
#     1st parameter = particle number
#     2nd parameter = value of x or x'

xt   = array(0, dim=c(Npar,length(s)+1))
pt   = array(0, dim=c(Npar,length(s)+1))
xpt  = array(0, dim=c(Npar,length(s)+1))

# randomly choose initial conditions for all the particles
xt[,1]  = rnorm(Npar,0,rms0)
pt[,1]  = rnorm(Npar,0,rms0)

# Use pre-given values of beta, alpha
b0      =  beta[1]
a0      = alpha[1]
xpt[,1] = (pt[,1]-a0*xt[,1])/b0  # mrad

plot(xt[,1],xpt[,1], 
   xlim=c(-1,1)*max(abs(xt)), ylim=c(-1,1)*max(abs(xpt)),
   xlab="position x (mm)", ylab="angle x' (mrad)")


hist(xt[,1])

hist(xpt[,1])

  1. For each particle in the distribution just found, track its phase space coordinates through the system of 24 FODO cells used previously. Trace the trajectory of each particle through the system by plotting its \(x\) coordinate as a function of \(s\). Compare the resulting “envelope” of the trajectories with the function \(\sqrt{\beta}(s)\) (scaled arbitrarily) found in the previous problem. Plot the trajectory of the last particle with a different color, to emphasize a typical single-particle trajectory.
# Track the distribution through the beam line

# initialize the plot; typ="n" means do not plot any points
plot(0,0, xlim=c(0,L*length(s)), 
   ylim=c(-1,1)*1.8*max(abs(xt)), typ="n",
   xlab="distance s (m)", ylab="position x (mm)")

q = 1/F      # magnitude of quad strength 
i = 1        # i = position along the beam line
while(i<(length(s))){
   i = i+1
   j =   1   # j = particle number
   while(j<(Npar)){
      j = j+1
      xt[j,i]  =  xt[j,i-1]  + L*xpt[j,i-1]
      xpt[j,i] = xpt[j,i-1]  -    xt[j,i]*q*(-1)^(i+1)
      lines(c(s[i-1],s[i]),c(xt[j,i-1],xt[j,i]),    # draw lines
         col=ifelse( j == Npar, "red", "black") )   # make last line RED
      }
}
# Add plot of sqrt(beta(s)) to the tracking result
#    scale by arbitrary amount, A (manuallly, for now...)
A = 0.4
i = 1
while( i < length(s) ){
   i = i+1
   alph_0 = alpha[i-1]; bet_0 = beta[i-1]
   curve( A*sqrt(bet(x-s[i-1])), s[i-1], s[i], add=TRUE, col="blue",lwd=3)
   curve(-A*sqrt(bet(x-s[i-1])), s[i-1], s[i], add=TRUE, col="blue",lwd=3)
}
text(400,-1.25*max(abs(xt)),"blue = ~sqrt(beta(s))")

An interesting exercise is to go back to the beginning and vary the values for the initial \(\alpha\) and \(\beta\) (new values for alpha and beta near the top of the notebook) and re-run the entire notebook. The spread in particle trajectories seen in the above plot will change, but the computed beam envelope through the line will still agree with the ensemble of particle tracks.

Is it possible to find an initial set of C-S conditions that will create a periodic pattern of the beam distribution throughout the FODO transport system?

Note: To access the code to this notebook, scroll up to the top of the page and click on the box labeled Code; select Download Rmd and the R markdown file will be downloaded to your computer and can be edited and re-run using Rstudio.

LS0tCnRpdGxlOiAiQmV0YSBGdW5jdGlvbiBDYWxjdWxhdGlvbnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyLCBlY2hvPUZBTFNFfQpybShsaXN0PWxzKCkpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUscmVzdWx0cz0nYXNpcycsZXZhbD1UUlVFKQpgYGAKCiMjIyBCZXRhIFBsb3QKCmBgYHtyIHBhcmFtcyxldmFsPVRSVUV9CkwgID0gMzAKRiAgPSAyNQpOMmNlbGxzID0gNDggICAgIyBOby4gb2YgaGFsZi1jZWxsczsgPSAyeCBuby4gb2YgZnVsbCBGT0RPIGNlbGxzCmBgYAoKCkNvbnNpZGVyIGEgc2V0IG9mICoqRk9ETyoqIGNlbGxzLCB3aGVyZSBlYWNoICpjZWxsKiBpcyBtYWRlIHVwIG9mIGEgZHJpZnQgb2YgbGVuZ3RoICRMJCA9IGByIExgIG0gZm9sbG93ZWQgYnkgYSBkZWZvY3VzaW5nIHF1YWRydXBvbGUgb2YgZm9jYWwgbGVuZ3RoICRGJCA9IGByIC1GYCBtIGZvbGxvd2VkIGJ5IGEgZHJpZnQgb2YgbGVuZ3RoICRMJCBmb2xsb3dlZCBieSBhIGZvY3VzaW5nIHF1YWRydXBvbGUgb2YgZm9jYWwgbGVuZ3RoICRGJCA9ICtgciBGYCBtLgoKYGBge3IgbWF0cmljZXN9Ck1mID0gbWF0cml4KGMoICAxLCAgMCwKICAgICAgICAgICAgICAtMS9GLCAxKSwgbnJvdz0yLCBuY29sPTIsIGJ5cm93PVRSVUUpCk1kID0gbWF0cml4KGMoICAxLCAgMCwKICAgICAgICAgICAgICAgMS9GLCAxKSwgbnJvdz0yLCBuY29sPTIsIGJ5cm93PVRSVUUpCk1vID0gbWF0cml4KGMoICAxLCAgTCwKICAgICAgICAgICAgICAgIDAsICAxKSwgbnJvdz0yLCBuY29sPTIsIGJ5cm93PVRSVUUpCk1jID0gTWYgJSolIE1vICUqJSBNZCAlKiUgTW8gICAgICAgICMgbm90ZSB0aGUgb3JkZXIsIHJpZ2h0LXRvLWxlZnQKYGBgCgpgYGB7ciBpbml0aWFsaXplLCBldmFsPVRSVUV9CiMgSW5pdGlhbCB2YWx1ZXMgb2YgYmV0YSxhbHBoYSxnYW1tYToKYWxwaGEwID0gMS4yCmJldGEwICA9IDYwICAgICMgbQpnYW1tYTAgPSAoMSthbHBoYTBbMV1eMikvYmV0YTBbMV0gICMgMS9tCmBgYApMZXQncyBhc3N1bWUgdGhhdCB0aGUgQ291cmFudC1TbnlkZXIgcGFyYW1ldGVycyBkZXNjcmliaW5nIHRoZSBob3Jpem9udGFsIG1vdGlvbiB1cG9uIGVudHJhbmNlIHRvIHRoZSBmaXJzdCBGT0RPIGNlbGwgYXJlICRcYWxwaGFfMCQgPSBgciBhbHBoYTBgIGFuZCAkXGJldGFfMCQgPSBgciBiZXRhMGAgbS4KCmEuIENyZWF0ZSB0aGUgbWF0cml4ICRLJCB1c2luZyB0aGUgcGFyYW1ldGVycyBhYm92ZSwgYW5kIGNvbXB1dGUgdGhlIHZhbHVlcyBvZiB0aGUgQ1MgcGFyYW1ldGVycyBhdCB0aGUgZW5kIG9mIGVhY2ggJEYkIGFuZCAkRCQgcXVhZHJ1cG9sZSB0aHJvdWdoIGEgc3lzdGVtIG9mIGByIE4yY2VsbHMvMmAgRk9ETyBjZWxscyBieSBwcm9wYWdhdGluZyB0aGUgJEskIG1hdHJpeCBhY2NvcmRpbmcgdG8KJCQKICBLXzIgPSBNIEtfMSBNXlQKJCQKCmBgYHtyIEt0cmFuc3BvcnR9CiMgQ29tcHV0ZSBiZXRhIHRocm91Z2ggYSBzZXJpZXMgb2YgKGRyaWZ0ICsgcXVhZCknczoKTW9GID0gTWYgJSolIE1vCk1vRCA9IE1kICUqJSBNbwoKYWxwaGEgPSBhbHBoYTAKYmV0YSAgPSBiZXRhMApnYW1tYSA9IGdhbW1hMAoKSyA9IGFycmF5KDAsZGltPWMoMiwyLE4yY2VsbHMrMSkpCiMgSW5pdGlhbCBLIG1hdHJpeDoKS1ssLDFdID0gbWF0cml4KGMoICBiZXRhWzFdLCAtYWxwaGFbMV0gLAogICAgICAgICAgICAgICAgICAtYWxwaGFbMV0sICBnYW1tYVsxXSApLG5yb3c9MixuY29sPTIsYnlyb3c9VFJVRSkKS1ssLDFdCgojIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYmVhbSBsaW5lOiAgIAppID0gMgp3aGlsZShpPChOMmNlbGxzKzEpKXsKICAgS1ssLGldICAgPSBNb0QgJSolIEtbLCxpLTFdICUqJSB0KE1vRCkKICAgS1ssLGkrMV0gPSBNb0YgJSolIEtbLCxpXSAgICUqJSB0KE1vRikKICAgaSA9IGkrMgp9CgojIGNvbXB1dGUgdGhlIENvdXJhbnQtU255ZGVyIHBhcmFtZXRlcnMgYXQgZWFjaCBxdWFkOgppID0gMQp3aGlsZShpPChOMmNlbGxzKzEpKXsKICAgaSA9IGkrMQogICBiZXRhW2ldICA9ICBLWzEsMSxpXQogICBhbHBoYVtpXSA9IC1LWzEsMixpXQogICBnYW1tYVtpXSA9ICBLWzIsMixpXQp9CmBgYAoKYi4gUGxvdCB0aGUgcmVzdWx0cyBhcyBhIGZ1bmN0aW9uIG9mIGRpc3RhbmNlIGFsb25nIHRoZSBGT0RPIHN5c3RlbSwgaW5jbHVkaW5nIHRoZSBmdW5jdGlvbmFsIGZvcm0gb2YgdGhlIGFtcGxpdHVkZSBmdW5jdGlvbiAoJFxiZXRhJCkgYmV0d2VlbiB0aGUgcXVhZHJ1cG9sZXMuCgpgYGB7ciBiZXRhUGxvdH0KIyBQYXRoIGxlbmd0aCBhbG9uZyB0aGUgRk9ETyBzeXN0ZW06CnMgPSBjdW1zdW0oIHJlcChMLE4yY2VsbHMrMikgKSAKIyBpLmUuLCByZXBlYXQgTCBOMmNlbGxzKzIgdGltZXMsIGFuZCBtYWtlIGEgdmVjdG9yIG9mIHRoZSBjdW1tdWxhdGl2ZSBzdW0KCiMgV3JpdGUgYSBGdW5jdGlvbiB0byBwbG90IGJldGEKYmV0XzAgPSBiZXRhWzFdOyBhbHBoXzAgPSBhbHBoYVsxXQpiZXQgPC0gZnVuY3Rpb24oeCl7IAogICBiZXRfMCAtIDIqYWxwaF8wKnggKyAoMSthbHBoXzBeMikvYmV0XzAqeF4yCn0KCiMgaW5pdGlhbGl6ZSB0aGUgcGxvdDsgdHlwPSJuIiBtZWFucyBkbyBub3QgcGxvdCBhbnkgcG9pbnRzCnBsb3QoMCwwLCB4bGltPWMoMCxMKmxlbmd0aChzKSksIHlsaW09YygwLDEuNSptYXgoYmV0YSkpLCB0eXA9Im4iLAogICB4bGFiPSJkaXN0YW5jZSwgcyBbbV0iLCB5bGFiPSJiZXRhKHMpIFsgbV0iKQoKaSA9IDEKd2hpbGUoaTwoTjJjZWxscysyKSl7CiAgIGkgPSBpKzEKICAgYWxwaF8wID0gYWxwaGFbaS0xXTsgYmV0XzAgPSBiZXRhW2ktMV0KICAgY3VydmUoIGJldCh4LXNbaS0xXSksIHNbaS0xXSwgc1tpXSwgYWRkPVRSVUUpCn0KYGBgCgoKIyMjIEJldGEgVHJhY2sKCmBgYHtyIE51bVBhciwgZXZhbD1UUlVFfQojIENyZWF0ZSBhIHBhcnRpY2xlIGRpc3RyaWJ1dGlvbgpOcGFyICA9IDIwMCAgICMgbnVtYmVyIG9mIHBhcnRpY2xlcyBpbiBvdXIgZGlzdHJpYnV0aW9uCnJtczAgID0gICAxICAgIyBtbSAgICBpbml0aWFsIGJlYW0gc2l6ZSAocm1zKQpgYGAKCmEuIENyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgYHIgTnBhcmAgcGFydGljbGVzIHdoaWNoIGhhcyBhIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbiBpbiAkeCQgd2l0aCBybXMgd2lkdGggYHIgcm1zMGAgbW0sIGFuZCB3aGljaCBoYXMgYSBwaGFzZSBzcGFjZSBkaXN0cmlidXRpb24gY29uc2lzdGVudCB3aXRoIHRoZSBpbml0aWFsIHNldCBvZiBDb3VyYW50LVNueWRlciBwYXJhbWV0ZXJzIGZvdW5kIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiAgUGxvdCB0aGUgcGhhc2Ugc3BhY2UgZGlzdHJpYnV0aW9uIGFuZCBoaXN0b2dyYW1zIG9mIHRoZSAkeCQgYW5kICR4JyQgdmFyaWFibGVzIGp1c3QgY3JlYXRlZC4KCmBgYHtyIGRpc3RyQmV0YXN9CiMgIHh0LCB4dHAgKD0geCcpIHdpbGwgYmUgMi1EIGFycmF5cyB0byBiZSB0cmFja2VkCiMgICAgIDFzdCBwYXJhbWV0ZXIgPSBwYXJ0aWNsZSBudW1iZXIKIyAgICAgMm5kIHBhcmFtZXRlciA9IHZhbHVlIG9mIHggb3IgeCcKCnh0ICAgPSBhcnJheSgwLCBkaW09YyhOcGFyLGxlbmd0aChzKSsxKSkKcHQgICA9IGFycmF5KDAsIGRpbT1jKE5wYXIsbGVuZ3RoKHMpKzEpKQp4cHQgID0gYXJyYXkoMCwgZGltPWMoTnBhcixsZW5ndGgocykrMSkpCgojIHJhbmRvbWx5IGNob29zZSBpbml0aWFsIGNvbmRpdGlvbnMgZm9yIGFsbCB0aGUgcGFydGljbGVzCnh0WywxXSAgPSBybm9ybShOcGFyLDAscm1zMCkKcHRbLDFdICA9IHJub3JtKE5wYXIsMCxybXMwKQoKIyBVc2UgcHJlLWdpdmVuIHZhbHVlcyBvZiBiZXRhLCBhbHBoYQpiMCAgICAgID0gIGJldGFbMV0KYTAgICAgICA9IGFscGhhWzFdCnhwdFssMV0gPSAocHRbLDFdLWEwKnh0WywxXSkvYjAgICMgbXJhZAoKcGxvdCh4dFssMV0seHB0WywxXSwgCiAgIHhsaW09YygtMSwxKSptYXgoYWJzKHh0KSksIHlsaW09YygtMSwxKSptYXgoYWJzKHhwdCkpLAogICB4bGFiPSJwb3NpdGlvbiB4IChtbSkiLCB5bGFiPSJhbmdsZSB4JyAobXJhZCkiKQoKaGlzdCh4dFssMV0pCmhpc3QoeHB0WywxXSkKYGBgCgpiLiBGb3IgZWFjaCBwYXJ0aWNsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGp1c3QgZm91bmQsIHRyYWNrIGl0cyBwaGFzZSBzcGFjZSBjb29yZGluYXRlcyB0aHJvdWdoIHRoZSBzeXN0ZW0gb2YgYHIgTjJjZWxscy8yYCBGT0RPIGNlbGxzIHVzZWQgcHJldmlvdXNseS4gIFRyYWNlIHRoZSB0cmFqZWN0b3J5IG9mIGVhY2ggcGFydGljbGUgdGhyb3VnaCB0aGUgc3lzdGVtIGJ5IHBsb3R0aW5nIGl0cyAkeCQgY29vcmRpbmF0ZSBhcyBhIGZ1bmN0aW9uIG9mICRzJC4gIENvbXBhcmUgdGhlIHJlc3VsdGluZyAiZW52ZWxvcGUiIG9mIHRoZSB0cmFqZWN0b3JpZXMgd2l0aCB0aGUgZnVuY3Rpb24gJFxzcXJ0e1xiZXRhfShzKSQgKHNjYWxlZCBhcmJpdHJhcmlseSkgZm91bmQgaW4gdGhlIHByZXZpb3VzIHByb2JsZW0uICBQbG90IHRoZSB0cmFqZWN0b3J5IG9mIHRoZSBsYXN0IHBhcnRpY2xlIHdpdGggYSBkaWZmZXJlbnQgY29sb3IsIHRvIGVtcGhhc2l6ZSBhIHR5cGljYWwgc2luZ2xlLXBhcnRpY2xlIHRyYWplY3RvcnkuCgoKYGBge3IgVHJhY2tBbGx9CiMgVHJhY2sgdGhlIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRoZSBiZWFtIGxpbmUKCiMgaW5pdGlhbGl6ZSB0aGUgcGxvdDsgdHlwPSJuIiBtZWFucyBkbyBub3QgcGxvdCBhbnkgcG9pbnRzCnBsb3QoMCwwLCB4bGltPWMoMCxMKmxlbmd0aChzKSksIAogICB5bGltPWMoLTEsMSkqMS44Km1heChhYnMoeHQpKSwgdHlwPSJuIiwKICAgeGxhYj0iZGlzdGFuY2UgcyAobSkiLCB5bGFiPSJwb3NpdGlvbiB4IChtbSkiKQoKcSA9IDEvRiAgICAgICMgbWFnbml0dWRlIG9mIHF1YWQgc3RyZW5ndGggCmkgPSAxICAgICAgICAjIGkgPSBwb3NpdGlvbiBhbG9uZyB0aGUgYmVhbSBsaW5lCndoaWxlKGk8KGxlbmd0aChzKSkpewogICBpID0gaSsxCiAgIGogPSAgIDEgICAjIGogPSBwYXJ0aWNsZSBudW1iZXIKICAgd2hpbGUoajwoTnBhcikpewogICAgICBqID0gaisxCiAgICAgIHh0W2osaV0gID0gIHh0W2osaS0xXSAgKyBMKnhwdFtqLGktMV0KICAgICAgeHB0W2osaV0gPSB4cHRbaixpLTFdICAtICAgIHh0W2osaV0qcSooLTEpXihpKzEpCiAgICAgIGxpbmVzKGMoc1tpLTFdLHNbaV0pLGMoeHRbaixpLTFdLHh0W2osaV0pLCAgICAjIGRyYXcgbGluZXMKICAgICAgICAgY29sPWlmZWxzZSggaiA9PSBOcGFyLCAicmVkIiwgImJsYWNrIikgKSAgICMgbWFrZSBsYXN0IGxpbmUgUkVECiAgICAgIH0KfQojIEFkZCBwbG90IG9mIHNxcnQoYmV0YShzKSkgdG8gdGhlIHRyYWNraW5nIHJlc3VsdAojICAgIHNjYWxlIGJ5IGFyYml0cmFyeSBhbW91bnQsIEEgKG1hbnVhbGxseSwgZm9yIG5vdy4uLikKQSA9IDAuNAppID0gMQp3aGlsZSggaSA8IGxlbmd0aChzKSApewogICBpID0gaSsxCiAgIGFscGhfMCA9IGFscGhhW2ktMV07IGJldF8wID0gYmV0YVtpLTFdCiAgIGN1cnZlKCBBKnNxcnQoYmV0KHgtc1tpLTFdKSksIHNbaS0xXSwgc1tpXSwgYWRkPVRSVUUsIGNvbD0iYmx1ZSIsbHdkPTMpCiAgIGN1cnZlKC1BKnNxcnQoYmV0KHgtc1tpLTFdKSksIHNbaS0xXSwgc1tpXSwgYWRkPVRSVUUsIGNvbD0iYmx1ZSIsbHdkPTMpCn0KdGV4dCg0MDAsLTEuMjUqbWF4KGFicyh4dCkpLCJibHVlID0gfnNxcnQoYmV0YShzKSkiKQpgYGAKCgpBbiBpbnRlcmVzdGluZyBleGVyY2lzZSBpcyB0byBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgYW5kIHZhcnkgdGhlIHZhbHVlcyBmb3IgdGhlIGluaXRpYWwgJFxhbHBoYSQgYW5kICRcYmV0YSQgKG5ldyB2YWx1ZXMgZm9yIGBhbHBoYWAgYW5kIGBiZXRhYCBuZWFyIHRoZSB0b3Agb2YgdGhlIG5vdGVib29rKSBhbmQgcmUtcnVuIHRoZSBlbnRpcmUgbm90ZWJvb2suICBUaGUgc3ByZWFkIGluIHBhcnRpY2xlIHRyYWplY3RvcmllcyBzZWVuIGluIHRoZSBhYm92ZSBwbG90IHdpbGwgY2hhbmdlLCBidXQgdGhlIGNvbXB1dGVkIGJlYW0gZW52ZWxvcGUgdGhyb3VnaCB0aGUgbGluZSB3aWxsIHN0aWxsIGFncmVlIHdpdGggdGhlIGVuc2VtYmxlIG9mIHBhcnRpY2xlIHRyYWNrcy4gIAoKSXMgaXQgcG9zc2libGUgdG8gZmluZCBhbiBpbml0aWFsIHNldCBvZiBDLVMgY29uZGl0aW9ucyB0aGF0IHdpbGwgY3JlYXRlIGEgKnBlcmlvZGljKiBwYXR0ZXJuIG9mIHRoZSBiZWFtIGRpc3RyaWJ1dGlvbiB0aHJvdWdob3V0IHRoZSBGT0RPIHRyYW5zcG9ydCBzeXN0ZW0/CgoqTm90ZToqICBUbyBhY2Nlc3MgdGhlIGNvZGUgdG8gdGhpcyBub3RlYm9vaywgc2Nyb2xsIHVwIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2UgYW5kIGNsaWNrIG9uIHRoZSBib3ggbGFiZWxlZCAqQ29kZSo7IHNlbGVjdCAqRG93bmxvYWQgUm1kKiBhbmQgdGhlIGBSIG1hcmtkb3duYCBmaWxlIHdpbGwgYmUgZG93bmxvYWRlZCB0byB5b3VyIGNvbXB1dGVyIGFuZCBjYW4gYmUgZWRpdGVkIGFuZCByZS1ydW4gdXNpbmcgYFJzdHVkaW9gLgoKCmBgYHtyIFBlckNTcGFyYW1zLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojIEluaXRpYWwgdmFsdWVzIG9mIGJldGEsYWxwaGEsZ2FtbWE6CmFsUHJkID0gc3FydCgoMStMLzIvRikvKDEtTC8yL0YpKQpiZVByZCA9IDIqRiphbHBoYVsxXQpnYVByZCA9ICgxK2FscGhhWzFdXjIpL2JldGFbMV0KCiMgY29tcGFyZSB3aXRoIG1hdHJpeCBjYWxjdWxhdGlvbjoKbXUyID0gYWNvcyhzdW0oZGlhZyhNYykpLzIpCmFsMiA9IChNY1sxLDFdLU1jWzIsMl0pLzIvc2luKG11MikKYmUyID0gTWNbMSwyXS9zaW4obXUyKQpnYTIgPSAtTWNbMiwxXS9zaW4obXUyKQpgYGAK