[5.1]

Да се покаже дека:

\[ T^2=n(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)'\boldsymbol{S}^{-1}(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)= (\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)'(\frac{\boldsymbol{S}}{n})^{-1}(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0) \]

\[ (\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)'(\frac{\boldsymbol{S}}{n})^{-1}(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)=(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)'(\frac{\boldsymbol{1}}{n})^{-1}\boldsymbol{S}^{-1}(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)=n(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)'\boldsymbol{S}^{-1}(\bar{\boldsymbol{y}}-\boldsymbol{\mu}_0)=T^2 \]

[5.5]

Да се покаже дека:

\[ s^2_d=\sum_{i=1}^{n}\frac{(d_i-\bar{d})^2}{n-1}=s^2_y+s^2_x-2s_{yx} \]

\[ s^2_d=\sum_{i=1}^{n}\frac{(d_i-\bar{d})^2}{n-1}=\\ \sum_{i=1}^{n}\frac{(y_i-x_i-\frac{1}{n}\sum_{j=1}^{n}(y_j-x_j))^2}{n-1}=\\ \sum_{i=1}^{n}\frac{(y_i-x_i-\bar{y}+\bar{x})^2}{n-1}=\\ \sum_{i=1}^{n}\frac{(y_i-\bar{y})^2+(x_i-\bar{x})^2-2(y_i-\bar{y})(x_i-\bar{x})}{n-1}=\\ s^2_y+s^2_x-2s_{yx} \]

[5.6]

Да се покаже дека:

\[ T^2=n\bar{\boldsymbol{d}}'\boldsymbol{S}_d^{-1}\bar{\boldsymbol{d}}=\bar{\boldsymbol{d}}'(\frac{\boldsymbol{S}_d}{n})^{-1}\bar{\boldsymbol{d}} \]

\[ \bar{\boldsymbol{d}}'(\frac{\boldsymbol{S}_d}{n})^{-1}\bar{\boldsymbol{d}}=\bar{\boldsymbol{d}}'(\frac{1}{n})^{-1}\boldsymbol{S}_d^{-1}\bar{\boldsymbol{d}}=n\bar{\boldsymbol{d}}'\boldsymbol{S}_d^{-1}\bar{\boldsymbol{d}}=T^2 \]

[5.10]

Да се покаже дека:

\[ T^2=(n_1+n_2)(\boldsymbol{C}\bar{\boldsymbol{y}})'(\boldsymbol{C}\boldsymbol{S}_{pl}\boldsymbol{C}')^{-1}\boldsymbol{C}\bar{\boldsymbol{y}} \sim T^2_{p-1,n_1+n_2-2} \]

\(\frac{\boldsymbol{C}\boldsymbol{S}_{pl}\boldsymbol{C}'}{n_1+n_2}\) e коваријансната матрица на \(\boldsymbol{C}\bar{\boldsymbol{y}}\). Кога ќе се земе тоа предвид, изразот комплетно се совпаѓа со карактеристичната форма на \(T^2\) од претходната задача, па може да се заклучи дека \(T^2\) навистина има распределба \(T^2_{p-1,n_1+n_2-2}\).

[5.16]

Податоците се:

data = c(
  1, 189, 245, 137, 163, 1, 181, 305, 184, 209,
  2, 192, 260, 132, 217, 2, 158, 237, 133, 188,
  3, 217, 276, 141, 192, 3, 184, 300, 166, 231,
  4, 221, 299, 142, 213, 4, 171, 273, 162, 213,
  5, 171, 239, 128, 158, 5, 181, 297, 163, 224,
  6, 192, 262, 147, 173, 6, 181, 308, 160, 223,
  7, 213, 278, 136, 201, 7, 177, 301, 166, 221,
  8, 192, 255, 128, 185, 8, 198, 308, 141, 197,
  9, 170, 244, 128, 192, 9, 180, 286, 146, 214,
  10, 201, 276, 146, 186, 10, 177, 299, 171, 192,
  11, 195, 242, 128, 192, 11, 176, 317, 166, 213,
  12, 205, 263, 147, 192, 12, 192, 312, 166, 209,
  13, 180, 252, 121, 167, 13, 176, 285, 141, 200,
  14, 192, 283, 138, 183, 14, 169, 287, 162, 214,
  15, 200, 294, 138, 188, 15, 164, 265, 147, 192,
  16, 192, 277, 150, 177, 16, 181, 308, 157, 204,
  17, 200, 287, 136, 173, 17, 192, 276, 154, 209,
  18, 181, 255, 146, 183, 18, 181, 278, 149, 235,
  19, 192, 287, 141, 198, 19, 175, 271, 140, 192,
  20, 0, 0, 0, 0, 20, 197, 303, 170, 205
)

y1 = data[seq(2, length(data) - 10, 10)]
y2 = data[seq(3, length(data) - 10, 10)]
y3 = data[seq(4, length(data) - 10, 10)]
y4 = data[seq(5, length(data) - 10, 10)]

ole = data.frame(y1, y2, y3, y4)
ole
y1 = data[seq(7, length(data), 10)]
y2 = data[seq(8, length(data), 10)]
y3 = data[seq(9, length(data), 10)]
y4 = data[seq(10, length(data), 10)]

car = data.frame(y1, y2, y3, y4)
car

(a)

Да се тестира хипотезата \(H_0:\boldsymbol{\mu}_1=\boldsymbol{\mu}_2\).

calc_w <- function(df) {
  rows = dim(df)[1]
  cols = dim(df)[2]
  means = colMeans(df)
  w = matrix(data=rep(0, cols * cols), nrow=cols, ncol=cols)
  for (k in 1:rows) {
    row = as.matrix(df[k, ])
    w = w + t(row - means) %*% (row - means)
  }
  return(w)
}

calc_t2_spl <- function(df1, df2) {
  df1_means = colMeans(df1)
  df2_means = colMeans(df2)
  n1 = dim(df1)[1]
  n2 = dim(df2)[1]
  w1 = calc_w(df1)
  w2 = calc_w(df2)
  spl = (w1 + w2) / (n1 + n2 - 2)
  means_diff = df1_means - df2_means
  return(list(
    (t(means_diff) %*% solve(spl) %*% means_diff) * (n1 * n2) / (n1 + n2),
    spl
  ))
}

res = calc_t2_spl(ole, car)
t2 = res[[1]]
spl = res[[2]]
t2
         [,1]
[1,] 133.4873

Оваа \(T^2\) вредност е доволно голема за да ја отфрлиме нултата хипотеза дека средините се исти.

(b)

Да се направи тестот на поединечните променливи.

ole_means = colMeans(ole)
car_means = colMeans(car)
n1 = dim(ole)[1]
n2 = dim(car)[1]

uni_t = (ole_means - car_means) / sqrt((diag(spl) * (n1 + n2) / (n1 * n2)))
uni_t
       y1        y2        y3        y4 
 3.887946 -3.865239 -5.691131 -5.042625 

Вредностите се доволно големи за да се отфрлат нултите хипотези за поединечните променливи т.е. не можеме да заклучиме дека просеците на поединечните променливи се исти.

(c)

Да се пресмета векторот со коефициенти на дискриминантната функција \(\boldsymbol{a}=\boldsymbol{S}_{pl}(\bar{\boldsymbol{y}}_1-\bar{\boldsymbol{y}}_1)\).

a = solve(spl) %*% (ole_means - car_means)
a
         [,1]
y1  0.3452490
y2 -0.1303878
y3 -0.1064338
y4 -0.1433533

(d)

Да се покаже дека \(T^2=t^2(\boldsymbol{a})\).

t_a <- function(a, y1_means, y2_means, n1, n2, spl) {
  return(
    (t(a) %*% y1_means - t(a) %*% y2_means) / 
      sqrt(t(a) %*% spl %*% a * (n1 + n2) / (n1 * n2))
  )
}

t_a(a, ole_means, car_means, n1, n2, spl) ^ 2
         [,1]
[1,] 133.4873

Исто е како и пресметаното под (а).

(e)

Да се најде \(T^2\) користејќи го методот на регресија.

ole["w"] = n2 / (n1 + n2)
car["w"] = n1 / (n1 + n2)
all_data = rbind(ole, car)
all_data
linear_model = lm(w ~ y1 + y2 + y3 + y4, data=all_data)
s = summary(linear_model)
s

Call:
lm(formula = w ~ y1 + y2 + y3 + y4, data = all_data)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.013859 -0.003554  0.000767  0.003522  0.011015 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  5.231e-01  1.979e-02  26.432  < 2e-16 ***
y1           5.059e-04  8.440e-05   5.994 8.76e-07 ***
y2          -1.911e-04  7.934e-05  -2.408  0.02160 *  
y3          -1.560e-04  1.171e-04  -1.332  0.19163    
y4          -2.101e-04  7.310e-05  -2.874  0.00694 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.006395 on 34 degrees of freedom
Multiple R-squared:  0.783, Adjusted R-squared:  0.7574 
F-statistic: 30.67 on 4 and 34 DF,  p-value: 7.522e-11
r2 = s$r.squared
new_t2 = (n1 + n2 - 2) * (r2 / (1 - r2))
new_t2
[1] 133.4873

Вредноста е иста како и таа пресметана под (а) и под (d).

(f)

Да се пресмета придонесот на секоја променлива во однос на останатите три.

Прикажани се по ред (Ф статистики):

ole = ole[-c(5)]
car = car[-c(5)]

calc_t2_no_ys <- function(df1, df2, omited_ys, t2_total) {
  ni = dim(df1)[1] + dim(df2)[1] - 2
  t_no_ys = calc_t2(df1[-omited_ys], df2[-omited_ys])
  return(((ni - length(df1) + 1) / length(omited_ys)) * (t2_total - t_no_ys) / (ni + t_no_ys))
}

calc_t2_no_ys(ole, car, c(1), t2)
        [,1]
[1,] 35.9336
calc_t2_no_ys(ole, car, c(2), t2)
         [,1]
[1,] 5.799435
calc_t2_no_ys(ole, car, c(3), t2)
         [,1]
[1,] 1.774944
calc_t2_no_ys(ole, car, c(4), t2)
         [,1]
[1,] 8.259241

(g)

Да се пресмета придонесот на последните 2 променливи во однос на првите две.

Прикажана е Ф статистиката:

calc_t2_no_ys(ole, car, c(3, 4), t2)
        [,1]
[1,] 6.08144
LS0tDQp0aXRsZTogItCT0LvQsNCy0LAgNTogVGVzdHMgb24gT25lIG9yIFR3byBNZWFuIFZlY3RvcnMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIFs1LjFdDQoNCtCU0LAg0YHQtSDQv9C+0LrQsNC20LUg0LTQtdC60LA6DQoNCiQkDQpUXjI9bihcYmFye1xib2xkc3ltYm9se3l9fS1cYm9sZHN5bWJvbHtcbXV9XzApJ1xib2xkc3ltYm9se1N9XnstMX0oXGJhcntcYm9sZHN5bWJvbHt5fX0tXGJvbGRzeW1ib2x7XG11fV8wKT0NCihcYmFye1xib2xkc3ltYm9se3l9fS1cYm9sZHN5bWJvbHtcbXV9XzApJyhcZnJhY3tcYm9sZHN5bWJvbHtTfX17bn0pXnstMX0oXGJhcntcYm9sZHN5bWJvbHt5fX0tXGJvbGRzeW1ib2x7XG11fV8wKQ0KJCQNCg0KJCQNCihcYmFye1xib2xkc3ltYm9se3l9fS1cYm9sZHN5bWJvbHtcbXV9XzApJyhcZnJhY3tcYm9sZHN5bWJvbHtTfX17bn0pXnstMX0oXGJhcntcYm9sZHN5bWJvbHt5fX0tXGJvbGRzeW1ib2x7XG11fV8wKT0oXGJhcntcYm9sZHN5bWJvbHt5fX0tXGJvbGRzeW1ib2x7XG11fV8wKScoXGZyYWN7XGJvbGRzeW1ib2x7MX19e259KV57LTF9XGJvbGRzeW1ib2x7U31eey0xfShcYmFye1xib2xkc3ltYm9se3l9fS1cYm9sZHN5bWJvbHtcbXV9XzApPW4oXGJhcntcYm9sZHN5bWJvbHt5fX0tXGJvbGRzeW1ib2x7XG11fV8wKSdcYm9sZHN5bWJvbHtTfV57LTF9KFxiYXJ7XGJvbGRzeW1ib2x7eX19LVxib2xkc3ltYm9se1xtdX1fMCk9VF4yDQokJA0KDQojIFs1LjVdDQoNCtCU0LAg0YHQtSDQv9C+0LrQsNC20LUg0LTQtdC60LA6DQoNCiQkDQpzXjJfZD1cc3VtX3tpPTF9XntufVxmcmFjeyhkX2ktXGJhcntkfSleMn17bi0xfT1zXjJfeStzXjJfeC0yc197eXh9DQokJA0KDQokJA0Kc14yX2Q9XHN1bV97aT0xfV57bn1cZnJhY3soZF9pLVxiYXJ7ZH0pXjJ9e24tMX09XFwNClxzdW1fe2k9MX1ee259XGZyYWN7KHlfaS14X2ktXGZyYWN7MX17bn1cc3VtX3tqPTF9XntufSh5X2oteF9qKSleMn17bi0xfT1cXA0KXHN1bV97aT0xfV57bn1cZnJhY3soeV9pLXhfaS1cYmFye3l9K1xiYXJ7eH0pXjJ9e24tMX09XFwNClxzdW1fe2k9MX1ee259XGZyYWN7KHlfaS1cYmFye3l9KV4yKyh4X2ktXGJhcnt4fSleMi0yKHlfaS1cYmFye3l9KSh4X2ktXGJhcnt4fSl9e24tMX09XFwNCnNeMl95K3NeMl94LTJzX3t5eH0NCiQkDQoNCiMgWzUuNl0NCg0K0JTQsCDRgdC1INC/0L7QutCw0LbQtSDQtNC10LrQsDoNCg0KJCQNClReMj1uXGJhcntcYm9sZHN5bWJvbHtkfX0nXGJvbGRzeW1ib2x7U31fZF57LTF9XGJhcntcYm9sZHN5bWJvbHtkfX09XGJhcntcYm9sZHN5bWJvbHtkfX0nKFxmcmFje1xib2xkc3ltYm9se1N9X2R9e259KV57LTF9XGJhcntcYm9sZHN5bWJvbHtkfX0NCiQkDQoNCiQkDQpcYmFye1xib2xkc3ltYm9se2R9fScoXGZyYWN7XGJvbGRzeW1ib2x7U31fZH17bn0pXnstMX1cYmFye1xib2xkc3ltYm9se2R9fT1cYmFye1xib2xkc3ltYm9se2R9fScoXGZyYWN7MX17bn0pXnstMX1cYm9sZHN5bWJvbHtTfV9kXnstMX1cYmFye1xib2xkc3ltYm9se2R9fT1uXGJhcntcYm9sZHN5bWJvbHtkfX0nXGJvbGRzeW1ib2x7U31fZF57LTF9XGJhcntcYm9sZHN5bWJvbHtkfX09VF4yDQokJA0KDQojIFs1LjEwXQ0KDQrQlNCwINGB0LUg0L/QvtC60LDQttC1INC00LXQutCwOg0KDQokJA0KVF4yPShuXzErbl8yKShcYm9sZHN5bWJvbHtDfVxiYXJ7XGJvbGRzeW1ib2x7eX19KScoXGJvbGRzeW1ib2x7Q31cYm9sZHN5bWJvbHtTfV97cGx9XGJvbGRzeW1ib2x7Q30nKV57LTF9XGJvbGRzeW1ib2x7Q31cYmFye1xib2xkc3ltYm9se3l9fSBcc2ltIFReMl97cC0xLG5fMStuXzItMn0NCiQkDQoNCiRcZnJhY3tcYm9sZHN5bWJvbHtDfVxib2xkc3ltYm9se1N9X3twbH1cYm9sZHN5bWJvbHtDfSd9e25fMStuXzJ9JCBlINC60L7QstCw0YDQuNGY0LDQvdGB0L3QsNGC0LAg0LzQsNGC0YDQuNGG0LAg0L3QsCAkXGJvbGRzeW1ib2x7Q31cYmFye1xib2xkc3ltYm9se3l9fSQuINCa0L7Qs9CwINGc0LUg0YHQtSDQt9C10LzQtSDRgtC+0LAg0L/RgNC10LTQstC40LQsINC40LfRgNCw0LfQvtGCINC60L7QvNC/0LvQtdGC0L3QviDRgdC1INGB0L7QstC/0LDRk9CwINGB0L4g0LrQsNGA0LDQutGC0LXRgNC40YHRgtC40YfQvdCw0YLQsCDRhNC+0YDQvNCwINC90LAgJFReMiQg0L7QtCDQv9GA0LXRgtGF0L7QtNC90LDRgtCwINC30LDQtNCw0YfQsCwg0L/QsCDQvNC+0LbQtSDQtNCwINGB0LUg0LfQsNC60LvRg9GH0Lgg0LTQtdC60LAgJFReMiQg0L3QsNCy0LjRgdGC0LjQvdCwINC40LzQsCDRgNCw0YHQv9GA0LXQtNC10LvQsdCwICRUXjJfe3AtMSxuXzErbl8yLTJ9JC4NCg0KIyBbNS4xNl0NCg0K0J/QvtC00LDRgtC+0YbQuNGC0LUg0YHQtToNCg0KYGBge3J9DQpkYXRhID0gYygNCiAgMSwgMTg5LCAyNDUsIDEzNywgMTYzLCAxLCAxODEsIDMwNSwgMTg0LCAyMDksDQogIDIsIDE5MiwgMjYwLCAxMzIsIDIxNywgMiwgMTU4LCAyMzcsIDEzMywgMTg4LA0KICAzLCAyMTcsIDI3NiwgMTQxLCAxOTIsIDMsIDE4NCwgMzAwLCAxNjYsIDIzMSwNCiAgNCwgMjIxLCAyOTksIDE0MiwgMjEzLCA0LCAxNzEsIDI3MywgMTYyLCAyMTMsDQogIDUsIDE3MSwgMjM5LCAxMjgsIDE1OCwgNSwgMTgxLCAyOTcsIDE2MywgMjI0LA0KICA2LCAxOTIsIDI2MiwgMTQ3LCAxNzMsIDYsIDE4MSwgMzA4LCAxNjAsIDIyMywNCiAgNywgMjEzLCAyNzgsIDEzNiwgMjAxLCA3LCAxNzcsIDMwMSwgMTY2LCAyMjEsDQogIDgsIDE5MiwgMjU1LCAxMjgsIDE4NSwgOCwgMTk4LCAzMDgsIDE0MSwgMTk3LA0KICA5LCAxNzAsIDI0NCwgMTI4LCAxOTIsIDksIDE4MCwgMjg2LCAxNDYsIDIxNCwNCiAgMTAsIDIwMSwgMjc2LCAxNDYsIDE4NiwgMTAsIDE3NywgMjk5LCAxNzEsIDE5MiwNCiAgMTEsIDE5NSwgMjQyLCAxMjgsIDE5MiwgMTEsIDE3NiwgMzE3LCAxNjYsIDIxMywNCiAgMTIsIDIwNSwgMjYzLCAxNDcsIDE5MiwgMTIsIDE5MiwgMzEyLCAxNjYsIDIwOSwNCiAgMTMsIDE4MCwgMjUyLCAxMjEsIDE2NywgMTMsIDE3NiwgMjg1LCAxNDEsIDIwMCwNCiAgMTQsIDE5MiwgMjgzLCAxMzgsIDE4MywgMTQsIDE2OSwgMjg3LCAxNjIsIDIxNCwNCiAgMTUsIDIwMCwgMjk0LCAxMzgsIDE4OCwgMTUsIDE2NCwgMjY1LCAxNDcsIDE5MiwNCiAgMTYsIDE5MiwgMjc3LCAxNTAsIDE3NywgMTYsIDE4MSwgMzA4LCAxNTcsIDIwNCwNCiAgMTcsIDIwMCwgMjg3LCAxMzYsIDE3MywgMTcsIDE5MiwgMjc2LCAxNTQsIDIwOSwNCiAgMTgsIDE4MSwgMjU1LCAxNDYsIDE4MywgMTgsIDE4MSwgMjc4LCAxNDksIDIzNSwNCiAgMTksIDE5MiwgMjg3LCAxNDEsIDE5OCwgMTksIDE3NSwgMjcxLCAxNDAsIDE5MiwNCiAgMjAsIDAsIDAsIDAsIDAsIDIwLCAxOTcsIDMwMywgMTcwLCAyMDUNCikNCg0KeTEgPSBkYXRhW3NlcSgyLCBsZW5ndGgoZGF0YSkgLSAxMCwgMTApXQ0KeTIgPSBkYXRhW3NlcSgzLCBsZW5ndGgoZGF0YSkgLSAxMCwgMTApXQ0KeTMgPSBkYXRhW3NlcSg0LCBsZW5ndGgoZGF0YSkgLSAxMCwgMTApXQ0KeTQgPSBkYXRhW3NlcSg1LCBsZW5ndGgoZGF0YSkgLSAxMCwgMTApXQ0KDQpvbGUgPSBkYXRhLmZyYW1lKHkxLCB5MiwgeTMsIHk0KQ0Kb2xlDQp5MSA9IGRhdGFbc2VxKDcsIGxlbmd0aChkYXRhKSwgMTApXQ0KeTIgPSBkYXRhW3NlcSg4LCBsZW5ndGgoZGF0YSksIDEwKV0NCnkzID0gZGF0YVtzZXEoOSwgbGVuZ3RoKGRhdGEpLCAxMCldDQp5NCA9IGRhdGFbc2VxKDEwLCBsZW5ndGgoZGF0YSksIDEwKV0NCg0KY2FyID0gZGF0YS5mcmFtZSh5MSwgeTIsIHkzLCB5NCkNCmNhcg0KYGBgDQoNCiMjIyAoYSkNCg0K0JTQsCDRgdC1INGC0LXRgdGC0LjRgNCwINGF0LjQv9C+0YLQtdC30LDRgtCwICRIXzA6XGJvbGRzeW1ib2x7XG11fV8xPVxib2xkc3ltYm9se1xtdX1fMiQuDQoNCmBgYHtyfQ0KY2FsY193IDwtIGZ1bmN0aW9uKGRmKSB7DQogIHJvd3MgPSBkaW0oZGYpWzFdDQogIGNvbHMgPSBkaW0oZGYpWzJdDQogIG1lYW5zID0gY29sTWVhbnMoZGYpDQogIHcgPSBtYXRyaXgoZGF0YT1yZXAoMCwgY29scyAqIGNvbHMpLCBucm93PWNvbHMsIG5jb2w9Y29scykNCiAgZm9yIChrIGluIDE6cm93cykgew0KICAgIHJvdyA9IGFzLm1hdHJpeChkZltrLCBdKQ0KICAgIHcgPSB3ICsgdChyb3cgLSBtZWFucykgJSolIChyb3cgLSBtZWFucykNCiAgfQ0KICByZXR1cm4odykNCn0NCg0KY2FsY190Ml9zcGwgPC0gZnVuY3Rpb24oZGYxLCBkZjIpIHsNCiAgZGYxX21lYW5zID0gY29sTWVhbnMoZGYxKQ0KICBkZjJfbWVhbnMgPSBjb2xNZWFucyhkZjIpDQogIG4xID0gZGltKGRmMSlbMV0NCiAgbjIgPSBkaW0oZGYyKVsxXQ0KICB3MSA9IGNhbGNfdyhkZjEpDQogIHcyID0gY2FsY193KGRmMikNCiAgc3BsID0gKHcxICsgdzIpIC8gKG4xICsgbjIgLSAyKQ0KICBtZWFuc19kaWZmID0gZGYxX21lYW5zIC0gZGYyX21lYW5zDQogIHJldHVybihsaXN0KA0KICAgICh0KG1lYW5zX2RpZmYpICUqJSBzb2x2ZShzcGwpICUqJSBtZWFuc19kaWZmKSAqIChuMSAqIG4yKSAvIChuMSArIG4yKSwNCiAgICBzcGwNCiAgKSkNCn0NCg0KcmVzID0gY2FsY190Ml9zcGwob2xlLCBjYXIpDQp0MiA9IHJlc1tbMV1dDQpzcGwgPSByZXNbWzJdXQ0KdDINCmBgYA0KDQrQntCy0LDQsCAkVF4yJCDQstGA0LXQtNC90L7RgdGCINC1INC00L7QstC+0LvQvdC+INCz0L7Qu9C10LzQsCDQt9CwINC00LAg0ZjQsCDQvtGC0YTRgNC70LjQvNC1INC90YPQu9GC0LDRgtCwINGF0LjQv9C+0YLQtdC30LAg0LTQtdC60LAg0YHRgNC10LTQuNC90LjRgtC1INGB0LUg0LjRgdGC0LguDQoNCiMjIyAoYikNCg0K0JTQsCDRgdC1INC90LDQv9GA0LDQstC4INGC0LXRgdGC0L7RgiDQvdCwINC/0L7QtdC00LjQvdC10YfQvdC40YLQtSDQv9GA0L7QvNC10L3Qu9C40LLQuC4NCg0KYGBge3J9DQpvbGVfbWVhbnMgPSBjb2xNZWFucyhvbGUpDQpjYXJfbWVhbnMgPSBjb2xNZWFucyhjYXIpDQpuMSA9IGRpbShvbGUpWzFdDQpuMiA9IGRpbShjYXIpWzFdDQoNCnVuaV90ID0gKG9sZV9tZWFucyAtIGNhcl9tZWFucykgLyBzcXJ0KChkaWFnKHNwbCkgKiAobjEgKyBuMikgLyAobjEgKiBuMikpKQ0KdW5pX3QNCmBgYA0KDQrQktGA0LXQtNC90L7RgdGC0LjRgtC1INGB0LUg0LTQvtCy0L7Qu9C90L4g0LPQvtC70LXQvNC4INC30LAg0LTQsCDRgdC1INC+0YLRhNGA0LvQsNGCINC90YPQu9GC0LjRgtC1INGF0LjQv9C+0YLQtdC30Lgg0LfQsCDQv9C+0LXQtNC40L3QtdGH0L3QuNGC0LUg0L/RgNC+0LzQtdC90LvQuNCy0Lgg0YIu0LUuINC90LUg0LzQvtC20LXQvNC1INC00LAg0LfQsNC60LvRg9GH0LjQvNC1INC00LXQutCwINC/0YDQvtGB0LXRhtC40YLQtSDQvdCwINC/0L7QtdC00LjQvdC10YfQvdC40YLQtSDQv9GA0L7QvNC10L3Qu9C40LLQuCDRgdC1INC40YHRgtC4Lg0KDQojIyMgKGMpDQoNCtCU0LAg0YHQtSDQv9GA0LXRgdC80LXRgtCwINCy0LXQutGC0L7RgNC+0YIg0YHQviDQutC+0LXRhNC40YbQuNC10L3RgtC4INC90LAg0LTQuNGB0LrRgNC40LzQuNC90LDQvdGC0L3QsNGC0LAg0YTRg9C90LrRhtC40ZjQsCAkXGJvbGRzeW1ib2x7YX09XGJvbGRzeW1ib2x7U31fe3BsfShcYmFye1xib2xkc3ltYm9se3l9fV8xLVxiYXJ7XGJvbGRzeW1ib2x7eX19XzEpJC4NCg0KYGBge3J9DQphID0gc29sdmUoc3BsKSAlKiUgKG9sZV9tZWFucyAtIGNhcl9tZWFucykNCmENCmBgYA0KDQojIyMgKGQpDQoNCtCU0LAg0YHQtSDQv9C+0LrQsNC20LUg0LTQtdC60LAgJFReMj10XjIoXGJvbGRzeW1ib2x7YX0pJC4NCg0KYGBge3J9DQp0X2EgPC0gZnVuY3Rpb24oYSwgeTFfbWVhbnMsIHkyX21lYW5zLCBuMSwgbjIsIHNwbCkgew0KICByZXR1cm4oDQogICAgKHQoYSkgJSolIHkxX21lYW5zIC0gdChhKSAlKiUgeTJfbWVhbnMpIC8gDQogICAgICBzcXJ0KHQoYSkgJSolIHNwbCAlKiUgYSAqIChuMSArIG4yKSAvIChuMSAqIG4yKSkNCiAgKQ0KfQ0KDQp0X2EoYSwgb2xlX21lYW5zLCBjYXJfbWVhbnMsIG4xLCBuMiwgc3BsKSBeIDINCmBgYA0KDQrQmNGB0YLQviDQtSDQutCw0LrQviDQuCDQv9GA0LXRgdC80LXRgtCw0L3QvtGC0L4g0L/QvtC0ICjQsCkuDQoNCiMjIyAoZSkNCg0K0JTQsCDRgdC1INC90LDRmNC00LUgJFReMiQg0LrQvtGA0LjRgdGC0LXRmNGc0Lgg0LPQviDQvNC10YLQvtC00L7RgiDQvdCwINGA0LXQs9GA0LXRgdC40ZjQsC4NCg0KYGBge3J9DQpvbGVbInciXSA9IG4yIC8gKG4xICsgbjIpDQpjYXJbInciXSA9IG4xIC8gKG4xICsgbjIpDQphbGxfZGF0YSA9IHJiaW5kKG9sZSwgY2FyKQ0KYWxsX2RhdGENCmxpbmVhcl9tb2RlbCA9IGxtKHcgfiB5MSArIHkyICsgeTMgKyB5NCwgZGF0YT1hbGxfZGF0YSkNCnMgPSBzdW1tYXJ5KGxpbmVhcl9tb2RlbCkNCnMNCnIyID0gcyRyLnNxdWFyZWQNCm5ld190MiA9IChuMSArIG4yIC0gMikgKiAocjIgLyAoMSAtIHIyKSkNCm5ld190Mg0KYGBgDQoNCtCS0YDQtdC00L3QvtGB0YLQsCDQtSDQuNGB0YLQsCDQutCw0LrQviDQuCDRgtCw0LAg0L/RgNC10YHQvNC10YLQsNC90LAg0L/QvtC0ICjQsCkg0Lgg0L/QvtC0IChkKS4NCg0KIyMjIChmKQ0KDQrQlNCwINGB0LUg0L/RgNC10YHQvNC10YLQsCDQv9GA0LjQtNC+0L3QtdGB0L7RgiDQvdCwINGB0LXQutC+0ZjQsCDQv9GA0L7QvNC10L3Qu9C40LLQsCDQstC+INC+0LTQvdC+0YEg0L3QsCDQvtGB0YLQsNC90LDRgtC40YLQtSDRgtGA0LguDQoNCtCf0YDQuNC60LDQttCw0L3QuCDRgdC1INC/0L4g0YDQtdC0ICjQpCDRgdGC0LDRgtC40YHRgtC40LrQuCk6DQoNCmBgYHtyfQ0Kb2xlID0gb2xlWy1jKDUpXQ0KY2FyID0gY2FyWy1jKDUpXQ0KDQpjYWxjX3QyX25vX3lzIDwtIGZ1bmN0aW9uKGRmMSwgZGYyLCBvbWl0ZWRfeXMsIHQyX3RvdGFsKSB7DQogIG5pID0gZGltKGRmMSlbMV0gKyBkaW0oZGYyKVsxXSAtIDINCiAgdF9ub195cyA9IGNhbGNfdDIoZGYxWy1vbWl0ZWRfeXNdLCBkZjJbLW9taXRlZF95c10pDQogIHJldHVybigoKG5pIC0gbGVuZ3RoKGRmMSkgKyAxKSAvIGxlbmd0aChvbWl0ZWRfeXMpKSAqICh0Ml90b3RhbCAtIHRfbm9feXMpIC8gKG5pICsgdF9ub195cykpDQp9DQoNCmNhbGNfdDJfbm9feXMob2xlLCBjYXIsIGMoMSksIHQyKQ0KY2FsY190Ml9ub195cyhvbGUsIGNhciwgYygyKSwgdDIpDQpjYWxjX3QyX25vX3lzKG9sZSwgY2FyLCBjKDMpLCB0MikNCmNhbGNfdDJfbm9feXMob2xlLCBjYXIsIGMoNCksIHQyKQ0KYGBgDQoNCiMjIyAoZykNCg0K0JTQsCDRgdC1INC/0YDQtdGB0LzQtdGC0LAg0L/RgNC40LTQvtC90LXRgdC+0YIg0L3QsCDQv9C+0YHQu9C10LTQvdC40YLQtSAyINC/0YDQvtC80LXQvdC70LjQstC4INCy0L4g0L7QtNC90L7RgSDQvdCwINC/0YDQstC40YLQtSDQtNCy0LUuDQoNCtCf0YDQuNC60LDQttCw0L3QsCDQtSDQpCDRgdGC0LDRgtC40YHRgtC40LrQsNGC0LA6DQoNCmBgYHtyfQ0KY2FsY190Ml9ub195cyhvbGUsIGNhciwgYygzLCA0KSwgdDIpDQpgYGANCg==