Vector Element Names
The elements of a vector can optionally be given names. For example,
say we have a 50-element vector showing the population of each state in
the United States. We could name each element according to its state
name, such as “Montana” and “New Jersey”. This in turn might lead to
naming points in plots, and so on.
names(x)
NULL
MY EXERCISE 1
Since there is no columns header the output of names(x) is NULL
names(x1)
NULL
Creating the column names (headers)
names(x1) <- c("Gustav","Marian","Joseph")
names(x1)
[1] "Gustav" "Marian" "Joseph"
Finally the output of x1 is a matrix of 2 rows and 3 columns, in
which first row values are the headers.
x1
Gustav Marian Joseph
3 7 12
It is possible to delete the column headers using NULL.
names(x1) <- NULL
x1
[1] 3 7 12
In order to see which is the value of a variable (Marian in this
case), is possible to reference elements of the vector by the name.
x1 <- c(3,7,12)
names(x1) <- c("Gustav","Marian","Joseph")
x1["Marian"]
Marian
7
EXAMPLE EXERCISE 1
We can assign or query vector element names via the names()
function:
names(x)
[1] "a" "b" "ab"
x
a b ab
1 2 4
We can remove the names from a vector by assigning NULL:
x
[1] 1 2 4
We can even reference elements of the vector by name:
x["b"]
b
2
MATRICES AND ARRAYS
A matrix is a vector with two additional attributes: the number of
rows and the number of columns. Since matrices are vectors, they also
have modes, such as numeric and character.
Creating Matrices
y<-matrix(c(1,2,3,4),nrow=2,ncol=2)
y
[,1] [,2]
[1,] 1 3
[2,] 2 4
MY EXERCISE 2 (MATRIX)
#Please create a matrix y1 and follow the steps below
y1 <- matrix(c(3,27,8,15),nrow=2, ncol=2)
y1
[,1] [,2]
[1,] 3 8
[2,] 27 15
It is not necessary to to specify ncol and nrow, just ncol or nrow.
Since there 4 elements and 2 row, with 2 columns should be enough.
y1
[,1] [,2]
[1,] 3 8
[2,] 27 15
As could be seen in the output above, the notation for columns is
[,x] and for rows [x,]. So in this example it is selected the column
1.
y1[,1]
[1] 3 27
A matrix could be created without values and them introduce the
values. In this example the structure of a 2x2 matrix is created
y1
[,1] [,2]
[1,] NA NA
[2,] NA NA
Then values are introduced
y1[1,1] <- 3
y1[2,1] <- 27
y1[1,2] <- 8
y1[2,2] <- 15
y1
[,1] [,2]
[1,] 3 8
[2,] 27 15
EXAMPLE EXERCISE 2 (MATRIX)
Since we specified the matrix entries in the preceding example, and
there were four of them, we did not need to specify both ncol and nrow;
just nrow or ncol would have been enough. Having four elements in all,
in two rows, implies two columns:
y <- matrix(c(1,2,3,4),nrow=2)
y
[,1] [,2]
[1,] 1 3
[2,] 2 4
Note that when we then print out y, R shows us its notation for rows
and columns. For instance, [,2] means the entirety of column 2, as can
be seen in this check:
y[,2]
[1] 3 4
Another way to build y is to specify elements individually:
y
[,1] [,2]
[1,] NA NA
[2,] NA NA
y
[,1] [,2]
[1,] 1 3
[2,] 2 4
Note that we do need to warn R ahead of time that y will be a matrix
and give the number of rows and columns.
Though internal storage of a matrix is in column-major order, you can
set the byrow argument in matrix() to true to indicate that the data is
coming in row-major order. Here’s an example of using byrow:
m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
MY EXERCISE 3 (MATRIX_2)
Using byrow the data is coming in row-major order. In this example
for 2 rows the output has 3 columns, for 3 rows 2 columns and for 6 rows
1 column.
m
[,1] [,2] [,3]
[1,] 3 6 7
[2,] 4 5 13
EXAMPLE EXERCISE 3 (MATRIX_2)
General Matrix Operations
Performing Linear Algebra Operations on Matrices
You can perform various linear algebra operations on matrices, such
as matrix multiplication, matrix scalar multiplication, and matrix
addition. Using y from the preceding example, here is how to perform
those three operations:
y %*% y # mathematical matrix multiplication
3*y # mathematical multiplication of matrix by scalar
y+y # mathematical matrix addition
MY EXERCISE 3 (MATRIX_2)
#Perform the operations shown above using y1
General Matrix Operations Performing linear algebra
operations on matrices Using the created matrix y1.
y1 %*% y1 # matrix y1 times matrix y1. Matrix y1 multiplicated by itself.
[,1] [,2]
[1,] 225 144
[2,] 486 441
4*y1 # Multiplication of a escalar number times a matrix.
[,1] [,2]
[1,] 12 32
[2,] 108 60
y1 + y1 #Sum of matrix.
[,1] [,2]
[1,] 6 16
[2,] 54 30
EXAMPLE EXERCISE 4 (MATRIX_3)
Matrix Indexing
Let us say that we have a matrix z:
z <- matrix(nrow=4,ncol=3)
z[1,1] <- 1
z[2,1] <- 2
z[1,2] <- 1
z[2,2] <- 1
z[3,1] <- 3
z[3,2] <- 0
z[3,3] <- 1
z[1,3] <- 1
z[2,3] <- 0
z[4,1] <- 4
z[4,2] <- 0
z[4,3] <- 0
z
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 0 1
[4,] 4 0 0
Let us obtain the submatrix of z consisting of all elements with
column numbers 2 and 3 and any row number. This extracts the second and
third columns.
z[,2:3]
[,1] [,2]
[1,] 1 1
[2,] 1 0
[3,] 0 1
[4,] 0 0
Let us now extract rows instead of columns.
z[3:4,]
[,1] [,2] [,3]
[1,] 3 0 1
[2,] 4 0 0
y
y[2:1,]
MY EXERCISE 4 (MATRIX_3)
#Create amatrix z1 and recreate a similar case scenario.
z1 <- matrix(nrow=4,ncol=3)
z1[1,1] <- 3
z1[2,1] <- 0
z1[1,2] <- 1
z1[2,2] <- 2
z1[3,1] <- 2
z1[3,2] <- 1
z1[3,3] <- 0
z1[1,3] <- 0
z1[2,3] <- 3
z1[4,1] <- 2
z1[4,2] <- 4
z1[4,3] <- 0
Lets output matrix z1
z1
[,1] [,2] [,3]
[1,] 3 1 0
[2,] 0 2 3
[3,] 2 1 0
[4,] 2 4 0
In this example, columns between 2 and 3 are the output.
z1[,2:3]
[,1] [,2]
[1,] 1 0
[2,] 2 3
[3,] 1 0
[4,] 4 0
Rows between 2 and 4, both included, are the output.
z1[2:4,]
[,1] [,2] [,3]
[1,] 0 2 3
[2,] 2 1 0
[3,] 2 4 0
Adding and Deleting Matrix Rows and Columns
Technically, matrices are of fixed length and dimensions, so we cannot
add or delete rows or columns. However, matrices can be reassigned, and
thus we can achieve the same effect as if we had directly done additions
or deletions.
Changing the Size of a Matrix
Creating a vector called x
x
[1] 1 12 5 13 16 8
Add variable 20 to the vector
x
[1] 1 12 5 13 16 8 20
In order to introduce number 20 in the exact position desired of the
vector.
x
[1] 1 12 5 20 13 16 8
Deleting values from column 2 to 4, both included.
x
[1] 1 13 16 8
Analogous operations can be used to change the size of a matrix. For
instance, the rbind() (row bind) and cbind() (column bind) functions let
you add rows or columns to a matrix.
Creating a vector of 4 columns with value 1 in each column
one<-c(1,1,1,1)
one
[1] 1 1 1 1
Matrix have been defined before.
z
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 0 1
[4,] 4 0 0
Combining vector “one” with matrix z, using function cbind().
Creating a matrix of 4 columns and rows, in which first column is the
vector “one”
cbind(one,z)
one
[1,] 1 1 1 1
[2,] 1 2 1 0
[3,] 1 3 0 1
[4,] 1 4 0 0
Here, cbind() creates a new matrix by combining a column of 1s with
the columns of z. We choose to get a quick printout, but we could have
assigned the result to z (or another variable), as follows:
Combining vector “one” with matrix z, using function cbind().
Creating a matrix of 4 columns and rows, in which last column is the
vector “one”
cbind(z,one)
one
[1,] 1 1 1 1
[2,] 2 1 0 1
[3,] 3 0 1 1
[4,] 4 0 0 1
Changing the value of matrix z for the matrix have been created
below.
Note, too, that we could have relied on recycling: Adding value 1 to
the new matrix z. Which have 5 columns and 4 rows. First row is filled
with ones.
cbind(1,z)
one
[1,] 1 1 1 1 1
[2,] 1 1 2 1 0
[3,] 1 1 3 0 1
[4,] 1 1 4 0 0
You can also use the rbind() and cbind() functions as a quick way to
create small matrices. Here’s an example:
Using cbind to create a matrix.
q
[,1] [,2]
[1,] 1 3
[2,] 2 4
You can delete rows or columns by reassignment, too:
Example of how to create a matrix with values from 1 to 6 and that
have 3 rows.
m
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
Output the rows number 1 and 3 of the matrix m
m <- m[c(1,3),]
m
[,1] [,2]
[1,] 1 4
[2,] 3 6
LS0tDQp0aXRsZTogIkxlY3R1cmUgNDogSW4tY2xhc3MgYWN0aXZpdHlfNiINCmF1dGhvcjogIlJhdWwgUm9jZXMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoqKlZlY3RvciBFbGVtZW50IE5hbWVzKioNCg0KVGhlIGVsZW1lbnRzIG9mIGEgdmVjdG9yIGNhbiBvcHRpb25hbGx5IGJlIGdpdmVuIG5hbWVzLiBGb3IgZXhhbXBsZSwgc2F5IHdlIGhhdmUgYSA1MC1lbGVtZW50IHZlY3RvciBzaG93aW5nIHRoZSBwb3B1bGF0aW9uIG9mIGVhY2ggc3RhdGUgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFdlIGNvdWxkIG5hbWUgZWFjaCBlbGVtZW50IGFjY29yZGluZyB0byBpdHMgc3RhdGUgbmFtZSwgc3VjaCBhcyAiTW9udGFuYSIgYW5kICJOZXcgSmVyc2V5Ii4gVGhpcyBpbiB0dXJuIG1pZ2h0IGxlYWQgdG8gbmFtaW5nIHBvaW50cyBpbiBwbG90cywgYW5kIHNvIG9uLg0KDQpgYGB7cn0NCnggPC0gYygxLDIsNCkNCm5hbWVzKHgpDQpgYGANCg0KIyMgTVkgRVhFUkNJU0UgMQ0KU2luY2UgdGhlcmUgaXMgbm8gY29sdW1ucyBoZWFkZXIgdGhlIG91dHB1dCBvZiBuYW1lcyh4KSBpcyBOVUxMDQpgYGB7cn0NCiMgUGxlYXNlIGNyZWF0ZSBhIHZlY3RvciB4MSBhbmQgZm9sbG93IHRoZSBzdGVwcyBvZiB0aGlzIGV4ZXJjaXNlLg0KeDEgPC0gYygzLDcsMTIpDQpuYW1lcyh4MSkNCmBgYA0KQ3JlYXRpbmcgdGhlIGNvbHVtbiBuYW1lcyAoaGVhZGVycykNCmBgYHtyfQ0KbmFtZXMoeDEpIDwtIGMoIkd1c3RhdiIsIk1hcmlhbiIsIkpvc2VwaCIpDQpuYW1lcyh4MSkNCmBgYA0KDQpGaW5hbGx5IHRoZSBvdXRwdXQgb2YgeDEgaXMgYSBtYXRyaXggb2YgMiByb3dzIGFuZCAzIGNvbHVtbnMsIGluIHdoaWNoIGZpcnN0IHJvdyB2YWx1ZXMgYXJlIHRoZSBoZWFkZXJzLg0KYGBge3J9DQp4MQ0KYGBgDQpJdCBpcyBwb3NzaWJsZSB0byBkZWxldGUgdGhlIGNvbHVtbiBoZWFkZXJzIHVzaW5nIE5VTEwuDQpgYGB7cn0NCm5hbWVzKHgxKSA8LSBOVUxMDQp4MQ0KYGBgDQpJbiBvcmRlciB0byBzZWUgd2hpY2ggaXMgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgKE1hcmlhbiBpbiB0aGlzIGNhc2UpLCBpcyBwb3NzaWJsZSB0byByZWZlcmVuY2UgZWxlbWVudHMgb2YgdGhlIHZlY3RvciBieSB0aGUgbmFtZS4NCmBgYHtyfQ0KeDEgPC0gYygzLDcsMTIpDQpuYW1lcyh4MSkgPC0gYygiR3VzdGF2IiwiTWFyaWFuIiwiSm9zZXBoIikNCngxWyJNYXJpYW4iXQ0KYGBgDQoNCg0KDQoNCiMjIEVYQU1QTEUgRVhFUkNJU0UgMQ0KV2UgY2FuIGFzc2lnbiBvciBxdWVyeSB2ZWN0b3IgZWxlbWVudCBuYW1lcyB2aWEgdGhlIG5hbWVzKCkgZnVuY3Rpb246DQoNCmBgYHtyfQ0KbmFtZXMoeCkgPC0gYygiYSIsImIiLCJhYiIpDQpuYW1lcyh4KQ0KYGBgDQoNCg0KYGBge3J9DQp4DQpgYGANCg0KV2UgY2FuIHJlbW92ZSB0aGUgbmFtZXMgZnJvbSBhIHZlY3RvciBieSBhc3NpZ25pbmcgTlVMTDoNCg0KYGBge3J9DQpuYW1lcyh4KSA8LSBOVUxMDQp4DQpgYGANCg0KV2UgY2FuIGV2ZW4gcmVmZXJlbmNlIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3IgYnkgbmFtZToNCg0KYGBge3J9DQp4IDwtIGMoMSwyLDQpDQpuYW1lcyh4KSA8LSBjKCJhIiwiYiIsImFiIikNCnhbImIiXQ0KYGBgDQoNCg0KDQoqKk1BVFJJQ0VTIEFORCBBUlJBWVMqKg0KDQpBIG1hdHJpeCBpcyBhIHZlY3RvciB3aXRoIHR3byBhZGRpdGlvbmFsIGF0dHJpYnV0ZXM6IHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgdGhlIG51bWJlciBvZiBjb2x1bW5zLiBTaW5jZSBtYXRyaWNlcyBhcmUgdmVjdG9ycywNCnRoZXkgYWxzbyBoYXZlIG1vZGVzLCBzdWNoIGFzIG51bWVyaWMgYW5kIGNoYXJhY3Rlci4NCg0KKipDcmVhdGluZyBNYXRyaWNlcyoqDQoNCg0KYGBge3J9DQp5PC1tYXRyaXgoYygxLDIsMyw0KSxucm93PTIsbmNvbD0yKQ0KeQ0KYGBgDQoNCiMjIE1ZIEVYRVJDSVNFIDIgKE1BVFJJWCkNCg0KYGBge3J9DQojUGxlYXNlIGNyZWF0ZSBhIG1hdHJpeCB5MSBhbmQgZm9sbG93IHRoZSBzdGVwcyBiZWxvdw0KeTEgPC0gbWF0cml4KGMoMywyNyw4LDE1KSxucm93PTIsIG5jb2w9MikNCnkxDQpgYGANCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdG8gc3BlY2lmeSBuY29sIGFuZCBucm93LCBqdXN0IG5jb2wgb3IgbnJvdy4gU2luY2UgdGhlcmUgNCBlbGVtZW50cyBhbmQgMiByb3csIHdpdGggMiBjb2x1bW5zIHNob3VsZCBiZSBlbm91Z2guDQpgYGB7cn0NCnkxPC1tYXRyaXgoYygzLDI3LDgsMTUpLG5yb3c9MikNCnkxDQpgYGANCkFzIGNvdWxkIGJlIHNlZW4gaW4gdGhlIG91dHB1dCBhYm92ZSwgdGhlIG5vdGF0aW9uIGZvciBjb2x1bW5zIGlzIFsseF0gYW5kIGZvciByb3dzIFt4LF0uIFNvIGluIHRoaXMgZXhhbXBsZSBpdCBpcyBzZWxlY3RlZCB0aGUgY29sdW1uIDEuDQpgYGB7cn0NCnkxWywxXQ0KYGBgDQpBIG1hdHJpeCBjb3VsZCBiZSBjcmVhdGVkIHdpdGhvdXQgdmFsdWVzIGFuZCB0aGVtIGludHJvZHVjZSB0aGUgdmFsdWVzLiBJbiB0aGlzIGV4YW1wbGUgdGhlIHN0cnVjdHVyZSBvZiBhIDJ4MiBtYXRyaXggaXMgY3JlYXRlZA0KYGBge3J9DQp5MSA8LSBtYXRyaXgobnJvdz0yLG5jb2w9MikNCnkxDQpgYGANClRoZW4gdmFsdWVzIGFyZSBpbnRyb2R1Y2VkDQpgYGB7cn0NCnkxWzEsMV0gPC0gMw0KeTFbMiwxXSA8LSAyNw0KeTFbMSwyXSA8LSA4DQp5MVsyLDJdIDwtIDE1IA0KeTENCmBgYA0KDQoNCg0KIyMgRVhBTVBMRSBFWEVSQ0lTRSAyIChNQVRSSVgpDQoNClNpbmNlIHdlIHNwZWNpZmllZCB0aGUgbWF0cml4IGVudHJpZXMgaW4gdGhlIHByZWNlZGluZyBleGFtcGxlLCBhbmQgdGhlcmUgd2VyZSBmb3VyIG9mIHRoZW0sIHdlIGRpZCBub3QgbmVlZCB0byBzcGVjaWZ5IGJvdGggbmNvbCBhbmQgbnJvdzsganVzdCBucm93IG9yIG5jb2wgd291bGQgaGF2ZSBiZWVuIGVub3VnaC4gSGF2aW5nIGZvdXIgZWxlbWVudHMgaW4gYWxsLCBpbiB0d28gcm93cywgaW1wbGllcyB0d28gY29sdW1uczoNCg0KYGBge3J9DQp5IDwtIG1hdHJpeChjKDEsMiwzLDQpLG5yb3c9MikNCnkNCmBgYA0KDQoNCk5vdGUgdGhhdCB3aGVuIHdlIHRoZW4gcHJpbnQgb3V0IHksIFIgc2hvd3MgdXMgaXRzIG5vdGF0aW9uIGZvciByb3dzIGFuZCBjb2x1bW5zLiBGb3IgaW5zdGFuY2UsIFssMl0gbWVhbnMgdGhlIGVudGlyZXR5IG9mIGNvbHVtbiAyLCBhcyBjYW4gYmUgc2VlbiBpbiB0aGlzIGNoZWNrOg0KDQpgYGB7cn0NCnlbLDJdDQpgYGANCg0KQW5vdGhlciB3YXkgdG8gYnVpbGQgeSBpcyB0byBzcGVjaWZ5IGVsZW1lbnRzIGluZGl2aWR1YWxseToNCg0KDQpgYGB7cn0NCnkgPC0gbWF0cml4KG5yb3c9MixuY29sPTIpDQp5DQpgYGANCg0KDQpgYGB7cn0NCnlbMSwxXSA8LSAxDQp5WzIsMV0gPC0gMg0KeVsxLDJdIDwtIDMNCnlbMiwyXSA8LSA0IA0KeQ0KYGBgDQoNCg0KTm90ZSB0aGF0IHdlIGRvIG5lZWQgdG8gd2FybiBSIGFoZWFkIG9mIHRpbWUgdGhhdCB5IHdpbGwgYmUgYSBtYXRyaXggYW5kIGdpdmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zLg0KDQpUaG91Z2ggaW50ZXJuYWwgc3RvcmFnZSBvZiBhIG1hdHJpeCBpcyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIsIHlvdSBjYW4gc2V0IHRoZSBieXJvdyBhcmd1bWVudCBpbiBtYXRyaXgoKSB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGRhdGEgaXMgY29taW5nIGluIHJvdy1tYWpvciBvcmRlci4gSGVyZeKAmXMgYW4gZXhhbXBsZSBvZiB1c2luZyBieXJvdzoNCg0KYGBge3J9DQptIDwtIG1hdHJpeChjKDEsMiwzLDQsNSw2KSxucm93PTIsYnlyb3c9VCkNCm0NCmBgYA0KIyMgTVkgRVhFUkNJU0UgMyAoTUFUUklYXzIpDQoNClVzaW5nIGJ5cm93IHRoZSBkYXRhIGlzIGNvbWluZyBpbiByb3ctbWFqb3Igb3JkZXIuIEluIHRoaXMgZXhhbXBsZSBmb3IgMiByb3dzIHRoZSBvdXRwdXQgaGFzIDMgY29sdW1ucywgZm9yIDMgcm93cyAyIGNvbHVtbnMgYW5kIGZvciA2IHJvd3MgMSBjb2x1bW4uDQpgYGB7cn0NCiNDcmVhdGUgYSBtYXRyaXggbTEgYW5kIHJlY3JlYXRlIGEgc2ltaWxhciBjYXNlIHNjZW5hcmlvIHRvIHRoZSBvbmUgYWJvdmUuDQptMSA8LSBtYXRyaXgoYygzLDYsNyw0LDUsMTMpLG5yb3c9MixieXJvdz1UKQ0KbTENCg0KYGBgDQoNCg0KIyMgRVhBTVBMRSBFWEVSQ0lTRSAzIChNQVRSSVhfMikNCg0KKipHZW5lcmFsIE1hdHJpeCBPcGVyYXRpb25zKioNCg0KUGVyZm9ybWluZyBMaW5lYXIgQWxnZWJyYSBPcGVyYXRpb25zIG9uIE1hdHJpY2VzDQoNCllvdSBjYW4gcGVyZm9ybSB2YXJpb3VzIGxpbmVhciBhbGdlYnJhIG9wZXJhdGlvbnMgb24gbWF0cmljZXMsIHN1Y2ggYXMgbWF0cml4IG11bHRpcGxpY2F0aW9uLCBtYXRyaXggc2NhbGFyIG11bHRpcGxpY2F0aW9uLCBhbmQgbWF0cml4IGFkZGl0aW9uLiBVc2luZyB5IGZyb20gdGhlIHByZWNlZGluZyBleGFtcGxlLCBoZXJlIGlzIGhvdyB0byBwZXJmb3JtIHRob3NlIHRocmVlIG9wZXJhdGlvbnM6DQoNCmBgYHtyfQ0KeSAlKiUgeSAjIG1hdGhlbWF0aWNhbCBtYXRyaXggbXVsdGlwbGljYXRpb24NCmBgYA0KDQpgYGB7cn0NCjMqeSAjIG1hdGhlbWF0aWNhbCBtdWx0aXBsaWNhdGlvbiBvZiBtYXRyaXggYnkgc2NhbGFyDQpgYGANCg0KDQoNCmBgYHtyfQ0KeSt5ICMgbWF0aGVtYXRpY2FsIG1hdHJpeCBhZGRpdGlvbg0KYGBgDQoNCiMjIE1ZIEVYRVJDSVNFIDMgKE1BVFJJWF8yKQ0KDQpgYGB7cn0NCiNQZXJmb3JtIHRoZSBvcGVyYXRpb25zIHNob3duIGFib3ZlIHVzaW5nIHkxDQpgYGANCg0KKipHZW5lcmFsIE1hdHJpeCBPcGVyYXRpb25zKioNClBlcmZvcm1pbmcgbGluZWFyIGFsZ2VicmEgb3BlcmF0aW9ucyBvbiBtYXRyaWNlcw0KVXNpbmcgdGhlIGNyZWF0ZWQgbWF0cml4IHkxLg0KDQpgYGB7cn0NCnkxICUqJSB5MSAjIG1hdHJpeCB5MSB0aW1lcyBtYXRyaXggeTEuIE1hdHJpeCB5MSBtdWx0aXBsaWNhdGVkIGJ5IGl0c2VsZi4NCmBgYA0KDQpgYGB7cn0NCjQqeTEgIyBNdWx0aXBsaWNhdGlvbiBvZiBhIGVzY2FsYXIgbnVtYmVyIHRpbWVzIGEgbWF0cml4Lg0KYGBgDQoNCmBgYHtyfQ0KeTEgKyB5MSAjU3VtIG9mIG1hdHJpeC4NCmBgYA0KDQojIyBFWEFNUExFIEVYRVJDSVNFIDQgKE1BVFJJWF8zKQ0KDQoqKk1hdHJpeCBJbmRleGluZyoqDQoNCkxldCB1cyBzYXkgdGhhdCB3ZSBoYXZlIGEgbWF0cml4IHo6DQoNCmBgYHtyfQ0KeiA8LSBtYXRyaXgobnJvdz00LG5jb2w9MykNCnpbMSwxXSA8LSAxDQp6WzIsMV0gPC0gMg0KelsxLDJdIDwtIDENCnpbMiwyXSA8LSAxDQp6WzMsMV0gPC0gMw0KelszLDJdIDwtIDANCnpbMywzXSA8LSAxDQp6WzEsM10gPC0gMQ0KelsyLDNdIDwtIDANCnpbNCwxXSA8LSA0DQp6WzQsMl0gPC0gMA0Kels0LDNdIDwtIDANCmBgYA0KDQoNCmBgYHtyfQ0Keg0KYGBgDQoNCkxldCB1cyBvYnRhaW4gdGhlIHN1Ym1hdHJpeCBvZiB6IGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIHdpdGggY29sdW1uIG51bWJlcnMgMiBhbmQgMyBhbmQgYW55IHJvdyBudW1iZXIuIFRoaXMgZXh0cmFjdHMgdGhlIHNlY29uZCBhbmQgdGhpcmQgY29sdW1ucy4NCg0KYGBge3J9DQp6WywyOjNdDQpgYGANCkxldCB1cyBub3cgZXh0cmFjdCByb3dzIGluc3RlYWQgb2YgY29sdW1ucy4NCg0KYGBge3J9DQp6WzM6NCxdDQpgYGANCg0KYGBge3J9DQp5DQpgYGANCg0KDQpgYGB7cn0NCnlbMjoxLF0NCmBgYA0KDQojIyBNWSBFWEVSQ0lTRSA0IChNQVRSSVhfMykNCmBgYHtyfQ0KI0NyZWF0ZSBhbWF0cml4IHoxIGFuZCByZWNyZWF0ZSBhIHNpbWlsYXIgY2FzZSBzY2VuYXJpby4NCg0KejEgPC0gbWF0cml4KG5yb3c9NCxuY29sPTMpDQp6MVsxLDFdIDwtIDMNCnoxWzIsMV0gPC0gMA0KejFbMSwyXSA8LSAxDQp6MVsyLDJdIDwtIDINCnoxWzMsMV0gPC0gMg0KejFbMywyXSA8LSAxDQp6MVszLDNdIDwtIDANCnoxWzEsM10gPC0gMA0KejFbMiwzXSA8LSAzDQp6MVs0LDFdIDwtIDINCnoxWzQsMl0gPC0gNA0KejFbNCwzXSA8LSAwDQpgYGANCg0KTGV0cyBvdXRwdXQgbWF0cml4IHoxDQpgYGB7cn0NCnoxDQpgYGANCg0KSW4gdGhpcyBleGFtcGxlLCBjb2x1bW5zIGJldHdlZW4gMiBhbmQgMyBhcmUgdGhlIG91dHB1dC4NCmBgYHtyfQ0KejFbLDI6M10NCmBgYA0KUm93cyBiZXR3ZWVuIDIgYW5kIDQsIGJvdGggaW5jbHVkZWQsIGFyZSB0aGUgb3V0cHV0Lg0KYGBge3J9DQp6MVsyOjQsXQ0KYGBgDQoNCg0KDQoqKkFkZGluZyBhbmQgRGVsZXRpbmcgTWF0cml4IFJvd3MgYW5kIENvbHVtbnMqKg0KVGVjaG5pY2FsbHksIG1hdHJpY2VzIGFyZSBvZiBmaXhlZCBsZW5ndGggYW5kIGRpbWVuc2lvbnMsIHNvIHdlIGNhbm5vdCBhZGQgb3IgZGVsZXRlIHJvd3Mgb3IgY29sdW1ucy4gSG93ZXZlciwgbWF0cmljZXMgY2FuIGJlIHJlYXNzaWduZWQsIGFuZCB0aHVzIHdlIGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBpZiB3ZSBoYWQgZGlyZWN0bHkgZG9uZSBhZGRpdGlvbnMgb3IgZGVsZXRpb25zLg0KDQpDaGFuZ2luZyB0aGUgU2l6ZSBvZiBhIE1hdHJpeA0KDQpDcmVhdGluZyBhIHZlY3RvciBjYWxsZWQgeCANCmBgYHtyfQ0KeDwtYygxLDEyLDUsMTMsMTYsOCkNCngNCmBgYA0KDQpBZGQgdmFyaWFibGUgMjAgdG8gdGhlIHZlY3Rvcg0KYGBge3J9DQp4IDwtIGMoeCwyMCkgIyBhcHBlbmQgMjANCngNCmBgYA0KSW4gb3JkZXIgdG8gaW50cm9kdWNlIG51bWJlciAyMCBpbiB0aGUgZXhhY3QgcG9zaXRpb24gZGVzaXJlZCBvZiB0aGUgdmVjdG9yLg0KYGBge3J9DQp4IDwtIGMoeFsxOjNdLDIwLHhbNDo2XSkgIyBpbnNlcnQgMjANCngNCmBgYA0KRGVsZXRpbmcgdmFsdWVzIGZyb20gY29sdW1uIDIgdG8gNCwgYm90aCBpbmNsdWRlZC4NCmBgYHtyfQ0KeCA8LSB4Wy0yOi00XSAjIGRlbGV0ZSBlbGVtZW50cyAyIHRocm91Z2ggNA0KeA0KYGBgDQoNCkFuYWxvZ291cyBvcGVyYXRpb25zIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiBhIG1hdHJpeC4gRm9yIGluc3RhbmNlLCB0aGUgcmJpbmQoKSAocm93IGJpbmQpIGFuZCBjYmluZCgpIChjb2x1bW4gYmluZCkgZnVuY3Rpb25zIGxldCB5b3UgYWRkIHJvd3Mgb3IgY29sdW1ucyB0byBhIG1hdHJpeC4NCg0KDQpDcmVhdGluZyBhIHZlY3RvciBvZiA0IGNvbHVtbnMgd2l0aCB2YWx1ZSAxIGluIGVhY2ggY29sdW1uDQpgYGB7cn0NCm9uZTwtYygxLDEsMSwxKQ0Kb25lDQpgYGANCk1hdHJpeCBoYXZlIGJlZW4gZGVmaW5lZCBiZWZvcmUuDQpgYGB7cn0NCnoNCmBgYA0KQ29tYmluaW5nIHZlY3RvciAib25lIiB3aXRoIG1hdHJpeCB6LCB1c2luZyBmdW5jdGlvbiBjYmluZCgpLiBDcmVhdGluZyBhIG1hdHJpeCBvZiA0IGNvbHVtbnMgYW5kIHJvd3MsIGluIHdoaWNoIGZpcnN0IGNvbHVtbiBpcyB0aGUgdmVjdG9yICJvbmUiDQpgYGB7cn0NCmNiaW5kKG9uZSx6KQ0KYGBgDQoNCkhlcmUsIGNiaW5kKCkgY3JlYXRlcyBhIG5ldyBtYXRyaXggYnkgY29tYmluaW5nIGEgY29sdW1uIG9mIDFzIHdpdGggdGhlIGNvbHVtbnMgb2Ygei4gV2UgY2hvb3NlIHRvIGdldCBhIHF1aWNrIHByaW50b3V0LCBidXQgd2UgY291bGQgaGF2ZSBhc3NpZ25lZCB0aGUgcmVzdWx0IHRvIHogKG9yIGFub3RoZXIgdmFyaWFibGUpLCBhcyBmb2xsb3dzOg0KDQpDb21iaW5pbmcgdmVjdG9yICJvbmUiIHdpdGggbWF0cml4IHosIHVzaW5nIGZ1bmN0aW9uIGNiaW5kKCkuIENyZWF0aW5nIGEgbWF0cml4IG9mIDQgY29sdW1ucyBhbmQgcm93cywgaW4gd2hpY2ggbGFzdCBjb2x1bW4gaXMgdGhlIHZlY3RvciAib25lIg0KYGBge3J9DQpjYmluZCh6LG9uZSkNCmBgYA0KDQpDaGFuZ2luZyB0aGUgdmFsdWUgb2YgbWF0cml4IHogZm9yIHRoZSBtYXRyaXggaGF2ZSBiZWVuIGNyZWF0ZWQgYmVsb3cuIA0KYGBge3J9DQp6IDwtIGNiaW5kKG9uZSx6KQ0KYGBgDQoNCg0KTm90ZSwgdG9vLCB0aGF0IHdlIGNvdWxkIGhhdmUgcmVsaWVkIG9uIHJlY3ljbGluZzoNCkFkZGluZyB2YWx1ZSAxIHRvIHRoZSBuZXcgbWF0cml4IHouIFdoaWNoIGhhdmUgNSBjb2x1bW5zIGFuZCA0IHJvd3MuIEZpcnN0IHJvdyBpcyBmaWxsZWQgd2l0aCBvbmVzLg0KYGBge3J9DQpjYmluZCgxLHopDQpgYGANCg0KWW91IGNhbiBhbHNvIHVzZSB0aGUgcmJpbmQoKSBhbmQgY2JpbmQoKSBmdW5jdGlvbnMgYXMgYSBxdWljayB3YXkgdG8gY3JlYXRlIHNtYWxsIG1hdHJpY2VzLiBIZXJl4oCZcyBhbiBleGFtcGxlOg0KDQogVXNpbmcgY2JpbmQgdG8gY3JlYXRlIGEgbWF0cml4Lg0KYGBge3J9DQpxIDwtIGNiaW5kKGMoMSwyKSxjKDMsNCkpDQpxDQpgYGANCg0KWW91IGNhbiBkZWxldGUgcm93cyBvciBjb2x1bW5zIGJ5IHJlYXNzaWdubWVudCwgdG9vOg0KDQpFeGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgYSBtYXRyaXggd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDYgYW5kIHRoYXQgaGF2ZSAzIHJvd3MuIA0KYGBge3J9DQptIDwtIG1hdHJpeCgxOjYsbnJvdz0zKQ0KbQ0KYGBgDQoNCk91dHB1dCB0aGUgcm93cyBudW1iZXIgMSBhbmQgMyBvZiB0aGUgbWF0cml4IG0NCmBgYHtyfQ0KbSA8LSBtW2MoMSwzKSxdDQptDQpgYGANCg0K