PROGRAM MANAGE
C ***** GLOBAL INPUT PARAMETERS
COMMON /MANPAR/ PPROB,PYMAX,PNYSTP,PKSTEP,PDSTEP,PNBSTP,PBMIN,
1 PBMAX,PSCALE,PHASET,PHASEP,PCYCLE,PLEVEL,PSLOPE
REAL PPROB, PYMAX, PNYSTP, PKSTEP, PDSTEP, PNBSTP, PBMIN, PBMAX,
1 PSCALE, PHASET, PHASEP, PCYCLE, PLEVEL, PSLOPE
COMMON /MANDAT/ ISTART, IYEAR, NS, NZ, RKLO, RKHI
INTEGER ISTART, IYEAR, NS, NZ
REAL RKLO, RKHI
PARAMETER (MAXYR = 200, MAXEST = 100)
PARAMETER (MSIZE = (MAXEST * (MAXEST + 1) / 2))
REAL CATCH(0:MAXYR), SIGHT(0:MAXEST), FMATRX(0:MSIZE),
1 ZMULT(0:MAXEST), POP(0:MAXYR), G(0:MAXYR), RAWCL, CL
INTEGER ISYR(0:MAXEST), IZYR(0:MAXEST), POUT
C ***** LOCAL VARIABLES
CHARACTER STOCK*30, FORMT*50
INTEGER IY, INITYR, I, IS, IYRCL, ILAST, N, IN, IOUT
C ***** Read in the data required for application of the CLA
DATA IN/2/, IOUT/3/
OPEN (IN, FILE = 'CLC.DAT')
OPEN (IOUT, FILE = 'CLC.OUT')
CALL RDPARS
READ (IN, '(A30/)') STOCK
WRITE (IOUT, '(A30/)') STOCK
WRITE (*, '(A30/)') STOCK
C Read the year of the first catch, the first year for which catch
C limits are to be set & the phaseout option
READ (IN, '(T30,I4)') INITYR
WRITE (IOUT, '(A,T30,I4)') 'Year of first input data', INITYR
WRITE (*, '(A,T30,I4)') 'Year of first input data', INITYR
READ (IN, '(T30,I4)') IYRCL
WRITE (IOUT, '(A, T30, I4)') 'Year of first catch limit', IYRCL
WRITE (*, '(A, T30, I4)') 'Year of first catch limit', IYRCL
READ (IN, '(T30, I4)') POUT
IF (POUT .EQ. 1) THEN
WRITE (IOUT, '(A, T30,A4)') 'Apply phaseout if necessary', 'YES'
WRITE (*, '(A, T30,A4)') 'Apply phaseout if necessary', 'YES'
ELSE
WRITE (IOUT, '(A, T30,A4)') 'Apply phaseout', 'No'
WRITE (*, '(A, T30,A4)') 'Apply phaseout', 'No'
ENDIF
C Re-scale IYRCL such that 0 is the year prior to the first input data
ISTART = 0
IYEAR = IYRCL - INITYR
IF (IYEAR .LE. 0 .OR. IYEAR .GT. MAXYR) STOP 'INVALID YEAR'
C Initialize the catch array
DO 10 I = 0, MAXYR
CATCH(I) = 0
10 CONTINUE
C Read in the catch data, scaling each year to the initial year
READ (IN, '(// A)') FORMT
WRITE (IOUT, '(/A)') 'Historic catches:'
WRITE (*, '(/A)') 'Historic catches:'
TOTALC = 0
DO 20 I = 0, MAXYR
READ (IN, FORMT) IY, C
IF (IY .LT. 0) GO TO 25
WRITE (IOUT, FORMT) IY, C
WRITE (*, FORMT) IY, C
IY = IY - INITYR
IF (IY .LT. 0 .OR. IY .GE. IYEAR) STOP
CATCH(IY) = C
TOTALC = TOTALC + C
20 CONTINUE
25 IF (TOTALC .LT. 0) STOP ' ERROR: No historic catch input'
C Read in the non-zero sightings estimates and information matrix
READ (IN, '(//T30, I4 / A)') NS, FORMT
WRITE (IOUT, '(/A)') 'Abundance estimates:'
WRITE (*, '(/A)') 'Abundance estimates:'
IF (NS .GT. MAXEST) STOP 'ERROR: Abundance year out of range'
DO 30 N=0,NS-1
N1 = (N * (N + 1)) / 2
READ (IN, FORMT) ISYR(N), SIGHT(N), (FMATRX(N1 + J), J = 0, N)
WRITE (IOUT, FORMT) ISYR(N), SIGHT(N),
1 (FMATRX (N1 + J), j = 0, N)
WRITE (*, FORMT) ISYR(N), SIGHT(N),
1 (FMATRX (N1 + J), j = 0, N)
ISYR(N) = ISYR(N) - INITYR
IF (ISYR(N) .LT. 0 .OR. ISYR(N) .GE. IYEAR) STOP
1 'ERROR: Sight year out of range'
IF (SIGHT(N) .LE. 0.0) STOP ' ERROR: Estimate not positive'
30 CONTINUE
C Read in the Poisson multipliers for any zero sightings estimates
READ (IN, '(/T30, I3, /A)') NZ, FORMAT
IF (NZ .GT. 0) THEN
WRITE (IOUT, '(/A)') 'Zero abundance estimates:'
WRITE (*, '(/A)') 'Zero abundance estimates:'
ENDIF
IF (NZ .GT. MAXEST) STOP ' ERROR: Zero estimate array too small'
DO 40 N = 0, NZ - 1
N1 = (N * (N + 1)) / 2
READ (IN, FORMT) IZYR(N), ZMULT(N)
WRITE (IOUT, FORMT) IZYR(N), ZMULT(N)
WRITE (*, FORMT) IZYR(N), ZMULT(N)
IZYR(N) = IZYR(N) - INITYR
IF (IZYR(N) .LT. 0 .OR. IZYR(N) .GE. IYEAR) STOP
1 ' Sight year out of range'
IF (ZMULT(N) .LE. 0.0) STOP ' ERROR: Multiplier not positive'
40 CONTINUE
WRITE (IOUT, '()')
WRITE (*, '()')
C Bound the range for the integration over K
RKHI = 1.E7
RKLO = 0.0
C ******
C ****** Run the CLA to obtain the nominal catch limit
C ******
RAWCL = CLIMIT (CATCH, SIGHT, FMATRX, ISYR, IZYR, ZMULT, POP, G)
C Set the catch limits for PCYCLE years. If the catch limit may be
C subject to phaseout, call POUT to apply the phaseout rule.
C First set ILAST = year of the most recent abundance estimate
IF (NS .GT. 0) ILAST = ISYR(NS - 1)
IF (NZ .GT. 0) ILAST = MAX(IS, IZYR(NZ - 1))
C DO 100 IY = IYEAR, IYEAR + PCYCLE - 1
DO 100 IY = IYEAR, IYEAR + int(PCYCLE) - 1
IF (POUT .EQ. 1) THEN
CALL PHOUT (CL, RAWCL, ILAST, IY)
ELSE
CL = RAWCL
ENDIF
WRITE (IOUT, '(A6, I5, A17, I6)') 'Year:', IY + INITYR,
1 'Catch limit:', NINT(CL)
WRITE (* , '(A6, I5, A17, I6)') 'Year:', IY + INITYR,
1 'Catch limit:', NINT(CL)
100 CONTINUE
STOP
END
C **************************************************************************************
C **************************************************************************************
C
C CLC version 6
C
C **************************************************************************************
C
C 31 January 1994
C
C **************************************************************************************
SUBROUTINE RDPARS
C Read the file of input parameters
COMMON /MANPAR/ PPROB,PYMAX,PNYSTP,PKSTEP,PDSTEP,PNBSTP,PBMIN,
1 PBMAX,PSCALE,PHASET,PHASEP,PCYCLE,PLEVEL,PSLOPE
REAL PPROB, PYMAX, PNYSTP, PKSTEP, PDSTEP, PNBSTP, PBMIN, PBMAX,
1 PSCALE, PHASET, PHASEP, PCYCLE, PLEVEL, PSLOPE
DATA IFILE /21/
C
C Open the input file (only read once)
C
OPEN (UNIT = IFILE, FILE = 'CLC.PAR')
C
READ (IFILE, '(T30, F10.0)') PPROB,PYMAX, PNYSTP, PKSTEP, PDSTEP,
1 PBMIN, PBMAX, PNBSTP, PSCALE, PHASET,
1 PHASEP, PCYCLE, PLEVEL, PSLOPE
CLOSE (IFILE)
RETURN
END
C
C
C **************************************************************************************
C **************************************************************************************
C
SUBROUTINE PHOUT (CL, RAWCL, ILAST, IY)
C
COMMON /MANPAR/ PPROB,PYMAX,PNYSTP,PKSTEP,PDSTEP,PBMIN,PBMAX,
1 PNBSTP,PSACLE,PHASET,PHASEP,PCYCLE,PLEVEL,PSLOPE
REAL PPROB, YMAX,PNYSTP,PKSTEP,PDSTEP,PBMIN,PBMAX,PNBSTP,PSACLE,
1 PHASET, PHASEP, PCYCLE, PLEVEL, PSLOPE
C PHASET Number of years without surveys before phaseout invoked
C PHASEP Phaseout annual reduction proportion
C
REAL CL, RAWCL
INTEGER ILAST, IY
C
C Phaseout: Reduce catch limit if there is no survey data in the
C last PHASET years
IF (IY .GE. ILAST + PHASET) THEN
CL = RAWCL * (1.0 - PHASEP * (IY - ILAST - PHASET))
IF (CL .LT. 0.0) CL = 0.0
ELSE
CL = RAWCL
ENDIF
C
RETURN
END
C ***************************************************************************************
REAL FUNCTION CLIMIT (CATCH,SIGHT,FMATRX,ISYR,IZYR,ZMULT,POP,G)
C Run the CLA to obtain to nominal catch limit
C
PARAMETER (MAXSIM = 600000, MAXSTP = 500)
REAL PRES(0:MAXSIM), QRES(0:MAXSIM), SS0, SS1, SS2, SS3
C
COMMON /MANPAR/ PPROB,PYMAX,PNYSTP,PKSTEP,PDSTEP,PNBSTP,PBMIN,
1 PBMAX,PSCALE,PHASET,PHASEP,PCYCLE,PLEVEL,PSLOPE
REAL PPROB,PYMAX,PNYSTP,PKSTEP,PDSTEP,PNBSTP,PBMIN, PBMAX,
1 PSCALE,PHASET,PHASEP,PCYCLE,PLEVEL,PSLOPE
C
COMMON /MANDAT/ ISTART, IYEAR, NS, NZ, RKLO, RKHI
INTEGER ISTART, IYEAR, NS, NZ
REAL RKLO, RKHI
C
REAL CATCH(0:*),SIGHT(0:*),FMATRX(0:*),ZMULT(0:*),POP(0:*),G(0:*)
INTEGER ISYR(0:*), IZYR(0:*)
C
C Local variables:
REAL SF, Y(0:MAXSTP), B(0:MAXSTP), RLGB(0:MAXSTP)
INTEGER NB, NR
C NB Number of bias steps
C NR Number of steps for Y (the productivity parameter)
C SF Deviance scale factor (SF = .5 / PSCALE**2)
C
CLIMIT = 0.
IF (NS .LE. 0) RETURN
C
C Set deviance scale factor S = 1/PSCALE**2
SF = 0.5 / (PSCALE * PSCALE)
C
C Check the sizes of the Y and B arrays are large enough
IF (PNBSTP .GT. MAXSTP .OR. PNYSTP .GT. MAXSTP) STOP
1 'Y &/or b array sizes too small'
C Set sightings bias step sizes & their log values. BINC = Bias increment
NB = PNBSTP
BINC = (PBMAX - PBMIN) / NB
DO 10 I = 0, NB - 1
B(I) = PBMIN + (I + 0.5) * BINC
RLGB(I) = -ALOG(B(I))
10 CONTINUE
C
C Set productivity parameter step sizes (midpoints)
NR = PNYSTP
YINC = PYMAX / NR
DO 20 I = 0, NR - 1
Y(I) = (I + 0.5) * YINC
20 CONTINUE
C
PTOT = 0
N = 0
DO 50 I = 0, NR - 1
C Set R from the productivity parameter, Y
R = 1.4184 * Y(I)
C Step size for K
DK = PKSTEP
D = 1.
RK = RKHI
C Use function STKSIM to set up the Nth population trajectory
C i.e. set up the pop array
30 IF (RK .LE. RKLO .OR. STKSIM (RK, R, POP, CATCH) .LE. 0.)
1 GOTO 40
IF (N .GE. MAXSIM) STOP 'ERROR: TOO MANY SIMULATIONS'
C How much depletion covered?
DD = D - POP(IYEAR) / RK
D = POP(IYEAR) / RK
P = 0.0
IF (DD .GT. 0.) THEN
C Compute the internal catch limit corresponding to D and Y(I)
QRES(N) = CONTRL (D, Y(I), PLEVEL, PSLOPE) * POP(IYEAR)
C Calculate deviance
CALL DEVIAN (SS0, SS1, SS2, SS3, SIGHT, FMATRX, ISYR,
1 IZYR, ZMULT, POP, G)
C Scale likelihood and integrate over values for the bias parameter
DO 35 J = 0, NB - 1
P = P + EXP(-SF * (SS0 + RLGB(J) * (SS1 + RLGB(J) * SS2)
1 + SS3 * B(J)))
35 CONTINUE
C Calculate the weight for this point (& total area under likelihood)
PRES(N) = P * DD
PTOT = PTOT + PRES(N)
C Update counter
N = N + 1
C Find the next K
DK = DK * PDSTEP / DD
IF (DK .GT. PKSTEP) DK = PKSTEP
ELSE
C IF DD = 0 change the step size only
DK = PKSTEP
ENDIF
C Set the new value of K
RK = RK / (1. + DK)
GOTO 30
40 CONTINUE
50 CONTINUE
IF (PTOT .LE. 0.) STOP 'ERROR: PROB INTEGRATES TO ZERO'
C Sort the QRES and PRES arrays in ascending order of QRES
N2 = N
CALL SORT (QRES, PRES, N2)
C Normalize the relative likelihoods
DO 60 I = 0, N - 1
PRES(I) = PRES(I) / PTOT
60 CONTINUE
C Extract the desired probability level: the nominal catch limit (NCL)
C is the lower PROB% of the distribution.
C First calculate PRES(I), the probability that the NCL is between
C QRES(I) & QRES(I + 1).
P = 0
DO 70 I = 0, N - 1
P = P + PRES (I)
IF (P .GT. PPROB) GOTO 80
70 CONTINUE
C Interpolate to set the nominal catch limit
80 IF (I .GE. N - 1) THEN
Q = QRES (N - 1)
ELSE
Q = (QRES (I + 1) * (PPROB - P + PRES(I)) + QRES(I) *
1 (P - PPROB)) / PRES(I)
ENDIF
CLIMIT = Q
RETURN
END
C ***********************************************************************************
FUNCTION CONTRL (D, Y, PLEVEL, PSLOPE)
C Catch control law
IF (D .LT. PLEVEL) THEN
CONTRL = 0.
ELSEIF (D .LT. 1.) THEN
CONTRL = PSLOPE * Y * (D - PLEVEL)
ELSE
CONTRL = PSLOPE * Y * (1.0 - PLEVEL)
ENDIF
END
C **********************************************************************************
SUBROUTINE DEVIAN (SS0, SS1, SS2, SS3, SIGHT, FMATRX, ISYR,
1 IZYR, ZMULT, POP, G)
C Calculate deviance (-2 log likelihood) in terms of coefficients for
C the bias and log bias parameters
COMMON /MANDAT/ ISTART, IYEAR, NS, NZ, RKLO, RKHI
INTEGER ISTART, IYAER, NS, NZ
REAL RKLO, RKHI
REAL SS0,SS1,SS2,SIGHT(0:*),FMATRX(0:*),ZMULT(0:*),POP(0:*),G(0:*)
INTEGER ISYR(0:*), IZYR(0:*)
SS0 = 0
SS1 = 0
SS2 = 0
SS3 = 0
DO 100 N = 0, NS - 1
G(N) = ALOG (SIGHT(N) / POP(ISYR(N)))
K = N * (N + 1) / 2
DO 10 J = 0, N - 1
C 1st add non diagonal contributions (which are doubled up)
SS0 = SS0 + 2. * G(J) * G(N) * FMATRX(K)
SS1 = SS1 + 2. * (G(J) + G(N)) * FMATRX(K)
SS2 = SS2 + FMATRX(K) + FMATRX(K)
K = K + 1
10 CONTINUE
C Now add diagnoal contribution
SS0 = SS0 + G(N) * G(N) * FMATRX(K)
SS1 = SS1 + 2. * G(N) * FMATRX(K)
SS2 = SS2 + FMATRX(K)
100 CONTINUE
C Now do the zero estimates
DO 200 N = 0, NZ - 1
SS3 = SS3 + 2.0 * POP(IZYR(N)) / ZMULT(N)
200 CONTINUE
RETURN
END
C *********************************************************************************
FUNCTION STKSIM (RK, R, POP, CATCH)
C Calculate the stock trajectory with parameter RK and R: return
C the current stock size
C RK = notional carrying capacity; R = productivity parameter * 1.4184
COMMON /MANDAT/ ISTART, IYEAR, NS, NZ, RKLO, RKHI
INTEGER ISTART, IYEAR, NS, NZ
REAL RKLO, RKHI
REAL CATCH(0:*), POP(0:*)
POP(ISTART) = RK
DO 10 I = ISTART + 1, IYEAR
D = POP(I - 1) / RK
POP(I) = POP (I - 1) * (1. + R * (1. - D * D)) - CATCH(I-1)
IF (POP(I) .LE. 0) GOTO 20
10 CONTINUE
STKSIM = POP(IYEAR)
RETURN
20 STKSIM = 0.
END
C *********************************************************************************
SUBROUTINE SORT (ARRAY, ARRAY2, N)
C SORT sorts a pair of arrays in ascending order of the first array
C (using the heapsort algorithm)
REAL ARRAY(0:*), ARRAY2(0:*), TEMP, TEMP2
INTEGER N, K, IR, I, J
IF (N .LT. 2) RETURN
K = N / 2
IR = N - 1
10 IF (K .NE. 0) THEN
K = K - 1
TEMP = ARRAY(K)
TEMP2 = ARRAY2(K)
ELSE
TEMP = ARRAY(IR)
TEMP2 = ARRAY2(IR)
ARRAY(IR) = ARRAY(0)
ARRAY2(IR) = ARRAY2(0)
IR = IR - 1
IF (IR .EQ. 0) THEN
ARRAY(0) = TEMP
ARRAY2(0) = TEMP2
RETURN
ENDIF
ENDIF
I = K
J = K + K + 1
20 IF (J .LE. IR) THEN
IF (J .LT. IR .AND. ARRAY(J) .LT. ARRAY(J + 1)) J = J + 1
IF (TEMP .LT. ARRAY(J)) THEN
ARRAY(I) = ARRAY(J)
ARRAY2(I) = ARRAY2(J)
I = J
J = J + I + 1
ELSE
J = IR + 1
ENDIF
GOTO 20
ENDIF
ARRAY(I) = TEMP
ARRAY2(I) = TEMP2
GOTO 10
END
ICAgICAgUFJPR1JBTSBNQU5BR0UKCkMgKioqKiogR0xPQkFMIElOUFVUIFBBUkFNRVRFUlMKCiAgICAgIENPTU1PTiAvTUFOUEFSLyBQUFJPQixQWU1BWCxQTllTVFAsUEtTVEVQLFBEU1RFUCxQTkJTVFAsUEJNSU4sCiAgICAgMSAgICAgICAgICAgICBQQk1BWCxQU0NBTEUsUEhBU0VULFBIQVNFUCxQQ1lDTEUsUExFVkVMLFBTTE9QRQogICAgICBSRUFMIFBQUk9CLCBQWU1BWCwgUE5ZU1RQLCBQS1NURVAsIFBEU1RFUCwgUE5CU1RQLCBQQk1JTiwgUEJNQVgsCiAgICAgMQkgICBQU0NBTEUsIFBIQVNFVCwgUEhBU0VQLCBQQ1lDTEUsIFBMRVZFTCwgUFNMT1BFCgogICAgICBDT01NT04gL01BTkRBVC8gSVNUQVJULCBJWUVBUiwgTlMsIE5aLCBSS0xPLCBSS0hJCiAgICAgIElOVEVHRVIgSVNUQVJULCBJWUVBUiwgTlMsIE5aCiAgICAgIFJFQUwgUktMTywgUktISQoKICAgICAgUEFSQU1FVEVSIChNQVhZUiA9IDIwMCwgTUFYRVNUID0gMTAwKQogICAgICBQQVJBTUVURVIgKE1TSVpFID0gKE1BWEVTVCAqIChNQVhFU1QgKyAxKSAvIDIpKQogICAgICBSRUFMIENBVENIKDA6TUFYWVIpLCBTSUdIVCgwOk1BWEVTVCksIEZNQVRSWCgwOk1TSVpFKSwKICAgICAxICAgICBaTVVMVCgwOk1BWEVTVCksIFBPUCgwOk1BWFlSKSwgRygwOk1BWFlSKSwgUkFXQ0wsIENMCiAgICAgIElOVEVHRVIgSVNZUigwOk1BWEVTVCksIElaWVIoMDpNQVhFU1QpLCBQT1VUCgpDICoqKioqIExPQ0FMIFZBUklBQkxFUwoKICAgICAgQ0hBUkFDVEVSIFNUT0NLKjMwLCBGT1JNVCo1MAogICAgICBJTlRFR0VSIElZLCBJTklUWVIsIEksIElTLCBJWVJDTCwgSUxBU1QsIE4sIElOLCBJT1VUCgpDICoqKioqIFJlYWQgaW4gdGhlIGRhdGEgcmVxdWlyZWQgZm9yIGFwcGxpY2F0aW9uIG9mIHRoZSBDTEEKCiAgICAgIERBVEEgSU4vMi8sIElPVVQvMy8KICAgICAgT1BFTiAoSU4sIEZJTEUgPSAnQ0xDLkRBVCcpCiAgICAgIE9QRU4gKElPVVQsIEZJTEUgPSAnQ0xDLk9VVCcpCgogICAgICBDQUxMIFJEUEFSUwogICAgICBSRUFEIChJTiwgJyhBMzAvKScpIFNUT0NLCiAgICAgIFdSSVRFIChJT1VULCAnKEEzMC8pJykgU1RPQ0sKICAgICAgV1JJVEUgKCosICAgICcoQTMwLyknKSBTVE9DSwoKQyAJUmVhZCB0aGUgeWVhciBvZiB0aGUgZmlyc3QgY2F0Y2gsIHRoZSBmaXJzdCB5ZWFyIGZvciB3aGljaCBjYXRjaApDCWxpbWl0cyBhcmUgdG8gYmUgc2V0ICYgdGhlIHBoYXNlb3V0IG9wdGlvbgoKICAgICAgUkVBRCAoSU4sICcoVDMwLEk0KScpIElOSVRZUgogICAgICBXUklURSAoSU9VVCwgJyhBLFQzMCxJNCknKSAnWWVhciBvZiBmaXJzdCBpbnB1dCBkYXRhJywgSU5JVFlSCiAgICAgIFdSSVRFICgqLCAgICAnKEEsVDMwLEk0KScpICdZZWFyIG9mIGZpcnN0IGlucHV0IGRhdGEnLCBJTklUWVIKICAgICAgUkVBRCAoSU4sICcoVDMwLEk0KScpIElZUkNMCiAgICAgIFdSSVRFIChJT1VULCAnKEEsIFQzMCwgSTQpJykgJ1llYXIgb2YgZmlyc3QgY2F0Y2ggbGltaXQnLCBJWVJDTAogICAgICBXUklURSAoKiwgICAgJyhBLCBUMzAsIEk0KScpICdZZWFyIG9mIGZpcnN0IGNhdGNoIGxpbWl0JywgSVlSQ0wKICAgICAgUkVBRCAoSU4sICcoVDMwLCBJNCknKSBQT1VUCiAgICAgIElGIChQT1VUIC5FUS4gMSkgVEhFTgogICAgICAgIFdSSVRFIChJT1VULCAnKEEsIFQzMCxBNCknKSAnQXBwbHkgcGhhc2VvdXQgaWYgbmVjZXNzYXJ5JywgJ1lFUycKICAgICAgICBXUklURSAoKiwgICAgJyhBLCBUMzAsQTQpJykgJ0FwcGx5IHBoYXNlb3V0IGlmIG5lY2Vzc2FyeScsICdZRVMnCiAgICAgIEVMU0UKICAgICAgICBXUklURSAoSU9VVCwgJyhBLCBUMzAsQTQpJykgJ0FwcGx5IHBoYXNlb3V0JywgJ05vJwogICAgICAgIFdSSVRFICgqLCAgICAnKEEsIFQzMCxBNCknKSAnQXBwbHkgcGhhc2VvdXQnLCAnTm8nCiAgICAgIEVORElGCgpDCVJlLXNjYWxlIElZUkNMIHN1Y2ggdGhhdCAwIGlzIHRoZSB5ZWFyIHByaW9yIHRvIHRoZSBmaXJzdCBpbnB1dCBkYXRhCgogICAgICBJU1RBUlQgPSAwCiAgICAgIElZRUFSID0gSVlSQ0wgLSBJTklUWVIKICAgICAgSUYgKElZRUFSIC5MRS4gMCAuT1IuIElZRUFSIC5HVC4gTUFYWVIpIFNUT1AgJ0lOVkFMSUQgWUVBUicKCkMJSW5pdGlhbGl6ZSB0aGUgY2F0Y2ggYXJyYXkKCiAgICAgIERPIDEwIEkgPSAwLCBNQVhZUgogICAgICAgIENBVENIKEkpID0gMAogMTAgICBDT05USU5VRQoKQwlSZWFkIGluIHRoZSBjYXRjaCBkYXRhLCBzY2FsaW5nIGVhY2ggeWVhciB0byB0aGUgaW5pdGlhbCB5ZWFyCgogICAgICBSRUFEIChJTiwgJygvLyBBKScpIEZPUk1UCiAgICAgIFdSSVRFIChJT1VULCAnKC9BKScpICdIaXN0b3JpYyBjYXRjaGVzOicKICAgICAgV1JJVEUgKCosICAgICcoL0EpJykgJ0hpc3RvcmljIGNhdGNoZXM6JwogICAgICBUT1RBTEMgPSAwCiAgICAgIERPIDIwIEkgPSAwLCBNQVhZUgogICAgICAgIFJFQUQgKElOLCBGT1JNVCkgSVksIEMgCiAgICAgICAgSUYgKElZIC5MVC4gMCkgR08gVE8gMjUKICAgICAgICBXUklURSAoSU9VVCwgRk9STVQpIElZLCBDCiAgICAgICAgV1JJVEUgKCosICAgIEZPUk1UKSBJWSwgQwogICAgICAgIElZID0gSVkgLSBJTklUWVIKICAgICAgICBJRiAoSVkgLkxULiAwIC5PUi4gSVkgLkdFLiBJWUVBUikgU1RPUCAKICAgICAgICBDQVRDSChJWSkgPSBDCiAgICAgICAgVE9UQUxDID0gVE9UQUxDICsgQwogMjAgICBDT05USU5VRQoKIDI1ICAgSUYgKFRPVEFMQyAuTFQuIDApIFNUT1AgJyBFUlJPUjogTm8gaGlzdG9yaWMgY2F0Y2ggaW5wdXQnCgpDCVJlYWQgaW4gdGhlIG5vbi16ZXJvIHNpZ2h0aW5ncyBlc3RpbWF0ZXMgYW5kIGluZm9ybWF0aW9uIG1hdHJpeAoKICAgICAgUkVBRCAoSU4sICcoLy9UMzAsIEk0IC8gQSknKSBOUywgRk9STVQKICAgICAgV1JJVEUgKElPVVQsICcoL0EpJykgJ0FidW5kYW5jZSBlc3RpbWF0ZXM6JwogICAgICBXUklURSAoKiwgICAgJygvQSknKSAnQWJ1bmRhbmNlIGVzdGltYXRlczonCiAgICAgIElGIChOUyAuR1QuIE1BWEVTVCkgU1RPUCAnRVJST1I6IEFidW5kYW5jZSB5ZWFyIG91dCBvZiByYW5nZScKICAgICAgRE8gMzAgTj0wLE5TLTEKICAgICAgICBOMSA9IChOICogKE4gKyAxKSkgLyAyCiAgICAgICAgUkVBRCAoSU4sIEZPUk1UKSBJU1lSKE4pLCBTSUdIVChOKSwgKEZNQVRSWChOMSArIEopLCBKID0gMCwgTikKICAgICAgICBXUklURSAoSU9VVCwgRk9STVQpIElTWVIoTiksIFNJR0hUKE4pLCAKICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZNQVRSWCAoTjEgKyBKKSwgaiA9IDAsIE4pCiAgICAgICAgV1JJVEUgKCosICAgIEZPUk1UKSBJU1lSKE4pLCBTSUdIVChOKSwKICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZNQVRSWCAoTjEgKyBKKSwgaiA9IDAsIE4pCiAgICAgICAgSVNZUihOKSA9IElTWVIoTikgLSBJTklUWVIKICAgICAgICBJRiAoSVNZUihOKSAuTFQuIDAgLk9SLiBJU1lSKE4pIC5HRS4gSVlFQVIpIFNUT1AgCiAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAnRVJST1I6IFNpZ2h0IHllYXIgb3V0IG9mIHJhbmdlJwogICAgICAgIElGIChTSUdIVChOKSAuTEUuIDAuMCkgU1RPUCAnIEVSUk9SOiBFc3RpbWF0ZSBub3QgcG9zaXRpdmUnCiAzMCAgIENPTlRJTlVFCgpDCVJlYWQgaW4gdGhlIFBvaXNzb24gbXVsdGlwbGllcnMgZm9yIGFueSB6ZXJvIHNpZ2h0aW5ncyBlc3RpbWF0ZXMKCiAgICAgIFJFQUQgKElOLCAnKC9UMzAsIEkzLCAvQSknKSBOWiwgRk9STUFUCiAgICAgIElGIChOWiAuR1QuIDApIFRIRU4KICAgICAgICBXUklURSAoSU9VVCwgJygvQSknKSAnWmVybyBhYnVuZGFuY2UgZXN0aW1hdGVzOicKICAgICAgICBXUklURSAoKiwgICAgJygvQSknKSAnWmVybyBhYnVuZGFuY2UgZXN0aW1hdGVzOicKICAgICAgRU5ESUYKICAgICAgSUYgKE5aIC5HVC4gTUFYRVNUKSBTVE9QICcgRVJST1I6IFplcm8gZXN0aW1hdGUgYXJyYXkgdG9vIHNtYWxsJwogICAgICBETyA0MCBOID0gMCwgTlogLSAxCiAgICAgICAgTjEgPSAoTiAqIChOICsgMSkpIC8gMgogICAgICAgIFJFQUQgKElOLCBGT1JNVCkgSVpZUihOKSwgWk1VTFQoTikKICAgICAgICBXUklURSAoSU9VVCwgRk9STVQpIElaWVIoTiksIFpNVUxUKE4pCiAgICAgICAgV1JJVEUgKCosICAgIEZPUk1UKSBJWllSKE4pLCBaTVVMVChOKQogICAgICAgIElaWVIoTikgPSBJWllSKE4pIC0gSU5JVFlSCiAgICAgICAgSUYgKElaWVIoTikgLkxULiAwIC5PUi4gSVpZUihOKSAuR0UuIElZRUFSKSBTVE9QIAogICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIFNpZ2h0IHllYXIgb3V0IG9mIHJhbmdlJwogICAgICAgIElGIChaTVVMVChOKSAuTEUuIDAuMCkgU1RPUCAnIEVSUk9SOiBNdWx0aXBsaWVyIG5vdCBwb3NpdGl2ZScKIDQwICAgQ09OVElOVUUKICAgICAgV1JJVEUgKElPVVQsICcoKScpCiAgICAgIFdSSVRFICgqLCAgICAnKCknKQoKQwlCb3VuZCB0aGUgcmFuZ2UgZm9yIHRoZSBpbnRlZ3JhdGlvbiBvdmVyIEsKCiAgICAgIFJLSEkgPSAxLkU3CiAgICAgIFJLTE8gPSAwLjAKCkMgKioqKioqCkMgKioqKioqIFJ1biB0aGUgQ0xBIHRvIG9idGFpbiB0aGUgbm9taW5hbCBjYXRjaCBsaW1pdApDICoqKioqKgoKICAgICAgUkFXQ0wgPSBDTElNSVQgKENBVENILCBTSUdIVCwgRk1BVFJYLCBJU1lSLCBJWllSLCBaTVVMVCwgUE9QLCBHKQpDCVNldCB0aGUgY2F0Y2ggbGltaXRzIGZvciBQQ1lDTEUgeWVhcnMuIElmIHRoZSBjYXRjaCBsaW1pdCBtYXkgYmUKQwlzdWJqZWN0IHRvIHBoYXNlb3V0LCBjYWxsIFBPVVQgdG8gYXBwbHkgdGhlIHBoYXNlb3V0IHJ1bGUuCgpDCUZpcnN0IHNldCBJTEFTVCA9IHllYXIgb2YgdGhlIG1vc3QgcmVjZW50IGFidW5kYW5jZSBlc3RpbWF0ZQoKICAgICAgSUYgKE5TIC5HVC4gMCkgSUxBU1QgPSBJU1lSKE5TIC0gMSkKICAgICAgSUYgKE5aIC5HVC4gMCkgSUxBU1QgPSBNQVgoSVMsIElaWVIoTlogLSAxKSkKCkMgICAgIERPIDEwMCBJWSA9IElZRUFSLCBJWUVBUiArIFBDWUNMRSAtIDEKICAgICAgRE8gMTAwIElZID0gSVlFQVIsIElZRUFSICsgaW50KFBDWUNMRSkgLSAxCiAgICAgICAgSUYgKFBPVVQgLkVRLiAxKSBUSEVOCiAgICAgICAgICBDQUxMIFBIT1VUIChDTCwgUkFXQ0wsIElMQVNULCBJWSkKICAgICAgICBFTFNFCiAgICAgICAgICBDTCA9IFJBV0NMCiAgICAgICAgRU5ESUYKICAgICAgICBXUklURSAoSU9VVCwgJyhBNiwgSTUsIEExNywgSTYpJykgJ1llYXI6JywgSVkgKyBJTklUWVIsCiAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NhdGNoIGxpbWl0OicsIE5JTlQoQ0wpCiAgICAgICAgV1JJVEUgKCogICAsICcoQTYsIEk1LCBBMTcsIEk2KScpICdZZWFyOicsIElZICsgSU5JVFlSLAogICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYXRjaCBsaW1pdDonLCBOSU5UKENMKQogMTAwICBDT05USU5VRQoKICAgICAgU1RPUAogICAgICBFTkQKCkMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDCkMJQ0xDIHZlcnNpb24gNgpDCkMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQwpDCTMxIEphbnVhcnkgMTk5NApDCkMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgIFNVQlJPVVRJTkUgUkRQQVJTCgpDCVJlYWQgdGhlIGZpbGUgb2YgaW5wdXQgcGFyYW1ldGVycwoKICAgICAgQ09NTU9OIC9NQU5QQVIvIFBQUk9CLFBZTUFYLFBOWVNUUCxQS1NURVAsUERTVEVQLFBOQlNUUCxQQk1JTiwKICAgICAxCQkgICAgIFBCTUFYLFBTQ0FMRSxQSEFTRVQsUEhBU0VQLFBDWUNMRSxQTEVWRUwsUFNMT1BFCiAgICAgIFJFQUwgUFBST0IsIFBZTUFYLCBQTllTVFAsIFBLU1RFUCwgUERTVEVQLCBQTkJTVFAsIFBCTUlOLCBQQk1BWCwKICAgICAxCQlQU0NBTEUsIFBIQVNFVCwgUEhBU0VQLCBQQ1lDTEUsIFBMRVZFTCwgUFNMT1BFCiAgICAgIERBVEEgSUZJTEUgLzIxLwpDCkMJT3BlbiB0aGUgaW5wdXQgZmlsZSAob25seSByZWFkIG9uY2UpCkMKICAgICAgT1BFTiAoVU5JVCA9IElGSUxFLCBGSUxFID0gJ0NMQy5QQVInKQpDCiAgICAgIFJFQUQgKElGSUxFLCAnKFQzMCwgRjEwLjApJykgUFBST0IsUFlNQVgsIFBOWVNUUCwgUEtTVEVQLCBQRFNURVAsCiAgICAgMQkJCSAgICAgUEJNSU4sICBQQk1BWCwgIFBOQlNUUCwgUFNDQUxFLCBQSEFTRVQsCiAgICAgMQkJCSAgICAgUEhBU0VQLCBQQ1lDTEUsIFBMRVZFTCwgUFNMT1BFCiAgICAgIENMT1NFIChJRklMRSkKICAgICAgUkVUVVJOCiAgICAgIEVORApDCkMKQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkMKICAgICAgU1VCUk9VVElORSBQSE9VVCAoQ0wsIFJBV0NMLCBJTEFTVCwgSVkpCkMKICAgICAgQ09NTU9OIC9NQU5QQVIvIFBQUk9CLFBZTUFYLFBOWVNUUCxQS1NURVAsUERTVEVQLFBCTUlOLFBCTUFYLAogICAgIDEJICAgICBQTkJTVFAsUFNBQ0xFLFBIQVNFVCxQSEFTRVAsUENZQ0xFLFBMRVZFTCxQU0xPUEUKICAgICAgUkVBTCBQUFJPQiwgWU1BWCxQTllTVFAsUEtTVEVQLFBEU1RFUCxQQk1JTixQQk1BWCxQTkJTVFAsUFNBQ0xFLAogICAgIDEgICAgIFBIQVNFVCwgUEhBU0VQLCBQQ1lDTEUsIFBMRVZFTCwgUFNMT1BFCkMJUEhBU0VUIE51bWJlciBvZiB5ZWFycyB3aXRob3V0IHN1cnZleXMgYmVmb3JlIHBoYXNlb3V0IGludm9rZWQKQwlQSEFTRVAgUGhhc2VvdXQgYW5udWFsIHJlZHVjdGlvbiBwcm9wb3J0aW9uCkMKICAgICAgUkVBTCBDTCwgUkFXQ0wKICAgICAgSU5URUdFUiBJTEFTVCwgSVkKQwpDCVBoYXNlb3V0OiBSZWR1Y2UgY2F0Y2ggbGltaXQgaWYgdGhlcmUgaXMgbm8gc3VydmV5IGRhdGEgaW4gdGhlCkMJbGFzdCBQSEFTRVQgeWVhcnMKICAgICAgSUYgKElZIC5HRS4gSUxBU1QgKyBQSEFTRVQpIFRIRU4KICAgICAgICBDTCA9IFJBV0NMICogKDEuMCAtIFBIQVNFUCAqIChJWSAtIElMQVNUIC0gUEhBU0VUKSkKICAgICAgICBJRiAoQ0wgLkxULiAwLjApIENMID0gMC4wCiAgICAgIEVMU0UKICAgICAgICBDTCA9IFJBV0NMCiAgICAgIEVORElGCkMKICAgICAgUkVUVVJOCiAgICAgIEVORAoKQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgIFJFQUwgRlVOQ1RJT04gQ0xJTUlUIChDQVRDSCxTSUdIVCxGTUFUUlgsSVNZUixJWllSLFpNVUxULFBPUCxHKQoKQwlSdW4gdGhlIENMQSB0byBvYnRhaW4gdG8gbm9taW5hbCBjYXRjaCBsaW1pdApDCiAgICAgIFBBUkFNRVRFUiAoTUFYU0lNID0gNjAwMDAwLCBNQVhTVFAgPSA1MDApCiAgICAgIFJFQUwgUFJFUygwOk1BWFNJTSksIFFSRVMoMDpNQVhTSU0pLCBTUzAsIFNTMSwgU1MyLCBTUzMKQwogICAgICBDT01NT04gL01BTlBBUi8gUFBST0IsUFlNQVgsUE5ZU1RQLFBLU1RFUCxQRFNURVAsUE5CU1RQLFBCTUlOLAogICAgIDEJICAgICAgICAgUEJNQVgsUFNDQUxFLFBIQVNFVCxQSEFTRVAsUENZQ0xFLFBMRVZFTCxQU0xPUEUKCVJFQUwgUFBST0IsUFlNQVgsUE5ZU1RQLFBLU1RFUCxQRFNURVAsUE5CU1RQLFBCTUlOLCBQQk1BWCwKICAgICAxCQkgIFBTQ0FMRSxQSEFTRVQsUEhBU0VQLFBDWUNMRSxQTEVWRUwsUFNMT1BFCkMKICAgICAgQ09NTU9OIC9NQU5EQVQvIElTVEFSVCwgSVlFQVIsIE5TLCBOWiwgUktMTywgUktISQogICAgICBJTlRFR0VSIElTVEFSVCwgSVlFQVIsIE5TLCBOWgogICAgICBSRUFMICAgIFJLTE8sIFJLSEkKQwogICAgICBSRUFMIENBVENIKDA6KiksU0lHSFQoMDoqKSxGTUFUUlgoMDoqKSxaTVVMVCgwOiopLFBPUCgwOiopLEcoMDoqKQogICAgICBJTlRFR0VSIElTWVIoMDoqKSwgSVpZUigwOiopCkMKQwlMb2NhbCB2YXJpYWJsZXM6CgogICAgICBSRUFMIFNGLCBZKDA6TUFYU1RQKSwgQigwOk1BWFNUUCksIFJMR0IoMDpNQVhTVFApCiAgICAgIElOVEVHRVIgTkIsIE5SCgpDCU5CCU51bWJlciBvZiBiaWFzIHN0ZXBzCkMJTlIJTnVtYmVyIG9mIHN0ZXBzIGZvciBZICh0aGUgcHJvZHVjdGl2aXR5IHBhcmFtZXRlcikKQwlTRglEZXZpYW5jZSBzY2FsZSBmYWN0b3IgKFNGID0gLjUgLyBQU0NBTEUqKjIpCkMKICAgICAgQ0xJTUlUID0gMC4KICAgICAgSUYgKE5TIC5MRS4gMCkgUkVUVVJOCkMKQwlTZXQgZGV2aWFuY2Ugc2NhbGUgZmFjdG9yIFMgPSAxL1BTQ0FMRSoqMgogICAgICBTRiA9IDAuNSAvIChQU0NBTEUgKiBQU0NBTEUpCkMKQwlDaGVjayB0aGUgc2l6ZXMgb2YgdGhlIFkgYW5kIEIgYXJyYXlzIGFyZSBsYXJnZSBlbm91Z2gKICAgICAgSUYgKFBOQlNUUCAuR1QuIE1BWFNUUCAuT1IuIFBOWVNUUCAuR1QuIE1BWFNUUCkgU1RPUAogICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZICYvb3IgYiBhcnJheSBzaXplcyB0b28gc21hbGwnCgpDCVNldCBzaWdodGluZ3MgYmlhcyBzdGVwIHNpemVzICYgdGhlaXIgbG9nIHZhbHVlcy4gQklOQyA9IEJpYXMgaW5jcmVtZW50CiAgICAgIE5CID0gUE5CU1RQCiAgICAgIEJJTkMgPSAoUEJNQVggLSBQQk1JTikgLyBOQgogICAgICBETyAxMCBJID0gMCwgTkIgLSAxCiAgICAgICAgQihJKSA9IFBCTUlOICsgKEkgKyAwLjUpICogQklOQwogICAgICAgIFJMR0IoSSkgPSAtQUxPRyhCKEkpKQogMTAgICBDT05USU5VRQpDCkMJU2V0IHByb2R1Y3Rpdml0eSBwYXJhbWV0ZXIgc3RlcCBzaXplcyAobWlkcG9pbnRzKQogICAgICBOUiA9IFBOWVNUUAogICAgICBZSU5DID0gUFlNQVggLyBOUgogICAgICBETyAyMCBJID0gMCwgTlIgLSAxCiAgICAgICAgWShJKSA9IChJICsgMC41KSAqIFlJTkMKIDIwICAgQ09OVElOVUUKQwoKICAgICAgUFRPVCA9IDAKICAgICAgTiA9IDAKICAgICAgRE8gNTAgSSA9IDAsIE5SIC0gMQoKQwkgIFNldCBSIGZyb20gdGhlIHByb2R1Y3Rpdml0eSBwYXJhbWV0ZXIsIFkKICAgICAgICBSID0gMS40MTg0ICogWShJKQoKQwkgIFN0ZXAgc2l6ZSBmb3IgSwogICAgICAgIERLID0gUEtTVEVQCiAgICAgICAgRCA9IDEuCiAgICAgICAgUksgPSBSS0hJCgpDCSAgVXNlIGZ1bmN0aW9uIFNUS1NJTSB0byBzZXQgdXAgdGhlIE50aCBwb3B1bGF0aW9uIHRyYWplY3RvcnkKQwkgIGkuZS4gc2V0IHVwIHRoZSBwb3AgYXJyYXkKIDMwICAgICBJRiAoUksgLkxFLiBSS0xPIC5PUi4gU1RLU0lNIChSSywgUiwgUE9QLCBDQVRDSCkgLkxFLiAwLikKICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT1RPIDQwCgkgIElGIChOIC5HRS4gTUFYU0lNKSBTVE9QICdFUlJPUjogVE9PIE1BTlkgU0lNVUxBVElPTlMnCgpDCSAgICBIb3cgbXVjaCBkZXBsZXRpb24gY292ZXJlZD8KICAgICAgICAgIEREID0gRCAtIFBPUChJWUVBUikgLyBSSwogICAgICAgICAgRCA9IFBPUChJWUVBUikgLyBSSwogICAgICAgICAgUCA9IDAuMAoKICAgICAgICAgIElGIChERCAuR1QuIDAuKSBUSEVOCgpDCSAgICAgIENvbXB1dGUgdGhlIGludGVybmFsIGNhdGNoIGxpbWl0IGNvcnJlc3BvbmRpbmcgdG8gRCBhbmQgWShJKQogICAgICAgICAgICBRUkVTKE4pID0gQ09OVFJMIChELCBZKEkpLCBQTEVWRUwsIFBTTE9QRSkgKiBQT1AoSVlFQVIpCgpDCSAgICAgIENhbGN1bGF0ZSBkZXZpYW5jZQogICAgICAgICAgICBDQUxMIERFVklBTiAoU1MwLCBTUzEsIFNTMiwgU1MzLCBTSUdIVCwgRk1BVFJYLCBJU1lSLAogICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElaWVIsIFpNVUxULCBQT1AsIEcpCgpDCSAgICAgIFNjYWxlIGxpa2VsaWhvb2QgYW5kIGludGVncmF0ZSBvdmVyIHZhbHVlcyBmb3IgdGhlIGJpYXMgcGFyYW1ldGVyCiAgICAgICAgICAgIERPIDM1IEogPSAwLCBOQiAtIDEKICAgICAgICAgICAgICBQID0gUCArIEVYUCgtU0YgKiAoU1MwICsgUkxHQihKKSAqIChTUzEgKyBSTEdCKEopICogU1MyKQogICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTUzMgKiBCKEopKSkKCiAzNSAgICAgICAgIENPTlRJTlVFCgoKQwkgICAgICBDYWxjdWxhdGUgdGhlIHdlaWdodCBmb3IgdGhpcyBwb2ludCAoJiB0b3RhbCBhcmVhIHVuZGVyIGxpa2VsaWhvb2QpCiAgICAgICAgICAgIFBSRVMoTikgPSBQICogREQKICAgICAgICAgICAgUFRPVCA9IFBUT1QgKyBQUkVTKE4pCgpDCSAgICAgIFVwZGF0ZSBjb3VudGVyCiAgICAgICAgICAgIE4gPSBOICsgMQoKQwkgICAgICBGaW5kIHRoZSBuZXh0IEsKICAgICAgICAgICAgREsgPSBESyAqIFBEU1RFUCAvIERECiAgICAgICAgICAgIElGIChESyAuR1QuIFBLU1RFUCkgREsgPSBQS1NURVAKCiAgICAgICAgICAgIEVMU0UKQwkgICAgSUYgREQgPSAwIGNoYW5nZSB0aGUgc3RlcCBzaXplIG9ubHkgCiAgICAgICAgICAgICAgREsgPSBQS1NURVAKICAgICAgICAgICAgRU5ESUYKCkMJICAgIFNldCB0aGUgbmV3IHZhbHVlIG9mIEsKICAgICAgICAgIFJLID0gUksgLyAoMS4gKyBESykKCiAgICAgICAgR09UTyAzMAogNDAgICAgIENPTlRJTlVFCiA1MCAgIENPTlRJTlVFCgoKICAgICAgSUYgKFBUT1QgLkxFLiAwLikgU1RPUCAnRVJST1I6IFBST0IgSU5URUdSQVRFUyBUTyBaRVJPJwoKQwlTb3J0IHRoZSBRUkVTIGFuZCBQUkVTIGFycmF5cyBpbiBhc2NlbmRpbmcgb3JkZXIgb2YgUVJFUwogICAgICBOMiA9IE4KICAgICAgQ0FMTCBTT1JUIChRUkVTLCBQUkVTLCBOMikKCkMJTm9ybWFsaXplIHRoZSByZWxhdGl2ZSBsaWtlbGlob29kcwogICAgICBETyA2MCBJID0gMCwgTiAtIDEKICAgICAgICBQUkVTKEkpID0gUFJFUyhJKSAvIFBUT1QKIDYwICAgQ09OVElOVUUKCkMJRXh0cmFjdCB0aGUgZGVzaXJlZCBwcm9iYWJpbGl0eSBsZXZlbDogdGhlIG5vbWluYWwgY2F0Y2ggbGltaXQgKE5DTCkKQwlpcyB0aGUgbG93ZXIgUFJPQiUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KQwlGaXJzdCBjYWxjdWxhdGUgUFJFUyhJKSwgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIE5DTCBpcyBiZXR3ZWVuCkMJICAgUVJFUyhJKSAmIFFSRVMoSSArIDEpLgogICAgICBQID0gMAogICAgICBETyA3MCBJID0gMCwgTiAtIDEKICAgICAgICBQID0gUCArIFBSRVMgKEkpCiAgICAgICAgSUYgKFAgLkdULiBQUFJPQikgR09UTyA4MAogNzAgICBDT05USU5VRQoKQwlJbnRlcnBvbGF0ZSB0byBzZXQgdGhlIG5vbWluYWwgY2F0Y2ggbGltaXQKIDgwICAgSUYgKEkgLkdFLiBOIC0gMSkgVEhFTgogICAgICAgIFEgPSBRUkVTIChOIC0gMSkKICAgICAgRUxTRQogICAgICAgIFEgPSAoUVJFUyAoSSArIDEpICogKFBQUk9CIC0gUCArIFBSRVMoSSkpICsgUVJFUyhJKSAqCiAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQIC0gUFBST0IpKSAvIFBSRVMoSSkKICAgICAgRU5ESUYKCiAgICAgIENMSU1JVCA9IFEKCiAgICAgIFJFVFVSTgogICAgICBFTkQKCkMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgIEZVTkNUSU9OIENPTlRSTCAoRCwgWSwgUExFVkVMLCBQU0xPUEUpCgpDCUNhdGNoIGNvbnRyb2wgbGF3CgogICAgICBJRiAoRCAuTFQuIFBMRVZFTCkgVEhFTgogICAgICAgIENPTlRSTCA9IDAuCiAgICAgIEVMU0VJRiAoRCAuTFQuIDEuKSBUSEVOCiAgICAgICAgQ09OVFJMID0gUFNMT1BFICogWSAqIChEIC0gUExFVkVMKQogICAgICBFTFNFCiAgICAgICAgQ09OVFJMID0gUFNMT1BFICogWSAqICgxLjAgLSBQTEVWRUwpCiAgICAgIEVORElGCgogICAgICBFTkQKCkMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgU1VCUk9VVElORSBERVZJQU4gKFNTMCwgU1MxLCBTUzIsIFNTMywgU0lHSFQsIEZNQVRSWCwgSVNZUiwKICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWllSLCBaTVVMVCwgUE9QLCBHKQoKQwlDYWxjdWxhdGUgZGV2aWFuY2UgKC0yIGxvZyBsaWtlbGlob29kKSBpbiB0ZXJtcyBvZiBjb2VmZmljaWVudHMgZm9yIApDCXRoZSBiaWFzIGFuZCBsb2cgYmlhcyBwYXJhbWV0ZXJzCgogICAgICBDT01NT04gL01BTkRBVC8gSVNUQVJULCBJWUVBUiwgTlMsIE5aLCBSS0xPLCBSS0hJCiAgICAgIElOVEVHRVIgSVNUQVJULCBJWUFFUiwgTlMsIE5aCiAgICAgIFJFQUwgICAgUktMTywgUktISQoKICAgICAgUkVBTCBTUzAsU1MxLFNTMixTSUdIVCgwOiopLEZNQVRSWCgwOiopLFpNVUxUKDA6KiksUE9QKDA6KiksRygwOiopCiAgICAgIElOVEVHRVIgSVNZUigwOiopLCBJWllSKDA6KikKCiAgICAgIFNTMCA9IDAKICAgICAgU1MxID0gMAogICAgICBTUzIgPSAwCiAgICAgIFNTMyA9IDAKCiAgICAgIERPIDEwMCBOID0gMCwgTlMgLSAxCgogICAgICAgIEcoTikgPSBBTE9HIChTSUdIVChOKSAvIFBPUChJU1lSKE4pKSkKICAgICAgICBLID0gTiAqIChOICsgMSkgLyAyCiAgICAgICAgRE8gMTAgSiA9IDAsIE4gLSAxCkMJICAgIDFzdCBhZGQgbm9uIGRpYWdvbmFsIGNvbnRyaWJ1dGlvbnMgKHdoaWNoIGFyZSBkb3VibGVkIHVwKQogICAgICAgICAgU1MwID0gU1MwICsgMi4gKiBHKEopICogRyhOKSAqIEZNQVRSWChLKQogICAgICAgICAgU1MxID0gU1MxICsgMi4gKiAoRyhKKSArIEcoTikpICogRk1BVFJYKEspCiAgICAgICAgICBTUzIgPSBTUzIgKyBGTUFUUlgoSykgKyBGTUFUUlgoSykKICAgICAgICAgIEsgPSBLICsgMQogMTAgICAgIENPTlRJTlVFCkMJICBOb3cgYWRkIGRpYWdub2FsIGNvbnRyaWJ1dGlvbgogICAgICAgIFNTMCA9IFNTMCArIEcoTikgKiBHKE4pICogRk1BVFJYKEspCiAgICAgICAgU1MxID0gU1MxICsgMi4gKiBHKE4pICogRk1BVFJYKEspCiAgICAgICAgU1MyID0gU1MyICsgRk1BVFJYKEspCiAxMDAgIENPTlRJTlVFCgpDCU5vdyBkbyB0aGUgemVybyBlc3RpbWF0ZXMKICAgICAgRE8gMjAwIE4gPSAwLCBOWiAtIDEKICAgICAgICBTUzMgPSBTUzMgKyAyLjAgKiBQT1AoSVpZUihOKSkgLyBaTVVMVChOKQogMjAwICBDT05USU5VRQoKICAgICAgUkVUVVJOCiAgICAgIEVORAoKQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgIEZVTkNUSU9OIFNUS1NJTSAoUkssIFIsIFBPUCwgQ0FUQ0gpCgpDCUNhbGN1bGF0ZSB0aGUgc3RvY2sgdHJhamVjdG9yeSB3aXRoIHBhcmFtZXRlciBSSyBhbmQgUjogcmV0dXJuCkMJdGhlIGN1cnJlbnQgc3RvY2sgc2l6ZQpDCVJLID0gbm90aW9uYWwgY2FycnlpbmcgY2FwYWNpdHk7IFIgPSBwcm9kdWN0aXZpdHkgcGFyYW1ldGVyICogMS40MTg0CgogICAgICBDT01NT04gL01BTkRBVC8gSVNUQVJULCBJWUVBUiwgTlMsIE5aLCBSS0xPLCBSS0hJCiAgICAgIElOVEVHRVIgSVNUQVJULCBJWUVBUiwgTlMsIE5aCiAgICAgIFJFQUwgICAgUktMTywgUktISQoKICAgICAgUkVBTCBDQVRDSCgwOiopLCBQT1AoMDoqKQoKICAgICAgUE9QKElTVEFSVCkgPSBSSwogICAgICBETyAxMCBJID0gSVNUQVJUICsgMSwgSVlFQVIKICAgICAgICBEID0gUE9QKEkgLSAxKSAvIFJLCiAgICAgICAgUE9QKEkpID0gUE9QIChJIC0gMSkgKiAoMS4gKyBSICogKDEuIC0gRCAqIEQpKSAtIENBVENIKEktMSkKICAgICAgICBJRiAoUE9QKEkpIC5MRS4gMCkgR09UTyAyMAogMTAgICBDT05USU5VRQogICAgICBTVEtTSU0gPSBQT1AoSVlFQVIpCiAgICAgIFJFVFVSTgoKIDIwICAgU1RLU0lNID0gMC4KCiAgICAgIEVORAoKQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgIFNVQlJPVVRJTkUgU09SVCAoQVJSQVksIEFSUkFZMiwgTikKCkMJU09SVCBzb3J0cyBhIHBhaXIgb2YgYXJyYXlzIGluIGFzY2VuZGluZyBvcmRlciBvZiB0aGUgZmlyc3QgYXJyYXkKQwkodXNpbmcgdGhlIGhlYXBzb3J0IGFsZ29yaXRobSkKCiAgICAgIFJFQUwgQVJSQVkoMDoqKSwgQVJSQVkyKDA6KiksIFRFTVAsIFRFTVAyCiAgICAgIElOVEVHRVIgTiwgSywgSVIsIEksIEoKICAgICAgSUYgKE4gLkxULiAyKSBSRVRVUk4KICAgICAgSyA9IE4gLyAyCiAgICAgIElSID0gTiAtIDEKIDEwICAgSUYgKEsgLk5FLiAwKSBUSEVOCiAgICAgICAgSyA9IEsgLSAxCiAgICAgICAgVEVNUCA9IEFSUkFZKEspCiAgICAgICAgVEVNUDIgPSBBUlJBWTIoSykKICAgICAgRUxTRQoJVEVNUCA9IEFSUkFZKElSKQoJVEVNUDIgPSBBUlJBWTIoSVIpCiAgICAgICAgQVJSQVkoSVIpID0gQVJSQVkoMCkKICAgICAgICBBUlJBWTIoSVIpID0gQVJSQVkyKDApCiAgICAgICAgSVIgPSBJUiAtIDEKICAgICAgICBJRiAoSVIgLkVRLiAwKSBUSEVOCiAgICAgICAgICBBUlJBWSgwKSA9IFRFTVAKICAgICAgICAgIEFSUkFZMigwKSA9IFRFTVAyCiAgICAgICAgICBSRVRVUk4KICAgICAgICBFTkRJRgogICAgICBFTkRJRgogICAgICBJID0gSwogICAgICBKID0gSyArIEsgKyAxCiAyMCAgIElGIChKIC5MRS4gSVIpIFRIRU4KICAgICAgICBJRiAoSiAuTFQuIElSIC5BTkQuIEFSUkFZKEopIC5MVC4gQVJSQVkoSiArIDEpKSBKID0gSiArIDEKICAgICAgICBJRiAoVEVNUCAuTFQuIEFSUkFZKEopKSBUSEVOCiAgICAgICAgICBBUlJBWShJKSA9IEFSUkFZKEopCiAgICAgICAgICBBUlJBWTIoSSkgPSBBUlJBWTIoSikKICAgICAgICAgIEkgPSBKCiAgICAgICAgICBKID0gSiArIEkgKyAxCiAgICAgICAgRUxTRQogICAgICAgICAgSiA9IElSICsgMQogICAgICAgIEVORElGCiAgICAgICAgR09UTyAyMAogICAgICBFTkRJRgogICAgICBBUlJBWShJKSA9IFRFTVAKICAgICAgQVJSQVkyKEkpID0gVEVNUDIKICAgICAgR09UTyAxMAoKICAgICAgRU5E