1 Zakład Bioinformatyki, Instytut Informatyki, Uniwersytet w Białymstoku

Correspondence: Jarosław Kotowicz <>

1 Grupa 1 (22 kwietnia)

1.1 Ustalamy ziarno generatora liczb psudolosowych i generujemy ciągi tych liczb z zadanych rozkładów

1.1.1 Rozkład normalny

set.seed(20200422)
x <- rnorm(1000, mean = 2, sd = 5)

1.1.2 Rozkład jednostany

set.seed(20200422)
y <- runif(1000, -1, 5)
x[1:10]
 [1]   2.1249874 -10.2865847   1.7913608   1.9451335  -5.5892037   0.1287322  -1.5224232   3.6882780  -3.8030355
[10]   3.5524538
y[1:10]
 [1]  2.0598291  1.0320158 -0.9580062 -0.7314746  1.9001470  3.2782507  1.9737342  2.6156499 -0.6128363  1.3471175

Inny sposób wywołania

head(x)
[1]   2.1249874 -10.2865847   1.7913608   1.9451335  -5.5892037   0.1287322
tail(x)
[1] -5.2829695  0.7300313  8.9150630  7.4593185 -2.4671868 13.0699565

1.2 Testy nieparametryczne (zgodności z rozkładem normalnym) z bibliotek nortest

library(nortest)

1.2.1 Cramera von Misesa

cvm.test(x)

    Cramer-von Mises normality test

data:  x
W = 0.058536, p-value = 0.3952

Interpretacja wyniku!

1.2.1.1 Interpretacja (pola wyniku testu)

wynik_testu <- cvm.test(x)
wynik_testu$statistic
         W 
0.05853586 
wynik_testu$p.value
[1] 0.3951641
wynik_testu$method
[1] "Cramer-von Mises normality test"
wynik_testu$data.name
[1] "x"

1.2.1.2 Najważniejsza to p-value (porównywana z poziomem istotności)

wynik_testu$p.value
[1] 0.3951641

Interpretacja wyniku!

1.3 Testy nieparametryczne (zgodności z rozkładem jednostajnym)

set.seed(20200422)
v <- runif(1000)

1.3.1 Test chi-kwadrat

chisq.test(v)
Aproksymacja chi-kwadrat mo戼㹦e by攼㸶 niepoprawna

    Chi-squared test for given probabilities

data:  v
X-squared = 167.99, df = 999, p-value = 1

Interpretacja wyniku!

min(x)
[1] -13.48324
max(x)
[1] 17.11177
range(x)
[1] -13.48324  17.11177

1.3.1.1 Jakie muszą być dane, aby stosować test chi-kwadrat

chisq.test(y)
Błąd w poleceniu 'chisq.test(y)':
  wszystkie wpisy 'x' muszą być nieujemne oraz skończone

1.3.1.2 Próba obejścia problemu

chisq.test(y-min(y))
Aproksymacja chi-kwadrat mo戼㹦e by攼㸶 niepoprawna

    Chi-squared test for given probabilities

data:  y - min(y)
X-squared = 1009.9, df = 999, p-value = 0.3979

Interpretacja wyniku!

1.3.1.3 Inne podejście (przygotowanie danych)

y[y<0]
  [1] -0.95800624 -0.73147460 -0.61283634 -0.26259484 -0.77301464 -0.50261229 -0.93218663 -0.16600981 -0.67371737
 [10] -0.75644257 -0.81003315 -0.65999794 -0.75958694 -0.37211472 -0.20222113 -0.89404429 -0.06799252 -0.38338615
 [19] -0.66683780 -0.49019173 -0.38805568 -0.74434469 -0.97263808 -0.11684305 -0.94581750 -0.14191842 -0.36905811
 [28] -0.69450349 -0.01473395 -0.19964384 -0.45496207 -0.23851467 -0.09463141 -0.72448216 -0.26153626 -0.36264080
 [37] -0.10229570 -0.36607777 -0.09141630 -0.32872861 -0.97090753 -0.34199329 -0.16551923 -0.68151346 -0.87377524
 [46] -0.52569026 -0.64925711 -0.83881919 -0.82314761 -0.08549429 -0.73140699 -0.45307140 -0.25339035 -0.68834832
 [55] -0.47735923 -0.77829048 -0.32139343 -0.79568583 -0.38602023 -0.53205535 -0.61340768 -0.26170468 -0.98069078
 [64] -0.60638089 -0.15911746 -0.48566788 -0.35561190 -0.79563512 -0.42337023 -0.37548184 -0.58462850 -0.82951841
 [73] -0.77496934 -0.52477507 -0.17227290 -0.36950605 -0.36234337 -0.82798795 -0.33728772 -0.79382131 -0.19574776
 [82] -0.35778896 -0.79959051 -0.31995309 -0.15032912 -0.96685557 -0.89311734 -0.60936618 -0.88826419 -0.17153404
 [91] -0.67411027 -0.36960852 -0.19024623 -0.06509306 -0.10393386 -0.17197220 -0.80091542 -0.40873708 -0.85647391
[100] -0.99412833 -0.94622227 -0.86527903 -0.94529888 -0.80214489 -0.22202381 -0.63103740 -0.80186290 -0.46176165
[109] -0.25725595 -0.25815562 -0.88425588 -0.30024511 -0.81757783 -0.68620628 -0.75661401 -0.79866321 -0.85138138
[118] -0.78717002 -0.81789560 -0.58657005 -0.14679690 -0.18831857 -0.95190122 -0.77608847 -0.68858983 -0.42548730
[127] -0.38342125 -0.71377264 -0.69549763 -0.16481542 -0.51893462 -0.20418006 -0.78671444 -0.74021722 -0.90043103
[136] -0.28708037 -0.29597974 -0.81989008 -0.69879078 -0.84335086 -0.64482531 -0.41073430 -0.42575010 -0.06573560
[145] -0.10751313 -0.41918188 -0.40335221 -0.78606690 -0.17088896 -0.18281418 -0.37985539 -0.24526034 -0.38019913
[154] -0.82241759 -0.11671112 -0.98866375 -0.51578829 -0.91530054 -0.62414241 -0.52262317 -0.45940923 -0.63344993
[163] -0.86202492 -0.65678423 -0.39341283 -0.97487639 -0.60950282 -0.25415060 -0.08329700 -0.71898936
seq(min(y)-.2, max(y)+.2, by = .5)
 [1] -1.1941283 -0.6941283 -0.1941283  0.3058717  0.8058717  1.3058717  1.8058717  2.3058717  2.8058717  3.3058717
[11]  3.8058717  4.3058717  4.8058717
yy <- cut(y, seq(min(y)-.2, max(y)+.5, by = 1), include.lowest = TRUE)
table(yy)
yy
[-1.19,-0.194] (-0.194,0.806]   (0.806,1.81]    (1.81,2.81]    (2.81,3.81]    (3.81,4.81] 
           143            159            178            170            158            171 
chisq.test(table(yy))

    Chi-squared test for given probabilities

data:  table(yy)
X-squared = 4.7732, df = 5, p-value = 0.4442

Interpretacja wyniku!

1.3.1.4 Stosowanie testu do ciągu liczb psedoulosowych z rozkładu normalnego

xx <- table(cut(x, seq(min(x)-.1, max(x)+.1, by = 1)))
seq(min(x), max(x), by = 1)
 [1] -13.4832388 -12.4832388 -11.4832388 -10.4832388  -9.4832388  -8.4832388  -7.4832388  -6.4832388  -5.4832388
[10]  -4.4832388  -3.4832388  -2.4832388  -1.4832388  -0.4832388   0.5167612   1.5167612   2.5167612   3.5167612
[19]   4.5167612   5.5167612   6.5167612   7.5167612   8.5167612   9.5167612  10.5167612  11.5167612  12.5167612
[28]  13.5167612  14.5167612  15.5167612  16.5167612
chisq.test(xx)

    Chi-squared test for given probabilities

data:  xx
X-squared = 735.62, df = 29, p-value < 2.2e-16

Interpretacja wyniku!

1.4 Test Kołomogorowa-Smirnowa do sprawdzanie zgodności z rozkładem wzorcowym

ks.test(x, "punif")

    One-sample Kolmogorov-Smirnov test

data:  x
D = 0.581, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(x, "pnorm")

    One-sample Kolmogorov-Smirnov test

data:  x
D = 0.48439, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

1.4.1 Jak prawidłowo stosować ks.test

ks.test(x, "pnorm", 2, 5)

    One-sample Kolmogorov-Smirnov test

data:  x
D = 0.02226, p-value = 0.7047
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(y, "punif")

    One-sample Kolmogorov-Smirnov test

data:  y
D = 0.662, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(y, "punif", -1, 5)

    One-sample Kolmogorov-Smirnov test

data:  y
D = 0.022288, p-value = 0.7032
alternative hypothesis: two-sided

Interpretacja wyniku!

1.5 Test Kołomogorowa-Smirnowa do sprawdzanie zgodności dwóch rozkładów (z różnymi alternatywami)

ks.test(x, y)

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D = 0.273, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(x, y, alternative = "greater")

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D^+ = 0.273, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies above that of y

Interpretacja wyniku!

ks.test(x, y, alternative = "less")

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D^- = 0.26, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y

Interpretacja wyniku!

set.seed(20200422)
x <- rnorm(100, 0, 1)
set.seed(20200422)
y <- rnorm(100, 1, 2)
ks.test(x, y)

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D = 0.35, p-value = 9.57e-06
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(x, y, alternative = "greater")

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D^+ = 0.35, p-value = 4.785e-06
alternative hypothesis: the CDF of x lies above that of y

Interpretacja wyniku!

ks.test(x, y, alternative = "less")

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D^- = 0.04, p-value = 0.8521
alternative hypothesis: the CDF of x lies below that of y

Interpretacja wyniku!

2 Grupa 2 (29 kwietnia)

rm(list = ls())
set.seed(20200429)
x <- rnorm(1000, mean = 2, sd = 5)
set.seed(20200429)
y <- runif(1000, -1, 5)
x[1:10]
 [1]  4.6714832  0.8892507 -2.2792958  3.4292737  0.9942545  4.7910496 -1.4429176  4.1738261  9.0957510 -1.5264687
y[1:10]
 [1] 3.2205911 2.9156664 1.4725917 3.5789826 0.1762271 4.7592749 2.6750318 2.6564900 1.5217459 4.7267674
library(tidyverse)
x %>% head
[1]  4.6714832  0.8892507 -2.2792958  3.4292737  0.9942545  4.7910496
x %>% tail
[1]  5.775721  1.399777 -3.369136  7.444115  3.920325 -2.672647
library(nortest)
cvm.test(x)

    Cramer-von Mises normality test

data:  x
W = 0.11129, p-value = 0.07867

Interpretacja wyniku!

wynik_testu <- cvm.test(x)
set.seed(20200429)
v <- runif(1000)
chisq.test(v)
Aproksymacja chi-kwadrat mo戼㹦e by攼㸶 niepoprawna

    Chi-squared test for given probabilities

data:  v
X-squared = 161.27, df = 999, p-value = 1

Interpretacja wyniku!

chisq.test(y)
Błąd w poleceniu 'chisq.test(y)':
  wszystkie wpisy 'x' muszą być nieujemne oraz skończone
y[y<0]
  [1] -0.774558080 -0.459011670 -0.165688826 -0.931717390 -0.557456438 -0.059941750 -0.070385757 -0.018147833
  [9] -0.768142478 -0.985676002 -0.812243139 -0.667685071 -0.953479179 -0.001755881 -0.985878188 -0.769708028
 [17] -0.523014728 -0.273197286 -0.806061134 -0.293130086 -0.082851095 -0.778385488 -0.264328896 -0.750303022
 [25] -0.087063489 -0.105209374 -0.528968196 -0.144532620 -0.231985062 -0.505583453 -0.307254543 -0.571332299
 [33] -0.134119838 -0.708954140 -0.368703438 -0.260358631 -0.543540496 -0.943924432 -0.713043388 -0.042399266
 [41] -0.177349371 -0.687168158 -0.041845309 -0.197333938 -0.791663572 -0.392224447 -0.639529231 -0.737074837
 [49] -0.458525225 -0.666554539 -0.757966761 -0.126263821 -0.422168402 -0.759431269 -0.631188556 -0.610675837
 [57] -0.774739987 -0.456104595 -0.153861335 -0.043877859 -0.790630813 -0.808079943 -0.452797469 -0.811868130
 [65] -0.807759208 -0.479214219 -0.852418177 -0.993603960 -0.804138533 -0.568458313 -0.509545429 -0.011551832
 [73] -0.159390502 -0.053273968 -0.334688193 -0.340534896 -0.160814290 -0.516160637 -0.242104731 -0.752340706
 [81] -0.874383947 -0.331755495 -0.373883135 -0.292805829 -0.162503794 -0.612528816 -0.694291612 -0.330250801
 [89] -0.243591165 -0.901544767 -0.455351744 -0.616433110 -0.382176313 -0.066072336 -0.703175373 -0.096358399
 [97] -0.493803163 -0.117744283 -0.654803821 -0.572179593 -0.246416953 -0.808070840 -0.394317290 -0.229937719
[105] -0.411889528 -0.677631333 -0.160661523 -0.501827216 -0.807501515 -0.083157544 -0.128178237 -0.337590765
[113] -0.212472433 -0.210635480 -0.996744194 -0.217153860 -0.826740840 -0.632368882 -0.235269646 -0.474523466
[121] -0.051744392 -0.184939863 -0.327123516 -0.476962590 -0.037486764 -0.527944332 -0.736527469 -0.091727185
[129] -0.530672375 -0.273964711 -0.327652875 -0.958741308 -0.366725228 -0.400749226 -0.330075766 -0.315880306
[137] -0.789588202 -0.650324373 -0.849804247 -0.691238732 -0.978339911 -0.308380773 -0.679004692 -0.776305452
[145] -0.626182226 -0.473648730 -0.173046334
chisq.test(y-min(y))
Aproksymacja chi-kwadrat mo戼㹦e by攼㸶 niepoprawna

    Chi-squared test for given probabilities

data:  y - min(y)
X-squared = 968.65, df = 999, p-value = 0.7489

Interpretacja wyniku!

seq(min(y)-.2, max(y)+.2, by = .5)
 [1] -1.1967442 -0.6967442 -0.1967442  0.3032558  0.8032558  1.3032558  1.8032558  2.3032558  2.8032558  3.3032558
[11]  3.8032558  4.3032558  4.8032558
yy <- cut(y, seq(min(y)-.2, max(y)+.5, by = 1), include.lowest = TRUE)
table(yy)
yy
 [-1.2,-0.197] (-0.197,0.803]    (0.803,1.8]      (1.8,2.8]      (2.8,3.8]      (3.8,4.8] 
           115            155            195            156            153            190 
chisq.test(table(yy))

    Chi-squared test for given probabilities

data:  table(yy)
X-squared = 26.373, df = 5, p-value = 7.552e-05

Interpretacja wyniku!

ks.test(x, "punif")

    One-sample Kolmogorov-Smirnov test

data:  x
D = 0.571, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

cvm.test(x)

    Cramer-von Mises normality test

data:  x
W = 0.11129, p-value = 0.07867

Interpretacja wyniku!

ks.test(x, "pnorm")

    One-sample Kolmogorov-Smirnov test

data:  x
D = 0.46835, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(x, "pnorm", 2, 5)

    One-sample Kolmogorov-Smirnov test

data:  x
D = 0.021549, p-value = 0.7419
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(y, "punif")

    One-sample Kolmogorov-Smirnov test

data:  y
D = 0.696, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(y, "punif", -1, 5)

    One-sample Kolmogorov-Smirnov test

data:  y
D = 0.032295, p-value = 0.2479
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(x, y)

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D = 0.284, p-value < 2.2e-16
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(x, y, alternative = "greater")

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D^+ = 0.268, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies above that of y

Interpretacja wyniku!

ks.test(x, y, alternative = "less")

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D^- = 0.284, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y

Interpretacja wyniku!

set.seed(20200429)
t <- rnorm(1000, mean = 1 , sd = 5)
ks.test(x, t)

    Two-sample Kolmogorov-Smirnov test

data:  x and t
D = 0.094, p-value = 0.0002908
alternative hypothesis: two-sided

Interpretacja wyniku!

ks.test(x, t, alternative = "greater")

    Two-sample Kolmogorov-Smirnov test

data:  x and t
D^+ = 0, p-value = 1
alternative hypothesis: the CDF of x lies above that of y

Interpretacja wyniku!

ks.test(x, y, alternative = "less")

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D^- = 0.284, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y

Interpretacja wyniku!

2.1 Test parametryczny dotyczący wartości oczekiwanej (t.test)

t.test(x)

    One Sample t-test

data:  x
t = 13.394, df = 999, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 1.828938 2.456857
sample estimates:
mean of x 
 2.142898 

Interpretacja wyniku!

t.test(x, mu = 2)

    One Sample t-test

data:  x
t = 0.89315, df = 999, p-value = 0.372
alternative hypothesis: true mean is not equal to 2
95 percent confidence interval:
 1.828938 2.456857
sample estimates:
mean of x 
 2.142898 

Interpretacja wyniku!

t.test(x[1:500], x[501:1000])

    Welch Two Sample t-test

data:  x[1:500] and x[501:1000]
t = 0.61361, df = 997.52, p-value = 0.5396
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.4317099  0.8245226
sample estimates:
mean of x mean of y 
 2.241101  2.044695 

Interpretacja wyniku!

LS0tDQp0aXRsZTogIlN0YXR5c3R5a2EgbWF0ZW1hdHljem5hIChraWVydW5layBpbmZvcm1hdHlrYSBpIGVrb25vbWV0cmlhKSAtIGxhYm9yYXRvcml1bSA1Ig0KYXV0aG9yOg0KLSBKYXJvc8WCYXcgS290b3dpY3o6DQogICAgY29ycmVzcG9uZGVuY2U6IG5vDQogICAgZW1haWw6IGoua290b3dpY3pAdXdiLmVkdS5wbA0KICAgIGluc3RpdHV0ZTogSUlVd0INCmRhdGU6ICIyMiBpIDI5IGt3aWV0bmlhIDIwMjByLiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBwYW5kb2NfYXJnczoNCiAgICAtIC0tbHVhLWZpbHRlcj1zY2hvbGFybHktbWV0YWRhdGEubHVhDQogICAgLSAtLWx1YS1maWx0ZXI9YXV0aG9yLWluZm8tYmxvY2tzLmx1YQ0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQppbnN0aXR1dGU6DQotIElJVXdCOiBaYWvFgmFkIEJpb2luZm9ybWF0eWtpLCBJbnN0eXR1dCBJbmZvcm1hdHlraSwgVW5pd2Vyc3l0ZXQgdyBCaWHFgnltc3Rva3UNCmNzbDogYmlnLWRhdGEtYW5kLWluZm9ybWF0aW9uLWFuYWx5dGljcy5jc2wNCmFsd2F5c19hbGxvd19odG1sOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0obGlzdCA9IGxzKCkpDQpgYGANCg0KIyBHcnVwYSAxICgyMiBrd2lldG5pYSkNCg0KIyMgVXN0YWxhbXkgemlhcm5vIGdlbmVyYXRvcmEgbGljemIgcHN1ZG9sb3Nvd3ljaCBpIGdlbmVydWplbXkgY2nEhWdpIHR5Y2ggbGljemIgeiB6YWRhbnljaCByb3prxYJhZMOzdw0KDQojIyMgUm96a8WCYWQgbm9ybWFsbnkNCmBgYHtyfQ0Kc2V0LnNlZWQoMjAyMDA0MjIpDQp4IDwtIHJub3JtKDEwMDAsIG1lYW4gPSAyLCBzZCA9IDUpDQpgYGANCg0KIyMjIFJvemvFgmFkIGplZG5vc3RhbnkNCmBgYHtyfQ0Kc2V0LnNlZWQoMjAyMDA0MjIpDQp5IDwtIHJ1bmlmKDEwMDAsIC0xLCA1KQ0KYGBgDQoNCmBgYHtyfQ0KeFsxOjEwXQ0KeVsxOjEwXQ0KYGBgDQoNCklubnkgc3Bvc8OzYiB3eXdvxYJhbmlhDQpgYGB7cn0NCmhlYWQoeCkNCnRhaWwoeCkNCmBgYA0KDQojIyBUZXN0eSBuaWVwYXJhbWV0cnljem5lICh6Z29kbm/Fm2NpIHogcm96a8WCYWRlbSBub3JtYWxueW0pIHogYmlibGlvdGVrICoqbm9ydGVzdCoqDQpgYGB7cn0NCmxpYnJhcnkobm9ydGVzdCkNCmBgYA0KDQojIyMgQ3JhbWVyYSB2b24gTWlzZXNhDQpgYGB7cn0NCmN2bS50ZXN0KHgpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCiMjIyMgSW50ZXJwcmV0YWNqYSAocG9sYSB3eW5pa3UgdGVzdHUpDQpgYGB7cn0NCnd5bmlrX3Rlc3R1IDwtIGN2bS50ZXN0KHgpDQpgYGANCg0KYGBge3J9DQp3eW5pa190ZXN0dSRzdGF0aXN0aWMNCnd5bmlrX3Rlc3R1JHAudmFsdWUNCnd5bmlrX3Rlc3R1JG1ldGhvZA0Kd3luaWtfdGVzdHUkZGF0YS5uYW1lDQpgYGANCg0KIyMjIyBOYWp3YcW8bmllanN6YSB0byAqcC12YWx1ZSogKHBvcsOzd255d2FuYSB6IHBvemlvbWVtIGlzdG90bm/Fm2NpKQ0KYGBge3J9DQp3eW5pa190ZXN0dSRwLnZhbHVlDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCiMjIFRlc3R5IG5pZXBhcmFtZXRyeWN6bmUgKHpnb2Rub8WbY2kgeiByb3prxYJhZGVtIGplZG5vc3Rham55bSkNCmBgYHtyfQ0Kc2V0LnNlZWQoMjAyMDA0MjIpDQp2IDwtIHJ1bmlmKDEwMDApDQpgYGANCg0KIyMjIFRlc3QgY2hpLWt3YWRyYXQNCmBgYHtyfQ0KY2hpc3EudGVzdCh2KQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCm1pbih4KQ0KbWF4KHgpDQpyYW5nZSh4KQ0KYGBgDQojIyMjIEpha2llIG11c3rEhSBiecSHIGRhbmUsIGFieSBzdG9zb3dhxIcgdGVzdCBjaGkta3dhZHJhdA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoeSkNCmBgYA0KIyMjIyBQcsOzYmEgb2JlasWbY2lhIHByb2JsZW11DQpgYGB7cn0NCmNoaXNxLnRlc3QoeS1taW4oeSkpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCiMjIyMgSW5uZSBwb2RlasWbY2llIChwcnp5Z290b3dhbmllIGRhbnljaCkNCmBgYHtyfQ0KeVt5PDBdDQpgYGANCg0KYGBge3J9DQpzZXEobWluKHkpLS4yLCBtYXgoeSkrLjIsIGJ5ID0gLjUpDQpgYGANCg0KYGBge3J9DQp5eSA8LSBjdXQoeSwgc2VxKG1pbih5KS0uMiwgbWF4KHkpKy41LCBieSA9IDEpLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQp0YWJsZSh5eSkNCmBgYA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoeXkpKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQojIyMjIFN0b3Nvd2FuaWUgdGVzdHUgZG8gY2nEhWd1IGxpY3piIHBzZWRvdWxvc293eWNoIHogcm96a8WCYWR1IG5vcm1hbG5lZ28NCmBgYHtyfQ0KeHggPC0gdGFibGUoY3V0KHgsIHNlcShtaW4oeCktLjEsIG1heCh4KSsuMSwgYnkgPSAxKSkpDQpgYGANCg0KYGBge3J9DQpzZXEobWluKHgpLCBtYXgoeCksIGJ5ID0gMSkNCmBgYA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoeHgpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCiMjIFRlc3QgS2/Fgm9tb2dvcm93YS1TbWlybm93YSBkbyBzcHJhd2R6YW5pZSB6Z29kbm/Fm2NpIHogcm96a8WCYWRlbSB3em9yY293eW0NCmBgYHtyfQ0Ka3MudGVzdCh4LCAicHVuaWYiKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCmtzLnRlc3QoeCwgInBub3JtIikNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KIyMjIEphayBwcmF3aWTFgm93byBzdG9zb3dhxIcga3MudGVzdA0KYGBge3J9DQprcy50ZXN0KHgsICJwbm9ybSIsIDIsIDUpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0Ka3MudGVzdCh5LCAicHVuaWYiKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCmtzLnRlc3QoeSwgInB1bmlmIiwgLTEsIDUpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCiMjIFRlc3QgS2/Fgm9tb2dvcm93YS1TbWlybm93YSBkbyBzcHJhd2R6YW5pZSB6Z29kbm/Fm2NpIGR3w7NjaCByb3prxYJhZMOzdyAoeiByw7PFvG55bWkgYWx0ZXJuYXR5d2FtaSkNCmBgYHtyfQ0Ka3MudGVzdCh4LCB5KQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCmtzLnRlc3QoeCwgeSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0Ka3MudGVzdCh4LCB5LCBhbHRlcm5hdGl2ZSA9ICJsZXNzIikNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQpzZXQuc2VlZCgyMDIwMDQyMikNCnggPC0gcm5vcm0oMTAwLCAwLCAxKQ0Kc2V0LnNlZWQoMjAyMDA0MjIpDQp5IDwtIHJub3JtKDEwMCwgMSwgMikNCmBgYA0KDQpgYGB7cn0NCmtzLnRlc3QoeCwgeSkNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQprcy50ZXN0KHgsIHksIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCmtzLnRlc3QoeCwgeSwgYWx0ZXJuYXRpdmUgPSAibGVzcyIpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCiMgR3J1cGEgMiAoMjkga3dpZXRuaWEpDQoNCmBgYHtyfQ0Kcm0obGlzdCA9IGxzKCkpDQpzZXQuc2VlZCgyMDIwMDQyOSkNCnggPC0gcm5vcm0oMTAwMCwgbWVhbiA9IDIsIHNkID0gNSkNCnNldC5zZWVkKDIwMjAwNDI5KQ0KeSA8LSBydW5pZigxMDAwLCAtMSwgNSkNCmBgYA0KDQpgYGB7cn0NCnhbMToxMF0NCnlbMToxMF0NCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCmBgYHtyfQ0KeCAlPiUgaGVhZA0KeCAlPiUgdGFpbA0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShub3J0ZXN0KQ0KYGBgDQoNCmBgYHtyfQ0KY3ZtLnRlc3QoeCkNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQp3eW5pa190ZXN0dSA8LSBjdm0udGVzdCh4KQ0KYGBgDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMjAyMDA0MjkpDQp2IDwtIHJ1bmlmKDEwMDApDQpgYGANCg0KYGBge3J9DQpjaGlzcS50ZXN0KHYpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0KY2hpc3EudGVzdCh5KQ0KYGBgDQoNCmBgYHtyfQ0KeVt5PDBdDQpgYGANCg0KYGBge3J9DQpjaGlzcS50ZXN0KHktbWluKHkpKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCnNlcShtaW4oeSktLjIsIG1heCh5KSsuMiwgYnkgPSAuNSkNCmBgYA0KDQpgYGB7cn0NCnl5IDwtIGN1dCh5LCBzZXEobWluKHkpLS4yLCBtYXgoeSkrLjUsIGJ5ID0gMSksIGluY2x1ZGUubG93ZXN0ID0gVFJVRSkNCnRhYmxlKHl5KQ0KYGBgDQoNCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZSh5eSkpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0Ka3MudGVzdCh4LCAicHVuaWYiKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCmN2bS50ZXN0KHgpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0Ka3MudGVzdCh4LCAicG5vcm0iKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCmtzLnRlc3QoeCwgInBub3JtIiwgMiwgNSkNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQprcy50ZXN0KHksICJwdW5pZiIpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0Ka3MudGVzdCh5LCAicHVuaWYiLCAtMSwgNSkNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQprcy50ZXN0KHgsIHkpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0Ka3MudGVzdCh4LCB5LCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQprcy50ZXN0KHgsIHksIGFsdGVybmF0aXZlID0gImxlc3MiKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCnNldC5zZWVkKDIwMjAwNDI5KQ0KdCA8LSBybm9ybSgxMDAwLCBtZWFuID0gMSAsIHNkID0gNSkNCmBgYA0KDQpgYGB7cn0NCmtzLnRlc3QoeCwgdCkNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQprcy50ZXN0KHgsIHQsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0KDQpgYGB7cn0NCmtzLnRlc3QoeCwgeSwgYWx0ZXJuYXRpdmUgPSAibGVzcyIpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCiMjIFRlc3QgcGFyYW1ldHJ5Y3pueSBkb3R5Y3rEhWN5IHdhcnRvxZtjaSBvY3pla2l3YW5laiAoKip0LnRlc3QqKikNCmBgYHtyfQ0KdC50ZXN0KHgpDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj5JbnRlcnByZXRhY2phIHd5bmlrdSE8L3NwYW4+DQoNCmBgYHtyfQ0KdC50ZXN0KHgsIG11ID0gMikNCmBgYA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPkludGVycHJldGFjamEgd3luaWt1ITwvc3Bhbj4NCg0KYGBge3J9DQp0LnRlc3QoeFsxOjUwMF0sIHhbNTAxOjEwMDBdKQ0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+SW50ZXJwcmV0YWNqYSB3eW5pa3UhPC9zcGFuPg0K