AirPassengers [144] (ts)
BJsales [150] (ts)
BOD [6,2] (data.frame)
CO2 [84,5] (nfnGroupedData)
ChickWeight [578,4] (nfnGroupedData)
DNase [176,3] (nfnGroupedData)
EuStockMarkets [1860,4] (mts)
Formaldehyde [6,2] (data.frame)
HairEyeColor [4,4,2] (table)
Harman23.cor [c(8, 8); 8; 1 ] (list)
Harman74.cor [c(24, 24); 24; 1 ] (list)
Indometh [66,3] (nfnGroupedData)
InsectSprays [72,2] (data.frame)
JohnsonJohnson [84] (ts)
LakeHuron [98] (ts)
LifeCycleSavings [50,5] (data.frame)
Loblolly [84,3] (nfnGroupedData)
Nile [100] (ts)
Orange [35,3] (nfnGroupedData)
OrchardSprays [64,4] (data.frame)
PlantGrowth [30,2] (data.frame)
Puromycin [23,3] (data.frame)
Seatbelts [192,8] (mts)
Theoph [132,5] (nfnGroupedData)
Titanic [4,2,2,2] (table)
ToothGrowth [60,3] (data.frame)
UCBAdmissions [2,2,6] (table)
UKDriverDeaths [192] (ts)
UKgas [108] (ts)
USAccDeaths [72] (ts)
USArrests [50,4] (data.frame)
USJudgeRatings [43,12] (data.frame)
USPersonalExpenditure [5,5] (matrix)
UScitiesD [10,10] (dist)
VADeaths [5,4] (matrix)
WWWusage [100] (ts)
WorldPhones [7,7] (matrix)
ability.cov [c(6, 6); 6; 1 ] (list)
airmiles [24] (ts)
airquality [153,6] (data.frame)
anscombe [11,8] (data.frame)
attenu [182,5] (data.frame)
attitude [30,7] (data.frame)
austres [89] (ts)
cars [50,2] (data.frame)
chickwts [71,2] (data.frame)
co2 [468] (ts)
crimtab [42,22] (table)
discoveries [100] (ts)
esoph [88,5] (data.frame)
euro [11] (numeric)
eurodist [21,21] (dist)
faithful [272,2] (data.frame)
freeny [39,5] (data.frame)
infert [248,8] (data.frame)
iris [150,5] (data.frame)
iris3 [50,4,3] (array)
islands [48] (numeric)
lh [48] (ts)
longley [16,7] (data.frame)
lynx [114] (ts)
morley [100,3] (data.frame)
mtcars [32,11] (data.frame)
nhtemp [60] (ts)
nottem [240] (ts)
npk [24,5] (data.frame)
occupationalStatus [8,8] (table)
precip [70] (numeric)
presidents [120] (ts)
pressure [19,2] (data.frame)
quakes [1000,5] (data.frame)
randu [400,3] (data.frame)
rivers [141] (numeric)
rock [48,4] (data.frame)
sleep [20,3] (data.frame)
stackloss [21,4] (data.frame)
sunspot.month [3177] (ts)
sunspot.year [289] (ts)
sunspots [2820] (ts)
swiss [47,6] (data.frame)
treering [7980] (ts)
trees [31,3] (data.frame)
uspop [19] (ts)
volcano [87,61] (matrix)
warpbreaks [54,3] (data.frame)
women [15,2] (data.frame)
lakers [34624,13] (data.frame)
Přiřazení hodnoty proměnné
[1] FALSE
Sčítání, odčítání, násobení a dělení
[1] Inf
[1] Inf
[1] NaN
[1] NaN
Převod desetinných čísel na zlomky
3 / 4-167 is a prime!
-167 / 100
Mocniny a odmocniny
Attaching package: ‘numbers’
The following object is masked from ‘package:shiny’:
div
[1] 12 2
[1] 2 3
Exponenty a logaritmy
Goniometrické funkce
Vypočítejte pH 0.001 M kyseliny chlorovodíkové, 0.01 M hydroxidu sodného, 0.15 M kyseliny octové (Ka = 1.75e-5) a 0.01 M amoniaku (Kb = 1.8e-5)
[1] 10.62764
Matematické konstanty
[1] 2.718282
[1] 2.7182818284590451
Vektory - generování řady čísel
Vektory - řada náhodných čísel z daného rozmezí
Indexy
[1] 18 94 87 47
Uspořádání vektoru
[1] 7 8 5 11 12 6 19 18 9 3 14 13 10 16 4 17 1 2 15
Množiny
Vektorová aritmetika
diff(x)
[1] 3 -38 33 -61 17 -25 2 32 33 -51 4 33 -7 29 -7
[16] 2 -39 -4
sign(x)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Filtrování hodnot ve vektoru
numbers =c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,7,65,34,435)
table(numbers)[2]==1
5
TRUE
numbers[2]
[1] 23
sum(numbers==435)
[1] 3
Matice
matrix(x,nrow=6,ncol=3,byrow = TRUE)
[,1] [,2] [,3]
[1,] 90 52 58
[2,] 71 27 17
[3,] 83 50 42
[4,] 61 45 15
[5,] 24 80 36
[6,] 63 33 43
matrix(x,nrow=6,ncol=3,byrow = FALSE)
[,1] [,2] [,3]
[1,] 90 83 24
[2,] 52 50 80
[3,] 58 42 36
[4,] 71 61 63
[5,] 27 45 33
[6,] 17 15 43
Dataframes
Seznamy (lists)
[1] 23
Vypočítejte molekulové hmotnosti alkanů C1 - C12.
1 2 3 4 5 6 7 8
16.043 30.070 44.097 58.124 72.151 86.178 100.205 114.232
9 10 11 12
128.259 142.286 156.313 170.340
$`1`
[1] 16.043
$`2`
[1] 30.07
$`3`
[1] 44.097
$`4`
[1] 58.124
$`5`
[1] 72.151
$`6`
[1] 86.178
$`7`
[1] 100.205
$`8`
[1] 114.232
$`9`
[1] 128.259
$`10`
[1] 142.286
$`11`
[1] 156.313
$`12`
[1] 170.34
Vliv 3 ůzných druhů krmiva na přírůstek živé váhy (v kg) prasat, rozdělených do 4 různých skupin.
Pipe operator (%>%) v R
# pipe operator
library(magrittr)
Attaching package: ‘magrittr’
The following object is masked from ‘package:numbers’:
mod
a = 3.14159
a %>% seq(10,3) %>% round(3)
[1] 3.142 6.142 9.142
Příkaz if-else
x = sample(12:99,18, replace = FALSE); x
ifelse(x<50,0,1)
x[x<50] = 0
x[x>=50] = 1
x
Vypocítejte vazebnou energii atomového jádra pomoci Bethe - Weiszackerovy rovnice B = 14.0 - 13.1A^(2/3) + 0.585Z(Z-1)/A^(1/3) - (18.1(A-2*Z)^2)/A + C/A, kde A - nukleonove cislo, Z - atomove cislo, C - konstanta, pro jádra se sudým počtem protonů i neutronů je rovna 132, pro jádra s lichým počtem protonů i neutronů je rovna -132, pro lichy počet protonů a sudý počet neutronů a naopak je rovna 0.
# alpha particle
A = 4
Z = 2
# U-235
A = 235
Z = 92
# funkce
N = A-Z
if (N%%2==0 & Z%%2==0){C = 132} else if (N%%2!=0 & Z%%2!=0){C = -132} else {C = 0}
B = 14.0 - 13.1*A^(2/3) + 0.585*Z*(Z-1)/A^(1/3) - (18.1*(A-2*Z)^2)/A + C/A
B # [MeV]
B/A # energie na 1 nukleon [MeV]
# polomer jadra: R = R0 * A^(1/3)
R0 = 1.4e-13 # [cm]
R = R0 * A^(1/3)
R = R*10e-15
R # [m]
Cyklus typu while
Vypočítejte molekulové hmotnosti alkanů C1 - C12 (while loop)
n = 1
Mhc = NULL
while(n <= 12){
hc = n*12.011 + (2*n + 2)*1.008
Mhc = c(Mhc,hc)
n = n+1
}
names(Mhc) = c(1:12)
Mhc
Cyklus typu for (for loop)
Vypočítejte molekulové hmotnosti alkanů C1 - C12
Mhc = NULL
for(n in c(1:12)){
hc = n*12.011 + (2*n + 2)*1.008
Mhc = c(Mhc,hc)
}
names(Mhc) = c(1:12)
Mhc
Vypočítejte střední kvadratickou rychlost molekul daných plynů v rozmezí teplot od 150 K do 500 K s krokem 50 K.
el = c("H2","He", "O2", "Kr")
M = c(2.0159, 4.0026, 31.9988, 83.8) # [g / mol]
Ts = seq(from=150, to=500, by=50) # [K]
R = 8314.34 # [J / kmol K]
MKV = NULL
for(tt in Ts){
mkv= rep(0, length(M))
for(ii in c(1:length(M))){
mkv[ii] = (3*R*tt/M[ii])^(1/2)
}
MKV = rbind(MKV, mkv)
}
colnames(MKV) = el
rownames(MKV) = Ts
MKV
plot(0,0,xlim=c(min(Ts),max(Ts)),ylim = c(min(MKV),max(MKV)), type ="n",xlab="T [K]",ylab="str. kv. rychlost [m/s]")
for(ii in c(1:length(M))){points(Ts,MKV[,ii], type="p",col=ii,pch=16)}
legend("topleft",legend=el,col=c(1:length(M)),pch=16,cex=.8)
Fyzikální konstanty
molweight("C")
C
12.0107
Určete délku měděného drátu o průměru 1.6 mm jehož hmotnost je 0.8 kg.
library(PeriodicTable)
Attaching package: ‘PeriodicTable’
The following object is masked from ‘package:MSbox’:
mass
The following object is masked from ‘package:CHNOSZ’:
mass
data(periodicTable)
ptCu = periodicTable[which(periodicTable$symb=="Cu"),]
ptCu$density
[1] 8.96
Molekulové hmotnosti
formula1<-c("C12H10Cl10")
multiform(formula1,3)
[1] "C36H30Cl30"
Uhlovodík o molekulové hmotnosti 84 g/mol obsahuje 85.71 % uhlíku a 14.29 % vodíku. Určete molekulový vzorec.
M = 84 # g/mol
mc = 0.8571
mh = 0.1429
library(marelac)
mC = molweight("C") # g/mol
mH = molweight("H") # g/mol
rs = c(mc/mC,mh/mH)/min(mc/mC,mh/mH)
rs = round(rs,0)
n = M/sum(rs*c(mC,mH))
n = round(n,0)
form = rs*n; form
gsub(" ", "", paste("C",form[1],"H",form[2]))
library(Rdisop)
dmp = decomposeMass(mass=M, ppm=1, mzabs=0.1, elements=initializeElements(c("C","H")), z=1, minElements="C4", maxElements="C10")
dmp$formula
library(rcdk)
generate.formula(M, window=5, validation=FALSE, charge=1,elements=list(c("C",2,10),c("H",4,30)))
Izotopy
library(enviPat)
data(isotopes)
isotopes
library(ecipex)
nistiso
nistiso$mass
nistiso$abundance
nistiso$element
library(IsoSpecR)
data(isotopicData)
isotopicData
library(CIAAWconsensus)
ciaaw.mass.2003
ciaaw.mass.2012
ciaaw.mass.2016
Izotopové patterny
Izotopové poměry
Vlastnosti vzduchu a vody
# Slozeni atmosfery
library(marelac)
atmComp()
## Hustota vzduchu
library(marelac)
air_density(t = 25, P = 1.013253)
# t - temperature in °C, P - pressure in bars
## Hustota vody
library(rLakeAnalyzer)
water.density(wtr = 25, sal = 0)
# wtr - temperature in °C
library(CHNOSZ)
rho.IAPWS95(T = 298.15, P = 1, state="", trace=0)
# T - temperature in K, P - pressure in bars
library(IAPWS95)
library(marelac)
library(CHNOSZ)
library(CHNOSZ)
thermo()$OBIGT
Disociační konstanty
library(CHNOSZ)
Warning: package ‘CHNOSZ’ was built under R version 4.1.3
CHNOSZ version 1.4.3 (2022-02-20)
reset: creating "thermo" object
OBIGT: loading default database with 1904 aqueous, 3445 total species
Attaching package: ‘CHNOSZ’
The following object is masked from ‘package:seqinr’:
read.fasta
thermo = thermo()
thermo$protein
pf <- protein.formula(thermo$protein); pf
C H N O S
O08452_PYRFU 2338.000 3307.000 573.000 649.000 9.000
AMY_BACSU 3006.000 4584.000 850.000 965.000 11.000
AMYA_PYRFU 3526.000 5325.000 885.000 976.000 14.000
BPT1_BOVIN 284.000 438.000 84.000 79.000 7.000
CYC_BOVIN 517.000 825.000 143.000 150.000 4.000
LYSC_CHICK 613.000 959.000 193.000 185.000 10.000
MYG_PHYCA 783.000 1240.000 216.000 216.000 2.000
NUC_STAAU 747.000 1204.000 208.000 224.000 4.000
RNAS1_BOVIN 575.000 909.000 171.000 193.000 12.000
RNBR_BACAM 555.000 847.000 153.000 170.000 0.000
RNH_ECOLI 776.000 1215.000 227.000 228.000 7.000
RNH_THET8 829.000 1297.000 253.000 231.000 7.000
RNT1_ASPOR 479.000 687.000 127.000 171.000 4.000
CSG_HALJP 3669.000 5647.000 971.000 1488.000 0.000
CSG_HALSA 3642.000 5653.000 979.000 1452.000 7.000
CSG_HALVO 3439.000 5418.000 910.000 1379.000 5.000
CSG_METFE 2815.000 4411.000 747.000 872.000 14.000
CSG_METJA 2555.000 4032.000 640.000 865.000 14.000
CSG_METSC 2812.000 4405.000 747.000 872.000 16.000
CSG_METVO 2575.000 4097.000 645.000 884.000 11.000
CSG_METTL 2484.000 4000.000 638.000 844.000 7.000
CSG_METBU 1362.000 2111.000 355.000 442.000 4.000
SLAP1_BACAN 3719.000 6077.000 971.000 1197.000 7.000
SLAP_ACEKI 3584.000 5648.000 926.000 1138.000 4.000
SLAP_AERSA 2250.000 3580.000 618.000 716.000 2.000
SLAP_BACCI 7457.000 11798.000 2148.000 2338.000 20.000
SLAP_GEOSE 5676.000 9113.000 1489.000 1863.000 3.000
SLAP_CAMFE 4138.000 6730.000 1100.000 1452.000 12.000
SLAP_CAUCR 4228.000 6830.000 1148.000 1510.000 3.000
SLAP_LACAC 1930.000 3086.000 542.000 646.000 1.000
SLAP_LACBR 1976.000 3113.000 533.000 673.000 4.000
SLAP_LACHE 1927.000 3063.000 519.000 635.000 3.000
SLAP2_BACAN 3926.000 6318.000 1044.000 1270.000 1.000
SLAP_BACLI 3977.000 6396.000 1068.000 1286.000 2.000
FLAB1_AERPE 920.000 1490.000 230.000 286.000 6.000
FLAB2_AERPE 1124.000 1793.000 275.000 363.000 5.000
FLAB1_METJA 954.000 1518.000 240.000 298.000 5.000
FLAB2_METJA 944.000 1537.000 243.000 296.000 4.000
FLAB3_METJA 972.000 1553.000 257.000 299.000 3.000
FLA_BACSU 1378.000 2286.000 420.000 477.000 8.000
FLAA_AQUPY 2361.000 3823.000 649.000 773.000 8.000
FLAA_AQUAE 2401.000 3860.000 666.000 806.000 7.000
FLJJ_CAUCR 1228.000 2034.000 364.000 413.000 5.000
PST1_YEAST 1789.000 2923.000 489.000 620.000 4.000
TSA1_YEAST 980.000 1530.000 248.000 288.000 2.000
PRX1_YEAST 1340.000 2102.000 352.000 387.000 5.000
DOT5_YEAST 1070.000 1740.000 300.000 324.000 4.000
MOD5.M_YEAST 2238.000 3545.000 623.000 657.000 17.000
MOD5.N_YEAST 2187.000 3455.000 609.000 645.000 15.000
COX1_YEAST 2778.000 4195.000 649.000 713.000 22.000
COX2_YEAST 1242.000 1888.000 286.000 351.000 10.000
COX3_YEAST 1430.000 2140.000 344.000 358.000 15.000
COX4_YEAST 622.000 984.000 170.000 198.000 5.000
COX5A_YEAST 663.000 1030.000 184.000 198.000 4.000
COX5B_YEAST 694.000 1080.000 188.000 199.000 2.000
COX6_YEAST 567.000 867.000 145.000 180.000 1.000
COX7_YEAST 328.000 511.000 83.000 74.000 0.000
COX8_YEAST 261.000 384.000 62.000 59.000 1.000
COX9_YEAST 300.000 467.000 79.000 74.000 3.000
KC11_YEAST 2709.000 4234.000 796.000 828.000 16.000
KC12_YEAST 2715.000 4222.000 804.000 842.000 15.000
KC13_YEAST 2641.000 4087.000 769.000 805.000 24.000
HRR25_YEAST 2545.000 3969.000 729.000 749.000 18.000
GAL83_YEAST 2024.000 3107.000 567.000 672.000 16.000
SIP1_YEAST 4168.000 6560.000 1204.000 1370.000 25.000
SIP2_YEAST 2003.000 3178.000 568.000 665.000 13.000
GLRX1_YEAST 549.000 886.000 146.000 170.000 4.000
GLRX2.C_YEAST 527.000 856.000 136.000 165.000 3.000
GLRX2_YEAST 715.000 1161.000 181.000 213.000 5.000
GLRX3_YEAST 1444.000 2195.000 371.000 463.000 10.000
GLRX4_YEAST 1226.000 1910.000 316.000 389.000 6.000
GLRX5_YEAST 762.000 1200.000 196.000 227.000 6.000
GSHR.M_YEAST 2383.000 3768.000 652.000 715.000 14.000
GSHR.C_YEAST 2302.000 3629.000 627.000 692.000 13.000
GPD1_YEAST 1905.000 2983.000 513.000 574.000 15.000
GPD2_YEAST 2213.000 3491.000 613.000 641.000 15.000
TRX1_YEAST 502.000 785.000 123.000 150.000 5.000
TRX2_YEAST 497.000 780.000 122.000 153.000 5.000
TRX3_YEAST 651.000 1049.000 167.000 181.000 10.000
TRXB1_YEAST 1509.000 2412.000 402.000 471.000 12.000
TRXB2_YEAST 1640.000 2615.000 449.000 501.000 14.000
AMPM1_YEAST 1870.000 2926.000 518.000 565.000 21.000
AMPM2_YEAST 2087.000 3291.000 587.000 653.000 14.000
EXG1_YEAST 2110.000 3091.000 547.000 650.000 12.000
CLPX_ECOLI 2040.000 3320.000 558.000 638.000 11.000
CLPP_ECOLI 1019.000 1624.000 282.000 307.000 14.000
CLPA_ECOLI 3707.000 5997.000 1065.000 1134.000 18.000
HSLU_ECOLI 2170.000 3559.000 615.000 676.000 16.000
HSLV_ECOLI 837.000 1356.000 238.000 255.000 4.000
FTSH_ECOLI 3120.000 5013.000 881.000 936.000 27.000
LON_ECOLI 3843.000 6319.000 1077.000 1167.000 36.000
AMY1_HORVU 2041.000 3068.000 552.000 598.000 16.000
AMYB_HORVU 2671.000 4060.000 730.000 782.000 23.000
GUB2_HORVU 1448.000 2203.000 391.000 417.000 13.000
ALEU_HORVU 581.000 927.000 185.000 177.000 3.000
RPOE_ECOLI 960.000 1541.000 271.000 291.000 5.000
FLIA_ECOLI 1200.000 1946.000 356.000 375.000 5.000
RP32_ECOLI 1423.000 2264.000 414.000 434.000 11.000
RPOS_ECOLI 1661.000 2691.000 483.000 524.000 5.000
RP54_ECOLI 2365.000 3791.000 649.000 766.000 13.000
RPOD_ECOLI 3042.000 4912.000 856.000 993.000 28.000
AMY1_ECOLI 3316.000 4962.000 900.000 995.000 19.000
AMPM_ECOLI 1291.000 2079.000 353.000 392.000 16.000
AMPM_PYRFU 1490.000 2408.000 390.000 423.000 9.000
ALBU_BOVIN 2934.000 4615.000 781.000 897.000 39.000
OVAL_CHICK 1901.000 2999.000 499.000 575.000 22.000
INS_BOVIN 254.000 381.000 65.000 74.000 6.000
CTRA_BOVIN 1110.000 1753.000 299.000 346.000 12.000
LACB_BOVIN 817.000 1316.000 206.000 248.000 9.000
MYG_HORSE 769.000 1212.000 210.000 218.000 2.000
A0FHA7_HORVU 2594.000 4098.000 708.000 767.000 19.000
CLPP_HORVU 1124.000 1722.000 280.000 317.000 15.000
E13A_HORVU 1476.000 2287.000 405.000 439.000 7.000
CSG_METMP 2494.000 3951.000 613.000 841.000 9.000
HJA1_METJA 332.000 565.000 91.000 95.000 1.000
HJA2_METJA 331.000 561.000 91.000 96.000 1.000
HJA3_METJA 321.000 548.000 94.000 91.000 2.000
HJA4_METJA 338.000 569.000 91.000 96.000 1.000
HstA_METVO 323.000 556.000 92.000 94.000 3.000
HstB_METVO 320.000 545.000 87.000 97.000 3.000
HARA_PYRAB 331.000 555.000 93.000 96.000 1.000
HARB_PYRAB 325.000 567.000 97.000 92.000 1.000
HARA_PYRFU 331.000 555.000 93.000 96.000 1.000
HARB_PYRFU 322.000 559.000 95.000 93.000 1.000
HMmA_METMP 320.000 547.000 87.000 95.000 5.000
Q6LXK3_METMP 304.000 525.000 87.000 93.000 4.000
DN71_SULSO 325.000 538.000 88.000 94.000 3.000
DN72_SULSO 320.000 528.000 86.000 94.000 2.000
TPX_THIDA 762.000 1239.000 197.000 230.000 6.000
TPX_BACHD 794.000 1270.000 212.000 251.000 4.000
TPX_BACSU 805.000 1276.000 212.000 252.000 4.000
TPX_AQUAE 830.000 1353.000 213.000 252.000 7.000
TPX_ECOLI 789.000 1260.000 210.000 245.000 3.000
H-NS_PHOPR 649.000 1067.000 181.000 212.000 3.000
PPB_ECOLI 2048.000 3277.000 585.000 670.000 12.000
SPTA2.SH3_CHICK 315.000 499.000 81.000 93.000 1.000
BARS_BACAM 459.000 720.000 118.000 141.000 2.000
TRY1_BOVIN 1012.000 1597.000 279.000 324.000 14.000
CYB5.HEME_BOVIN 399.000 607.000 105.000 127.000 0.000
LYS_BPT4 823.000 1326.000 238.000 241.000 7.000
RNT1.K25_ASPOR 480.000 691.000 127.000 170.000 4.000
IOVO.3_MELGA 238.000 367.000 65.000 78.000 6.000
PAP1_CARPA 1050.000 1590.000 290.000 308.000 7.000
PRVB_ESOLU 510.000 791.000 127.000 162.000 3.000
PEPA_PIG 1530.000 2300.000 366.000 523.000 10.000
PLMN.K4_HUMAN 380.000 569.000 113.000 121.000 8.000
SPG1.B1_STRSG 268.000 414.000 66.000 94.000 0.000
SPG1.B2_STRSG 268.000 417.000 67.000 92.000 0.000
DN71.d_SULAC 325.000 535.000 91.000 98.000 2.000
SSI_STRAO|2 1000.000 1572.000 272.000 320.000 14.000
SSI_STRAO 500.000 786.000 136.000 160.000 7.000
TRPA_SALTY 1281.000 2034.000 352.000 378.000 8.000
UBIQ_HUMAN 378.000 629.000 105.000 118.000 1.000
CDK1_HUMAN 1550.000 2444.000 406.000 440.000 9.000
CDK2_HUMAN 1559.000 2446.000 408.000 423.000 8.000
CDK3_HUMAN 1603.000 2519.000 423.000 440.000 9.000
CDK4_HUMAN 1515.000 2381.000 419.000 430.000 12.000
CDK5_HUMAN 1505.000 2362.000 402.000 427.000 12.000
CDK6_HUMAN 1651.000 2612.000 452.000 485.000 12.000
CDK7_HUMAN 1771.000 2803.000 475.000 492.000 13.000
CDK8_HUMAN 2381.000 3693.000 665.000 690.000 19.000
CDK9_HUMAN 1916.000 3044.000 526.000 547.000 18.000
CDK10_HUMAN 1848.000 2962.000 506.000 510.000 19.000
CCNA1_HUMAN 2357.000 3670.000 604.000 697.000 23.000
CCNA2_HUMAN 2177.000 3451.000 579.000 645.000 15.000
CCNB1_HUMAN 2155.000 3483.000 571.000 630.000 27.000
CCNB2_HUMAN 2016.000 3271.000 549.000 594.000 18.000
CCNB3_HUMAN 7036.000 11399.000 1795.000 2180.000 61.000
CCNC_HUMAN 1522.000 2348.000 384.000 417.000 17.000
CCND1_HUMAN 1480.000 2386.000 396.000 450.000 25.000
CCND2_HUMAN 1457.000 2347.000 393.000 441.000 20.000
CCND3_HUMAN 1427.000 2306.000 402.000 422.000 21.000
CCNE1_HUMAN 2093.000 3297.000 567.000 615.000 26.000
CCNE2_HUMAN 2114.000 3337.000 553.000 601.000 20.000
CCNF_HUMAN 3854.000 6112.000 1082.000 1174.000 39.000
CCNG1_HUMAN 1525.000 2470.000 416.000 431.000 17.000
CCNG2_HUMAN 1724.000 2747.000 451.000 521.000 23.000
CCNH_HUMAN 1684.000 2660.000 450.000 491.000 18.000
CCNI_HUMAN 1904.000 3028.000 516.000 544.000 22.000
CCNJ_HUMAN 1907.000 2968.000 516.000 549.000 21.000
CCNJL_HUMAN 2171.000 3378.000 580.000 623.000 26.000
CCNK_HUMAN 1857.000 2870.000 506.000 535.000 14.000
CCNL1_HUMAN 2571.000 4198.000 846.000 766.000 13.000
CCNL2_HUMAN 2522.000 4123.000 801.000 748.000 16.000
CCNO_HUMAN 1673.000 2688.000 484.000 490.000 21.000
CCNT1_HUMAN 3528.000 5570.000 1024.000 1101.000 23.000
CCNT2_HUMAN 3524.000 5590.000 1030.000 1113.000 26.000
CCNY_HUMAN 1738.000 2744.000 490.000 526.000 13.000
CD5R1_HUMAN 1513.000 2419.000 421.000 446.000 13.000
MAT1_HUMAN 1580.000 2530.000 438.000 482.000 14.000
Q2RJF3_MOOTA 2299.000 3588.000 606.000 669.000 15.000
Q2RMD6_MOOTA 5702.000 8933.000 1521.000 1690.000 45.000
Q2RJ73_MOOTA 3685.000 5743.000 957.000 1069.000 36.000
H2O_RESIDUE 0.000 2.000 0.000 1.000 0.000
Ala_RESIDUE 3.000 5.000 1.000 1.000 0.000
Cys_RESIDUE 3.000 5.000 1.000 1.000 1.000
Asp_RESIDUE 4.000 5.000 1.000 3.000 0.000
Glu_RESIDUE 5.000 7.000 1.000 3.000 0.000
Phe_RESIDUE 9.000 9.000 1.000 1.000 0.000
Gly_RESIDUE 2.000 3.000 1.000 1.000 0.000
[ reached getOption("max.print") -- omitted 305 rows ]
iA <- info("alanine")
info.character: found alanine(aq); also available in cr
info(iA)$formula
[1] "C3H7NO2"
as.chemical.formula(makeup(iA))
[1] "C3H7NO2"
Převody jednotek
[1] 273.15
Plynný systém mění svůj objem o 1200 ml za konstantního vnějšího tlaku 30 atm. Jakou práci vykoná plyn při expanzi? Vyjádřete v různých energetických jednotkách.
[1] 3647.7
Ocelová láhev o objemu 20.5 l je naplněna kyslíkem. Při 17 °C je tlak v láhvi 87 atm. Vypočítejte hmotnost kyslíku.
m = P*V*M/(R*Tk)
m = ceiling(m); m # g
[1] 2
mk = conv_unit(m, from="g", to="kg")
mk = round(mk,2); mk # kg
[1] 0
paste("Hmotnost kyslíku je", m, "g, resp.", mk, "kg.")
[1] "Hmotnost kyslíku je 2 g, resp. 0 kg."
Vypočítejte molekulovou hmotnost benzenu, váží-li 600 ml jeho par při 87 °C a tlaku 624 mm Hg 1.3 g.
paste("Zjištěná molární hmotnost benzenu je", round(M,0), "g/mol.")
[1] "Zjištená molární hmotnost benzenu je 78 g/mol."
Pokus trval celkem 7658 minut. Kolik je to dní, hodin a minut?
[1] "Pokus trval 5 dní, 7 hodin, 38 minut a 0 sekund."
Zaokrouhlování čísel na daný pocet desetinných míst
Nejistoty a chyby měření
Ze zásilky kaprolaktamu bylo odebráno 10 vzorku a byl u nich stanoven bod tání. Vypočítejte průměrnou hodnotu bodu tání v zásilce a její směrodatnou odchylku.
Sireni chyb
Vypočítejte hustotu a její chybu pro látku, u níž byla opakovaným měřením stanovena hmotnost 6.824 (0.008) g a objem 3.03 (0.01) ml.
Na píst o průměru 200 (0.05) mm působí pára tlakem 8.2 (0.1) atm. Jakou silou působí pára na píst?
Vypočítejte koeficient viskozity roztoku glycerinu Stokesovou metodou
Vypočítejte koeficient viskozity roztoku glycerinu pomocí kapilárního viskozimetru.
Součin rozpustnosti stříbrné soli AgX má hodnotu Ks = 4.0 (0.4) x 10^-8. Jaká je chyba vypočtené rovnovážné koncentrace stříbrných iontů ve vode?
Nejistoty a korelace
Errors: 0.022880681 0.011490987 0.007474727 0.005623896 0.004536172
[1] 0.9969624 1.0108112 1.0008685 1.0050627 1.0080674
Errors: 0.012312356 0.005439786 0.003877966 0.002770037 0.002083100
[1] 0.9969624 1.0108112 1.0008685 1.0050627 1.0080674
Errors: 0.029924187 0.015313206 0.009833843 0.007455422 0.006067488
[1] 0.9969624 1.0108112 1.0008685 1.0050627 1.0080674
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCg0KaW5zdGFsbC5wYWNrYWdlcyhwa2dzID0gIiIpDQppbnN0YWxsLnBhY2thZ2VzKGZpbGVfbmFtZV9hbmRfcGF0aCwgcmVwb3MgPSBOVUxMLCB0eXBlPSJzb3VyY2UiKQ0KDQoNCiMgUlN0dWRpbyAtIGNyYW4NCg0KIyBSU3R1ZGlvIC0gYXJjaGl2DQoNCiMgR2l0SHViDQpsaWJyYXJ5KGRldnRvb2xzKQ0KaW5zdGFsbF9naXRodWIoIk1vbW9jcyIsdXNlcm5hbWU9ImpmcGFsb21lcXVlIikNCmluc3RhbGxfZ2l0aHViKCJqZnBhbG9tZXF1ZS9Nb21vY3MiKQ0KDQoNCiMgQmlvY29uZHVjdG9yDQojIGh0dHBzOi8vd3d3LmJpb2NvbmR1Y3Rvci5vcmcvDQppZiAoIXJlcXVpcmUoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikNCkJpb2NNYW5hZ2VyOjppbnN0YWxsKHZlcnNpb24gPSAiMy4xNCIpDQoNCkJpb2NNYW5hZ2VyOjphdmFpbGFibGUoKQ0KDQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikNCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJSY2hlbWNwcCIpDQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgiYmlvZGIiKQ0KDQoNCiMgU2VhcmNoDQoNCmxpYnJhcnkocGtnc2VhcmNoKQ0KcGtnX3NlYXJjaF9hZGRpbihxdWVyeSA9ICIiLCB2aWV3ZXIgPSBjKCJkaWFsb2ciLCAiYnJvd3NlciIpKQ0KDQojIGh0dHBzOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvZWR1Y2F0aW9uL2RhdGFzZXRzLmh0bQ0KDQoNCmxpYnJhcnkoTkNtaXNjKQ0KcmVxdWlyZShOQ21pc2MpDQoNCnN1bW1hcmlzZS5yLmRhdGFzZXRzKCkNCnN1bW1hcmlzZS5yLmRhdGFzZXRzKGZpbHRlcj1UUlVFLCJtYXRyaXgiKQ0KDQpgYGANCg0KDQpQxZlpxZlhemVuw60gaG9kbm90eSBwcm9txJtubsOpDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnggPC0gLTcNCngNCg0KeCA9IC03OyB4DQoNCih4ID0gLTcpDQoNCg0KbGlicmFyeShzY2hvb2xtYXRoKQ0Kc2Nob29sbWF0aDo6aXMubmVnYXRpdmUoeCkNCnNjaG9vbG1hdGg6OmlzLnBvc2l0aXZlKHgpDQpzY2hvb2xtYXRoOjppcy5yZWFsLnBvc2l0aXZlKHgpDQoNCmFicyh4KQ0KDQpgYGANCg0KDQpTxI3DrXTDoW7DrSwgb2TEjcOtdMOhbsOtLCBuw6Fzb2JlbsOtIGEgZMSbbGVuw60NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KMyszDQo5LTMNCjMqMw0KOS8zDQoNCnggPSA5DQp4KzMNCngtMw0KeCozDQp4LzMNCih4LTMpLyh4LzMpDQoNCjEvMA0KSW5mKkluZg0KSW5mL0luZg0KMC8wDQoNCg0KIyBjZWxvY2lzZWxuZSBkZWxlbmkgKGludGFnZXIgZGl2aXNpb24pDQoxMyUvJTINCmxpYnJhcnkobnVtYmVycykNCmRpdigxMywyKSAgDQoNCiMgemJ5dGVrIHBvIGRlbGVuaSAocmVtaW5kZXIgYWZ0ZXIgZGl2aXNpb24pDQoxMyUlMg0KbGlicmFyeShudW1iZXJzKQ0KbW9kKDEzLDIpIA0KDQpgYGANCg0KDQpQxZlldm9kIGRlc2V0aW5uw71jaCDEjcOtc2VsIG5hIHpsb21reQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KE1BU1MpDQpmcmFjdGlvbnMoLTAuMTY2NjY2NykNCmZyYWN0aW9ucygwLjE0KQ0KZnJhY3Rpb25zKDAuNCkNCg0KbGlicmFyeShzY2hvb2xtYXRoKQ0KZGVjaW1hbDJmcmFjdGlvbigwLjEsNikNCg0KbGlicmFyeShmcmFjdGlvbmFsKQ0KZnJhY3Rpb25hbCgtMC4xNjY2NjY3LCBlcHMgPSAxZS0wNiwgbWF4Q29udiA9IDIwLCBzeW5jID0gRkFMU0UpDQpudW1lcmF0b3JzKC0wLjE2NjY2NjcpICMgdnlwaXNlIGNpdGF0ZWxlIChudW1lcmF0b3IpDQpkZW5vbWluYXRvcnMoLTAuMTY2NjY2NykgIyB2eXBpc2Ugam1lbm92YXRlbGUgKGRlbm9taW5hdG9yKQ0KbnVtZXJpY2FsKC0xLzYpDQp1bmZyYWN0aW9uYWwoLTEvNikNCg0KIyB6amVkbm9kdXNlbsOtIHpsb21rdSAoZnJhY3Rpb25zIHNpbXBsaWZpY2F0aW9uKQ0KbGlicmFyeShzY2hvb2xtYXRoKQ0KY2FuY2VsLmZyYWN0aW9uKDQyLCA1NikNCmNhbmNlbC5mcmFjdGlvbigtMTY3LCAxMDApDQoNCg0KIyBOZWp2ZXRzaSBzcG9sZWNueSBkZWxpdGVsIChncmVhdGVzdCBjb21tb24gZGl2aXNvcikNCnggPSAxMg0KeSA9IDgNCmxpYnJhcnkoc2Nob29sbWF0aCkNCnNjaG9vbG1hdGg6OmdjZCh4LCB5KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpEZXNjVG9vbHM6OkdDRCh4LCB5LCBuYS5ybSA9IEZBTFNFKQ0KRGVzY1Rvb2xzOjpHQ0QoYygxMiwxMCw4KSwgbmEucm0gPSBGQUxTRSkNCg0KDQojIE5lam1lbnNpIHNwb2xlY255IG5hc29iZWsgKHNtYWxsZXN0IGNvbW1vbiBtdWx0aXBsZSkNCnggPSAxMg0KeSA9IDgNCmxpYnJhcnkoc2Nob29sbWF0aCkNCnNjaG9vbG1hdGg6OnNjbSh4LCB5KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpEZXNjVG9vbHM6OkxDTSh4LCB5KQ0KRGVzY1Rvb2xzOjpMQ00oYygxMiwxMCw4KSwgbmEucm0gPSBGQUxTRSkNCg0KYGBgDQoNCg0KTW9jbmlueSBhIG9kbW9jbmlueQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4ID0gOQ0KeT00DQoNCnNxcnQoeCkNCnheKDEvMikNCnheKC0xLzIpDQoNCngqKjINCnheMg0KeF4oLTIpDQoNCg0KIyB6ZGEgamUgY2lzbG8gbW9jbmlub3UgY2VsZWhvIGNpc2xhDQoNCmxpYnJhcnkobnVtYmVycykNCmlzSW50cG93ZXIoMTQ0KQ0KaXNJbnRwb3dlcig4KQ0KDQpgYGANCg0KDQpFeHBvbmVudHkgYSBsb2dhcml0bXkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyMjIEV4cG9uZW50eSAjIyMNCnggPSAyDQoxMF54ICMgZXhwb25lbnQNCjEwKip4ICMgZXhwb25lbnQNCg0KeCA9IDINCmV4cCh4KSAgICMgZV54DQoNCg0KIyMjIFByaXJvemVueSBsb2dhcml0bXVzICMjIw0KeCA9IDEwDQpsb2coeCkgICMgYmFzZSBlDQpsb2coeCwgYmFzZSA9IGV4cCgxKSkgICMgYmFzZSBlDQpsb2coMCkNCg0KDQojIyMgRGVrYWRpY2t5IGxvZ2FyaXRtdXMgIyMjDQp4ID0gMTANCmxvZzEwKHgpICMgYmFzZSAxMA0KbG9nKHgsYmFzZSA9IDEwKQ0KbG9nMTAoMCkNCg0KYGBgDQoNCg0KR29uaW9tZXRyaWNrw6kgZnVua2NlDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnggPSBwaS8yDQpjb3MoeCkNCnNpbih4KQ0KdGFuKHgpDQoNCnggPSAxDQphY29zKHgpDQphc2luKHgpDQphdGFuKHgpDQoNCg0KIyBwcmV2b2QgdWhseSB2cyByYWRpYW55DQpsaWJyYXJ5KHByYWNtYSkNCmRlZzJyYWQoMTIwKSANCnJhZDJkZWcoMy4xNCkNCg0KYGBgDQoNCg0KVnlwb8SNw610ZWp0ZSBwSCAwLjAwMSBNIGt5c2VsaW55IGNobG9yb3ZvZMOta292w6ksIDAuMDEgTSBoeWRyb3hpZHUgc29kbsOpaG8sIDAuMTUgTSBreXNlbGlueSBvY3RvdsOpIChLYSA9IDEuNzVlLTUpIGEgMC4wMSBNIGFtb25pYWt1IChLYiA9IDEuOGUtNSkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyBIQ2wNCnBIID0gLWxvZzEwKDAuMDAxKTsgcEgNCg0KDQojIE5hT0gNCnBIID0gMTQgLSAoLWxvZzEwKDAuMDEpKTsgcEgNCg0KDQojIENIM0NPT09IDQpwSCA9ICgtbG9nMTAoMS43NWUtNSktbG9nMTAoMC4xNSkpLzI7IHBIDQoNCmxpYnJhcnkoY2gpDQptb25vYShrYT0xLjc1ZS01LCBjPTAuMTUsIGRpZ2l0cyA9IDIpDQptb25vKGthPTEuNzVlLTUsIGM9MC4xNSwgZGlnaXRzID0gNCwgYWNpZCA9IFRSVUUsIGt3ID0gMWUtMTQpDQoNCg0KIyBOSDRPSA0KcEggPSAxNCAtICgtbG9nMTAoMS44ZS01KS1sb2cxMCgwLjAxKSkvMjsgcEgNCg0KbGlicmFyeShjaCkNCm1vbm9iKGthPTEuOGUtNSwgYz0wLjAxLCBkaWdpdHMgPSAyKQ0KbW9ubyhrYT0xLjhlLTUsIGM9MC4wMSwgZGlnaXRzID0gNCwgYWNpZCA9IEZBTFNFLCBrdyA9IDFlLTE0KQ0KDQpgYGANCg0KDQpNYXRlbWF0aWNrw6kga29uc3RhbnR5DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMjIyBMdWRvbGZvdm8gY2lzbG8gIyMjIw0KcGkNCnByaW50KHBpLCBkaWdpdHM9MjApDQoNCiMjIyBFdWxlcm92byBjaXNsbyAjIyMjDQpleHAoMSkNCnByaW50KGV4cCgxKSwgZGlnaXRzPTIwKSANCg0KYGBgDQoNCg0KVmVrdG9yeSAtIGdlbmVyb3bDoW7DrSDFmWFkeSDEjcOtc2VsDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCjE6Ng0KYygyOjEyKQ0KcmV2KGMoMjoxMikpDQoNCnNlcShmcm9tPTEsIHRvPTIwLCBieT0yKQ0Kc2VxKDUsIC01LCAtMSkNCnNlcShmcm9tPTUsIGJ5PS0xLCBhbG9uZy53aXRoID0gMToyMCkNCg0KcmVwKDEsIGxlbiA9IDkpDQpyZXAoMTo0LCBsZW4gPSA5KQ0KcmVwKDE6NCwgMikNCnJlcCgxOjQsIGVhY2ggPSAyKSAgICAgICAjIG5vdCB0aGUgc2FtZS4NCnJlcCgxOjQsIGVhY2ggPSAyLCBsZW4gPSA0KSAgICAjIGZpcnN0IDQgb25seS4NCnJlcCgxOjQsIGVhY2ggPSAyLCB0aW1lcyA9IDMpICANCg0KYGBgDQoNCg0KVmVrdG9yeSAtIMWZYWRhIG7DoWhvZG7DvWNoIMSNw61zZWwgeiBkYW7DqWhvIHJvem1lesOtDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgc2V0LnNlZWQoMTIzKQ0Kc2FtcGxlKDEyOjk5LCA5LCByZXBsYWNlID0gRkFMU0UpICMgYmV6IG9wYWtvdmFuaQ0Kc29ydChzYW1wbGUoMToyMCwgOSwgcmVwbGFjZSA9IEZBTFNFKSkNCnNhbXBsZSgxMjo5OSwgOSwgcmVwbGFjZSA9IFRSVUUpICMgcyBvcGFrb3ZhbmltDQpzb3J0KHNhbXBsZSgxOjIwLCA5LCByZXBsYWNlID0gVFJVRSkpDQoNCnJub3JtKG49NiwgbWVhbj0wLCBzZD0xKQ0Kcm5vcm0oNiw5LDEuNSkNCg0KcmJpbm9tKDMwLGMoMCwxKSwwLjUpICNtaW5jZQ0KcmJpbm9tKDMwLGMoMTo2KSwoMS82KSkgI2tvc3RrYSAoZGljZSkNCg0KcnVuaWYobj01LCBtaW49MCwgbWF4PTEpICMgcm92bm9tZXJuZSByb3pkZWxlbmkNCnJ1bmlmKDYsLTIsMikNCg0KYGBgDQoNCg0KSW5kZXh5DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXQuc2VlZCgxMjMpICMgZ2VuZXJhdG9yIG5haG9kbnljaCBjaXNlbA0KeCA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IEZBTFNFKQ0KaXMudmVjdG9yKHgpDQp4DQp4WzFdDQp4WzE6NV0NCnhbYygxOjUpXQ0KeFtsZW5ndGgoeCldDQp4WyhsZW5ndGgoeCktMSldDQp4Wy0xXQ0KeFstKDE6NSldDQp4Wy1jKDE6NSldDQp4Wy1sZW5ndGgoeCldDQp4WyhsZW5ndGgoeCktMyk6bGVuZ3RoKHgpXSNwb3NsZWRuaSA0IGhvZG5vdHkNCnhbYygxLDQsNyldI3Z5YnJhbmUgaG9kbm90eQ0Kd2hpY2gubWF4KHgpDQp3aGljaC5taW4oeCkNCmxpYnJhcnkoUm1wZnIpDQp3aGljaC5taW4oeCkNCndoaWNoKHg8PTUwKQ0KeFt3aGljaCh4PD01MCldDQp4W3g8PTUwXQ0Kd2hpY2goeD49NTApDQp4W3doaWNoKHg+PTUwKV0NCndoaWNoKHggPT0gbWF4KHgpKSNtYXhpbWFsbmkgaG9kbm90YQ0Kd2hpY2goeCA9PSAxMCkNCndoaWNoKHggIT0gMTApDQp4W3ggPiA0MF0jaG9kbm90eSB2eXNzaSBuZXogNDAuDQp4W3ggPCA0MF0jaG9kbm90eSBtZW5zaSBuZXogNDANCndoaWNoKHggPiAxMCkjaG9kbm90eSB2eXNzaSBuZXogMTAuDQp3aGljaCh4IDwgMTApI2hvZG5vdHkgbWVuc2kgbmV6IDEwLg0KDQpgYGANCg0KDQpVc3BvxZnDoWTDoW7DrSB2ZWt0b3J1DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnggPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBGQUxTRSkNCg0KcmFuayh4KSAgIyB2aG9kbmUgcHJvIHZla3RvcnksIG5ldmhvZG5lIHBybyBtYXRpY2UgDQoNCnNvcnQoeCwgZGVjcmVhc2luZyA9IEZBTFNFKQ0Kc29ydCh4LCBkZWNyZWFzaW5nID0gVFJVRSkNCnNvcnQoeFt3aGljaCh4Pj01MCldKQ0Kb3JkZXIoeCkgICMgcG9yYWRpIChpbmRleHkpIHBybyBzb3J0DQp4W29yZGVyKHgpXQ0KDQpgYGANCg0KDQpNbm/FvmlueQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4ID0gMTANCg0KeCA9PSAwDQp4ICE9IDANCnggPT0gMTANCnggIT0gMTANCng+MA0KeDwwDQp4Pj0wDQp4Pj0xMA0KeDw9MTANCi14Pj0xMA0KDQpsaWJyYXJ5KGV4dHJhb3BlcmF0b3JzKQ0KIyBodHRwczovL2pvc2h1YXdpbGV5LmNvbS9leHRyYW9wZXJhdG9ycy8NCnglbCUxMCAjIDwNCnglbGUlMTAgIyA8PQ0KeCVnJTEwICMgPg0KeCVnZSUxMCAjID49DQogDQogDQp4IDwtIGMoc29ydChzYW1wbGUoMToyMCwgMykpKQ0KDQp4PjUgJiB4PDEwICMgNSA8IHggQU5EIHggPCAxMQ0KeD41IHwgeDwxMCAjIDUgPCB4IE9SIHggPCAxMQ0KDQpsaWJyYXJ5KGV4dHJhb3BlcmF0b3JzKQ0KIyBodHRwczovL2pvc2h1YXdpbGV5LmNvbS9leHRyYW9wZXJhdG9ycy8NCg0KNSVnbCUxMCAjICMgNSA8IHggQU5EIHggPCAxMSAoNSwgMTEpDQo1JWdlbCUxMCAjIDUgPD0geCBBTkQgeCA8IDExIFs1LCAxMSkNCjUlZ2xlJTEwICMgNSA8IHggQU5EIHggPD0gMTEgKDUsIDExXQ0KNSVnZWxlJTEwICMgNSA8PSB4IEFORCB4IDw9IDExIFt4LCB5XQ0KDQoNCnkgPC0gYyhzb3J0KHNhbXBsZSgzOjIzLCA3KSkpDQoNCnVuaW9uKHgsIHkpICMgc2plZG5vY2VuaQ0KaW50ZXJzZWN0KHgsIHkpICMgcHJ1bmlrDQpzZXRkaWZmKHgsIHkpICMgcm96ZGlsIG1ub3ppbg0Kc2V0ZGlmZih5LCB4KSAjIHJvemRpbCBtbm96aW4NCg0KDQojIGtsYWRuZSB2cy4gemFwb3JuZSBjaXNsbw0KeCA8LSBjKC0xLCAtMiwgMy4wMiwgNCwgLTUuMiwgNiwgLTcsIDApIA0Kc2Nob29sbWF0aDo6aXMubmVnYXRpdmUoeCkNCnNjaG9vbG1hdGg6OmlzLnBvc2l0aXZlKHgpDQpzY2hvb2xtYXRoOjppcy5yZWFsLnBvc2l0aXZlKHgpDQoNCiMgc3VkZSB2cy4gbGljaGUgY2lzbG8NCnggPC0gYygxLCAyLCAzLCA0LCA1LCA2LCA3KSANCnNjaG9vbG1hdGg6OmlzLmV2ZW4oeCkNCnNjaG9vbG1hdGg6OmlzLm9kZCh4KQ0KeCAlJSAyID09IDAgDQp4ICUlIDIgIT0gMA0KDQpgYGANCg0KDQpWZWt0b3JvdsOhIGFyaXRtZXRpa2ENCg0KYGBge3J9DQphID0gYygxLCAzLCA1LCA3KSANCmIgPSBjKDEsIDIsIDQsIDgpIA0KNSAqIGENCmEgKyBiIA0KYSAtIGIgDQphICogYiANCmEgLyBiDQoNCnUgPSBjKDEwLCAyMCwgMzApIA0KdiA9IGMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSkgDQp1ICsgdiANCg0KZGlmZih1KQ0KZGlmZih2KQ0KDQoNCm1heCh4KQ0KbWluKHgpDQpyYW5nZSh4KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpSYW5nZSh4KQ0Kc3VtKHgpDQpjdW1zdW0oeCkNCnByb2QoeCkNCmN1bXByb2QoeCkNCmRpZmYoeCkNCnNpZ24oeCkNCg0KYGBgDQoNCg0KRmlsdHJvdsOhbsOtIGhvZG5vdCB2ZSB2ZWt0b3J1DQoNCmBgYHtyfQ0KDQp4ID0gc2FtcGxlKDEyOjk5LCA5LCByZXBsYWNlID0gVFJVRSkNCngNCnVuaXF1ZSh4KQ0KdGFibGUoeCkNCnN1bW1hcnkoYXMuZmFjdG9yKHgpKQ0KIyBmcmVrdmVuY2Ugdnlza3l0dSBkYW5laG8gY2lzbGENCnN1bSh4PT0zMikNCmxlbmd0aCh3aGljaCh4PT01NykpDQoNCg0KbnVtYmVycyA9Yyg0LDIzLDQsMjMsNSw0Myw1NCw1Niw2NTcsNjcsNjcsNDM1LDQ1Myw0MzUsNyw2NSwzNCw0MzUpDQp0YWJsZShudW1iZXJzKVsyXT09MQ0KbnVtYmVyc1syXQ0Kc3VtKG51bWJlcnM9PTQzNSkNCg0KZHVwbGljYXRlZChudW1iZXJzKSAjIGlkZW50aWZ5aW5nIGR1cGxpY2F0ZWQgZWxlbWVudHMgDQpudW1iZXJzW2R1cGxpY2F0ZWQobnVtYmVycyldDQp1bmlxdWUobnVtYmVycykgIyBleHRyYWN0aW5nIHVuaXF1ZSBlbGVtZW50cywNCg0KYGBgDQoNCg0KTWF0aWNlDQoNCmBgYHtyfQ0KDQp4ID0gc2FtcGxlKDEyOjk5LDE4LCByZXBsYWNlID0gRkFMU0UpOyB4DQptYXRyaXgoeCxucm93PTYsbmNvbD0zLGJ5cm93ID0gVFJVRSkNCm1hdHJpeCh4LG5yb3c9NixuY29sPTMsYnlyb3cgPSBGQUxTRSkNCg0KDQp4MSA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IEZBTFNFKQ0KeDIgPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBUUlVFKQ0KDQp4MTIgPSByYmluZCh4MSx4MikNCngxMiA9IGNiaW5kKHgxLHgyKQ0KaXMubWF0cml4KHgxMikNCm5yb3coeDEyKQ0KbmNvbCh4MTIpDQoNCngxMltvcmRlcih4MSksXQ0KeDEyW29yZGVyKHgyKSxdDQp4MTJbLDFdDQp4MTJbLCJ4Il0NCngxMiR4DQoNCmNvbG5hbWVzKHgxMikNCmNvbG5hbWVzKHgxMik9YygiWCIsIlkiKQ0Kcm93bmFtZXMoeDEyKQ0Kcm93bmFtZXMoeDEyKSA9IExFVFRFUlNbMTpsZW5ndGgoeDEpXSANCg0KYGBgDQoNCg0KRGF0YWZyYW1lcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4MSA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IEZBTFNFKQ0KeDIgPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBUUlVFKQ0KeiA9IExFVFRFUlNbMTpsZW5ndGgoeDEpXSANCg0KeDEyID0gcmJpbmQoeDEseDIseikNCngxMiA9IGNiaW5kKHgxLHgyLHopDQpucm93KHgxMikNCm5jb2woeDEyKQ0KaXMuZGF0YS5mcmFtZSh4MTIpDQppcy5tYXRyaXgoeDEyKQ0KDQp4MTIgPSBhcy5kYXRhLmZyYW1lKHgxMikNCngxMlssMV0gPSBhcy5udW1lcmljKHgxMlssMV0pDQp4MTJbLDJdID0gYXMubnVtZXJpYyh4MTJbLDJdKQ0KDQppcy5kYXRhLmZyYW1lKHgxMikNCmNvbG5hbWVzKHgxMikNCnJvd25hbWVzKHgxMikNCmFzLm1hdHJpeCh4MTIpDQoNCg0KbWVhbih4MSkNCm1lYW4oYXMubnVtZXJpYyh4MTJbLDFdKSkNCg0KYGBgDQoNCg0KU2V6bmFteSAobGlzdHMpDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCng9IGxpc3QoMSwyLDMpDQpuYW1lcyh4KSA9IGMoIngxIiwieDIiLCJ4MyIpDQp4JHgxWzFdDQp4W1syXV1bMV0NCg0KeDEgPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBGQUxTRSkNCngyID0gc2FtcGxlKDEyOjk5LDE5LCByZXBsYWNlID0gVFJVRSkNCngzID0gc2FtcGxlKDEyOjk5LDE5LCByZXBsYWNlID0gVFJVRSkNCnogPSBMRVRURVJTWzE6bGVuZ3RoKHgxKV0gDQoNCngxMjMgPSBsaXN0KHgxLHgyLHgzLHopDQppcy5saXN0KHgxMjMpDQpuYW1lcyh4MTIzKSA9IGMoIngxIiwieDIiLCJ4MyIsInoiKSANCngxMjMkeDENCngxMjNbWzFdXQ0KDQoNCngxID0gc2FtcGxlKDEyOjk5LDE5LCByZXBsYWNlID0gRkFMU0UpDQp4MiA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IFRSVUUpDQp4MyA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IFRSVUUpDQpMTCA9IGxpc3QoeDEseDIseDMpDQpuYW1lcyhMTCkgPSBjKCJ4MSIsIngyIiwieDMiKQ0KDQpMTFtbMl1dWzNdDQpMTCR4MlszXQ0KDQpgYGANCg0KDQoNClZ5cG/EjcOtdGVqdGUgbW9sZWt1bG92w6kgaG1vdG5vc3RpIGFsa2Fuxa8gQzEgLSBDMTIuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCkhDID0gZnVuY3Rpb24obil7bioxMi4wMTEgKyAoMipuICsgMikqMS4wMDh9DQoNCmhjMTEyID0gSEMoYygxOjEyKSkNCm5hbWVzKGhjMTEyKSA9IGMoMToxMikNCmhjMTEyDQoNCmhjMTEyID0gc2FwcGx5KGMoMToxMiksSEMpDQpuYW1lcyhoYzExMikgPSBjKDE6MTIpDQpoYzExMg0KDQpoYzExMiA9IGxhcHBseShjKDE6MTIpLEhDKQ0KbmFtZXMoaGMxMTIpID0gYygxOjEyKQ0KaGMxMTINCg0KYGBgDQoNCg0KVmxpdiAzIMWvem7DvWNoIGRydWjFryBrcm1pdmEgbmEgcMWZw61yxa9zdGVrIMW+aXbDqSB2w6FoeSAodiBrZykgcHJhc2F0LCByb3pkxJtsZW7DvWNoIGRvIDQgcsWvem7DvWNoIHNrdXBpbi4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCkEgPSBjKDcuMCwgMTYuMCwgMTAuNSwgMTMuNSkNCkIgPSBjKDE0LjAsIDE1LjUsIDE1LjAsIDIxLjApDQpDID0gYyg4LjUsIDE2LjUsIDkuNSwgMTMuNSkNCnBzID1jYmluZChBLEIsQykNCmNvbG5hbWVzKHBzKSA9IGMoIkEiLCJCIiwiQyIpDQpyb3duYW1lcyhwcykgPSBjKCJJIiwiSUkiLCJJSUkiLCJJViIpDQpwcw0KDQpjb2xTdW1zKHBzKQ0Kcm93U3VtcyhwcykNCg0KY29sTWVhbnMocHMpDQpyb3dNZWFucyhwcykNCg0KYXBwbHkocHMsMixtZWFuKQ0KYXBwbHkocHMsMSxtZWFuKQ0KDQojIGRlbGVuaSBob2Rub3QgdmUgc2xvdXBjaSBzdW1vdSBzbG91cGNlDQpzdXAgPSBhcHBseShwcywyLHN1bSkNCnNhcHBseShjKDE6MyksZnVuY3Rpb24oaSl7cHNbLGldL3N1cFtpXX0pDQoNCg0KbGlicmFyeShyZXNoYXBlMikNCm1lbHQocHMpDQpwciA9IHNldE5hbWVzKG1lbHQocHMpLCBjKCdzZXJpZScsJ2tybWVuaScsJ3ByaXJ1c3RlaycpKQ0KcHINCg0KYXMuZGF0YS5mcmFtZShwcikNCmFzLm1hdHJpeChwcikNCg0KYWNhc3QocHIsc2VyaWUgfiBrcm1lbmkpDQoNCg0Kc3QgPSBzdGFjayhhcy5kYXRhLmZyYW1lKHBzKSk7IHN0DQp1bnN0YWNrKHN0KQ0KDQoNCnByaXJ1c3RlayA9IHByWywicHJpcnVzdGVrIl0NCnNlcmllID0gYXMuZmFjdG9yKHByWywic2VyaWUiXSkNCmtybWVuaSA9IGFzLmZhY3RvcihwclssImtybWVuaSJdKQ0KDQphZ2dyZWdhdGUocHJpcnVzdGVrLGxpc3Qoa3JtZW5pKSwgRlVOPW1lYW4pDQphZ2dyZWdhdGUocHJpcnVzdGVrLGxpc3Qoc2VyaWUsa3JtZW5pKSwgRlVOPW1lYW4pDQoNCnRhcHBseShwcmlydXN0ZWssIGxpc3Qoa3JtZW5pKSwgbWVhbikNCnRhcHBseShwciRwcmlydXN0ZWssIHByJGtybWVuaSwgbWVhbikNCg0KDQoNCmxwcyA9IGxpc3QoQSxCLEMpDQpscHMNCm5hbWVzKGxwcykgPSBjKCJBIiwiQiIsIkMiKQ0KbHBzDQoNCnVubGlzdChscHMpDQoNCmRvLmNhbGwoY2JpbmQsbHBzKQ0KDQpzYXBwbHkobHBzLG1lYW4pDQpsYXBwbHkobHBzLG1lYW4pDQoNCg0Kc3QgPSBzdGFjayhscHMpOyBzdA0KdW5zdGFjayhzdCkNCg0KbGlicmFyeShyZXNoYXBlMikNCm1lbHQobHBzKQ0KbHByID0gc2V0TmFtZXMobWVsdChscHMpLCBjKCdrcm1lbmknLCdwcmlydXN0ZWsnKSkNCmxwcg0KDQoNCmBgYA0KDQoNClBpcGUgb3BlcmF0b3IgKCU+JSkgdiBSDQoNCmBgYHtyfQ0KDQphID0gMy4xNDE1OQ0KYiA9IHNlcShmcm9tID0gYSwxMCwzKQ0Kcm91bmQoYiwzKQ0KDQphID0gMy4xNDE1OQ0Kc2VxKHJvdW5kKGEsMyksMTAsMykNCg0KIyBwaXBlIG9wZXJhdG9yDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KYSA9IDMuMTQxNTkNCmEgJT4lIHNlcSgxMCwzKSAlPiUgcm91bmQoMykNCg0KYGBgDQoNCg0KUMWZw61rYXogaWYtZWxzZQ0KDQpgYGB7cn0NCg0KeCA9IHNhbXBsZSgxMjo5OSwxOCwgcmVwbGFjZSA9IEZBTFNFKTsgeA0KaWZlbHNlKHg8NTAsMCwxKQ0KeFt4PDUwXSA9IDANCnhbeD49NTBdID0gMQ0KeA0KDQpgYGANCg0KDQpWeXBvY8OtdGVqdGUgdmF6ZWJub3UgZW5lcmdpaSBhdG9tb3bDqWhvIGrDoWRyYSBwb21vY2kgQmV0aGUgLSBXZWlzemFja2Vyb3Z5IHJvdm5pY2UgQiA9IDE0LjAgLSAxMy4xKkFeKDIvMykgKyAwLjU4NSpaKihaLTEpL0FeKDEvMykgLSAoMTguMSooQS0yKlopXjIpL0EgKyBDL0EsIGtkZQ0KQSAtIG51a2xlb25vdmUgY2lzbG8sIFogLSBhdG9tb3ZlIGNpc2xvLCBDIC0ga29uc3RhbnRhLCBwcm8gasOhZHJhIHNlIHN1ZMO9bSBwb8SNdGVtIHByb3RvbsWvIGkgbmV1dHJvbsWvIGplIHJvdm5hIDEzMiwgDQpwcm8gasOhZHJhIHMgbGljaMO9bSBwb8SNdGVtIHByb3RvbsWvIGkgbmV1dHJvbsWvIGplIHJvdm5hIC0xMzIsIHBybyBsaWNoeSBwb8SNZXQgcHJvdG9uxa8gYSBzdWTDvSBwb8SNZXQgbmV1dHJvbsWvIGEgbmFvcGFrIGplIHJvdm5hIDAuDQoNCmBgYHtyfQ0KDQojIGFscGhhIHBhcnRpY2xlDQpBID0gNCANClogPSAyDQoNCiMgVS0yMzUNCkEgPSAyMzUgDQpaID0gOTINCg0KIyBmdW5rY2UNCk4gPSBBLVoNCmlmIChOJSUyPT0wICYgWiUlMj09MCl7QyA9IDEzMn0gZWxzZSBpZiAoTiUlMiE9MCAmIFolJTIhPTApe0MgPSAtMTMyfSBlbHNlIHtDID0gMH0NCkIgPSAxNC4wIC0gMTMuMSpBXigyLzMpICsgMC41ODUqWiooWi0xKS9BXigxLzMpIC0gKDE4LjEqKEEtMipaKV4yKS9BICsgQy9BDQpCICMgW01lVl0NCkIvQSAjIGVuZXJnaWUgbmEgMSBudWtsZW9uIFtNZVZdDQoNCiMgcG9sb21lciBqYWRyYTogUiA9IFIwICogQV4oMS8zKQ0KUjAgPSAxLjRlLTEzICMgW2NtXQ0KUiA9IFIwICogQV4oMS8zKQ0KUiA9IFIqMTBlLTE1IA0KUiAgICMgW21dDQoNCmBgYA0KDQoNCkN5a2x1cyB0eXB1IHdoaWxlDQoNClZ5cG/EjcOtdGVqdGUgbW9sZWt1bG92w6kgaG1vdG5vc3RpIGFsa2Fuxa8gQzEgLSBDMTIgKHdoaWxlIGxvb3ApDQoNCmBgYHtyfQ0KDQpuID0gMQ0KTWhjID0gTlVMTA0Kd2hpbGUobiA8PSAxMil7DQogIGhjID0gbioxMi4wMTEgKyAoMipuICsgMikqMS4wMDgNCiAgTWhjID0gYyhNaGMsaGMpDQogIG4gPSBuKzENCn0NCm5hbWVzKE1oYykgPSBjKDE6MTIpDQpNaGMNCg0KYGBgDQoNCg0KQ3lrbHVzIHR5cHUgZm9yIChmb3IgbG9vcCkNCg0KVnlwb8SNw610ZWp0ZSBtb2xla3Vsb3bDqSBobW90bm9zdGkgYWxrYW7FryBDMSAtIEMxMg0KDQpgYGB7cn0NCg0KTWhjID0gTlVMTA0KZm9yKG4gaW4gYygxOjEyKSl7DQogIGhjID0gbioxMi4wMTEgKyAoMipuICsgMikqMS4wMDgNCiAgTWhjID0gYyhNaGMsaGMpIA0KfQ0KbmFtZXMoTWhjKSA9IGMoMToxMikNCk1oYw0KDQpgYGANCg0KDQpWeXBvxI3DrXRlanRlIHN0xZllZG7DrSBrdmFkcmF0aWNrb3UgcnljaGxvc3QgbW9sZWt1bCBkYW7DvWNoIHBseW7FryB2IHJvem1lesOtIHRlcGxvdCBvZCAxNTAgSyBkbyA1MDAgSyBzIGtyb2tlbSA1MCBLLg0KDQpgYGB7cn0NCg0KZWwgPSBjKCJIMiIsIkhlIiwgIk8yIiwgIktyIikNCk0gPSBjKDIuMDE1OSwgNC4wMDI2LCAzMS45OTg4LCA4My44KSAjIFtnIC8gbW9sXQ0KVHMgPSBzZXEoZnJvbT0xNTAsIHRvPTUwMCwgYnk9NTApICMgW0tdDQpSID0gODMxNC4zNCAjIFtKIC8ga21vbCBLXQ0KTUtWID0gTlVMTA0KZm9yKHR0IGluIFRzKXsNCiAgbWt2PSByZXAoMCwgbGVuZ3RoKE0pKQ0KICBmb3IoaWkgaW4gYygxOmxlbmd0aChNKSkpew0KICAgIG1rdltpaV0gPSAoMypSKnR0L01baWldKV4oMS8yKQ0KICB9DQogIE1LViA9IHJiaW5kKE1LViwgbWt2KSAgIA0KfQ0KY29sbmFtZXMoTUtWKSA9IGVsDQpyb3duYW1lcyhNS1YpID0gVHMNCk1LVg0KcGxvdCgwLDAseGxpbT1jKG1pbihUcyksbWF4KFRzKSkseWxpbSA9IGMobWluKE1LViksbWF4KE1LVikpLCB0eXBlID0ibiIseGxhYj0iVCBbS10iLHlsYWI9InN0ci4ga3YuIHJ5Y2hsb3N0IFttL3NdIikNCmZvcihpaSBpbiBjKDE6bGVuZ3RoKE0pKSl7cG9pbnRzKFRzLE1LVlssaWldLCB0eXBlPSJwIixjb2w9aWkscGNoPTE2KX0NCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPWVsLGNvbD1jKDE6bGVuZ3RoKE0pKSxwY2g9MTYsY2V4PS44KQ0KDQpgYGANCg0KDQpGeXppa8OhbG7DrSBrb25zdGFudHkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShtYXJlbGFjKQ0KZGF0YShDb25zdGFudHMpDQpDb25zdGFudHMNCg0KIyBVbml2ZXJ6YWxuaSBwbHlub3ZhIGtvbnN0YW50YQ0KQ29uc3RhbnRzJGdhc0N0MQ0KQ29uc3RhbnRzJGdhc0N0Mg0KQ29uc3RhbnRzJGdhc0N0Mw0KUiA9IGFzLm51bWVyaWMoQ29uc3RhbnRzJGdhc0N0MlsxXSk7IFIgIyBob2Rub3RhDQpDb25zdGFudHMkZ2FzQ3QyWzJdICMgamVkbm90a2ENCg0KDQpsaWJyYXJ5KGNvbnN0YW50cykNCmNvZGF0YQ0Kc3ltc193aXRoX2Vycm9ycw0Kc3ltc193aXRoX3VuaXRzDQoNCmxvb2t1cCgicGxhbmNrIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgiYXZvZ2Fkcm8iLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJmYXJhZGF5IiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgibW9sYXIiLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJtb2xhciBtYXNzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgibGlnaHQiLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJib2x0em1hbm4iLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJtYXNzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgibWFzcyBjb25zdGFudCIsIGlnbm9yZS5jYXNlPVRSVUUpDQpsb29rdXAoInByb3RvbiBtYXNzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgiZWxlY3Ryb24gbWFzcyIsIGlnbm9yZS5jYXNlPVRSVUUpDQoNCiMgVW5pdmVyemFsbmkgcGx5bm92YSBrb25zdGFudGENCmxvb2t1cCgiZ2FzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmNvZGF0YVsxMzQsXQ0KUiA9IGFzLm51bWVyaWMoY29kYXRhWzEzNCw1XSkgIyBob2Rub3RhDQpSdSA9IGFzLm51bWVyaWMoY29kYXRhWzEzNCw2XSkgIyBuZWppc3RvdGENCmNvZGF0YVsxMzQsN10gIyBqZWRub3RrYQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbGlicmFyeShjaCkNCnBlcmlvZF90YWJsZSgpDQoNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KZGF0YShkLnBlcmlvZGljKQ0KZC5wZXJpb2RpYw0KDQpsaWJyYXJ5KGxvb24uZGF0YSkNCmRhdGEoZWxlbWVudHMpDQplbGVtZW50cw0KDQpsaWJyYXJ5KFBlcmlvZGljVGFibGUpDQpkYXRhKHBlcmlvZGljVGFibGUpDQpwZXJpb2RpY1RhYmxlDQojDQplbCA9ICJTZSINCnBlbCA9IHBlcmlvZGljVGFibGVbd2hpY2gocGVyaW9kaWNUYWJsZSRzeW1iPT1lbCksXQ0KcGVsJGNvbmZpZw0KcGVsJG1hc3MNCnBlbCRFbmVnDQp2ZWwgPSBwZWwkZ3JvdXAtMTAgICMgcG9jZXQgdmFsZW5jbmljaCBlbGVrdHJvbnUgYXRvbXUNCg0KbGlicmFyeShDaGVtbWluZVIpICMgYmlvYw0KZGF0YShhdG9tcHJvcCkNCmF0b21wcm9wDQoNCmxpYnJhcnkoQ0hOT1NaKQ0KdGhlcm1vKCkkZWxlbWVudA0KdGhlcm1vKCkkZWxlbWVudFssYygxLDQpXQ0KDQoNCiMjIyMgQXRvbW92ZSBobW90bm9zdGkNCg0KbGlicmFyeShtYXJlbGFjKQ0KZGF0YShBdG9taWNXZWlnaHQpDQpBdG9taWNXZWlnaHQNCg0KQXRvbWljV2VpZ2h0W0F0b21pY1dlaWdodCRTeW1ib2wgPT0gIkMiLF0NCmF0b21pY3dlaWdodCRDIA0KDQptb2x3ZWlnaHQoIkgiKSANCm1vbHdlaWdodCgiQyIpDQoNCmxpYnJhcnkoQ0hOT1NaKQ0KQVcgPSBDSE5PU1o6Om1hc3MoIkNhIik7IEFXDQoNCmxpYnJhcnkoYmlvZ2FzKQ0KbW9sTWFzcygiQyIpDQptb2xNYXNzKCdGZScpDQoNCmBgYA0KDQoNClVyxI1ldGUgZMOpbGt1IG3Em2TEm27DqWhvIGRyw6F0dSBvIHByxa9txJtydSAxLjYgbW0gamVob8W+IGhtb3Rub3N0IGplIDAuOCBrZy4NCg0KYGBge3J9DQoNCmxpYnJhcnkoUGVyaW9kaWNUYWJsZSkNCmRhdGEocGVyaW9kaWNUYWJsZSkNCnB0Q3UgPSBwZXJpb2RpY1RhYmxlW3doaWNoKHBlcmlvZGljVGFibGUkc3ltYj09IkN1IiksXQ0KcHRDdSRkZW5zaXR5DQoNCmhtID0gMC44ICMga2cNCnJobyA9IHB0Q3UkZGVuc2l0eSoxMDAwICMga2cvbTMNCiMgcmhvID0gODkwMCAjIGtnL20zDQpkID0gMS42ZS0zICMgbQ0KDQpWID0gaG0vcmhvDQpTID0gcGkqKGQvMileMg0KTCA9IFYvUzsgTA0KDQpwYXN0ZSgiRMOpbGthIGRyw6F0dSBqZSIsIHJvdW5kKEwsMCksICJtLiIpDQoNCmBgYA0KDQoNCk1vbGVrdWxvdsOpIGhtb3Rub3N0aQ0KDQpgYGB7cn0NCg0KbGlicmFyeShlbnZpUGF0KQ0KZGF0YShjaGVtZm9ybXMpDQpjaGVtZm9ybXMNCmZvcm11bGExPC1jKCJDMTJIMTBDbDEwIikNCmZvcm11bGEyPC1jKCJDM0g1IikNCiMgb2RlY2l0YW5pIDIgdnpvcmN1DQpzdWJmb3JtKGZvcm11bGExLGZvcm11bGEyKQ0KIyBzY2l0YW5pIDIgdnpvcmN1DQptZXJnZWZvcm0oZm9ybXVsYTEsZm9ybXVsYTIpDQojIG5hc29iZW5pIHZ6b3JjZQ0KZm9ybXVsYTE8LWMoIkMxMkgxMENsMTAiKQ0KbXVsdGlmb3JtKGZvcm11bGExLDMpDQoNCg0KbGlicmFyeShtYXJlbGFjKQ0KbW9sd2VpZ2h0KCJDTzIiKSANCm1vbHdlaWdodCgiSENPMyIpIA0KbW9sd2VpZ2h0KCJIM1BPNCIpDQptb2x3ZWlnaHQoIkNIM0NIMkNIQ0hDSDJDSENIQ0gyQ0hDSENIMkNIQ0hDSDJDSENIKENIMikzQ09PSCIpICMgZWljb3NhcGVudGFlbm9pYyBhY2lkIChFUEEpIA0KbW9sd2VpZ2h0KCJDMjBIMzBPMiIpDQptb2x3ZWlnaHQoYygiQzJINU9IIiwgIkNPMiIsICJIMk8iKSkgDQptb2x3ZWlnaHQoYygiU2lPRkg0IiwgIk5hSENPMyIsICJDNkgxMk82IiwgIkNhKEhDTzMpMiIsICJQYihOTzMpMiIsICIoTkg0KTJTTzQiKSkNCg0KDQpsaWJyYXJ5KENITk9TWikNCk1XID0gQ0hOT1NaOjptYXNzKCJDYUNPMyIpOyBNVw0KIyBwb2NldCBhdG9tdSBwcnZrdSB2ZSB2em9yY2kNCmNlID0gY291bnQuZWxlbWVudHMoIkNhQ08zIik7IGNlDQphcy5jaGVtaWNhbC5mb3JtdWxhKGNlLCBkcm9wLnplcm8gPSBUUlVFKQ0KDQptZSA9IG1ha2V1cCgiQzZIMTJPNiIsIG11bHRpcGxpZXIgPSAxLCBzdW0gPSBUUlVFLCBjb3VudC56ZXJvID0gVFJVRSk7IG1lDQpjZSA9IGNvdW50LmVsZW1lbnRzKCJDNkgxMk82Iik7IGNlDQppMkEoIkM2SDEyTzYiKQ0KYXMuY2hlbWljYWwuZm9ybXVsYShjZSwgZHJvcC56ZXJvID0gVFJVRSkNCmFzLmNoZW1pY2FsLmZvcm11bGEobWUsIGRyb3AuemVybyA9IFRSVUUpDQoNCg0KbGlicmFyeShiaW9nYXMpDQptb2xNYXNzKCJDNkgxMk82IikNCm1vbE1hc3MoYygiQzZIMTJPNiIsICJDSDNDT09IIikpDQptb2xNYXNzKCJIM0MoQ0gyKTVDT09IIikNCm1vbE1hc3MoJ0ZlU080KEgyTyk3JykgIyBoeWRyYXRlcw0KbW9sTWFzcygiKEM2SDEyTzYpMC4yNDk5OSAoSDNDT09IKTAuNzUwMDEiKQ0KDQoNCmxpYnJhcnkoQlJBSU4pICMgQmlvYw0KY2FsY3VsYXRlQXZlcmFnZU1hc3MobGlzdChDPTYwLCBIPTMwLCBOPTAsIE89MzAsIFM9MCkpDQoNCg0KbGlicmFyeShNU2JveCkNCk1TYm94OjptYXNzKCdDN0g3TycpDQpNU2JveDo6bWFzcygnQzdoN28xJykNCk1TYm94OjptYXNzKCdDN0g3TycsIGNhc2VTZW5zaXRpdmUgPSBUUlVFKQ0KDQpgYGANCg0KDQpVaGxvdm9kw61rIG8gbW9sZWt1bG92w6kgaG1vdG5vc3RpIDg0IGcvbW9sIG9ic2FodWplIDg1LjcxICUgdWhsw61rdSBhIDE0LjI5ICUgdm9kw61rdS4gVXLEjWV0ZSBtb2xla3Vsb3bDvSB2em9yZWMuDQoNCmBgYHtyfQ0KDQpNID0gODQgIyBnL21vbA0KbWMgPSAwLjg1NzENCm1oID0gMC4xNDI5DQpsaWJyYXJ5KG1hcmVsYWMpDQptQyA9IG1vbHdlaWdodCgiQyIpICMgZy9tb2wNCm1IID0gbW9sd2VpZ2h0KCJIIikgIyBnL21vbA0KDQpycyA9IGMobWMvbUMsbWgvbUgpL21pbihtYy9tQyxtaC9tSCkNCnJzID0gcm91bmQocnMsMCkNCm4gPSBNL3N1bShycypjKG1DLG1IKSkNCm4gPSByb3VuZChuLDApDQpmb3JtID0gcnMqbjsgZm9ybQ0KZ3N1YigiICIsICIiLCBwYXN0ZSgiQyIsZm9ybVsxXSwiSCIsZm9ybVsyXSkpDQoNCg0KbGlicmFyeShSZGlzb3ApDQpkbXAgPSBkZWNvbXBvc2VNYXNzKG1hc3M9TSwgcHBtPTEsIG16YWJzPTAuMSwgIGVsZW1lbnRzPWluaXRpYWxpemVFbGVtZW50cyhjKCJDIiwiSCIpKSwgej0xLCBtaW5FbGVtZW50cz0iQzQiLCBtYXhFbGVtZW50cz0iQzEwIikNCmRtcCRmb3JtdWxhDQoNCmxpYnJhcnkocmNkaykNCmdlbmVyYXRlLmZvcm11bGEoTSwgd2luZG93PTUsIHZhbGlkYXRpb249RkFMU0UsIGNoYXJnZT0xLGVsZW1lbnRzPWxpc3QoYygiQyIsMiwxMCksYygiSCIsNCwzMCkpKQ0KDQpgYGANCg0KDQpJem90b3B5DQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KGVudmlQYXQpDQpkYXRhKGlzb3RvcGVzKQ0KaXNvdG9wZXMNCg0KbGlicmFyeShlY2lwZXgpDQpuaXN0aXNvDQpuaXN0aXNvJG1hc3MNCm5pc3Rpc28kYWJ1bmRhbmNlDQpuaXN0aXNvJGVsZW1lbnQNCg0KbGlicmFyeShJc29TcGVjUikNCmRhdGEoaXNvdG9waWNEYXRhKQ0KaXNvdG9waWNEYXRhDQoNCmxpYnJhcnkoQ0lBQVdjb25zZW5zdXMpDQpjaWFhdy5tYXNzLjIwMDMNCmNpYWF3Lm1hc3MuMjAxMg0KY2lhYXcubWFzcy4yMDE2DQoNCmBgYA0KDQoNCkl6b3RvcG92w6kgcGF0dGVybnkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KDQpsaWJyYXJ5KE9yZ01hc3NTcGVjUikNCklzb3RvcGljRGlzdHJpYnV0aW9uKGZvcm11bGEgPSBsaXN0KEMgPSAxLCBIID0gMSwgQ2wgPSAzKSwgY2hhcmdlID0gMSkNCiMgYWxsb3dlZCBlbGVtZW50czogQywgSCxOLCBPLCBTLCBQLCBCciwgQ2wsIEYsIFNpLg0KIyByZWxhdGl2ZSBhdG9taWMgbWFzc2VzIG9mIHRoZSBlbGVtZW50cyBhcmUgZnJvbSB0aGUgTklTVCBQaHlzaWNhbCBSZWZlcmVuY2UgRGF0YSANCiMgaHR0cHM6Ly93d3cubmlzdC5nb3YvcG1sL2F0b21pYy13ZWlnaHRzLWFuZC1pc290b3BpYy1jb21wb3NpdGlvbnMtcmVsYXRpdmUtYXRvbWljLW1hc3Nlcy4NCg0KbXggPC0gSXNvdG9waWNEaXN0cmlidXRpb24oZm9ybXVsYSA9IGxpc3QoQyA9IDksIEggPSA0LCBCciA9IDUsIENsID0gMSwgTiA9IDIpKQ0KbGlicmFyeShsYXR0aWNlKQ0KeHlwbG90KHBlcmNlbnQgfiBteiwgZGF0YSA9IG14LHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiaW50ZW5zaXR5ICglKSIsbWFpbiA9ICJJc290b3BpYyBEaXN0cmlidXRpb24sIEM5SDRCcjVDbE4yIikNCg0KDQojIEM2MEgzME8zMA0KDQpsaWJyYXJ5KE9yZ01hc3NTcGVjUikNCnggPC0gSXNvdG9waWNEaXN0cmlidXRpb24oZm9ybXVsYSA9IExpc3RGb3JtdWxhKCJDNjBIMzBPMzAiKSkNCnBsb3QoeCRteiwgeCRwZXJjZW50LHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiaW50ZW5zaXR5ICglKSIsbWFpbiA9ICJJc290b3BpYyBEaXN0cmlidXRpb24sIEM2MEgzME8zMCIsbHdkPTIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQpsaWJyYXJ5KGVjaXBleCkNCnh4IDwtIGVjaXBleCgiQzYwSDMwTzMwIiwgaXNvaW5mbyA9IG5pc3Rpc28sIGxpbWl0ID0gMC4wMDA1LGlkID0gRkFMU0UsIHNvcnRieSA9ICJtYXNzIikNCmxtYXNzID0geHgkQzYwSDMwTzMwJG1hc3MNCmxhYnVuID0geHgkQzYwSDMwTzMwJGFidW5kYW5jZQ0KcGxvdChsbWFzcyxsYWJ1bix0eXBlPSJoIix4bGFiPSJtL3oiLHlsYWI9ImFidW5kYW5jZSIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQpsaWJyYXJ5KHJjZGspDQpmb3JtdWxhMSA8LSBnZXQuZm9ybXVsYSgiQzYwSDMwTzMwIiwgY2hhcmdlID0gMSkNCmlzb3QxIDwtIGdldC5pc290b3Blcy5wYXR0ZXJuKGZvcm11bGExLG1pbkFidW5kPTAuMDAwMDUpDQpwbG90KGlzb3QxWywxXSwgaXNvdDFbLDJdLHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiaW50ZW5zaXR5ICglKSIsbWFpbiA9ICJJc290b3BpYyBEaXN0cmlidXRpb24sIEM2MEgzME8zMCIsbHdkPTIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQpsaWJyYXJ5KGVudmlQYXQpDQpkYXRhKGlzb3RvcGVzKQ0KDQpwYXR0ID0gaXNvcGF0dGVybihpc290b3BlcywgIkM2MEgzME8zMCIsIHRocmVzaG9sZCA9IDAuMDAxLCBjaGFyZ2UgPSBGQUxTRSxlbWFzcyA9IDAuMDAwNTQ4NTgsIHBsb3RpdCA9IFRSVUUsIGFsZ289MSwgcmVsX3RvID0gMCwgdmVyYm9zZSA9IFRSVUUscmV0dXJuX2lzb19jYWxjX2Ftb3VudCA9IEZBTFNFKQ0KDQplbnZlbG9wZShwYXR0ZXJuPXBhdHQsIHBwbSA9IEZBTFNFLCBkbXogPSAiZ2V0IiwgZnJhYyA9IDEvNCwgZW52ID0gIkdhdXNzaWFuIixyZXNvbHV0aW9uID0gNWUrMDMsIHBsb3RpdCA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQ0KDQoNCmxpYnJhcnkoUmRpc29wKQ0KTW0gPC0gZ2V0TW9sZWN1bGUoIkM2MEgzME8zMCIsIHo9MCwgZWxlbWVudHM9aW5pdGlhbGl6ZUVsZW1lbnRzKGMoIkMiLCJIIiwiTyIpKSkNCmdldE1hc3MoTW0pDQpnZXRGb3JtdWxhKE1tKQ0KZ2V0SXNvdG9wZShNbSkNCmdldElzb3RvcGUoTW0sIGluZGV4PTEpDQpnZXRWYWxpZChNbSkNCmlzb3RvcGVzIDwtIGdldElzb3RvcGUoTW0sIHNlcSgxLDEwKSkNCmlzb3RvcGVzDQpwbG90KGlzb3RvcGVzWzEsXSwgaXNvdG9wZXNbMixdLHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiYWJ1bmRhbmNlIixtYWluID0gIkM2MEgzME8zMCIsbHdkPTIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQoNCmxpYnJhcnkoQlJBSU4pICMgYmlvYw0KYUMgPSBsaXN0KEM9NjAsIEg9MzAsIE49MCwgTz0zMCwgUz0wKQ0KbnJQZWFrcyA9IGNhbGN1bGF0ZU5yUGVha3MoYUMpDQpuclBlYWtzDQpyZXMgPC0gY2FsY3VsYXRlSXNvdG9waWNQcm9iYWJpbGl0aWVzKGFDID0gYUMsIHN0b3BPcHRpb249Im5yUGVha3MiLCBuclBlYWtzID0gbnJQZWFrcykNCnJlcw0KDQoNCmxpYnJhcnkoSXNvU3BlY1IpDQpJc29TcGVjaWZ5KG1vbGVjdWxlID0gYyhDPTEwLEg9MjIsTz0xKSwgc3RvcENvbmRpdGlvbiA9IC45OTk5ICkNCg0KYGBgDQoNCg0KSXpvdG9wb3bDqSBwb23Em3J5DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkoQ0lBQVdjb25zZW5zdXMpDQoNCiMjIE5vcm1hbGl6YWNlIMO6ZGFqxa8gbyBpem90b3BlY2ggcGxhdGlueSBuYSBwbGF0aW51LTE5NQ0Kbm9ybWFsaXplLnJhdGlvcyhwbGF0aW51bS5kYXRhLCAicGxhdGludW0iLCAiMTk1UHQiKQ0KDQojIyBLb25zZW56dcOhbG7DrSBwb23Em3J5IG1ub8W+c3R2w60gaXpvdG9wxa8gcGxhdGlueSANCmRmPW5vcm1hbGl6ZS5yYXRpb3MocGxhdGludW0uZGF0YSwgInBsYXRpbnVtIiwgIjE5NVB0IikgDQptbW0oZGYkUiwgZGYkdS5SKQ0KDQojIyBJem90b3BvdsOpIHBvbcSbcnkgemlua3UgeiBpem90b3BvdsO9Y2ggemFzdG91cGVuw60gDQp4ID0gYygwLjQ4NjMwLCAwLjI3OTAwLCAwLjA0MTAwLCAwLjE4NzUwLCAwLjAwNjIwKSANCnV4ID0gYygwLjAwMDkxLCAwLjAwMDc2LCAwLjAwMDMxLCAwLjAwMTM1LCAwLjAwMDEwKSANCnogPSBhYnVuZGFuY2VzMnJhdGlvcyh4LHV4LHJlZj0yKTsgeg0KYXQud2VpZ2h0KHokUix6JFIuY292LCJ6aW5jIiwiNjZabiIpDQoNCiMjIEF0b21vdsOhIGhtb3Rub3N0IGEgaXpvdG9wb3bDqSB6YXN0b3VwZW7DrSBpcmlkaWEsIGt0ZXLDqSBvZHBvdsOtZGFqw60gcG9txJtydSBpem90b3DFryAxOTFJci8xOTNJciA9IDAsNTk0NzEoMTMpIA0KYXQud2VpZ2h0KDAuNTk0NzEsIG1hdHJpeCgwLjAwMDEzXjIpLCAiaXJpZGl1bSIsICIxOTNJciIpDQoNCiMjIEF0b21vdsOhIGhtb3Rub3N0IGEgaXpvdG9wb3bDqSB6YXN0b3VwZW7DrSBrxZllbcOta3UsIGt0ZXLDqSBvZHBvdsOtZGFqw60gaXpvdG9wb3bDvW0gcG9txJtyxa9tIDI4U2kvMjlTaSA9IDEsMDc0KDY5KSBhIDMwU2kvMjlTaSA9IDI2MCgxMSkgcyBrb3JlbGFjw60gMCw4MCBtZXppIG9ixJttYSBpem90b3BvdsO9bWkgcG9txJtyeS4gDQpyYXRpb3MgPSBjKDEuMDc0LDI2MCkgDQpyLmNvdiA9IG1hdHJpeChjKDAuMDY5XjIsMC44MCowLjA2OSoxMSwwLjgwKjAuMDY5KjExLDExXjIpLG5jb2w9MixieXJvdz1UUlVFKSANCmF0LndlaWdodChyYXRpb3MsIHIuY292LCAic2lsaWNvbiIsICIyOVNpIikNCg0KYGBgDQoNCg0KVmxhc3Rub3N0aSB2emR1Y2h1IGEgdm9keQ0KDQpgYGB7cn0NCg0KIyBTbG96ZW5pIGF0bW9zZmVyeQ0KbGlicmFyeShtYXJlbGFjKQ0KYXRtQ29tcCgpIA0KDQojIyBIdXN0b3RhIHZ6ZHVjaHUgDQpsaWJyYXJ5KG1hcmVsYWMpDQphaXJfZGVuc2l0eSh0ID0gMjUsIFAgPSAxLjAxMzI1MykNCiMgdCAtIHRlbXBlcmF0dXJlIGluIMKwQywgUCAtIHByZXNzdXJlIGluIGJhcnMNCg0KIyMgSHVzdG90YSB2b2R5DQpsaWJyYXJ5KHJMYWtlQW5hbHl6ZXIpDQp3YXRlci5kZW5zaXR5KHd0ciA9IDI1LCBzYWwgPSAwKQ0KIyB3dHIgLSB0ZW1wZXJhdHVyZSBpbiDCsEMNCmxpYnJhcnkoQ0hOT1NaKQ0KcmhvLklBUFdTOTUoVCA9IDI5OC4xNSwgUCA9IDEsIHN0YXRlPSIiLCB0cmFjZT0wKQ0KIyBUIC0gdGVtcGVyYXR1cmUgaW4gSywgUCAtIHByZXNzdXJlIGluIGJhcnMNCg0KDQpsaWJyYXJ5KElBUFdTOTUpDQpsaWJyYXJ5KG1hcmVsYWMpDQpsaWJyYXJ5KENITk9TWikNCg0KbGlicmFyeShDSE5PU1opDQp0aGVybW8oKSRPQklHVA0KDQpgYGANCg0KDQoNCg0KRGlzb2NpYcSNbsOtIGtvbnN0YW50eQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojaHR0cHM6Ly9jaGVtLmxpYnJldGV4dHMub3JnL0FuY2lsbGFyeV9NYXRlcmlhbHMvUmVmZXJlbmNlL1JlZmVyZW5jZV9UYWJsZXMvRXF1aWxpYnJpdW1fQ29uc3RhbnRzL0UxJTNBX0FjaWRfRGlzc29jaWF0aW9uX0NvbnN0YW50c19hdF8yNUMNCg0KDQpsaWJyYXJ5KHNlYWNhcmIpDQpLZDEgPSBLMXAoUz0wLCBUPTI1LCBQPTAsIHBIc2NhbGU9IlQiLCBrU1dTMnNjYWxlPSJ4Iiwgd2Fybj0ibiIpDQpwS2ExID0gLWxvZzEwKEtkMSk7IHBLYTENCktkMiA9IEsycChTPTAsIFQ9MjUsIFA9MCwgcEhzY2FsZT0iVCIsIGtTV1Myc2NhbGU9IngiLCB3YXJuPSJuIikNCnBLYTIgPSAtbG9nMTAoS2QyKTsgcEthMg0KS2QzID0gSzNwKFM9MCwgVD0yNSwgUD0wLCBwSHNjYWxlPSJUIiwga1NXUzJzY2FsZT0ieCIsIHdhcm49Im4iKQ0KcEthMyA9IC1sb2cxMChLZDMpOyBwS2EzDQoNCmxpYnJhcnkoc2VhY2FyYikNCmJqZXJydW0oSzE9S2QxWzFdLCBLMj1LZDJbMV0sIEszPUtkM1sxXSwgcGhtaW49MSwgcGhtYXg9MTMsIGJ5PTAuMSwgY29uYz0xLHR5cGU9ImwiLCBjb2w9YygyLDMsNCw2KSwgeWxhYj0iUmVsYXRpdmUgY29uY2VudHJhdGlvbiAoJSkiLCBhZGQ9RkFMU0UpDQoNCg0KbGlicmFyeShTb2x2ZVNBUEhFKQ0KQUtfUEhPU18xX01JTEw5NSh0X2s9Mjk4LHM9MCwgcF9iYXI9MCkNCkFLX1BIT1NfMl9NSUxMOTUodF9rPTI5OCxzPTM1LCBwX2Jhcj0wKQ0KQUtfUEhPU18zX01JTEw5NSh0X2s9Mjk4LHM9MCwgcF9iYXI9MCkNCg0KDQpsaWJyYXJ5KEFxdWFFbnYpDQpkYXRhKFBoeXNDaGVtQ29uc3QpDQpQaHlzQ2hlbUNvbnN0DQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KHNlcWlucikNCmRhdGEoYWFpbmRleCkNCmFhaW5kZXgNCg0KYSgiR2x1IikNCmFhYSgiQSIpDQoNCg0KbGlicmFyeShDSE5PU1opDQp0aGVybW8gPSB0aGVybW8oKQ0KdGhlcm1vJHByb3RlaW4NCnBmIDwtIHByb3RlaW4uZm9ybXVsYSh0aGVybW8kcHJvdGVpbik7IHBmDQppQSA8LSBpbmZvKCJhbGFuaW5lIikNCmluZm8oaUEpJGZvcm11bGENCmFzLmNoZW1pY2FsLmZvcm11bGEobWFrZXVwKGlBKSkNCg0KYGBgDQoNCg0KDQpQxZlldm9keSBqZWRub3Rlaw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShtZWFzdXJlbWVudHMpDQpjb252X3VuaXRfb3B0aW9ucyAjIHBvdXppdmFuZSBqZWRub3RreQ0KDQojIGxlbmd0aA0KY29udl91bml0KDEsIGZyb209Im1tIiwgdG89Im0iKQ0KY29udl91bml0KDEsIGZyb209Im5tIiwgdG89ImFuZ3N0cm9tIikNCg0KIyBwcmVzc3VyZQ0KY29udl91bml0KDEwMSwgZnJvbT0iUGEiLCB0bz0ibW1IZyIpDQpjb252X3VuaXQoMSwgZnJvbT0iYXRtIiwgdG89IlBhIikNCg0KIyB0ZW1wZXJhdHVyZQ0KY29udl91bml0KDEwMCwgZnJvbT0iQyIsIHRvPSJLIikNCg0KIyBlbmVyZ3kNCmNvbnZfdW5pdCg1MDAsIGZyb209ImNhbCIsIHRvPSJKIikNCmNvbnZfdW5pdCgxLCBmcm9tPSJlcmciLCB0bz0iSiIpDQoNCiN2b2x1bWUNCmNvbnZfdW5pdCgxMDAsIGZyb209ImwiLCB0bz0ibTMiKQ0KDQojIG1hc3MNCmNvbnZfdW5pdCgxMDAsIGZyb209ImciLCB0bz0ibWciKQ0KY29udl91bml0KDEwMCwgZnJvbT0idWciLCB0bz0iZyIpDQoNCiMgc3BlZWQNCmNvbnZfdW5pdCgxLCBmcm9tPSJrbV9wZXJfaHIiLCB0bz0ibV9wZXJfc2VjIikNCmNvbnZfdW5pdCgxLCBmcm9tPSJsaWdodCIsIHRvPSJrbV9wZXJfaHIiKQ0KY29udl91bml0KDEsIGZyb209ImxpZ2h0IiwgdG89Im1fcGVyX3NlYyIpDQoNCg0KIyMjIG11bHRpdW5pdHMNCmNvbnZfbXVsdGl1bml0KHggPSAxLCBmcm9tPSJ1ZyAvIGwiLCB0bz0iZyAvIG0zIikNCmNvbnZfbXVsdGl1bml0KHggPSAxLCBmcm9tPSJtZyAvIGwiLCB0bz0ia2cgLyBtMyIpDQpjb252X211bHRpdW5pdCh4ID0gMSwgZnJvbT0iY2FsIC8ga2ciLCB0bz0iSiAvIGciKQ0KDQoNCiMjIFByZXZvZCB0ZXBsb3QNCmxpYnJhcnkod2VhdGhlcm1ldHJpY3MpDQpjb252ZXJ0X3RlbXBlcmF0dXJlKHRlbXBlcmF0dXJlPTAsIG9sZF9tZXRyaWM9ImMiLCBuZXdfbWV0cmljPSJrIiwgcm91bmQgPSAyKQ0KIyBtZXRyaWMgPSAiYyIsImYiLCJrIg0KY2Vsc2l1cy50by5mYWhyZW5oZWl0KFQuY2Vsc2l1cywgcm91bmQgPSAyKQ0KY2Vsc2l1cy50by5rZWx2aW4oVC5jZWxzaXVzLCByb3VuZCA9IDIpDQpmYWhyZW5oZWl0LnRvLmtlbHZpbihULmZhaHJlbmhlaXQsIHJvdW5kID0gMikNCmZhaHJlbmhlaXQudG8uY2Vsc2l1cyhULmZhaHJlbmhlaXQsIHJvdW5kID0gMikNCmtlbHZpbi50by5jZWxzaXVzKFQua2VsdmluLCByb3VuZCA9IDIpDQprZWx2aW4udG8uZmFocmVuaGVpdChULmtlbHZpbiwgcm91bmQgPSAyKQ0KDQoNCiMjIyMgbmFzb2JreSBqZWRub3RlayBTSQ0KbGlicmFyeShzaXRvb2xzKQ0KZjJzaSgxMDAwMCkNCmYyc2koMC4wMjMsIHVuaXQ9ImwiKQ0KZjJzaSgzLjVlLTUsIHVuaXQ9Im1vbCIpDQpudW1iZXJzIDwtIGMoMWU1LCAzLjVlLTEyLCAwLjAwNCkgDQpmMnNpKG51bWJlcnMsIHVuaXQ9ImciKQ0KDQpzYXBwbHkobnVtYmVycyxmdW5jdGlvbih4KXtmMnNpKHgsIHVuaXQ9ImciKX0pDQoNCg0KIyBQcmV2b2QgY2Fzb3Z5Y2ggamVkbm90ZWsNCg0KbGlicmFyeShkYXRldGltZSkNCg0KeHggPSBhcy5taW51dGUoNjApICMgNjAgbWluDQphcy5zZWNvbmQoeHgpDQphcy5ob3VyKHh4KQ0KYXMuZGF5KHh4KQ0KDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmR1ciA9IGR1cmF0aW9uKHdlZWs9MCxkYXk9MC4wNDE2NjY2Nyxob3Vycz0xLG1pbnV0ZXM9MCxzZWNvbmRzPTM2MDApDQphcy5udW1lcmljKGR1ciwgIm1pbnV0ZXMiKQ0KDQoNCiMgT3B0aWNrZSBqZWRub3RreQ0KbGlicmFyeShwaG90b2Jpb2xvZ3kpDQpUMkEoMC45OSwgYWN0aW9uID0gTlVMTCwgYnlyZWYgPSBGQUxTRSwgY2xlYW4gPSBUUlVFKSAjIHRyYW5zbWl0YW5jZSBuYSBhYnNvcmJhbmNpDQpUMkFmcigwLjk5LCBSZnIgPSAxLzQsIGJ5cmVmID0gRkFMU0UsIGNsZWFuID0gVFJVRSkgIyB0cmFuc21pdGFuY2UgbmEgYWJzb3JwdGFuY2kgKHMgZGFub3UgbWlyb3UgcmVmbGVrdGFuY2Ugdnpvcmt1KQ0KQTJUKDAuMDEsIGFjdGlvbiA9IE5VTEwsIGJ5cmVmID0gRkFMU0UsIGNsZWFuID0gVFJVRSkgIyBhYnNvcmJhbmNlIG5hIHRyYW5zbWl0YW5jaQ0KDQoNCmBgYA0KDQoNClBseW5uw70gc3lzdMOpbSBtxJtuw60gc3bFr2ogb2JqZW0gbyAxMjAwIG1sIHphIGtvbnN0YW50bsOtaG8gdm7Em2rFocOtaG8gdGxha3UgMzAgYXRtLiBKYWtvdSBwcsOhY2kgdnlrb27DoSBwbHluIHDFmWkgZXhwYW56aT8gVnlqw6FkxZlldGUgdiByxa96bsO9Y2ggZW5lcmdldGlja8O9Y2ggamVkbm90a8OhY2guDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkobWVhc3VyZW1lbnRzKQ0KDQojIFcgPSBwIC4gZFYNCmRWID0gY29udl91bml0KDEyMDAsIGZyb209Im1sIiwgdG89Im0zIik7IGRWDQpwID0gY29udl91bml0KDMwLCBmcm9tPSJhdG0iLCB0bz0iUGEiKTsgcA0KVyA9IHAqZFY7IFcgIyBbSl0NClcxID0gY29udl91bml0KFcsIGZyb209IkoiLCB0bz0iY2FsIik7IFcxICMgW2NhbF0NClcyID0gY29udl91bml0KFcsIGZyb209IkoiLCB0bz0iV3NlYyIpOyBXMiAjIFtXLnNdDQpXMyA9IGNvbnZfdW5pdChXLCBmcm9tPSJKIiwgdG89ImVyZyIpOyBXMyAjIFtlcmddDQoNCmBgYA0KDQoNCk9jZWxvdsOhIGzDoWhldiBvIG9iamVtdSAyMC41IGwgamUgbmFwbG7Em25hIGt5c2zDrWtlbS4gUMWZaSAxNyDCsEMgamUgdGxhayB2IGzDoWh2aSA4NyBhdG0uIFZ5cG/EjcOtdGVqdGUgaG1vdG5vc3Qga3lzbMOta3UuDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KG1hcmVsYWMpDQpSID0gYXMubnVtZXJpYyhDb25zdGFudHMkZ2FzQ3QyWzFdKTsgUg0KQ29uc3RhbnRzJGdhc0N0MlsyXQ0KbGlicmFyeShtZWFzdXJlbWVudHMpDQpQID0gY29udl91bml0KDg3LCBmcm9tPSJhdG0iLCB0bz0iUGEiKTsgUA0KVGsgPSBjb252X3VuaXQoMTcsIGZyb209IkMiLCB0bz0iSyIpOyBUaw0KViA9IGNvbnZfdW5pdCgyMC41LCBmcm9tPSJsIiwgdG89Im0zIik7IFYNCmxpYnJhcnkoQ0hOT1NaKQ0KTSA9IG1hc3MoIk8yIik7IE0gIyBnL21vbA0KDQptID0gUCpWKk0vKFIqVGspDQptID0gY2VpbGluZyhtKTsgbSAjIGcNCm1rID0gY29udl91bml0KG0sIGZyb209ImciLCB0bz0ia2ciKQ0KbWsgPSByb3VuZChtaywyKTsgbWsgIyBrZw0KDQpwYXN0ZSgiSG1vdG5vc3Qga3lzbMOta3UgamUiLCBtLCAiZywgcmVzcC4iLCBtaywgImtnLiIpDQoNCmBgYA0KDQoNClZ5cG/EjcOtdGVqdGUgbW9sZWt1bG92b3UgaG1vdG5vc3QgYmVuemVudSwgdsOhxb7DrS1saSA2MDAgbWwgamVobyBwYXIgcMWZaSA4NyDCsEMgYSB0bGFrdSA2MjQgbW0gSGcgMS4zIGcuDQoNCmBgYHtyfQ0KDQptID0gMS4zICMgZw0KbGlicmFyeShtYXJlbGFjKQ0KUiA9IGFzLm51bWVyaWMoQ29uc3RhbnRzJGdhc0N0MlsxXSk7IFINCkNvbnN0YW50cyRnYXNDdDJbMl0NCmxpYnJhcnkobWVhc3VyZW1lbnRzKQ0KUCA9IGNvbnZfdW5pdCg2MjQsIGZyb209Im1tSGciLCB0bz0iUGEiKTsgUA0KVGsgPSBjb252X3VuaXQoODcsIGZyb209IkMiLCB0bz0iSyIpOyBUaw0KViA9IGNvbnZfdW5pdCg2MDAsIGZyb209Im1sIiwgdG89Im0zIik7IFYNCg0KTSA9IG0qUipUay8oUCpWKTsgTSAjIGcvbW9sDQoNCmxpYnJhcnkoQ0hOT1NaKQ0KTWIgPSBtYXNzKCJDNkg2Iik7IE1iICMgZy9tb2wNCg0KcGFzdGUoIlpqacWhdMSbbsOhIG1vbMOhcm7DrSBobW90bm9zdCBiZW56ZW51IGplIiwgcm91bmQoTSwwKSwgImcvbW9sLiIpDQoNCmBgYA0KDQoNClBva3VzIHRydmFsIGNlbGtlbSA3NjU4IG1pbnV0LiBLb2xpayBqZSB0byBkbsOtLCBob2RpbiBhIG1pbnV0Pw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0dCA9IDc2NTggIyBbbWluXQ0KDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCnRpbSA9IHNlY29uZHNfdG9fcGVyaW9kKHR0KjYwKTsgdGltDQpsaWJyYXJ5KGRhdGV0aW1lKQ0KdGltID0gc2Vjb25kc190b19wZXJpb2QoYXMuc2Vjb25kKGFzLm1pbnV0ZSh0dCkpKTsgdGltDQoNCnRuID0gcmVnbWF0Y2hlcyh0aW0sIGdyZWdleHByKCJbWzpkaWdpdDpdXSsiLCB0aW0pKQ0KdG4gPSBhcy5udW1lcmljKHVubGlzdCh0bikpDQp0MSA9IHRuWzFdDQp0MiA9IHRuWzJdDQp0MyA9IHRuWzNdDQp0NCA9IHRuWzRdDQogIA0KcGFzdGUoIlBva3VzIHRydmFsIiwgdDEsICJkbsOtLCIsIHQyLCAiaG9kaW4sIiwgdDMsICJtaW51dCBhIiwgdDQsICJzZWt1bmQuIikNCg0KYGBgDQoNCg0KDQpaYW9rcm91aGxvdsOhbsOtIMSNw61zZWwgbmEgZGFuw70gcG9jZXQgZGVzZXRpbm7DvWNoIG3DrXN0DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnJvdW5kKDEyMzQuNTY3LDIpDQpyb3VuZCgxMjMuNDU2LGRpZ2l0cz0yKQ0KY2VpbGluZygxMjM0LjU2NykNCmZsb29yKDEyMzQuNTY3KQ0KdHJ1bmMoMTIzNC41NjcpDQoNCmxpYnJhcnkoZ3VmKQ0Kcm91bmRfc29tZXRoaW5nKDEyMy40NTYsIGRlY2ltYWxzID0gMikNCnJvdW5kX3NvbWV0aGluZygiMTIzLjQ1NiIsIGRlY2ltYWxzID0gMikNCg0KbGlicmFyeShQS05DQSkNCnJvdW5kU3RyaW5nKDMxNDEuNTkyNjUsIGRpZ2l0cyA9IDMsIHNjaV9yYW5nZSA9IDAsIHNjaV9zZXAgPSAiZSIpDQpyb3VuZFN0cmluZygzMTQxLjU5MjY1LCBkaWdpdHMgPSAzLCBzY2lfcmFuZ2UgPSAwLCBzY2lfc2VwID0gIngxMF4iKQ0Kcm91bmRTdHJpbmcoMzE0MS41OTI2NSwgZGlnaXRzID0gMywgc2NpX3JhbmdlID0gSW5mLCBzY2lfc2VwID0gImUiKQ0KDQojIHZla3RvcnkNCnggPC0gYyhzb3J0KHNhbXBsZSgxLjc2NToyMCwgMTApKSkNCnJvdW5kKHgsZGlnaXRzPTIpDQpjZWlsaW5nKHgpDQpmbG9vcih4KQ0KdHJ1bmMoeCkNCg0KbGlicmFyeShjaCkNClJvdW5kKHgsIG49MikNClJvdW5kMih4LCBuPTIpDQoNCg0KIyBtYXRpY2UNCg0KWCA9IG1hdHJpeCh4LDUsMixieXJvdyA9IFRSVUUpDQpyb3VuZChYLGRpZ2l0cz0yKQ0KY2VpbGluZyhYKQ0KZmxvb3IoWCkNCnRydW5jKFgpDQoNClJvdW5kKFgsIG49MikNClJvdW5kMihYLCBuPTIpDQoNCmBgYA0KDQoNCk5lamlzdG90eSBhIGNoeWJ5IG3Em8WZZW7DrQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KGVycm9ycykNCnhlIDwtIHNldF9lcnJvcnMoMy42MDIsIDAuMDA4KQ0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGx1cy1taW51cyIpIA0KcHJpbnQoeGUsIGRpZ2l0cyA9IDIpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpDQpwcmludCh4ZSwgZGlnaXRzID0gMikNCg0KIyBlbGVtZW50YXJuaSBuYWJvag0KZSA8LSBzZXRfZXJyb3JzKDEuNjAyMTc2NjIwOGUtMTksIDAuMDAwMDAwMDA5OGUtMTkpIA0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGx1cy1taW51cyIpIA0KcHJpbnQoZSwgZGlnaXRzID0gMikNCm9wdGlvbnMoZXJyb3JzLm5vdGF0aW9uID0gInBhcmVudGhlc2lzIikNCnByaW50KGUsIGRpZ2l0cyA9IDMpDQoNCmBgYA0KDQoNClplIHrDoXNpbGt5IGthcHJvbGFrdGFtdSBieWxvIG9kZWJyw6FubyAxMCB2em9ya3UgYSBieWwgdSBuaWNoIHN0YW5vdmVuIGJvZCB0w6Fuw60uIFZ5cG/EjcOtdGVqdGUgcHLFr23Em3Jub3UgaG9kbm90dSBib2R1IHTDoW7DrSB2IHrDoXNpbGNlIGEgamVqw60gc23Em3JvZGF0bm91IG9kY2h5bGt1Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4YyA9IGMoNjguNSwgNjguNywgNjguMywgNjguOCwgNjguNSwgNjguMiwgNjguNiwgNjguNCwgNjguMiwgNjguNykNCm1lYW4oeGMpDQpzZCh4YykgIyBzZA0Kc2QoeGMpL3NxcnQobGVuZ3RoKHhjKSkgIyBzdHIgY2h5YmEgcHJ1bWVydQ0KDQplIDwtIHNldF9lcnJvcnMobWVhbih4YyksIHNkKHhjKS9zcXJ0KGxlbmd0aCh4YykpKSANCm9wdGlvbnMoZXJyb3JzLm5vdGF0aW9uID0gInBsdXMtbWludXMiKTsgcHJpbnQoZSwgZGlnaXRzID0gMikNCg0KYGBgDQoNCg0KU2lyZW5pIGNoeWINCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShwcm9wYWdhdGUpDQoNCiMgeiBwcnVtZXJ1IGEgbmVqaXN0b3R5LCBiZXogdXZlZGVuw60gcG9jdHUgc3R1cG51IHZvbG5vc3RpLCByZXNwLiBwb2N0dSBvcGFrb3ZhbmkNCg0KeCA8LSBjKDUsIDAuMDEpIA0KeSA8LSBjKDEsIDAuMDEpIA0KDQpFWFBSMSA8LSBleHByZXNzaW9uKHgveSkgDQpERjEgPC0gY2JpbmQoeCwgeSkNClJFUzEgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSMSwgZGF0YSA9IERGMSwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApIA0KUkVTMQ0KUkVTMSRkYXRhDQpSRVMxJHByb3ANClJFUzEkc2ltDQpzdW1tYXJ5KFJFUzEpDQpwbG90KFJFUzEpDQoNCkVYUFIgPC0gZXhwcmVzc2lvbihhXmIqeCkNCmEgPSBjKDUsIDAuMSkNCmIgPSBjKDEwLCAwLjEpDQp4ID0gYygxLCAwLjEpDQpEQVQgPC0gY2JpbmQoYSwgYiwgeCkNCihyZXMgPC0gcHJvcGFnYXRlKEVYUFIsIERBVCkpDQpyZXMkZGF0YQ0KcmVzJHByb3ANCnJlcyRzaW0NCnN1bW1hcnkocmVzKQ0KcGxvdChyZXMpDQoNCg0KIyB6IHBydW1lcnUgYSBuZWppc3RvdHksIHMgdXZlZGVuw61tIHBvY3R1IHN0dXBudSB2b2xub3N0aQ0KRVhQUjIgPC0gZXhwcmVzc2lvbih4L3kpIA0KeCA8LSBjKDUsIDAuMDEsIDEyKSANCnkgPC0gYygxLCAwLjAxLCA1KSANCkRGMiA8LSBjYmluZCh4LCB5KSANClJFUzIgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSMiwgZGF0YSA9IERGMiwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVMyDQpSRVMyJGRhdGENClJFUzIkcHJvcA0KUkVTMiRzaW0NCnN1bW1hcnkoUkVTMikNCnBsb3QoUkVTMikNCg0KDQojIFbDvXBvY2V0IHBvbW9jw60gaW50ZXJ2YWx1IA0KDQpFWFBSMyA8LSBleHByZXNzaW9uKEMgKiBzcXJ0KCg1MjAgKiBIICogUCkvKE0gKih0ICsgNDYwKSkpKQ0KSCA8LSBjKDY0LCA2NSkNCk0gPC0gYygxNiwgMTYuMikNClAgPC0gYygzNjEsIDM2NSkNCnQgPC0gYygxNjUsIDE3MCkNCkMgPC0gYygzOC40LCAzOC41KQ0KREFUMyA8LSBtYWtlRGF0KEVYUFIzKQ0KaW50ZXJ2YWwoREFUMywgRVhQUjMsIHNlcSA9IDIpDQoNCkVYUFI1IDwtIGV4cHJlc3Npb24oeF4yIC0geCArIDEpDQp4IDwtIGMoLTIsIDEpDQpjdXJ2ZSh4XjIgLSB4ICsgMSwgLTIsIDEpDQpEQVQ1IDwtIG1ha2VEYXQoRVhQUjUpDQppbnRlcnZhbChEQVQ1LCBFWFBSNSwgc2VxID0gMikNCg0KDQpsaWJyYXJ5KG1ldFJvbG9neSkNCg0KZGF0YShHVU0uSC4xKQ0KR1VNLkguMQ0KDQojIyBhIHNpbXBsZSB1bmNlcnRhaW50eSBhbmFseXNpcyBmb3IgdGhlIHByb2R1Y3Qgb2YgdHdvIHF1YW50aXRpZXMNCkdVTShjKCJ4MSIsIngyIiksYygyLjMsMS4xKSxjKDAuMDMwLDAuMDE1KSxjKDUsOTk5OSksIngxKngyIikNCg0KIyMgYSBzaW1wbGUgdW5jZXJ0YWludHkgYW5hbHlzaXMgZm9yIHRoZSBwcm9kdWN0IG9mIHR3byBxdWFudGl0aWVzDQpHVU0udmFsaWRhdGUoYygieDEiLCJ4MiIpLCBjKDIuMywxLjEpLCBjKDAuMDMwLDAuMDE1KSwgYyg1LDk5OTkpLCBjKCJBIiwiQiIpLGMoIk5vcm1hbCIsIlJlY3Rhbmd1bGFyIiksIngxKngyIikNCg0KDQpleHByIDwtIGV4cHJlc3Npb24oYStiKjIrYyozK2QvMikNCnggPC0gbGlzdChhPTEsIGI9MywgYz0yLCBkPTExKQ0KdSA8LSBsYXBwbHkoeCwgZnVuY3Rpb24oeCkgeC8xMCkgIyBuZWppc3RvdGEgMTAgJQ0KdS5leHByPC11bmNlcnQoZXhwciwgeCwgdSwgbWV0aG9kPSJOVU0iKQ0KdS5leHByDQojIGZ1bmN0aW9uIG1ldGhvZA0KZiA8LSBmdW5jdGlvbihhLGIsYyxkKSBhK2IqMitjKjMrZC8yDQp1LmZ1bjwtdW5jZXJ0KGYsIHgsIHUsIG1ldGhvZD0iTlVNIikNCnUuZnVuDQojIGZvcm11bGEgbWV0aG9kDQp1LmZvcm08LXVuY2VydCh+YStiKjIrYyozK2QvMiwgeCwgdSwgbWV0aG9kPSJOVU0iKQ0KdS5mb3JtDQoNCg0KIyBzIGtvcmVsYWNpDQp1LmNvcjwtZGlhZygxLDQpDQp1LmNvclszLDRdPC11LmNvcls0LDNdPC0wLjUNCnUuY29yDQojIG51bQ0KdS5mb3JtYzwtdW5jZXJ0KH5hK2IqMitjKjMrZC8yLCB4LCB1LCBtZXRob2Q9Ik5VTSIsIGNvcj11LmNvcikNCnUuZm9ybWMNCiMgTW9udGUgQ2FybG8NCnUuZm9ybWMuTUM8LXVuY2VydCh+YStiKjIrYyozK2QvMiwgeCwgdSwgbWV0aG9kPSJNQyIsIGNvcj11LmNvciwgQj0yMDApDQp1LmZvcm1jLk1DDQoNCg0KZXhwciA8LSBleHByZXNzaW9uKGEvKGItYykpDQp4IDwtIGxpc3QoYT0xLCBiPTMsIGM9MikNCnUgPC0gbGFwcGx5KHgsIGZ1bmN0aW9uKHgpIHgvMjApDQpzZXQuc2VlZCg0MDMpDQp1LmludmV4cHI8LXVuY2VydE1DKGV4cHIsIHgsIHUsIGRpc3RyaWI9cmVwKCJub3JtIiwgMyksIEI9OTk5LCBrZWVwLng9VFJVRSApDQp1LmludmV4cHINCg0KYGBgDQoNCg0KVnlwb8SNw610ZWp0ZSBodXN0b3R1IGEgamVqw60gY2h5YnUgcHJvIGzDoXRrdSwgdSBuw63FviBieWxhIG9wYWtvdmFuw71tIG3Em8WZZW7DrW0gc3Rhbm92ZW5hIGhtb3Rub3N0IDYuODI0ICgwLjAwOCkgZyBhIG9iamVtIDMuMDMgKDAuMDEpIG1sLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KHByb3BhZ2F0ZSkNCg0KRVhQUjIgPC0gZXhwcmVzc2lvbihtL1YpIA0KbSA9IGMoNi44MjQsIDAuMDA4KSAjW2ddIA0KViA9IGMoMy4wMywgMC4wMSkgI1ttbF0NCkRGMiA8LSBjYmluZChtLCBWKSANClJFUzIgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSMiwgZGF0YSA9IERGMiwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVMyDQpSRVMyJGRhdGENClJFUzIkcHJvcA0KUkVTMiRzaW0NCmxpYnJhcnkoZXJyb3JzKQ0KZSA8LSBzZXRfZXJyb3JzKFJFUzIkc2ltWzFdLCBSRVMyJHNpbVsyXSkgDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwbHVzLW1pbnVzIik7IHByaW50KGUsIGRpZ2l0cyA9IDEpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0KDQpgYGANCg0KDQpOYSBww61zdCBvIHByxa9txJtydSAyMDAgKDAuMDUpIG1tIHDFr3NvYsOtIHDDoXJhIHRsYWtlbSA4LjIgKDAuMSkgYXRtLiBKYWtvdSBzaWxvdSBwxa9zb2LDrSBww6FyYSBuYSBww61zdD8NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShwcm9wYWdhdGUpDQpsaWJyYXJ5KG1lYXN1cmVtZW50cykNCg0KZCA9IGMoMjAwLCAwLjA1KSAjIFttbV0gbmEgW21dDQpkID0gYXMudmVjdG9yKGNvbnZfdW5pdChjKDIwMCwgMC4wNSksIGZyb209Im1tIiwgdG89Im0iKSkNCnAgPSBjKDguMiwgMC4xKSAgIyBbYXRtXSBuYSBbUGFdDQpwID0gYXMudmVjdG9yKGNvbnZfdW5pdChjKDguMiwgMC4xKSwgZnJvbT0iYXRtIiwgdG89IlBhIikpDQpwaQ0KRVhQUjcgPC0gZXhwcmVzc2lvbihwKjMuMTQxNTkzKihkLzIpXjIpDQpERjcgPC0gY2JpbmQoZCwgcCkgDQpSRVM3IDwtIHByb3BhZ2F0ZShleHByID0gRVhQUjcsIGRhdGEgPSBERjcsIHR5cGUgPSAic3RhdCIsIGRvLnNpbSA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCBuc2ltID0gMTAwMDAwKQ0KUkVTNw0KUkVTNyRkYXRhDQpSRVM3JHByb3ANClJFUzckc2ltDQpsaWJyYXJ5KGVycm9ycykNCmUgPC0gc2V0X2Vycm9ycyhSRVM3JHNpbVsxXSwgUkVTNyRzaW1bMl0pIA0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGx1cy1taW51cyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGFyZW50aGVzaXMiKTsgcHJpbnQoZSwgZGlnaXRzID0gMSkNCg0KYGBgDQoNCg0KVnlwb8SNw610ZWp0ZSBrb2VmaWNpZW50IHZpc2tveml0eSByb3p0b2t1IGdseWNlcmludSBTdG9rZXNvdm91IG1ldG9kb3UNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShwcm9wYWdhdGUpDQoNCnIgPSBjKDAuMDExMiwgMC4wMDAxKSAjIHBvbG9tZXIga3VsaWNreSBbY21dDQpsID0gYygzMS4yMywgMC4wNSkgIyBkcmFoYSBrdWxpY2t5IHphIGNhcyB0IFtjbV0NCnQgPSBjKDYyLjEsIDAuMikgIyBjYXMgW3NdDQpnID0gYyg5ODAuMSwwKSAjIHRpaG92ZSB6cnljaGxlbmkgW2NtL3MyXSB6IHRhYnVsZWsNCmQwID0gYygxMy41NSwwKSAjIGh1c3RvdGEga3VsaWNreSBbZy9jbTNdIHogdGFidWxlaw0KZCA9IGMoMS4yOCwwKSAjIGh1c3RvdGEgcm96dG9rdSBbZy9jbTNdIHogdGFidWxlaw0KRVhQUjMgPC0gZXhwcmVzc2lvbigoMi85KSpnKigoKGQwLWQpKnJeMikvbCkqdCkNCkRGMyA8LSBjYmluZChyLCBsLCB0LCBnLCBkMCwgZCkgDQpSRVMzIDwtIHByb3BhZ2F0ZShleHByID0gRVhQUjMsIGRhdGEgPSBERjMsIHR5cGUgPSAic3RhdCIsIGRvLnNpbSA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCBuc2ltID0gMTAwMDAwKQ0KUkVTMw0KUkVTMyRkYXRhDQpSRVMzJHByb3ANClJFUzMkc2ltDQpFWFBSNCA8LSBleHByZXNzaW9uKCgyLzkpKjk4MC4xKigoKDEzLjU1LTEuMjgpKnJeMikvbCkqdCkNCkRGNCA8LSBjYmluZChyLCBsLCB0KSANClJFUzQgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSNCwgZGF0YSA9IERGNCwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVM0JGRhdGENClJFUzQkcHJvcA0KUkVTNCRzaW0NCmxpYnJhcnkoZXJyb3JzKQ0KZSA8LSBzZXRfZXJyb3JzKFJFUzQkc2ltWzFdLCBSRVM0JHNpbVsyXSkgDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwbHVzLW1pbnVzIik7IHByaW50KGUsIGRpZ2l0cyA9IDEpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0KDQpgYGANCg0KDQpWeXBvxI3DrXRlanRlIGtvZWZpY2llbnQgdmlza296aXR5IHJvenRva3UgZ2x5Y2VyaW51IHBvbW9jw60ga2FwaWzDoXJuw61obyB2aXNrb3ppbWV0cnUuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkocHJvcGFnYXRlKQ0KbGlicmFyeShtZWFzdXJlbWVudHMpDQoNCnAgPSBjKDIwLjEyLCAwLjAxKSAjIHRsYWsgbmEgdnl0b2t1IHoga2FwaWxhcnkgW21tIEhnXSB0byBbUGFdDQpwID0gYXMudmVjdG9yKGNvbnZfdW5pdChjKDIwLjEyLCAwLjAxKSwgZnJvbT0ibW1IZyIsIHRvPSJQYSIpKQ0KciA9IGMoMC41NzAsIDAuMDAzKSAjIHBvbG9tZXIga2FwaWxhcnkgW21tXSB0byBbbV0NCnIgPSBjb252X3VuaXQoYygwLjU3MCwgMC4wMDMpLCBmcm9tPSJtbSIsIHRvPSJtIikNCmwgPSBjKDEwLjUyNiwgMC4wMDUpICMgZGVsa2Ega2FwaWxhcnkgW21tXSB0byBbbV0NCmwgPSBjb252X3VuaXQoYygxMC41MjYsIDAuMDA1KSwgZnJvbT0ibW0iLCB0bz0ibSIpDQpWID0gYyg1LjAyNSwgMC4wMDEpIyBvYmplbSBrYXBhbGlueSB2eXRla2xlIHphIGNhcyB0IFtjbTNdIHRvIFttM10NClYgPSBjb252X3VuaXQoYyg1LjAyNSwgMC4wMDEpLCBmcm9tPSJjbTMiLCB0bz0ibTMiKQ0KdCA9IGMoMjcuMzQsIDAuMDIpICMgY2FzIFtzXQ0KcGkNCkVYUFI1IDwtIGV4cHJlc3Npb24oKDMuMTQxNTkzKnAqKHJeNCkqdCkvKDgqVipsKSkNCkRGNSA8LSBjYmluZChwLCByLCBsLCBWLCB0KSANClJFUzUgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSNSwgZGF0YSA9IERGNSwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVM1ICMgW2tnIC8gbS5zXQ0KUkVTNSRkYXRhDQpSRVM1JHByb3ANClJFUzUkc2ltDQojIGNvbnZfbXVsdGl1bml0KHggPSBSRVM1JHNpbVsxOjJdLCBmcm9tPSJrZyAvIG0iLCB0bz0iZyAvIGNtIikNCmxpYnJhcnkoZXJyb3JzKQ0KZSA8LSBzZXRfZXJyb3JzKFJFUzUkc2ltWzFdLCBSRVM1JHNpbVsyXSkgDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwbHVzLW1pbnVzIik7IHByaW50KGUsIGRpZ2l0cyA9IDEpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0KDQpgYGANCg0KDQpTb3XEjWluIHJvenB1c3Rub3N0aSBzdMWZw61icm7DqSBzb2xpIEFnWCBtw6EgaG9kbm90dSBLcyA9IDQuMCAoMC40KSB4IDEwXi04LiBKYWvDoSBqZSBjaHliYSB2eXBvxI10ZW7DqSByb3Zub3bDocW+bsOpIGtvbmNlbnRyYWNlIHN0xZnDrWJybsO9Y2ggaW9udMWvIHZlIHZvZGU/DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkocHJvcGFnYXRlKQ0KRVhQUiA8LSBleHByZXNzaW9uKHheMC41KQ0KeCA9IGMoNC4wLCAwLjQpDQpEQVQgPC0gZGF0YS5mcmFtZSh4KQ0KcmVzIDwtIHByb3BhZ2F0ZShFWFBSLERBVCkNCiMgTkVGVU5HVUpFIHBybyBqZWRudSBwcm9tZW5ub3UuDQoNCg0KbGlicmFyeShtZXRSb2xvZ3kpDQoNCkdVTSgiS3MiLDQuMGUtOCwwLjRlLTgsMSwic3FydChLcykiLHNpZy5kaWdpdHMuVSA9IDIpIA0KDQpleHByIDwtIGV4cHJlc3Npb24oYV4wLjUpDQp4IDwtIGxpc3QoYT00LjBlLTgpDQp1IDwtIGxhcHBseSh4LCBmdW5jdGlvbih4KSB4LzEwKSAjIG5lamlzdG90YSAxMCAlDQp1LmV4cHI8LXVuY2VydChleHByLCB4LCB1LCBtZXRob2Q9Ik5VTSIpDQp1LmV4cHINCiMgZnVuY3Rpb24gbWV0aG9kDQpmIDwtIGZ1bmN0aW9uKGEpIGFeMC41DQp1LmZ1bjwtdW5jZXJ0KGYsIHgsIHUsIG1ldGhvZD0iTlVNIikNCnUuZnVuDQojIGZvcm11bGEgbWV0aG9kDQp1LmZvcm08LXVuY2VydCh+YV4wLjUsIHgsIHUsIG1ldGhvZD0iTlVNIikNCnUuZm9ybQ0KDQpgYGANCg0KDQpOZWppc3RvdHkgYSBrb3JlbGFjZQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KGVycm9ycykNCg0KeCA9IGMoMC45NzE5Mzc4LCAxLjk4NDAwMDYsIDIuOTk2MTgzMCwgNC4wMTIzMzQ2LCA1LjAwMTI3OTkpDQplcnJvcnMoeCkgPSBjKDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEpDQp5ID0gYygwLjk3NDg5OTIsIDEuOTYyNzgwNSwgMi45OTM1ODMxLCAzLjk5MjEyMzcsIDQuOTYxMjU1NSkNCmVycm9ycyh5KSA9IGMoMC4wMiwgMC4wMiwgMC4wMiwgMC4wMiwgMC4wMikNCg0KIyBiZXoga29yZWxhY2UNCmNvcnJlbCh4LCB5KSA9ICBjKDAsIDAsIDAsIDAsIDApIA0KeiA8LSB4IC8geTsgeg0KDQojIHMga29yZWxhY8OtDQpjb3JyZWwoeCwgeSkgPSAgYygwLjg4NjQyODIsIDAuOTc2MTg0MSwgMC45MTQwMjA5LCAwLjk0OTYyNjYsIDAuOTkxMTgzNykNCnpfY29ycmVscCA8LSB4IC8geTsgel9jb3JyZWxwDQoNCmNvcnJlbCh4LCB5KSA9ICBjKC0wLjg4NjQyODIsIC0wLjk3NjE4NDEsIC0wLjkxNDAyMDksIC0wLjk0OTYyNjYsIC0wLjk5MTE4MzcpDQp6X2NvcnJlbG4gPC0geCAvIHk7IHpfY29ycmVsbg0KDQpgYGANCg0K