ВЕКТОР - часть 1
- Ключевой объект языка R - вектор
- Вектор и векторизация - краеугольный камень R и ключ к написанию красивого и эффективного кода
- Идеи векторов и векторизации редко встречаются в других языках программирования
- Вектор - самая базовая структура данных в R
- На векторах основаны более сложные структуры (матрица, список, фактор, дата фрейм)
- Векторизация - ключевая концепция языка
Вектор - индексированный набор данных одного типа. Каждый элемент данных имеет свой индекс.
* R не делает различия между скалярными и векторными величинами, т.е. Скаляр - это вектор длины 1.
* Скаляр - всегда описывается одним числом
* Вектор - может описываться несколькими числами (2 и >)
Т.е. есть некий примитивный тип данных - например, целочисленный тип, после этого объявляется вектор, который уже состоит из этих целочисленный типов.
Но есть и целочисленный тип отдельно, например, число 3
Для R число 3 - это вектор. Т.е. если у R спросить, является ли 3 (тройка) вектором (тройка - скаляр), то он скажет, что да, является
is.vector(3)
[1] TRUE
Индексация векторов начинается с единицы (не с нуля, в отличие от того же Python). Для создания вектора можно использовать функцию vector Например:
x <- vector(length = 2)
x[1] <- 3
x[2] <- 26
x
[1] 3 26
Но в R такая запись используется крайне редко Вместо указания каждого элемента в отдельности, есть функция combine:
x <- c(23, 35)
x
[1] 23 35
Функция c (combine) может быть и вложенная, например:
y <- c(x, 1, c(3, 4), 18, 21)
y
[1] 23 35 1 3 4 18 21
Но все-таки функция combine требует перечисления всех элементов вектора. Часто элементы можно записать проще через последовательности
ПОСЛЕДОВАТЕЛЬНОСТИ ЧИСЕЛ (Оператор двуеточие :)
5:0
[1] 5 4 3 2 1 0
Сложные последовательности с произвольным шагом
Например, хочу создать вектор с началом 1, концом 2 и шагом 1/4
Синтаксис
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1))
# 1 - начало, 2 - конец
seq(1, 2, by = 0.25)
[1] 1.00 1.25 1.50 1.75 2.00
Если я заранее не знаю шаг, но знаю сколько элементов должно быть на промежутке, то можно сделать следующую запись:
seq(3, 4, length.out = 5) # где length.out = количество элементов на промежутке, тогда шаг рассчитается автоматически
[1] 3.00 3.25 3.50 3.75 4.00
N.B! В некоторых случаях необязательно указывать имя аргумента целиком для именнованных аргументов, можно просто указать именнованный префикс. Например:
seq(3,4, length = 5) # результат будет такой же, как и в предыдущем примере.
[1] 3.00 3.25 3.50 3.75 4.00
Когда аргументы перечисляются строго в соотвествии с внутренним порядком аргументов функции, то их имена указывать вообще не обязательно, но важно следить за последовательностью. Иначе функция может и сработает, но не так, как мы ожидаем. Аргументы и их последовательность можно всегда посмотреть в справке по функции
Повторение векторов:
Первый аргумент тот, который хотим повторить, затем количество повторений
rep(1:3, times = 3)
[1] 1 2 3 1 2 3 1 2 3
Если я хочу, чтобы каждый элемент вектора повторился несколько раз, то выполняем функцию немного по-другому:
rep(1:3, each = 4)
[1] 1 1 1 1 2 2 2 2 3 3 3 3
Например:
rep(1:3, times = 3)
[1] 1 2 3 1 2 3 1 2 3
rep(1:3, each = 2)
[1] 1 1 2 2 3 3
Как и функции seq, здесь тоже есть аргумент length.out:
rep(1:3, length = 6)
[1] 1 2 3 1 2 3
При этом, если указать длину, не кратную длине повторяемого вектора, то повторится ровно столько элементов вектора, сколько “влазит” в указанную длину
rep(1:3, length = 4)
[1] 1 2 3 1
rep(1:3, length = 5)
[1] 1 2 3 1 2
ТИПЫ ВЕКТОРОВ
Атомарные (atomic) вектора: все элементы одного типа в 1 векторе
6 основных типов векторов:
* logical: True or False
* integer (целые числа)
* numeric/double (числа с плавающей точкой)
* complex (комплексные числа) - есть по умолчанию
* character (строки)
* raw (байтовые последовательности)
Как определить тип вектора?
Функция typeof
y <- c("Дуб - дерево", "Роза - цветок")
typeof(y)
[1] "character"
Функция is.(тип вектора):
is.character(y)
[1] TRUE
is.logical(y)
[1] FALSE
ПРИВЕДЕНИЕ ТИПОВ
- “Естественное приведение” типов по цепочке: logical - integer - double - character
- При чем, если приведение выполняется в процессе программы, то это норма
Т.е. иерархия среди 4 типов векторов от самого “узкого” к самому “широкому” следующая:
1/ logical
2/ integer
3/ double/numeric
4/ character
Например:
b <- c(FALSE, 1.5)
typeof(b)
[1] "double"
b
[1] 0.0 1.5
Т.е. программа никак не предупреждает о том, что в вектор записывается два разных типа элементы. Значение FALSE “естественным” образом привелось к нулю и добавилось к 1.5 -> b получил общий единый тип double
Другой пример:
b <- c(5,b, "abc")
typeof(b)
[1] "character"
Поскольку строка abc самая правая в этой цепочке, самый широкий тип, то весь вектор приводится к типу abc - character. Если мы еще раз посмотрим на b, то увидим:
b
[1] "5" "0" "1.5" "abc"
“Принудительное приведение” типов осуществляется при помощи функции as.* N.B! as.double() = as.numeric()
b <- c(FALSE, 1.5)
b
[1] 0.0 1.5
as.double(b)
[1] 0.0 1.5
Другой пример:
b <- c("Дерево", "Дуб")
as.double(b)
NAs introduced by coercion
[1] NA NA
Пример float в integer
b <- c(1.5, 6.7, 6.9)
as.integer(b)
[1] 1 6 6
У вектора есть тип, и этот тип в каждый момент времени однозначно определен
Но также у вектора есть длина
Параметры вектора: * тип
* длина
При этом в R работа с векторами достаточно гибкая
Длина вектора:
x <- 1:100
length(x)
[1] 100
Длина определяется автоматически, но ее можно принудительно изменить:
length(x) <- 4; x
[1] 1 2 3 4
Т.е. 4 элемента остаются без изменений, а остальные принимают значение по умолчанию, т.е. пропущены
ИМЕНОВАННЫЕ ВЕКТОРА
Элементы вектора могут быть проименованы
- 1й СПОСОБ проименования элементов вектора:
a <- c(uno = 1, dos = 2, "universal answer" = 42, 99)
a
uno dos universal answer
1 2 42 99
При этом непроименнованные элементы будут отображаться корректно
Некоторые имена не могут быть использованы без кавычек, например, начинающиеся с цифры или словосочетания. Чтобы их использовать, нужно заключать их в кавычки, как в примере выше.
Функция names позволяет посмотреть на имена вектора
names(a)
[1] "uno" "dos" "universal answer"
[4] ""
- 2й СПОСОБ именования - переприсвоить вектору names некоторое значение для уже существующей переменной а:
names(a) <- c("one", "two", "forty two", "ninety nine")
a
one two forty two ninety nine
1 2 42 99
Как избавиться от имен в векторе? - присвоить NULL
names(a) <- NULL; a
[1] 1 2 42 99
ВЕКТОРИЗАЦИЯ
1Й аспект - ВЕКТОРНАЯ АРИФМЕТИКА
В R важен негласный принцип “наименьшего удивления”, т.е. мы должны понимать, какой резульат мы ожидаем получить в каждом действии
Арифметические операторы векторизованы (т.е. Применяются поэлементно). ### CЛОЖЕНИЕ
1:3 + c(-1, 2, 0)
[1] 0 4 3
Поэлементное выполнение арифметики верно не только для сложения, но и для всех остальных арифметических действий
1:3 * c(-1, 2, 0)
Верно, в том числе для логических операторов, например & (AND):
c(TRUE, TRUE, TRUE) & c(0, 1, 999)
[1] FALSE TRUE TRUE
При этом не явным образом сработало приведение типов, для численного вектора 0 - превратился в FALSE, все остальное в TRUE
ФУНКЦИОНАЛЬНАЯ ВЕКТОРИЗОВАННОСТЬ R
Многие функции в R имеют встроенную поддержку векторизации.
Например, функция квадратного корня sqrt - векторизована, т.е. как мы и ожидаем действие функции будет применяться поэлементно - в этом суть векторизации функции.
sqrt(a)
[1] 1.000000 1.414214 6.480741 9.949874
Никаких дополнительных действий от нас не требуется
Другая векторизованная функция floor, которая приводит float вниз до ближайшего целого
seq(0, 3, by = 0.25)
[1] 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00
floor(seq(0 ,3, by = 0.25))
[1] 0 0 0 0 1 1 1 1 2 2 2 2 3
Мне не обязательно создавать промежуточные функции, вектор можно вкидывать в функцию на лету
Невекторизованные функции
Для некоторых в этом может большого смысла и нет, но такие есть. Например, функция sum
sum(1:100)
[1] 5050
Т.е. Здесь мы получаем по сути 1 число, хотя применяли функцию к вектору.
N.B! Операция с векторами разной длины
Как оказалось, R ведёт себя достаточно нетривиально при операциях с векторами разной длины. Выравнивание длин происходит по более длинному вектору, а когда короткий вектор заканчивается, он просто зацикливается.
1:3 + 1:6
[1] 2 4 6 5 7 9
Ещё можно представить, что короткий вектор выравнивается с длинным с помощью вызова rep(vec_short, length=size_long)
Eсли длина большего вектора не делится без остатка на длину меньшего, то выскакивает предупреждение.
1:3 + 1:7
longer object length is not a multiple of shorter object length
[1] 2 4 6 5 7 9 8
Предупреждение: длина большего объекта не является произведением длины меньшего объекта
Глоссарий по уроку векторы
LS0tDQp0aXRsZTogItCS0LXQutGC0L7RgNGLIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyDQktCV0JrQotCe0KAgLSDRh9Cw0YHRgtGMIDENCiog0JrQu9GO0YfQtdCy0L7QuSDQvtCx0YrQtdC60YIg0Y/Qt9GL0LrQsCBSIC0gKtCy0LXQutGC0L7RgCogDQoqINCS0LXQutGC0L7RgCDQuCDQstC10LrRgtC+0YDQuNC30LDRhtC40Y8gLSDQutGA0LDQtdGD0LPQvtC70YzQvdGL0Lkg0LrQsNC80LXQvdGMIFIg0Lgg0LrQu9GO0Ycg0Log0L3QsNC/0LjRgdCw0L3QuNGOINC60YDQsNGB0LjQstC+0LPQviDQuCDRjdGE0YTQtdC60YLQuNCy0L3QvtCz0L4g0LrQvtC00LAgIA0KKiDQmNC00LXQuCDQstC10LrRgtC+0YDQvtCyINC4INCy0LXQutGC0L7RgNC40LfQsNGG0LjQuCDRgNC10LTQutC+INCy0YHRgtGA0LXRh9Cw0Y7RgtGB0Y8g0LIg0LTRgNGD0LPQuNGFINGP0LfRi9C60LDRhSDQv9GA0L7Qs9GA0LDQvNC80LjRgNC+0LLQsNC90LjRjyAgDQoqINCS0LXQutGC0L7RgCAtINGB0LDQvNCw0Y8g0LHQsNC30L7QstCw0Y8g0YHRgtGA0YPQutGC0YPRgNCwINC00LDQvdC90YvRhSDQsiBSICANCiog0J3QsCDQstC10LrRgtC+0YDQsNGFINC+0YHQvdC+0LLQsNC90Ysg0LHQvtC70LXQtSDRgdC70L7QttC90YvQtSDRgdGC0YDRg9C60YLRg9GA0YsgKNC80LDRgtGA0LjRhtCwLCDRgdC/0LjRgdC+0LosINGE0LDQutGC0L7RgCwg0LTQsNGC0LAg0YTRgNC10LnQvCkgIA0KKiDQktC10LrRgtC+0YDQuNC30LDRhtC40Y8gLSDQutC70Y7Rh9C10LLQsNGPINC60L7QvdGG0LXQv9GG0LjRjyDRj9C30YvQutCwICANCg0KKirQktC10LrRgtC+0YAqKiAtINC40L3QtNC10LrRgdC40YDQvtCy0LDQvdC90YvQuSDQvdCw0LHQvtGAINC00LDQvdC90YvRhSDQvtC00L3QvtCz0L4g0YLQuNC/0LAuINCa0LDQttC00YvQuSDRjdC70LXQvNC10L3RgiDQtNCw0L3QvdGL0YUg0LjQvNC10LXRgiDRgdCy0L7QuSDQuNC90LTQtdC60YEuICANCiogUiDQvdC1INC00LXQu9Cw0LXRgiDRgNCw0LfQu9C40YfQuNGPINC80LXQttC00YMg0YHQutCw0LvRj9GA0L3Ri9C80Lgg0Lgg0LLQtdC60YLQvtGA0L3Ri9C80Lgg0LLQtdC70LjRh9C40L3QsNC80LgsINGCLtC1LiDQodC60LDQu9GP0YAgLSDRjdGC0L4g0LLQtdC60YLQvtGAINC00LvQuNC90YsgMS4gIA0KKiAq0KHQutCw0LvRj9GAKiAtINCy0YHQtdCz0LTQsCDQvtC/0LjRgdGL0LLQsNC10YLRgdGPINC+0LTQvdC40Lwg0YfQuNGB0LvQvtC8ICANCiogKtCS0LXQutGC0L7RgCogLSDQvNC+0LbQtdGCINC+0L/QuNGB0YvQstCw0YLRjNGB0Y8g0L3QtdGB0LrQvtC70YzQutC40LzQuCDRh9C40YHQu9Cw0LzQuCAoMiDQuCA+KSAgDQogIA0KDQrQoi7QtS4g0LXRgdGC0Ywg0L3QtdC60LjQuSDQv9GA0LjQvNC40YLQuNCy0L3Ri9C5INGC0LjQvyDQtNCw0L3QvdGL0YUgLSDQvdCw0L/RgNC40LzQtdGALCAq0YbQtdC70L7Rh9C40YHQu9C10L3QvdGL0Lkg0YLQuNC/Kiwg0L/QvtGB0LvQtSDRjdGC0L7Qs9C+INC+0LHRitGP0LLQu9GP0LXRgtGB0Y8g0LLQtdC60YLQvtGALCDQutC+0YLQvtGA0YvQuSDRg9C20LUg0YHQvtGB0YLQvtC40YIg0LjQtyDRjdGC0LjRhSDRhtC10LvQvtGH0LjRgdC70LXQvdC90YvQuSDRgtC40L/QvtCyLiAgDQoNCtCd0L4g0LXRgdGC0Ywg0Lgg0YbQtdC70L7Rh9C40YHQu9C10L3QvdGL0Lkg0YLQuNC/INC+0YLQtNC10LvRjNC90L4sINC90LDQv9GA0LjQvNC10YAsINGH0LjRgdC70L4gMyAgDQoNCtCU0LvRjyBSICrRh9C40YHQu9C+IDMgLSDRjdGC0L4g0LLQtdC60YLQvtGAKi4g0KIu0LUuINC10YHQu9C4INGDIFIg0YHQv9GA0L7RgdC40YLRjCwg0Y/QstC70Y/QtdGC0YHRjyDQu9C4IDMgKNGC0YDQvtC50LrQsCkg0LLQtdC60YLQvtGA0L7QvCAo0YLRgNC+0LnQutCwIC0g0YHQutCw0LvRj9GAKSwg0YLQviDQvtC9INGB0LrQsNC20LXRgiwg0YfRgtC+INC00LAsINGP0LLQu9GP0LXRgtGB0Y8NCmBgYHtyfQ0KaXMudmVjdG9yKDMpDQpgYGANCtCY0L3QtNC10LrRgdCw0YbQuNGPINCy0LXQutGC0L7RgNC+0LIg0L3QsNGH0LjQvdCw0LXRgtGB0Y8g0YEg0LXQtNC40L3QuNGG0YsgKNC90LUg0YEg0L3Rg9C70Y8sINCyINC+0YLQu9C40YfQuNC1INC+0YIg0YLQvtCz0L4g0LbQtSBQeXRob24pLiDQlNC70Y8g0YHQvtC30LTQsNC90LjRjyDQstC10LrRgtC+0YDQsCDQvNC+0LbQvdC+INC40YHQv9C+0LvRjNC30L7QstCw0YLRjCDRhNGD0L3QutGG0LjRjiB2ZWN0b3IgDQrQndCw0L/RgNC40LzQtdGAOg0KYGBge3J9DQp4IDwtIHZlY3RvcihsZW5ndGggPSAyKQ0KeFsxXSA8LSAzDQp4WzJdIDwtIDI2DQp4DQojINCi0LDQuiDRjdGC0L4g0L7QsdGL0YfQvdC+INCy0YvQs9C70Y/QtNC40YIg0LIg0YLRgNCw0LTQuNGG0LjQvtC90L3Ri9GFINGP0LfRi9C60LDRhQ0KYGBgDQrQndC+INCyIFIgKtGC0LDQutCw0Y8g0LfQsNC/0LjRgdGMKiDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8gKirQutGA0LDQudC90LUg0YDQtdC00LrQvioqIA0K0JLQvNC10YHRgtC+INGD0LrQsNC30LDQvdC40Y8g0LrQsNC20LTQvtCz0L4g0Y3Qu9C10LzQtdC90YLQsCDQsiDQvtGC0LTQtdC70YzQvdC+0YHRgtC4LCDQtdGB0YLRjCDRhNGD0L3QutGG0LjRjyAqY29tYmluZSo6DQpgYGB7cn0NCnggPC0gYygyMywgMzUpDQp4DQpgYGANCtCk0YPQvdC60YbQuNGPIGMgKGNvbWJpbmUpINC80L7QttC10YIg0LHRi9GC0Ywg0Lgg0LLQu9C+0LbQtdC90L3QsNGPLCDQvdCw0L/RgNC40LzQtdGAOg0KYGBge3J9DQp5IDwtIGMoeCwgMSwgYygzLCA0KSwgMTgsIDIxKQ0KeQ0KYGBgDQrQndC+INCy0YHQtS3RgtCw0LrQuCDRhNGD0L3QutGG0LjRjyBjb21iaW5lINGC0YDQtdCx0YPQtdGCINC/0LXRgNC10YfQuNGB0LvQtdC90LjRjyDQstGB0LXRhSDRjdC70LXQvNC10L3RgtC+0LIg0LLQtdC60YLQvtGA0LAuINCn0LDRgdGC0L4g0Y3Qu9C10LzQtdC90YLRiyDQvNC+0LbQvdC+INC30LDQv9C40YHQsNGC0Ywg0L/RgNC+0YnQtSDRh9C10YDQtdC3INC/0L7RgdC70LXQtNC+0LLQsNGC0LXQu9GM0L3QvtGB0YLQuA0KDQojIyMg0J/QntCh0JvQldCU0J7QktCQ0KLQldCb0KzQndCe0KHQotCYINCn0JjQodCV0JsgKNCe0L/QtdGA0LDRgtC+0YAg0LTQstGD0LXRgtC+0YfQuNC1IDopDQpgYGB7cn0NCjU6MA0KYGBgDQojIyMg0KHQu9C+0LbQvdGL0LUg0L/QvtGB0LvQtdC00L7QstCw0YLQtdC70YzQvdC+0YHRgtC4INGBINC/0YDQvtC40LfQstC+0LvRjNC90YvQvCDRiNCw0LPQvtC8IA0K0J3QsNC/0YDQuNC80LXRgCwg0YXQvtGH0YMg0YHQvtC30LTQsNGC0Ywg0LLQtdC60YLQvtGAINGBINC90LDRh9Cw0LvQvtC8IDEsINC60L7QvdGG0L7QvCAyINC4INGI0LDQs9C+0LwgMS80ICANCirQodC40L3RgtCw0LrRgdC40YEqICANCnNlcShmcm9tID0gMSwgdG8gPSAxLCBieSA9ICgodG8gLSBmcm9tKS8obGVuZ3RoLm91dCAtIDEpKQ0KYGBge3J9DQojIDEgLSDQvdCw0YfQsNC70L4sIDIgLSDQutC+0L3QtdGGDQpzZXEoMSwgMiwgYnkgPSAwLjI1KQ0KYGBgDQrQldGB0LvQuCDRjyDQt9Cw0YDQsNC90LXQtSDQvdC1INC30L3QsNGOINGI0LDQsywg0L3QviDQt9C90LDRjiDRgdC60L7Qu9GM0LrQviDRjdC70LXQvNC10L3RgtC+0LIg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LAg0L/RgNC+0LzQtdC20YPRgtC60LUsINGC0L4g0LzQvtC20L3QviDRgdC00LXQu9Cw0YLRjCDRgdC70LXQtNGD0Y7RidGD0Y4g0LfQsNC/0LjRgdGMOg0KYGBge3J9DQpzZXEoMywgNCwgbGVuZ3RoLm91dCA9IDUpICMg0LPQtNC1IGxlbmd0aC5vdXQgPSDQutC+0LvQuNGH0LXRgdGC0LLQviDRjdC70LXQvNC10L3RgtC+0LIg0L3QsCDQv9GA0L7QvNC10LbRg9GC0LrQtSwg0YLQvtCz0LTQsCDRiNCw0LMg0YDQsNGB0YHRh9C40YLQsNC10YLRgdGPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4DQpgYGANCk4uQiEg0JIg0L3QtdC60L7RgtC+0YDRi9GFINGB0LvRg9GH0LDRj9GFINC90LXQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+INGD0LrQsNC30YvQstCw0YLRjCDQuNC80Y8g0LDRgNCz0YPQvNC10L3RgtCwINGG0LXQu9C40LrQvtC8INC00LvRjyDQuNC80LXQvdC90L7QstCw0L3QvdGL0YUg0LDRgNCz0YPQvNC10L3RgtC+0LIsINC80L7QttC90L4g0L/RgNC+0YHRgtC+INGD0LrQsNC30LDRgtGMINC40LzQtdC90L3QvtCy0LDQvdC90YvQuSDQv9GA0LXRhNC40LrRgS4g0J3QsNC/0YDQuNC80LXRgDoNCmBgYHtyfQ0Kc2VxKDMsNCwgbGVuZ3RoID0gNSkgIyDRgNC10LfRg9C70YzRgtCw0YIg0LHRg9C00LXRgiDRgtCw0LrQvtC5INC20LUsINC60LDQuiDQuCDQsiDQv9GA0LXQtNGL0LTRg9GJ0LXQvCDQv9GA0LjQvNC10YDQtQ0KYGBgDQogINCa0L7Qs9C00LAg0LDRgNCz0YPQvNC10L3RgtGLINC/0LXRgNC10YfQuNGB0LvRj9GO0YLRgdGPINGB0YLRgNC+0LPQviDQsiDRgdC+0L7RgtCy0LXRgdGC0LLQuNC4INGBINCy0L3Rg9GC0YDQtdC90L3QuNC8INC/0L7RgNGP0LTQutC+0Lwg0LDRgNCz0YPQvNC10L3RgtC+0LIg0YTRg9C90LrRhtC40LgsINGC0L4g0LjRhSDQuNC80LXQvdCwINGD0LrQsNC30YvQstCw0YLRjCDQstC+0L7QsdGJ0LUg0L3QtSDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+LCDQvdC+INCy0LDQttC90L4g0YHQu9C10LTQuNGC0Ywg0LfQsCDQv9C+0YHQu9C10LTQvtCy0LDRgtC10LvRjNC90L7RgdGC0YzRji4g0JjQvdCw0YfQtSDRhNGD0L3QutGG0LjRjyDQvNC+0LbQtdGCINC4INGB0YDQsNCx0L7RgtCw0LXRgiwg0L3QviDQvdC1INGC0LDQuiwg0LrQsNC6INC80Ysg0L7QttC40LTQsNC10LwuINCQ0YDQs9GD0LzQtdC90YLRiyDQuCDQuNGFINC/0L7RgdC70LXQtNC+0LLQsNGC0LXQu9GM0L3QvtGB0YLRjCDQvNC+0LbQvdC+INCy0YHQtdCz0LTQsCDQv9C+0YHQvNC+0YLRgNC10YLRjCDQsiDRgdC/0YDQsNCy0LrQtSDQv9C+INGE0YPQvdC60YbQuNC4DQoNCiMjIyDQn9C+0LLRgtC+0YDQtdC90LjQtSDQstC10LrRgtC+0YDQvtCyOg0K0J/QtdGA0LLRi9C5INCw0YDQs9GD0LzQtdC90YIg0YLQvtGCLCDQutC+0YLQvtGA0YvQuSDRhdC+0YLQuNC8INC/0L7QstGC0L7RgNC40YLRjCwg0LfQsNGC0LXQvCDQutC+0LvQuNGH0LXRgdGC0LLQviDQv9C+0LLRgtC+0YDQtdC90LjQuQ0KYGBge3J9DQpyZXAoMTozLCB0aW1lcyA9IDMpDQpgYGANCg0K0JXRgdC70Lgg0Y8g0YXQvtGH0YMsINGH0YLQvtCx0Ysg0LrQsNC20LTRi9C5INGN0LvQtdC80LXQvdGCINCy0LXQutGC0L7RgNCwINC/0L7QstGC0L7RgNC40LvRgdGPINC90LXRgdC60L7Qu9GM0LrQviDRgNCw0LcsINGC0L4g0LLRi9C/0L7Qu9C90Y/QtdC8INGE0YPQvdC60YbQuNGOINC90LXQvNC90L7Qs9C+INC/0L4t0LTRgNGD0LPQvtC80YM6DQpgYGB7cn0NCnJlcCgxOjMsIGVhY2ggPSA0KQ0KYGBgDQoNCtCd0LDQv9GA0LjQvNC10YA6DQpgYGB7cn0NCnJlcCgxOjMsIHRpbWVzID0gMykNCnJlcCgxOjMsIGVhY2ggPSAyKQ0KYGBgDQrQmtCw0Log0Lgg0YTRg9C90LrRhtC40Lggc2VxLCDQt9C00LXRgdGMINGC0L7QttC1INC10YHRgtGMINCw0YDQs9GD0LzQtdC90YIgbGVuZ3RoLm91dDoNCmBgYHtyfQ0KcmVwKDE6MywgbGVuZ3RoID0gNikNCmBgYA0K0J/RgNC4INGN0YLQvtC8LCDQtdGB0LvQuCDRg9C60LDQt9Cw0YLRjCDQtNC70LjQvdGDLCDQvdC1INC60YDQsNGC0L3Rg9GOINC00LvQuNC90LUg0L/QvtCy0YLQvtGA0Y/QtdC80L7Qs9C+INCy0LXQutGC0L7RgNCwLCDRgtC+INC/0L7QstGC0L7RgNC40YLRgdGPINGA0L7QstC90L4g0YHRgtC+0LvRjNC60L4g0Y3Qu9C10LzQtdC90YLQvtCyINCy0LXQutGC0L7RgNCwLCDRgdC60L7Qu9GM0LrQviAqItCy0LvQsNC30LjRgiIqINCyINGD0LrQsNC30LDQvdC90YPRjiDQtNC70LjQvdGDDQpgYGB7cn0NCnJlcCgxOjMsIGxlbmd0aCA9IDQpDQpyZXAoMTozLCBsZW5ndGggPSA1KQ0KYGBgDQojIyDQotCY0J/QqyDQktCV0JrQotCe0KDQntCSDQojIyMg0JDRgtC+0LzQsNGA0L3Ri9C1IChhdG9taWMpINCy0LXQutGC0L7RgNCwOiDQstGB0LUg0Y3Qu9C10LzQtdC90YLRiyDQvtC00L3QvtCz0L4g0YLQuNC/0LAg0LIgMSDQstC10LrRgtC+0YDQtQ0KKio2INC+0YHQvdC+0LLQvdGL0YUg0YLQuNC/0L7QsiDQstC10LrRgtC+0YDQvtCyOioqICANCiogKipsb2dpY2FsKio6IFRydWUgb3IgRmFsc2UgIA0KKiAqKmludGVnZXIqKiAo0YbQtdC70YvQtSDRh9C40YHQu9CwKSAgDQoqICoqbnVtZXJpYy9kb3VibGUqKiAo0YfQuNGB0LvQsCDRgSDQv9C70LDQstCw0Y7RidC10Lkg0YLQvtGH0LrQvtC5KSAgDQoqICoqY29tcGxleCoqICjQutC+0LzQv9C70LXQutGB0L3Ri9C1INGH0LjRgdC70LApIC0g0LXRgdGC0Ywg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4gIA0KKiAqKmNoYXJhY3RlcioqICjRgdGC0YDQvtC60LgpICANCiogKipyYXcqKiAo0LHQsNC50YLQvtCy0YvQtSDQv9C+0YHQu9C10LTQvtCy0LDRgtC10LvRjNC90L7RgdGC0LgpDQoNCiMjIyDQmtCw0Log0L7Qv9GA0LXQtNC10LvQuNGC0Ywg0YLQuNC/INCy0LXQutGC0L7RgNCwPw0K0KTRg9C90LrRhtC40Y8gKnR5cGVvZioNCmBgYHtyfQ0KeSA8LSBjKCLQlNGD0LEgLSDQtNC10YDQtdCy0L4iLCAi0KDQvtC30LAgLSDRhtCy0LXRgtC+0LoiKQ0KdHlwZW9mKHkpDQpgYGANCtCk0YPQvdC60YbQuNGPIGlzLigq0YLQuNC/INCy0LXQutGC0L7RgNCwKik6DQpgYGB7cn0NCmlzLmNoYXJhY3Rlcih5KQ0KaXMubG9naWNhbCh5KQ0KYGBgDQojIyMg0J/QoNCY0JLQldCU0JXQndCY0JUg0KLQmNCf0J7Qkg0KKiDigJzQldGB0YLQtdGB0YLQstC10L3QvdC+0LUg0L/RgNC40LLQtdC00LXQvdC40LXigJ0g0YLQuNC/0L7QsiDQv9C+INGG0LXQv9C+0YfQutC1OiAgbG9naWNhbCAtIGludGVnZXIgLSBkb3VibGUgLSBjaGFyYWN0ZXIgIA0KKiDQn9GA0Lgg0YfQtdC8LCDQtdGB0LvQuCDQv9GA0LjQstC10LTQtdC90LjQtSDQstGL0L/QvtC70L3Rj9C10YLRgdGPINCyINC/0YDQvtGG0LXRgdGB0LUg0L/RgNC+0LPRgNCw0LzQvNGLLCDRgtC+INGN0YLQviDQvdC+0YDQvNCwICANCtCiLtC1LiDQuNC10YDQsNGA0YXQuNGPINGB0YDQtdC00LggNCDRgtC40L/QvtCyINCy0LXQutGC0L7RgNC+0LIg0L7RgiDRgdCw0LzQvtCz0L4g4oCc0YPQt9C60L7Qs9C+4oCdINC6INGB0LDQvNC+0LzRgyDigJzRiNC40YDQvtC60L7QvNGD4oCdINGB0LvQtdC00YPRjtGJ0LDRjzogIA0KMS8gbG9naWNhbCAgDQoyLyBpbnRlZ2VyICANCjMvIGRvdWJsZS9udW1lcmljICANCjQvIGNoYXJhY3RlciANCg0K0J3QsNC/0YDQuNC80LXRgDoNCmBgYHtyfQ0KYiA8LSBjKEZBTFNFLCAxLjUpDQp0eXBlb2YoYikNCmINCmBgYA0K0KIu0LUuINC/0YDQvtCz0YDQsNC80LzQsCDQvdC40LrQsNC6INC90LUg0L/RgNC10LTRg9C/0YDQtdC20LTQsNC10YIg0L4g0YLQvtC8LCDRh9GC0L4g0LIg0LLQtdC60YLQvtGAINC30LDQv9C40YHRi9Cy0LDQtdGC0YHRjyDQtNCy0LAg0YDQsNC30L3Ri9GFINGC0LjQv9CwINGN0LvQtdC80LXQvdGC0YsuINCX0L3QsNGH0LXQvdC40LUgRkFMU0Ug4oCc0LXRgdGC0LXRgdGC0LLQtdC90L3Ri9C84oCdINC+0LHRgNCw0LfQvtC8INC/0YDQuNCy0LXQu9C+0YHRjCDQuiDQvdGD0LvRjiDQuCDQtNC+0LHQsNCy0LjQu9C+0YHRjCDQuiAxLjUgLT4gYiDQv9C+0LvRg9GH0LjQuyDQvtCx0YnQuNC5INC10LTQuNC90YvQuSDRgtC40L8gZG91YmxlIA0KDQrQlNGA0YPQs9C+0Lkg0L/RgNC40LzQtdGAOg0KYGBge3J9DQpiIDwtIGMoNSxiLCAiYWJjIikNCnR5cGVvZihiKQ0KYGBgDQrQn9C+0YHQutC+0LvRjNC60YMg0YHRgtGA0L7QutCwIGFiYyDRgdCw0LzQsNGPINC/0YDQsNCy0LDRjyDQsiDRjdGC0L7QuSDRhtC10L/QvtGH0LrQtSwg0YHQsNC80YvQuSDRiNC40YDQvtC60LjQuSDRgtC40L8sINGC0L4g0LLQtdGB0Ywg0LLQtdC60YLQvtGAINC/0YDQuNCy0L7QtNC40YLRgdGPINC6INGC0LjQv9GDIGFiYyAtIGNoYXJhY3Rlci4g0JXRgdC70Lgg0LzRiyDQtdGJ0LUg0YDQsNC3INC/0L7RgdC80L7RgtGA0LjQvCDQvdCwIGIsINGC0L4g0YPQstC40LTQuNC8Og0KYGBge3J9DQpiDQpgYGANCiMjIyDigJzQn9GA0LjQvdGD0LTQuNGC0LXQu9GM0L3QvtC1INC/0YDQuNCy0LXQtNC10L3QuNC14oCdINGC0LjQv9C+0LIg0L7RgdGD0YnQtdGB0YLQstC70Y/QtdGC0YHRjyDQv9GA0Lgg0L/QvtC80L7RidC4INGE0YPQvdC60YbQuNC4IGFzLioNCk4uQiEgYXMuZG91YmxlKCkgPSBhcy5udW1lcmljKCkNCmBgYHtyfQ0KYiA8LSBjKEZBTFNFLCAxLjUpDQpiDQphcy5kb3VibGUoYikNCmBgYA0K0JTRgNGD0LPQvtC5INC/0YDQuNC80LXRgDoNCmBgYHtyfQ0KYiA8LSBjKCLQlNC10YDQtdCy0L4iLCAi0JTRg9CxIikNCmFzLmRvdWJsZShiKQ0KYGBgDQrQn9GA0LjQvNC10YAgZmxvYXQg0LIgaW50ZWdlcg0KYGBge3J9DQpiIDwtIGMoMS41LCA2LjcsIDYuOSkNCmFzLmludGVnZXIoYikNCmBgYA0KDQrQoyDQstC10LrRgtC+0YDQsCDQtdGB0YLRjCAqKtGC0LjQvyoqLCDQuCDRjdGC0L7RgiDRgtC40L8g0LIg0LrQsNC20LTRi9C5INC80L7QvNC10L3RgiDQstGA0LXQvNC10L3QuCDQvtC00L3QvtC30L3QsNGH0L3QviDQvtC/0YDQtdC00LXQu9C10L0gIA0KICANCiAgDQrQndC+INGC0LDQutC20LUg0YMg0LLQtdC60YLQvtGA0LAg0LXRgdGC0YwgKirQtNC70LjQvdCwKiogIA0KICANCiAgDQoNCioq0J/QsNGA0LDQvNC10YLRgNGLINCy0LXQutGC0L7RgNCwKio6DQoqINGC0LjQvyAgDQoqINC00LvQuNC90LAgICANCtCf0YDQuCDRjdGC0L7QvCDQsiBSINGA0LDQsdC+0YLQsCDRgSDQstC10LrRgtC+0YDQsNC80Lgg0LTQvtGB0YLQsNGC0L7Rh9C90L4g0LPQuNCx0LrQsNGPICANCg0KDQoqKtCU0LvQuNC90LAg0LLQtdC60YLQvtGA0LAqKjoNCmBgYHtyfQ0KeCA8LSAxOjEwMA0KbGVuZ3RoKHgpDQpgYGANCtCU0LvQuNC90LAg0L7Qv9GA0LXQtNC10LvRj9C10YLRgdGPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4LCDQvdC+INC10LUg0LzQvtC20L3QviDQv9GA0LjQvdGD0LTQuNGC0LXQu9GM0L3QviDQuNC30LzQtdC90LjRgtGMOg0KYGBge3J9DQpsZW5ndGgoeCkgPC0gNDsgeA0KYGBgDQrQoi7QtS4gNCDRjdC70LXQvNC10L3RgtCwINC+0YHRgtCw0Y7RgtGB0Y8g0LHQtdC3INC40LfQvNC10L3QtdC90LjQuSwg0LAg0L7RgdGC0LDQu9GM0L3Ri9C1INC/0YDQuNC90LjQvNCw0Y7RgiDQt9C90LDRh9C10L3QuNC1INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLCDRgi7QtS4g0L/RgNC+0L/Rg9GJ0LXQvdGLDQoNCiMg0JjQnNCV0J3QntCS0JDQndCd0KvQlSDQktCV0JrQotCe0KDQkA0K0K3Qu9C10LzQtdC90YLRiyDQstC10LrRgtC+0YDQsCDQvNC+0LPRg9GCINCx0YvRgtGMINC/0YDQvtC40LzQtdC90L7QstCw0L3RiyAgDQogIA0KKiAqKjHQuSDQodCf0J7QodCe0JEg0L/RgNC+0LjQvNC10L3QvtCy0LDQvdC40Y8g0Y3Qu9C10LzQtdC90YLQvtCyINCy0LXQutGC0L7RgNCwKio6DQpgYGB7cn0NCmEgPC0gYyh1bm8gPSAxLCBkb3MgPSAyLCAidW5pdmVyc2FsIGFuc3dlciIgPSA0MiwgOTkpDQphDQpgYGANCtCf0YDQuCDRjdGC0L7QvCDQvdC10L/RgNC+0LjQvNC10L3QvdC+0LLQsNC90L3Ri9C1INGN0LvQtdC80LXQvdGC0Ysg0LHRg9C00YPRgiDQvtGC0L7QsdGA0LDQttCw0YLRjNGB0Y8g0LrQvtGA0YDQtdC60YLQvdC+ICANCiAgDQoNCg0K0J3QtdC60L7RgtC+0YDRi9C1INC40LzQtdC90LAg0L3QtSDQvNC+0LPRg9GCINCx0YvRgtGMINC40YHQv9C+0LvRjNC30L7QstCw0L3RiyDQsdC10Lcg0LrQsNCy0YvRh9C10LosINC90LDQv9GA0LjQvNC10YAsINC90LDRh9C40L3QsNGO0YnQuNC10YHRjyDRgSDRhtC40YTRgNGLINC40LvQuCDRgdC70L7QstC+0YHQvtGH0LXRgtCw0L3QuNGPLiDQp9GC0L7QsdGLINC40YUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMLCDQvdGD0LbQvdC+INC30LDQutC70Y7Rh9Cw0YLRjCDQuNGFINCyINC60LDQstGL0YfQutC4LCDQutCw0Log0LIg0L/RgNC40LzQtdGA0LUg0LLRi9GI0LUuICANCiAgDQogIA0K0KTRg9C90LrRhtC40Y8gbmFtZXMg0L/QvtC30LLQvtC70Y/QtdGCINC/0L7RgdC80L7RgtGA0LXRgtGMINC90LAg0LjQvNC10L3QsCDQstC10LrRgtC+0YDQsA0KYGBge3J9DQpuYW1lcyhhKQ0KYGBgDQoqICoqMtC5INCh0J/QntCh0J7QkSDQuNC80LXQvdC+0LLQsNC90LjRjyAtINC/0LXRgNC10L/RgNC40YHQstC+0LjRgtGMINCy0LXQutGC0L7RgNGDIG5hbWVzINC90LXQutC+0YLQvtGA0L7QtSDQt9C90LDRh9C10L3QuNC1INC00LvRjyDRg9C20LUg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQtdC5INC/0LXRgNC10LzQtdC90L3QvtC5INCwKio6DQpgYGB7cn0NCm5hbWVzKGEpIDwtIGMoIm9uZSIsICJ0d28iLCAiZm9ydHkgdHdvIiwgIm5pbmV0eSBuaW5lIikNCmENCmBgYA0KKirQmtCw0Log0LjQt9Cx0LDQstC40YLRjNGB0Y8g0L7RgiDQuNC80LXQvSDQsiDQstC10LrRgtC+0YDQtT8gLSDQv9GA0LjRgdCy0L7QuNGC0YwgTlVMTCoqDQpgYGB7cn0NCm5hbWVzKGEpIDwtIE5VTEw7IGENCmBgYA0KDQogICANCiAgICAgDQogIA0KICANCiMjICDQktCV0JrQotCe0KDQmNCX0JDQptCY0K8gDQojIyMgMdCZINCw0YHQv9C10LrRgiAtINCS0JXQmtCi0J7QoNCd0JDQryDQkNCg0JjQpNCc0JXQotCY0JrQkA0K0JIgUiDQstCw0LbQtdC9INC90LXQs9C70LDRgdC90YvQuSDQv9GA0LjQvdGG0LjQvyDigJzQvdCw0LjQvNC10L3RjNGI0LXQs9C+INGD0LTQuNCy0LvQtdC90LjRj+KAnSwg0YIu0LUuINC80Ysg0LTQvtC70LbQvdGLINC/0L7QvdC40LzQsNGC0YwsINC60LDQutC+0Lkg0YDQtdC30YPQu9GM0LDRgiDQvNGLINC+0LbQuNC00LDQtdC8INC/0L7Qu9GD0YfQuNGC0Ywg0LIg0LrQsNC20LTQvtC8INC00LXQudGB0YLQstC40LggIA0KICANCiAgDQrQkNGA0LjRhNC80LXRgtC40YfQtdGB0LrQuNC1INC+0L/QtdGA0LDRgtC+0YDRiyDQstC10LrRgtC+0YDQuNC30L7QstCw0L3RiyAo0YIu0LUuINCf0YDQuNC80LXQvdGP0Y7RgtGB0Y8g0L/QvtGN0LvQtdC80LXQvdGC0L3QvikuIA0KIyMjIEPQm9Ce0JbQldCd0JjQlQ0KYGBge3J9DQoxOjMgKyBjKC0xLCAyLCAwKQ0KYGBgDQrQn9C+0Y3Qu9C10LzQtdC90YLQvdC+0LUg0LLRi9C/0L7Qu9C90LXQvdC40LUg0LDRgNC40YTQvNC10YLQuNC60Lgg0LLQtdGA0L3QviDQvdC1INGC0L7Qu9GM0LrQviDQtNC70Y8g0YHQu9C+0LbQtdC90LjRjywg0L3QviDQuCDQtNC70Y8g0LLRgdC10YUg0L7RgdGC0LDQu9GM0L3Ri9GFINCw0YDQuNGE0LzQtdGC0LjRh9C10YHQutC40YUg0LTQtdC50YHRgtCy0LjQuSANCmBgYHtyfQ0KMTozICogYygtMSwgMiwgMCkNCmBgYA0KDQrQktC10YDQvdC+LCDQsiDRgtC+0Lwg0YfQuNGB0LvQtSDQtNC70Y8g0LvQvtCz0LjRh9C10YHQutC40YUg0L7Qv9C10YDQsNGC0L7RgNC+0LIsINC90LDQv9GA0LjQvNC10YAgJiAoQU5EKToNCmBgYHtyfQ0KYyhUUlVFLCBUUlVFLCBUUlVFKSAmIGMoMCwgMSwgOTk5KQ0KYGBgDQrQn9GA0Lgg0Y3RgtC+0Lwg0L3QtSDRj9Cy0L3Ri9C8INC+0LHRgNCw0LfQvtC8INGB0YDQsNCx0L7RgtCw0LvQviDQv9GA0LjQstC10LTQtdC90LjQtSDRgtC40L/QvtCyLCDQtNC70Y8g0YfQuNGB0LvQtdC90L3QvtCz0L4g0LLQtdC60YLQvtGA0LAgMCAtINC/0YDQtdCy0YDQsNGC0LjQu9GB0Y8g0LIgRkFMU0UsINCy0YHQtSDQvtGB0YLQsNC70YzQvdC+0LUg0LIgVFJVRQ0KDQojIyMg0KTQo9Cd0JrQptCY0J7QndCQ0JvQrNCd0JDQryDQktCV0JrQotCe0KDQmNCX0J7QktCQ0J3QndCe0KHQotCsIFINCtCc0L3QvtCz0LjQtSDRhNGD0L3QutGG0LjQuCDQsiBSINC40LzQtdGO0YIg0LLRgdGC0YDQvtC10L3QvdGD0Y4g0L/QvtC00LTQtdGA0LbQutGDINCy0LXQutGC0L7RgNC40LfQsNGG0LjQuC4gIA0KICANCiAgDQrQndCw0L/RgNC40LzQtdGALCDRhNGD0L3QutGG0LjRjyDQutCy0LDQtNGA0LDRgtC90L7Qs9C+INC60L7RgNC90Y8gc3FydCAtINCy0LXQutGC0L7RgNC40LfQvtCy0LDQvdCwLCDRgi7QtS4g0LrQsNC6INC80Ysg0Lgg0L7QttC40LTQsNC10Lwg0LTQtdC50YHRgtCy0LjQtSDRhNGD0L3QutGG0LjQuCDQsdGD0LTQtdGCINC/0YDQuNC80LXQvdGP0YLRjNGB0Y8g0L/QvtGN0LvQtdC80LXQvdGC0L3QviAtINCyINGN0YLQvtC8INGB0YPRgtGMINCy0LXQutGC0L7RgNC40LfQsNGG0LjQuCDRhNGD0L3QutGG0LjQuC4gDQpgYGB7cn0NCnNxcnQoYSkNCmBgYA0K0J3QuNC60LDQutC40YUg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvRhSDQtNC10LnRgdGC0LLQuNC5INC+0YIg0L3QsNGBINC90LUg0YLRgNC10LHRg9C10YLRgdGPICAgDQogIA0K0JTRgNGD0LPQsNGPINCy0LXQutGC0L7RgNC40LfQvtCy0LDQvdC90LDRjyDRhNGD0L3QutGG0LjRjyBmbG9vciwg0LrQvtGC0L7RgNCw0Y8g0L/RgNC40LLQvtC00LjRgiBmbG9hdCDQstC90LjQtyDQtNC+INCx0LvQuNC20LDQudGI0LXQs9C+INGG0LXQu9C+0LPQvg0KYGBge3J9DQpzZXEoMCwgMywgYnkgPSAwLjI1KQ0KZmxvb3Ioc2VxKDAgLDMsIGJ5ID0gMC4yNSkpDQpgYGANCtCc0L3QtSDQvdC1INC+0LHRj9C30LDRgtC10LvRjNC90L4g0YHQvtC30LTQsNCy0LDRgtGMINC/0YDQvtC80LXQttGD0YLQvtGH0L3Ri9C1INGE0YPQvdC60YbQuNC4LCDQstC10LrRgtC+0YAg0LzQvtC20L3QviDQstC60LjQtNGL0LLQsNGC0Ywg0LIg0YTRg9C90LrRhtC40Y4g0L3QsCDQu9C10YLRgw0KDQoNCiMjIyDQndC10LLQtdC60YLQvtGA0LjQt9C+0LLQsNC90L3Ri9C1INGE0YPQvdC60YbQuNC4DQrQlNC70Y8g0L3QtdC60L7RgtC+0YDRi9GFINCyINGN0YLQvtC8INC80L7QttC10YIg0LHQvtC70YzRiNC+0LPQviDRgdC80YvRgdC70LAg0Lgg0L3QtdGCLCDQvdC+INGC0LDQutC40LUg0LXRgdGC0YwuDQrQndCw0L/RgNC40LzQtdGALCDRhNGD0L3QutGG0LjRjyBzdW0NCmBgYHtyfQ0Kc3VtKDE6MTAwKQ0KYGBgDQrQoi7QtS4g0JfQtNC10YHRjCDQvNGLINC/0L7Qu9GD0YfQsNC10Lwg0L/QviDRgdGD0YLQuCAxINGH0LjRgdC70L4sINGF0L7RgtGPINC/0YDQuNC80LXQvdGP0LvQuCDRhNGD0L3QutGG0LjRjiDQuiDQstC10LrRgtC+0YDRgy4NCg0KIyMjIE4uQiEg0J7Qv9C10YDQsNGG0LjRjyDRgSDQstC10LrRgtC+0YDQsNC80Lgg0YDQsNC30L3QvtC5INC00LvQuNC90YsNCtCa0LDQuiDQvtC60LDQt9Cw0LvQvtGB0YwsIFIg0LLQtdC00ZHRgiDRgdC10LHRjyDQtNC+0YHRgtCw0YLQvtGH0L3QviDQvdC10YLRgNC40LLQuNCw0LvRjNC90L4g0L/RgNC4INC+0L/QtdGA0LDRhtC40Y/RhSDRgSDQstC10LrRgtC+0YDQsNC80Lgg0YDQsNC30L3QvtC5INC00LvQuNC90YsuINCS0YvRgNCw0LLQvdC40LLQsNC90LjQtSDQtNC70LjQvSDQv9GA0L7QuNGB0YXQvtC00LjRgiDQv9C+INCx0L7Qu9C10LUg0LTQu9C40L3QvdC+0LzRgyDQstC10LrRgtC+0YDRgywg0LAg0LrQvtCz0LTQsCDQutC+0YDQvtGC0LrQuNC5INCy0LXQutGC0L7RgCDQt9Cw0LrQsNC90YfQuNCy0LDQtdGC0YHRjywg0L7QvSDQv9GA0L7RgdGC0L4g0LfQsNGG0LjQutC70LjQstCw0LXRgtGB0Y8uDQpgYGB7cn0NCjE6MyArIDE6Ng0KYGBgDQrQldGJ0ZEg0LzQvtC20L3QviDQv9GA0LXQtNGB0YLQsNCy0LjRgtGMLCDRh9GC0L4g0LrQvtGA0L7RgtC60LjQuSDQstC10LrRgtC+0YAg0LLRi9GA0LDQstC90LjQstCw0LXRgtGB0Y8g0YEg0LTQu9C40L3QvdGL0Lwg0YEg0L/QvtC80L7RidGM0Y4g0LLRi9C30L7QstCwIHJlcCh2ZWNfc2hvcnQsIGxlbmd0aD1zaXplX2xvbmcpICANCiAgDQogIA0KRdGB0LvQuCDQtNC70LjQvdCwINCx0L7Qu9GM0YjQtdCz0L4g0LLQtdC60YLQvtGA0LAg0L3QtSDQtNC10LvQuNGC0YHRjyDQsdC10Lcg0L7RgdGC0LDRgtC60LAg0L3QsCDQtNC70LjQvdGDINC80LXQvdGM0YjQtdCz0L4sINGC0L4g0LLRi9GB0LrQsNC60LjQstCw0LXRgiDQv9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNC1Lg0KYGBge3J9DQoxOjMgKyAxOjcNCmBgYA0KKirQn9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNC1Kio6INC00LvQuNC90LAg0LHQvtC70YzRiNC10LPQviDQvtCx0YrQtdC60YLQsCDQvdC1INGP0LLQu9GP0LXRgtGB0Y8g0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNC10Lwg0LTQu9C40L3RiyDQvNC10L3RjNGI0LXQs9C+INC+0LHRitC10LrRgtCwDQoNCg0KIyMjINCT0LvQvtGB0YHQsNGA0LjQuSDQv9C+INGD0YDQvtC60YMg0LLQtdC60YLQvtGA0YsNCmBgYHtyfQ0KaGVscCgpDQo/Yw0KPyI6Ig0KDQo/c2VxDQo/cmVwDQoNCj9wcmludA0KP2FsbC5lcXVhbA0KP3R5cGVvZg0KDQo/aXMubG9naWNhbA0KP2FzLmxvZ2ljYWwNCg0KP2xlbmd0aA0KP25hbWVzDQpgYGANCg0KDQo=