Основна робота з R полягає в написанні функцій. Функціями називають іменований програмний код, складений із певного набору змінних, констант, операторів або інших функцій, і призначений для виконання конкретних операцій та завдань. Як правило (але не завжди), функції повертають результат свого виконання у вигляді об’єкта мови R – змінної певного класу: вектору, списку, таблиці тощо.

       За своїм призначенням функції поділяють на характерні групи: арифметичні, символьні, статистичні та ін. Функції можуть бути вбудованими, тобто представленими в базових пакетах мови R з необхідністю додаткового завантаження, і власними – написаними безпосередньо самим користувачем. Деякі найбільш вживані вбудовані функції представлені нижче:

       Виклик функції та опис | Приклад і результат ————- | ————-

abs(x) - модуль величини x | abs(-1)=1 Cell 3 | Cell 4

Створення власних функцій

       Трьома характерними рисами мови R, як мови високого рівня програмування є модульність побудови, орієнтація на об’єкти, і векторизація обчислень. Під модульністю розуміється широке використання груп виразів і функцій. Вирази expr, що складаються з об’єктів даних, викликів функцій і інших операторів мови групуються у фігурних дужках: {expr_1; ...; expr_m}, і значення, яке повертає ця група, є результатом виконання останнього виразу. Оскільки така група є також виразом, то вона може бути, скажімо, включена в круглі дужки і використовуватися, як частина ще більш загального виразу.Наприклад, група команд нижче виконує обрахунок середнього і стандартного відхилень натурального ряду чисел від 1 до 10 і повертає вектор цих значень:

{aver <- mean(1:10);
stdev <- sd(1:10);
c(MEAN=aver, SD=stdev)
}
   MEAN      SD 
5.50000 3.02765 

       Однак якщо цю операцію необхідно виконувати неодноразово для різних наборів початкових даних, то її варто оформити у вигляді функції. Загальний синтаксис оформлення власної функції користувача такий:

function_name <- function(arg1, arg2, ...) {
  statement
  return(object)
}

де function_name – ім’я створюваної функції; argl, arg2, ... – формальні аргументи функції. Оператор return() потрібен у випадках, коли функція проводить обрахунки над заданими аргументами, але не повертає цільового результату.

       Перед першим виконанням, функцію оголошують у поточному скрипті, або завантажують із допомогою команди source() зі скриптового файлу, де вона була попередньо підготовлена. Тоді виклик функції здійснюється в такий спосіб:

function_name(arg1, arg2, ...)

де argl, arg2, ... – фактичні аргументи, пов’язані з формальними параметрами функції або послідовно, або за найменуванням.

       Для представленого вище прикладу можна оформити функцію:

stat_param <- function(x) {
  aver <- mean(x)
  stdev <- sd(x)
  c(MEAN=aver, SD=stdev)
}

і включити її в колекцію власних функцій, розташованих у файлі my_func.R.

       Тоді необхідний нам результат можна отримати, виконавши

source("my_func.R")
stat_param(1:10)

       Компоненти списку аргументів у заголовку функцій є або обов’язковими, або приймають необов’язкові значення. Наприклад, така функція зводить числовий об’єкт x в степінь n, проте якщо степінь не вказана, то автоматично відбувається зведення в куб:

power <- function(x, n=3) {
  x^n
  }

       Аргументами функцій можуть бути об’єкти різного типу, наприклад, назви інших функцій. Так, функція, наведена нижче, виконує довільні перетворення випадкових рівномірно розподілених величин:

my_example <- function(n, func_trans) {
  X <- runif(n)
  abs(func_trans(x))
  }

       Тоді згенерувати 10 прологарифмованих значень можна, якщо записати:

my_example(10, log)
[1] 2.079442 1.791759 1.386294       NA       NA       NA 2.302585

       Розглянемо в якості прикладу функцію оцінки довірчого інтервалу середнього значення для вибірки розміром n з використанням непараметричного бутстрепу. Варто зазначити, що немає усталеного перекладу терміну “bootstrap” з англійської мови на українську. Використовуються різні варіанти: “бутстреп”, “бутстрап”, “розмноження вибірок”, “метод псевдовибірок”, “ресамплінг” (з англ. “resampling”). Незважаючи на складнощі з україномовною назвою, суть методу, тим не менш, досить просто та докладно викладено в оригінальних роботах Б. Ефрона (1979-1988).

       Припустимо, що ми маємо вибірку деякого обмеженого обсягу, і вважаємо цю вибірку репрезентативною (тобто вибірка задовільно відображає властивості генеральної сукупності, з якої вона була взята). Ідея бутстреп-методу полягає в тому, що ми можемо вилучити велику кількість випадкових вибірок із цієї сукупності для обрахунку шуканого параметру (або параметрів). Очевидно, що завдяки випадковому процесу формування цих нових вибірок, буде спостерігатися певна варіація значень оцінюваного параметру. Іншими словами, ми отримаємо деякий розподіл значень цього параметру. Розрахувавши стандартне відхилення розподілу, ми отримаємо оцінку стандартної помилки параметру, яка за великої кількості спостережень асимптотично наближатиметься до істинної стандартної помилки. Аналогічно отримують оцінки границь довірчого інтервалу.

       Отже, будемо генерувати з початкової вибірки множину псевдовибірок того ж розміру, складених із випадкових комбінацій початкового набору елементів. За такої умови використовуємо алгоритм “випадкового вибору з поверненням” (з англ. “random sampling with replacement”), тобто вилучений елемент повертається в початкову сукупність і має шанс бути обраним знову. У результаті деякі члени в кожній окремій псевдовиборці можуть повторюватися двічі або більше разів, водночас інші – бути відсутніми взагалі. Цей алгоритм в R реалізований у функції sample(data, replace=T). Для кожної псевдовибірки ми розрахуємо значення середнього, а в якості границь 95%-ого довірчого інтервалу приймемо 2.5% і 97.5% квантилі бутстреп-розподілу (квантиль – значення, яке задана випадкова величина не перевищує з фіксованою ймовірністю):

boot_np <- function(data, Nboot=5000) {
  boots <- numeric(Nboot) # Порожній вектор для зберігання результатів
  for(i in 1: Nboot) {
    boots[i] <- mean(sample(data, replace=T))
    }
  CI <- quantile(boots, prob=c(0.025,0.975))
  return(c(m=mean(data), CI))
}
x <- c(5, 5, 8, 10, 10, 10, 19, 20, 20, 20, 30, 40, 42, 50, 50)
boot_np(x)
       m     2.5%    97.5% 
22.60000 15.26667 30.80000 

       У прикладі конструкція for() здійснює формування Nboot=5000 значень середніх для генерованих псевдовибірок.

       Проведемо оцінювання вибіркового довірчого інтервалу звичайним параметричним методом на основі процентилей розподілу Стьюдента (процентиль – міра, у якій процентне значення загальних значень дорівнює цій мірі, або менше за неї):

param_CI <- function(data) {
  n = length(data)
  m = mean(data)
  SE = sd(data) / sqrt (n)
  E = qt(.975, df=n - 1) * SE
  CI <- m + c(-E, E)
  return(c(m, CI))
}
param_CI(x)
[1] 22.60000 13.74741 31.45259
LS0tDQp0aXRsZTogItCb0LXQutGG0ZbRjyA2LiDQoNC+0LHQvtGC0LAg0Lcg0YTRg9C90LrRhtGW0Y/QvNC4Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogbm9uZQ0KLS0tDQoNCjxzdHlsZT4NCmJvZHkgew0KdGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQoNCmBgYHtyIHBhdGggYXNzaWdubWVudCwgZWNobyA9ICJGQUxTRSJ9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0Kb3B0aW9ucyhrbml0ci50YWJsZS5mb3JtYXQgPSAiaHRtbCIpDQpgYGANCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQntGB0L3QvtCy0L3QsCDRgNC+0LHQvtGC0LAg0LcgUiDQv9C+0LvRj9Cz0LDRlCDQsiDQvdCw0L/QuNGB0LDQvdC90ZYg0YTRg9C90LrRhtGW0LkuINCk0YPQvdC60YbRltGP0LzQuCDQvdCw0LfQuNCy0LDRjtGC0Ywg0ZbQvNC10L3QvtCy0LDQvdC40Lkg0L/RgNC+0LPRgNCw0LzQvdC40Lkg0LrQvtC0LCDRgdC60LvQsNC00LXQvdC40Lkg0ZbQtyDQv9C10LLQvdC+0LPQviDQvdCw0LHQvtGA0YMg0LfQvNGW0L3QvdC40YUsINC60L7QvdGB0YLQsNC90YIsINC+0L/QtdGA0LDRgtC+0YDRltCyINCw0LHQviDRltC90YjQuNGFINGE0YPQvdC60YbRltC5LCDRliDQv9GA0LjQt9C90LDRh9C10L3QuNC5INC00LvRjyDQstC40LrQvtC90LDQvdC90Y8g0LrQvtC90LrRgNC10YLQvdC40YUg0L7Qv9C10YDQsNGG0ZbQuSDRgtCwINC30LDQstC00LDQvdGMLiDQr9C6INC/0YDQsNCy0LjQu9C+ICjQsNC70LUg0L3QtSDQt9Cw0LLQttC00LgpLCDRhNGD0L3QutGG0ZbRlyDQv9C+0LLQtdGA0YLQsNGO0YLRjCDRgNC10LfRg9C70YzRgtCw0YIg0YHQstC+0LPQviDQstC40LrQvtC90LDQvdC90Y8g0YMg0LLQuNCz0LvRj9C00ZYg0L7QseKAmdGU0LrRgtCwINC80L7QstC4IFIg4oCTINC30LzRltC90L3QvtGXINC/0LXQstC90L7Qs9C+INC60LvQsNGB0YM6INCy0LXQutGC0L7RgNGDLCDRgdC/0LjRgdC60YMsINGC0LDQsdC70LjRhtGWINGC0L7RidC+Lg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCX0LAg0YHQstC+0ZfQvCDQv9GA0LjQt9C90LDRh9C10L3QvdGP0Lwg0YTRg9C90LrRhtGW0Zcg0L/QvtC00ZbQu9GP0Y7RgtGMINC90LAg0YXQsNGA0LDQutGC0LXRgNC90ZYg0LPRgNGD0L/QuDog0LDRgNC40YTQvNC10YLQuNGH0L3Rliwg0YHQuNC80LLQvtC70YzQvdGWLCDRgdGC0LDRgtC40YHRgtC40YfQvdGWINGC0LAg0ZbQvS4g0KTRg9C90LrRhtGW0Zcg0LzQvtC20YPRgtGMINCx0YPRgtC4INCy0LHRg9C00L7QstCw0L3QuNC80LgsINGC0L7QsdGC0L4g0L/RgNC10LTRgdGC0LDQstC70LXQvdC40LzQuCDQsiDQsdCw0LfQvtCy0LjRhSDQv9Cw0LrQtdGC0LDRhSDQvNC+0LLQuCBSINC3INC90LXQvtCx0YXRltC00L3RltGB0YLRjiDQtNC+0LTQsNGC0LrQvtCy0L7Qs9C+INC30LDQstCw0L3RgtCw0LbQtdC90L3Rjywg0ZYg0LLQu9Cw0YHQvdC40LzQuCDigJMg0L3QsNC/0LjRgdCw0L3QuNC80Lgg0LHQtdC30L/QvtGB0LXRgNC10LTQvdGM0L4g0YHQsNC80LjQvCDQutC+0YDQuNGB0YLRg9Cy0LDRh9C10LwuINCU0LXRj9C60ZYg0L3QsNC50LHRltC70YzRiCDQstC20LjQstCw0L3RliDQstCx0YPQtNC+0LLQsNC90ZYg0YTRg9C90LrRhtGW0Zcg0L/RgNC10LTRgdGC0LDQstC70LXQvdGWINC90LjQttGH0LU6DQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0JLQuNC60LvQuNC6INGE0YPQvdC60YbRltGXINGC0LAg0L7Qv9C40YEgfCDQn9GA0LjQutC70LDQtCDRliDRgNC10LfRg9C70YzRgtCw0YINCi0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tDQoNCmBhYnMoeClgIC0g0LzQvtC00YPQu9GMINCy0LXQu9C40YfQuNC90LggeCB8IGBhYnMoLTEpPTFgDQpDZWxsIDMgfCBDZWxsIDQNCg0KIyPQodGC0LLQvtGA0LXQvdC90Y8g0LLQu9Cw0YHQvdC40YUg0YTRg9C90LrRhtGW0LkNCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQotGA0YzQvtC80LAg0YXQsNGA0LDQutGC0LXRgNC90LjQvNC4INGA0LjRgdCw0LzQuCDQvNC+0LLQuCBSLCDRj9C6INC80L7QstC4INCy0LjRgdC+0LrQvtCz0L4g0YDRltCy0L3RjyDQv9GA0L7Qs9GA0LDQvNGD0LLQsNC90L3RjyDRlCDQvNC+0LTRg9C70YzQvdGW0YHRgtGMINC/0L7QsdGD0LTQvtCy0LgsINC+0YDRltGU0L3RgtCw0YbRltGPINC90LAg0L7QseKAmdGU0LrRgtC4LCDRliDQstC10LrRgtC+0YDQuNC30LDRhtGW0Y8g0L7QsdGH0LjRgdC70LXQvdGMLiDQn9GW0LQg0LzQvtC00YPQu9GM0L3RltGB0YLRjiDRgNC+0LfRg9C80ZbRlNGC0YzRgdGPINGI0LjRgNC+0LrQtSDQstC40LrQvtGA0LjRgdGC0LDQvdC90Y8g0LPRgNGD0L8g0LLQuNGA0LDQt9GW0LIg0ZYg0YTRg9C90LrRhtGW0LkuINCS0LjRgNCw0LfQuCBgZXhwcmAsINGJ0L4g0YHQutC70LDQtNCw0Y7RgtGM0YHRjyDQtyDQvtCx4oCZ0ZTQutGC0ZbQsiDQtNCw0L3QuNGFLCDQstC40LrQu9C40LrRltCyINGE0YPQvdC60YbRltC5INGWINGW0L3RiNC40YUg0L7Qv9C10YDQsNGC0L7RgNGW0LIg0LzQvtCy0Lgg0LPRgNGD0L/Rg9GO0YLRjNGB0Y8g0YMg0YTRltCz0YPRgNC90LjRhSDQtNGD0LbQutCw0YU6IGB7ZXhwcl8xOyAuLi47IGV4cHJfbX1gLCDRliDQt9C90LDRh9C10L3QvdGPLCDRj9C60LUg0L/QvtCy0LXRgNGC0LDRlCDRhtGPINCz0YDRg9C/0LAsINGUINGA0LXQt9GD0LvRjNGC0LDRgtC+0Lwg0LLQuNC60L7QvdCw0L3QvdGPINC+0YHRgtCw0L3QvdGM0L7Qs9C+INCy0LjRgNCw0LfRgy4g0J7RgdC60ZbQu9GM0LrQuCDRgtCw0LrQsCDQs9GA0YPQv9CwINGUINGC0LDQutC+0LYg0LLQuNGA0LDQt9C+0LwsINGC0L4g0LLQvtC90LAg0LzQvtC20LUg0LHRg9GC0LgsINGB0LrQsNC20ZbQvNC+LCDQstC60LvRjtGH0LXQvdCwINCyINC60YDRg9Cz0LvRliDQtNGD0LbQutC4INGWINCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuNGB0Y8sINGP0Log0YfQsNGB0YLQuNC90LAg0YnQtSDQsdGW0LvRjNGIINC30LDQs9Cw0LvRjNC90L7Qs9C+INCy0LjRgNCw0LfRgy7QndCw0L/RgNC40LrQu9Cw0LQsINCz0YDRg9C/0LAg0LrQvtC80LDQvdC0INC90LjQttGH0LUg0LLQuNC60L7QvdGD0ZQg0L7QsdGA0LDRhdGD0L3QvtC6INGB0LXRgNC10LTQvdGM0L7Qs9C+INGWINGB0YLQsNC90LTQsNGA0YLQvdC+0LPQviDQstGW0LTRhdC40LvQtdC90Ywg0L3QsNGC0YPRgNCw0LvRjNC90L7Qs9C+INGA0Y/QtNGDINGH0LjRgdC10Lsg0LLRltC0IDEg0LTQviAxMCDRliDQv9C+0LLQtdGA0YLQsNGUINCy0LXQutGC0L7RgCDRhtC40YUg0LfQvdCw0YfQtdC90Yw6DQoNCmBgYHtyfQ0Ke2F2ZXIgPC0gbWVhbigxOjEwKTsNCnN0ZGV2IDwtIHNkKDE6MTApOw0KYyhNRUFOPWF2ZXIsIFNEPXN0ZGV2KQ0KfQ0KYGBgDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0J7QtNC90LDQuiDRj9C60YnQviDRhtGOINC+0L/QtdGA0LDRhtGW0Y4g0L3QtdC+0LHRhdGW0LTQvdC+INCy0LjQutC+0L3Rg9Cy0LDRgtC4INC90LXQvtC00L3QvtGA0LDQt9C+0LLQviDQtNC70Y8g0YDRltC30L3QuNGFINC90LDQsdC+0YDRltCyINC/0L7Rh9Cw0YLQutC+0LLQuNGFINC00LDQvdC40YUsINGC0L4g0ZfRlyDQstCw0YDRgtC+INC+0YTQvtGA0LzQuNGC0Lgg0YMg0LLQuNCz0LvRj9C00ZYg0YTRg9C90LrRhtGW0ZcuINCX0LDQs9Cw0LvRjNC90LjQuSDRgdC40L3RgtCw0LrRgdC40YEg0L7RhNC+0YDQvNC70LXQvdC90Y8g0LLQu9Cw0YHQvdC+0Zcg0YTRg9C90LrRhtGW0Zcg0LrQvtGA0LjRgdGC0YPQstCw0YfQsCDRgtCw0LrQuNC5Og0KDQpgYGB7cn0NCmZ1bmN0aW9uX25hbWUgPC0gZnVuY3Rpb24oYXJnMSwgYXJnMiwgLi4uKSB7DQogIHN0YXRlbWVudA0KICByZXR1cm4ob2JqZWN0KQ0KfQ0KYGBgDQoNCtC00LUgYGZ1bmN0aW9uX25hbWVgIOKAkyDRltC84oCZ0Y8g0YHRgtCy0L7RgNGO0LLQsNC90L7RlyDRhNGD0L3QutGG0ZbRlzsgYGFyZ2wsIGFyZzIsIC4uLmAg4oCTINGE0L7RgNC80LDQu9GM0L3RliDQsNGA0LPRg9C80LXQvdGC0Lgg0YTRg9C90LrRhtGW0ZcuINCe0L/QtdGA0LDRgtC+0YAgYHJldHVybigpYCDQv9C+0YLRgNGW0LHQtdC9INGDINCy0LjQv9Cw0LTQutCw0YUsINC60L7Qu9C4INGE0YPQvdC60YbRltGPINC/0YDQvtCy0L7QtNC40YLRjCDQvtCx0YDQsNGF0YPQvdC60Lgg0L3QsNC0INC30LDQtNCw0L3QuNC80Lgg0LDRgNCz0YPQvNC10L3RgtCw0LzQuCwg0LDQu9C1INC90LUg0L/QvtCy0LXRgNGC0LDRlCDRhtGW0LvRjNC+0LLQvtCz0L4g0YDQtdC30YPQu9GM0YLQsNGC0YMuDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0J/QtdGA0LXQtCDQv9C10YDRiNC40Lwg0LLQuNC60L7QvdCw0L3QvdGP0LwsINGE0YPQvdC60YbRltGOINC+0LPQvtC70L7RiNGD0Y7RgtGMINGDINC/0L7RgtC+0YfQvdC+0LzRgyDRgdC60YDQuNC/0YLRliwg0LDQsdC+INC30LDQstCw0L3RgtCw0LbRg9GO0YLRjCDRltC3INC00L7Qv9C+0LzQvtCz0L7RjiDQutC+0LzQsNC90LTQuCBgc291cmNlKClgINC30ZYg0YHQutGA0LjQv9GC0L7QstC+0LPQviDRhNCw0LnQu9GDLCDQtNC1INCy0L7QvdCwINCx0YPQu9CwINC/0L7Qv9C10YDQtdC00L3RjNC+INC/0ZbQtNCz0L7RgtC+0LLQu9C10L3QsC4g0KLQvtC00ZYg0LLQuNC60LvQuNC6INGE0YPQvdC60YbRltGXINC30LTRltC50YHQvdGO0ZTRgtGM0YHRjyDQsiDRgtCw0LrQuNC5INGB0L/QvtGB0ZbQsToNCg0KYGBge3J9DQpmdW5jdGlvbl9uYW1lKGFyZzEsIGFyZzIsIC4uLikNCmBgYA0KDQrQtNC1IGBhcmdsLCBhcmcyLCAuLi5gIOKAkyDRhNCw0LrRgtC40YfQvdGWINCw0YDQs9GD0LzQtdC90YLQuCwg0L/QvtCy4oCZ0Y/Qt9Cw0L3RliDQtyDRhNC+0YDQvNCw0LvRjNC90LjQvNC4INC/0LDRgNCw0LzQtdGC0YDQsNC80Lgg0YTRg9C90LrRhtGW0Zcg0LDQsdC+INC/0L7RgdC70ZbQtNC+0LLQvdC+LCDQsNCx0L4g0LfQsCDQvdCw0LnQvNC10L3Rg9Cy0LDQvdC90Y/QvC4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQlNC70Y8g0L/RgNC10LTRgdGC0LDQstC70LXQvdC+0LPQviDQstC40YnQtSDQv9GA0LjQutC70LDQtNGDINC80L7QttC90LAg0L7RhNC+0YDQvNC40YLQuCDRhNGD0L3QutGG0ZbRjjoNCg0KYGBge3J9DQpzdGF0X3BhcmFtIDwtIGZ1bmN0aW9uKHgpIHsNCiAgYXZlciA8LSBtZWFuKHgpDQogIHN0ZGV2IDwtIHNkKHgpDQogIGMoTUVBTj1hdmVyLCBTRD1zdGRldikNCn0NCmBgYA0KDQrRliDQstC60LvRjtGH0LjRgtC4INGX0Zcg0LIg0LrQvtC70LXQutGG0ZbRjiDQstC70LDRgdC90LjRhSDRhNGD0L3QutGG0ZbQuSwg0YDQvtC30YLQsNGI0L7QstCw0L3QuNGFINGDINGE0LDQudC70ZYgYG15X2Z1bmMuUmAuDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0KLQvtC00ZYg0L3QtdC+0LHRhdGW0LTQvdC40Lkg0L3QsNC8INGA0LXQt9GD0LvRjNGC0LDRgiDQvNC+0LbQvdCwINC+0YLRgNC40LzQsNGC0LgsINCy0LjQutC+0L3QsNCy0YjQuA0KDQpgYGB7cn0NCnNvdXJjZSgibXlfZnVuYy5SIikNCnN0YXRfcGFyYW0oMToxMCkNCmBgYA0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCa0L7QvNC/0L7QvdC10L3RgtC4INGB0L/QuNGB0LrRgyDQsNGA0LPRg9C80LXQvdGC0ZbQsiDRgyDQt9Cw0LPQvtC70L7QstC60YMg0YTRg9C90LrRhtGW0Lkg0ZQg0LDQsdC+INC+0LHQvtCy4oCZ0Y/Qt9C60L7QstC40LzQuCwg0LDQsdC+INC/0YDQuNC50LzQsNGO0YLRjCDQvdC10L7QsdC+0LLigJnRj9C30LrQvtCy0ZYg0LfQvdCw0YfQtdC90L3Rjy4g0J3QsNC/0YDQuNC60LvQsNC0LCDRgtCw0LrQsCDRhNGD0L3QutGG0ZbRjyDQt9Cy0L7QtNC40YLRjCDRh9C40YHQu9C+0LLQuNC5INC+0LHigJnRlNC60YIgYHhgINCyINGB0YLQtdC/0ZbQvdGMIGBuYCwg0L/RgNC+0YLQtSDRj9C60YnQviDRgdGC0LXQv9GW0L3RjCDQvdC1INCy0LrQsNC30LDQvdCwLCDRgtC+INCw0LLRgtC+0LzQsNGC0LjRh9C90L4g0LLRltC00LHRg9Cy0LDRlNGC0YzRgdGPINC30LLQtdC00LXQvdC90Y8g0LIg0LrRg9CxOg0KDQpgYGB7cn0NCnBvd2VyIDwtIGZ1bmN0aW9uKHgsIG49Mykgew0KICB4Xm4NCiAgfQ0KYGBgDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0JDRgNCz0YPQvNC10L3RgtCw0LzQuCDRhNGD0L3QutGG0ZbQuSDQvNC+0LbRg9GC0Ywg0LHRg9GC0Lgg0L7QseKAmdGU0LrRgtC4INGA0ZbQt9C90L7Qs9C+INGC0LjQv9GDLCDQvdCw0L/RgNC40LrQu9Cw0LQsINC90LDQt9Cy0Lgg0ZbQvdGI0LjRhSDRhNGD0L3QutGG0ZbQuS4g0KLQsNC6LCDRhNGD0L3QutGG0ZbRjywg0L3QsNCy0LXQtNC10L3QsCDQvdC40LbRh9C1LCDQstC40LrQvtC90YPRlCDQtNC+0LLRltC70YzQvdGWINC/0LXRgNC10YLQstC+0YDQtdC90L3RjyDQstC40L/QsNC00LrQvtCy0LjRhSDRgNGW0LLQvdC+0LzRltGA0L3QviDRgNC+0LfQv9C+0LTRltC70LXQvdC40YUg0LLQtdC70LjRh9C40L06DQoNCmBgYHtyfQ0KbXlfZXhhbXBsZSA8LSBmdW5jdGlvbihuLCBmdW5jX3RyYW5zKSB7DQogIFggPC0gcnVuaWYobikNCiAgYWJzKGZ1bmNfdHJhbnMoeCkpDQogIH0NCmBgYA0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCi0L7QtNGWINC30LPQtdC90LXRgNGD0LLQsNGC0LggMTAg0L/RgNC+0LvQvtCz0LDRgNC40YTQvNC+0LLQsNC90LjRhSDQt9C90LDRh9C10L3RjCDQvNC+0LbQvdCwLCDRj9C60YnQviDQt9Cw0L/QuNGB0LDRgtC4Og0KDQpgYGB7cn0NCm15X2V4YW1wbGUoMTAsIGxvZykNCmBgYA0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCg0L7Qt9Cz0LvRj9C90LXQvNC+INCyINGP0LrQvtGB0YLRliDQv9GA0LjQutC70LDQtNGDINGE0YPQvdC60YbRltGOINC+0YbRltC90LrQuCDQtNC+0LLRltGA0YfQvtCz0L4g0ZbQvdGC0LXRgNCy0LDQu9GDINGB0LXRgNC10LTQvdGM0L7Qs9C+INC30L3QsNGH0LXQvdC90Y8g0LTQu9GPINCy0LjQsdGW0YDQutC4INGA0L7Qt9C80ZbRgNC+0LwgKm4qINC3INCy0LjQutC+0YDQuNGB0YLQsNC90L3Rj9C8INC90LXQv9Cw0YDQsNC80LXRgtGA0LjRh9C90L7Qs9C+INCx0YPRgtGB0YLRgNC10L/Rgy4g0JLQsNGA0YLQviDQt9Cw0LfQvdCw0YfQuNGC0LgsINGJ0L4g0L3QtdC80LDRlCDRg9GB0YLQsNC70LXQvdC+0LPQviDQv9C10YDQtdC60LvQsNC00YMg0YLQtdGA0LzRltC90YMgKiJib290c3RyYXAiKiDQtyDQsNC90LPQu9GW0LnRgdGM0LrQvtGXINC80L7QstC4INC90LAg0YPQutGA0LDRl9C90YHRjNC60YMuINCS0LjQutC+0YDQuNGB0YLQvtCy0YPRjtGC0YzRgdGPINGA0ZbQt9C90ZYg0LLQsNGA0ZbQsNC90YLQuDogItCx0YPRgtGB0YLRgNC10L8iLCAi0LHRg9GC0YHRgtGA0LDQvyIsICLRgNC+0LfQvNC90L7QttC10L3QvdGPINCy0LjQsdGW0YDQvtC6IiwgItC80LXRgtC+0LQg0L/RgdC10LLQtNC+0LLQuNCx0ZbRgNC+0LoiLCAi0YDQtdGB0LDQvNC/0LvRltC90LMiICjQtyDQsNC90LPQuy4gKiJyZXNhbXBsaW5nIiopLiDQndC10LfQstCw0LbQsNGO0YfQuCDQvdCwINGB0LrQu9Cw0LTQvdC+0YnRliDQtyDRg9C60YDQsNGX0L3QvtC80L7QstC90L7RjiDQvdCw0LfQstC+0Y4sINGB0YPRgtGMINC80LXRgtC+0LTRgywg0YLQuNC8INC90LUg0LzQtdC90YgsINC00L7RgdC40YLRjCDQv9GA0L7RgdGC0L4g0YLQsCDQtNC+0LrQu9Cw0LTQvdC+INCy0LjQutC70LDQtNC10L3QviDQsiDQvtGA0LjQs9GW0L3QsNC70YzQvdC40YUg0YDQvtCx0L7RgtCw0YUg0JEuINCV0YTRgNC+0L3QsCAoMTk3OS0xOTg4KS4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQn9GA0LjQv9GD0YHRgtC40LzQviwg0YnQviDQvNC4INC80LDRlNC80L4g0LLQuNCx0ZbRgNC60YMg0LTQtdGP0LrQvtCz0L4g0L7QsdC80LXQttC10L3QvtCz0L4g0L7QsdGB0Y/Qs9GDLCDRliDQstCy0LDQttCw0ZTQvNC+INGG0Y4g0LLQuNCx0ZbRgNC60YMg0YDQtdC/0YDQtdC30LXQvdGC0LDRgtC40LLQvdC+0Y4gKNGC0L7QsdGC0L4g0LLQuNCx0ZbRgNC60LAg0LfQsNC00L7QstGW0LvRjNC90L4g0LLRltC00L7QsdGA0LDQttCw0ZQg0LLQu9Cw0YHRgtC40LLQvtGB0YLRliDQs9C10L3QtdGA0LDQu9GM0L3QvtGXINGB0YPQutGD0L/QvdC+0YHRgtGWLCDQtyDRj9C60L7RlyDQstC+0L3QsCDQsdGD0LvQsCDQstC30Y/RgtCwKS4g0IbQtNC10Y8g0LHRg9GC0YHRgtGA0LXQvy3QvNC10YLQvtC00YMg0L/QvtC70Y/Qs9Cw0ZQg0LIg0YLQvtC80YMsINGJ0L4g0LzQuCDQvNC+0LbQtdC80L4g0LLQuNC70YPRh9C40YLQuCDQstC10LvQuNC60YMg0LrRltC70YzQutGW0YHRgtGMINCy0LjQv9Cw0LTQutC+0LLQuNGFINCy0LjQsdGW0YDQvtC6INGW0Lcg0YbRltGU0Zcg0YHRg9C60YPQv9C90L7RgdGC0ZYg0LTQu9GPINC+0LHRgNCw0YXRg9C90LrRgyDRiNGD0LrQsNC90L7Qs9C+INC/0LDRgNCw0LzQtdGC0YDRgyAo0LDQsdC+INC/0LDRgNCw0LzQtdGC0YDRltCyKS4g0J7Rh9C10LLQuNC00L3Qviwg0YnQviDQt9Cw0LLQtNGP0LrQuCDQstC40L/QsNC00LrQvtCy0L7QvNGDINC/0YDQvtGG0LXRgdGDINGE0L7RgNC80YPQstCw0L3QvdGPINGG0LjRhSDQvdC+0LLQuNGFINCy0LjQsdGW0YDQvtC6LCDQsdGD0LTQtSDRgdC/0L7RgdGC0LXRgNGW0LPQsNGC0LjRgdGPINC/0LXQstC90LAg0LLQsNGA0ZbQsNGG0ZbRjyDQt9C90LDRh9C10L3RjCDQvtGG0ZbQvdGO0LLQsNC90L7Qs9C+INC/0LDRgNCw0LzQtdGC0YDRgy4g0IbQvdGI0LjQvNC4INGB0LvQvtCy0LDQvNC4LCDQvNC4INC+0YLRgNC40LzQsNGU0LzQviDQtNC10Y/QutC40Lkg0YDQvtC30L/QvtC00ZbQuyDQt9C90LDRh9C10L3RjCDRhtGM0L7Qs9C+INC/0LDRgNCw0LzQtdGC0YDRgy4g0KDQvtC30YDQsNGF0YPQstCw0LLRiNC4INGB0YLQsNC90LTQsNGA0YLQvdC1INCy0ZbQtNGF0LjQu9C10L3QvdGPINGA0L7Qt9C/0L7QtNGW0LvRgywg0LzQuCDQvtGC0YDQuNC80LDRlNC80L4g0L7RhtGW0L3QutGDINGB0YLQsNC90LTQsNGA0YLQvdC+0Zcg0L/QvtC80LjQu9C60Lgg0L/QsNGA0LDQvNC10YLRgNGDLCDRj9C60LAg0LfQsCDQstC10LvQuNC60L7RlyDQutGW0LvRjNC60L7RgdGC0ZYg0YHQv9C+0YHRgtC10YDQtdC20LXQvdGMINCw0YHQuNC80L/RgtC+0YLQuNGH0L3QviDQvdCw0LHQu9C40LbQsNGC0LjQvNC10YLRjNGB0Y8g0LTQviDRltGB0YLQuNC90L3QvtGXINGB0YLQsNC90LTQsNGA0YLQvdC+0Zcg0L/QvtC80LjQu9C60LguINCQ0L3QsNC70L7Qs9GW0YfQvdC+INC+0YLRgNC40LzRg9GO0YLRjCDQvtGG0ZbQvdC60Lgg0LPRgNCw0L3QuNGG0Ywg0LTQvtCy0ZbRgNGH0L7Qs9C+INGW0L3RgtC10YDQstCw0LvRgy4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQntGC0LbQtSwg0LHRg9C00LXQvNC+INCz0LXQvdC10YDRg9Cy0LDRgtC4INC3INC/0L7Rh9Cw0YLQutC+0LLQvtGXINCy0LjQsdGW0YDQutC4INC80L3QvtC20LjQvdGDINC/0YHQtdCy0LTQvtCy0LjQsdGW0YDQvtC6INGC0L7Qs9C+INC2INGA0L7Qt9C80ZbRgNGDLCDRgdC60LvQsNC00LXQvdC40YUg0ZbQtyDQstC40L/QsNC00LrQvtCy0LjRhSDQutC+0LzQsdGW0L3QsNGG0ZbQuSDQv9C+0YfQsNGC0LrQvtCy0L7Qs9C+INC90LDQsdC+0YDRgyDQtdC70LXQvNC10L3RgtGW0LIuINCX0LAg0YLQsNC60L7RlyDRg9C80L7QstC4INCy0LjQutC+0YDQuNGB0YLQvtCy0YPRlNC80L4g0LDQu9Cz0L7RgNC40YLQvCAi0LLQuNC/0LDQtNC60L7QstC+0LPQviDQstC40LHQvtGA0YMg0Lcg0L/QvtCy0LXRgNC90LXQvdC90Y/QvCIgKNC3INCw0L3Qs9C7LiAq4oCccmFuZG9tIHNhbXBsaW5nIHdpdGggcmVwbGFjZW1lbnTigJ0qKSwg0YLQvtCx0YLQviDQstC40LvRg9GH0LXQvdC40Lkg0LXQu9C10LzQtdC90YIg0L/QvtCy0LXRgNGC0LDRlNGC0YzRgdGPINCyINC/0L7Rh9Cw0YLQutC+0LLRgyDRgdGD0LrRg9C/0L3RltGB0YLRjCDRliDQvNCw0ZQg0YjQsNC90YEg0LHRg9GC0Lgg0L7QsdGA0LDQvdC40Lwg0LfQvdC+0LLRgy4g0KMg0YDQtdC30YPQu9GM0YLQsNGC0ZYg0LTQtdGP0LrRliDRh9C70LXQvdC4INCyINC60L7QttC90ZbQuSDQvtC60YDQtdC80ZbQuSDQv9GB0LXQstC00L7QstC40LHQvtGA0YbRliDQvNC+0LbRg9GC0Ywg0L/QvtCy0YLQvtGA0Y7QstCw0YLQuNGB0Y8g0LTQstGW0YfRliDQsNCx0L4g0LHRltC70YzRiNC1INGA0LDQt9GW0LIsINCy0L7QtNC90L7Rh9Cw0YEg0ZbQvdGI0ZYg4oCTINCx0YPRgtC4INCy0ZbQtNGB0YPRgtC90ZbQvNC4INCy0LfQsNCz0LDQu9GWLiDQptC10Lkg0LDQu9Cz0L7RgNC40YLQvCDQsiBSINGA0LXQsNC70ZbQt9C+0LLQsNC90LjQuSDRgyDRhNGD0L3QutGG0ZbRlyBgc2FtcGxlKGRhdGEsIHJlcGxhY2U9VClgLiDQlNC70Y8g0LrQvtC20L3QvtGXINC/0YHQtdCy0LTQvtCy0LjQsdGW0YDQutC4INC80Lgg0YDQvtC30YDQsNGF0YPRlNC80L4g0LfQvdCw0YfQtdC90L3RjyDRgdC10YDQtdC00L3RjNC+0LPQviwg0LAg0LIg0Y/QutC+0YHRgtGWINCz0YDQsNC90LjRhtGMIDk1JS3QvtCz0L4g0LTQvtCy0ZbRgNGH0L7Qs9C+INGW0L3RgtC10YDQstCw0LvRgyDQv9GA0LjQudC80LXQvNC+IDIuNSUg0ZYgOTcuNSUg0LrQstCw0L3RgtC40LvRliDQsdGD0YLRgdGC0YDQtdC/LdGA0L7Qt9C/0L7QtNGW0LvRgyAo0LrQstCw0L3RgtC40LvRjCDigJMg0LfQvdCw0YfQtdC90L3Rjywg0Y/QutC1INC30LDQtNCw0L3QsCDQstC40L/QsNC00LrQvtCy0LAg0LLQtdC70LjRh9C40L3QsCDQvdC1INC/0LXRgNC10LLQuNGJ0YPRlCDQtyDRhNGW0LrRgdC+0LLQsNC90L7RjiDQudC80L7QstGW0YDQvdGW0YHRgtGOKToNCg0KYGBge3J9DQpib290X25wIDwtIGZ1bmN0aW9uKGRhdGEsIE5ib290PTUwMDApIHsNCiAgYm9vdHMgPC0gbnVtZXJpYyhOYm9vdCkgIyDQn9C+0YDQvtC20L3RltC5INCy0LXQutGC0L7RgCDQtNC70Y8g0LfQsdC10YDRltCz0LDQvdC90Y8g0YDQtdC30YPQu9GM0YLQsNGC0ZbQsg0KICBmb3IoaSBpbiAxOiBOYm9vdCkgew0KICAgIGJvb3RzW2ldIDwtIG1lYW4oc2FtcGxlKGRhdGEsIHJlcGxhY2U9VCkpDQogICAgfQ0KICBDSSA8LSBxdWFudGlsZShib290cywgcHJvYj1jKDAuMDI1LDAuOTc1KSkNCiAgcmV0dXJuKGMobT1tZWFuKGRhdGEpLCBDSSkpDQp9DQoNCnggPC0gYyg1LCA1LCA4LCAxMCwgMTAsIDEwLCAxOSwgMjAsIDIwLCAyMCwgMzAsIDQwLCA0MiwgNTAsIDUwKQ0KYm9vdF9ucCh4KQ0KDQpgYGANCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQoyDQv9GA0LjQutC70LDQtNGWINC60L7QvdGB0YLRgNGD0LrRhtGW0Y8gYGZvcigpYCDQt9C00ZbQudGB0L3RjtGUINGE0L7RgNC80YPQstCw0L3QvdGPIGBOYm9vdD01MDAwYCDQt9C90LDRh9C10L3RjCDRgdC10YDQtdC00L3RltGFINC00LvRjyDQs9C10L3QtdGA0L7QstCw0L3QuNGFINC/0YHQtdCy0LTQvtCy0LjQsdGW0YDQvtC6Lg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCf0YDQvtCy0LXQtNC10LzQviDQvtGG0ZbQvdGO0LLQsNC90L3RjyDQstC40LHRltGA0LrQvtCy0L7Qs9C+INC00L7QstGW0YDRh9C+0LPQviDRltC90YLQtdGA0LLQsNC70YMg0LfQstC40YfQsNC50L3QuNC8INC/0LDRgNCw0LzQtdGC0YDQuNGH0L3QuNC8INC80LXRgtC+0LTQvtC8INC90LAg0L7RgdC90L7QstGWINC/0YDQvtGG0LXQvdGC0LjQu9C10Lkg0YDQvtC30L/QvtC00ZbQu9GDINCh0YLRjNGO0LTQtdC90YLQsCAo0L/RgNC+0YbQtdC90YLQuNC70Ywg4oCTINC80ZbRgNCwLCDRgyDRj9C60ZbQuSDQv9GA0L7RhtC10L3RgtC90LUg0LfQvdCw0YfQtdC90L3RjyDQt9Cw0LPQsNC70YzQvdC40YUg0LfQvdCw0YfQtdC90Ywg0LTQvtGA0ZbQstC90Y7RlCDRhtGW0Lkg0LzRltGA0ZYsINCw0LHQviDQvNC10L3RiNC1INC30LAg0L3QtdGXKToNCg0KYGBge3J9DQpwYXJhbV9DSSA8LSBmdW5jdGlvbihkYXRhKSB7DQogIG4gPSBsZW5ndGgoZGF0YSkNCiAgbSA9IG1lYW4oZGF0YSkNCiAgU0UgPSBzZChkYXRhKSAvIHNxcnQgKG4pDQogIEUgPSBxdCguOTc1LCBkZj1uIC0gMSkgKiBTRQ0KICBDSSA8LSBtICsgYygtRSwgRSkNCiAgcmV0dXJuKGMobSwgQ0kpKQ0KfQ0KDQpwYXJhbV9DSSh4KQ0KYGBgDQoNCg0K