Git, Github, SSH and setup R-github

1 Download and install git-bash

At https://git-scm.com/ and follow the instructions for installation


2 Create a free account in github

Go to https://github.com/ and sign up

  • choose the email address you want to use (it does not need to be your university address email; you can use a permanent personal email address, if you want. This will allow you to keep access to your account should you leave the university)
  • choose a strong password - you can remember (note this somewhere safe)

3 Create a ssh key on your computer

  • this is done using git bash
    • launch git bash (from the windows menu)

  • you get a window like that - its called a terminal

  • you will write instructions in the terminal - and the computer will execute those
  • # are comments - they are not executed
  • type the instructions bellow; note: you need to use the same email address than the one you used to create the github account. So: replace "your_email@example.com" by your email.
  • press enter between each line.
# show which directory you are on the computer - copy this path in a notepad file
pwd 

# if you are working on a windows computer please write this command 
git config --global core.autocrlf true # its an additional configuration for the end of lines

# creates a ssh key
ssh-keygen -t ed25519 -C "your_email@example.com"

# press enter at all questions 
# do not fill anything, that will be too complicated for a start

This will create a directory called .ssh

# entering the directory 
cd .ssh

# list the files in the directory
ls -la 

You have now two files in the directory - files functioning as pair to allow ssh key to authenticate you on cloud services

  • id_ed25519 which is a private key. You should NEVER give this key to anyone else, and NEVER upload it anywhere - its stays on your computer
  • id_ed25519.pub is a public key. We can upload the content of the public key to github.

Those to keys will help identifying you in github, and while using R, without you having to type passwords all the time.

The principle of usage is that if you provide a public key to a cloud service (eg. github), it will use this information to authenticate you.

A caricature is that: the cloud service will ask your computer if its you trying to authenticate. Because your computer possesses the private key that is associated to the public key the cloud services has information about, the computer will answer YES. So the cloud service will let you in.

(This is why you never give your private key to anybody, its stays on your computer. If you share it, people will be able to identify as you, and you do not want that)


4 Add the SSH public key to your github account

You will put the information from the public key in the github account you just created

In git bash get the information of the public key

cat id_ed25519.pub
# it provides text starting by ssh-ed ... and finishing by your email
  • logging to your github account
  • got to Settings (your profile > settings)

  • then go to SSH and GPG keys > SSH keys

  • click new ssh key
    • give a name to the ssh key
    • paste the text that is given by git bash for your public key (above)
    • click add ssh key
    • confirm if requested using your password

  • Testing if the ssh key works : in git bash type :
ssh -T git@github.com

say yes … the last line of text should say something like - your username should be written - then you know it works

Hi <username>! You have successfully authenticated, but GitHub does not provide 
shell access.

  • creating a configuration file (in git bash)
# go to the home directory
cd 
# go to ssh directory
cd .ssh
# creating and opening a config file using a simple text editor : nano
nano config 
  • Now copy and then paste the following lines (right click) in the file that is open.
    • ! if you used a different path and id of the key put that here (it gives the directory and prefix where your key pair is stored)
Host [github.com](http://github.com/)
Hostname [github.com](http://github.com/)
IdentityFile ~/.ssh/id_ed25519 

  • NB: The symbol ^ means the touch ctrl (no need of capital letters here)
  • We save the file using ctr+O

it ask to write config : this is correct (note this is correct that there is no extension) - press enter. It said it wrote 3 lines.

  • Now we close it using ctrl+X - we should return to git bash window. We have now a file that is called config


NB:


5 Create a repository on github

  • got back to your main github page

  • click on new to create a new repository
  • create a new repository (you can choose own name and description - we will use for the course - do not have space between words in the repository name) and otherwise use the same options I did use


6 Configure R to use your SSH key and github

  • after having installed R and Rstudio (if you did not yet, do so) and the previous actions above
  • launch Rstudio
  • go to Tools > Global Options > Git/SVN
    • verify that the path in “Git executable is correct” (mine is C:/Program Files/Git/bin/git.exe)
    • verify that the ssh key path is correct(mine is C:/Users/username/.ssh/id_ed25519 ), this corresponds to the path shown in git bash
pwd
/c/Users/username/.ssh
  • press apply if you changed something, otherwise : cancel

NB: Here is the new link of R and version control usage (in case) https://docs.posit.co/ide/user/ide/guide/tools/version-control.html


7 7. Final setup : Making git, github and R work together

Create a directory where you will be able to have your R projects on your PC. Example I created one in Documents and called it my_projects

  • right click on my_projects and open with “git bash here”

This allows you to open “git bash” in the my_project directory. You can verify the path using pwd which is path of the working (current) directory. (All good. ! )

We will create a directory inside by something that is called “cloning a github repository” - basically we will create a directory that allows to link a repository in github (also called remote) to a directory on your local PC (origin). For now, just let git bash window open

  • go to github and look at the repository you created (I called it learning_R). It should look like something like that:

  • click on the green code button, go to SSH and copy(the two windows on the right)

  • go back to git bash windows that is still opened and type git clone then paste (right click paste) the instruction you just copied for me it give that, and press enter. If it indicates that it received object its all good.

Now you can look you have a sub-directory in my_projects - this sub-directory has the name of the github repository learning_R … and you will be able to write your code in this directory with R, and save the code and track changes, and this we will learn how to synchronize with github for version control.

Go to the directory. It should contain the following files, and a sub-directory called .git (this is the directory that does the version tracking).

We will have an brief overview of what those files are during the course.

  • now we will create a R project in this sub-directory, so you can write the code during the course. Go back to Rstudio, and do File > New project then choose Existing Directory and in the explorer choose the directory we just created from github learning_R for me.

  • The click create project.
  • Now you can see that you are in the project with this panel

  • if you click on README.md you will see it contains the description that we entered into github.
  • You can now close Rstudio for now.

If you managed to reach this stage, well, you already have done the most difficult and most boring part alone.
If not, do not worry, please tell me where you stopped so we can have a look during the meeting online.

Back to Index

LS0tDQp0aXRsZTogImByIHBhcmFtcyR0aXRsZWAiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQphdXRob3I6IEV2ZSBaZXlsIEZpc2tlYmVjaw0KcGFyYW1zOg0KICB0aXRsZTogIkdpdCwgR2l0aHViLCBTU0ggYW5kIHNldHVwIFItZ2l0aHViIiANCiAgcHJvamVjdF9wYXRoOiAiYHIgaGVyZTo6aGVyZSgpYCINCiAgDQprbml0OiAoZnVuY3Rpb24oaW5wdXRGaWxlLCBlbmNvZGluZykgew0KICBybWFya2Rvd246OnJlbmRlcihpbnB1dEZpbGUsIGVuY29kaW5nID0gZW5jb2RpbmcsIG91dHB1dF9kaXIgPSAiLi4vLi4vZG9jcyIpIH0pDQogIA0Kb3V0cHV0OiANCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgICBjc3M6IC4uL3N0eWxlcy9zdHlsZS5jc3MNCiAgICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgICB0b2NfZGVwdGg6IDQNCiAgICAgIGRmX3ByaW50OiBwYWdlZA0KICAgICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgICBhdXRob3I6IHBhcmFtcyRhdXRob3INCiAgICAgIGhpZ2hsaWdodDogZXNwcmVzc28NCiAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KDQogIA0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogNzINCi0tLQ0KDQojIERvd25sb2FkIGFuZCBpbnN0YWxsIGdpdC1iYXNoDQoNCkF0IFtodHRwczovL2dpdC1zY20uY29tL10oaHR0cHM6Ly9naXQtc2NtLmNvbS8pIGFuZCANCmZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBpbnN0YWxsYXRpb24gDQoNCi0tLQ0KDQojIENyZWF0ZSBhIGZyZWUgYWNjb3VudCBpbiBnaXRodWINCg0KR28gdG8gW2h0dHBzOi8vZ2l0aHViLmNvbS9dKGh0dHBzOi8vZ2l0aHViLmNvbS8pIGFuZCBzaWduIHVwICANCg0KLSBjaG9vc2UgdGhlIGVtYWlsIGFkZHJlc3MgeW91IHdhbnQgdG8gdXNlIChpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHlvdXIgdW5pdmVyc2l0eSANCmFkZHJlc3MgZW1haWw7IHlvdSBjYW4gdXNlIGEgcGVybWFuZW50IHBlcnNvbmFsIGVtYWlsIGFkZHJlc3MsIGlmIHlvdSB3YW50LiBUaGlzIA0Kd2lsbCBhbGxvdyB5b3UgdG8ga2VlcCBhY2Nlc3MgdG8geW91ciBhY2NvdW50IHNob3VsZCB5b3UgbGVhdmUgdGhlIHVuaXZlcnNpdHkpDQotIGNob29zZSBhIHN0cm9uZyBwYXNzd29yZCAtIHlvdSBjYW4gcmVtZW1iZXIgKG5vdGUgdGhpcyBzb21ld2hlcmUgc2FmZSkNCg0KLS0tDQoNCiMgQ3JlYXRlIGEgc3NoIGtleSBvbiB5b3VyIGNvbXB1dGVyDQoNCi0gdGhpcyBpcyBkb25lIHVzaW5nIGdpdCBiYXNoDQogICAgLSBsYXVuY2ggZ2l0IGJhc2ggKGZyb20gdGhlIHdpbmRvd3MgbWVudSkNCg0KIVtdKC4vaW1hZ2VzL2ltYWdlLnBuZykNCg0KICAtIHlvdSBnZXQgYSB3aW5kb3cgbGlrZSB0aGF0IC0gaXRzIGNhbGxlZCBhIHRlcm1pbmFsDQogICAgDQohW10oLi9pbWFnZXMvaW1hZ2UxLnBuZykNCiAgICANCiAgLSB5b3Ugd2lsbCB3cml0ZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRlcm1pbmFsIC0gYW5kIHRoZSBjb21wdXRlciB3aWxsIGV4ZWN1dGUgdGhvc2UNCiAgLSBgI2AgIGFyZSBjb21tZW50cyAtIHRoZXkgYXJlIG5vdCBleGVjdXRlZA0KICAtICoqdHlwZSB0aGUgaW5zdHJ1Y3Rpb25zIGJlbGxvdzsgbm90ZTogeW91IG5lZWQgdG8gdXNlIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MgDQogIHRoYW4gdGhlIG9uZSB5b3UgdXNlZCB0byBjcmVhdGUgdGhlIGdpdGh1YiBhY2NvdW50LiBTbzogcmVwbGFjZSoqIA0KICAgIGAieW91cl9lbWFpbEBleGFtcGxlLmNvbSJgIGJ5IHlvdXIgZW1haWwuDQogIC0gKipwcmVzcyBlbnRlciBiZXR3ZWVuIGVhY2ggbGluZS4qKg0KDQpgYGBiYXNoDQojIHNob3cgd2hpY2ggZGlyZWN0b3J5IHlvdSBhcmUgb24gdGhlIGNvbXB1dGVyIC0gY29weSB0aGlzIHBhdGggaW4gYSBub3RlcGFkIGZpbGUNCnB3ZCANCg0KIyBpZiB5b3UgYXJlIHdvcmtpbmcgb24gYSB3aW5kb3dzIGNvbXB1dGVyIHBsZWFzZSB3cml0ZSB0aGlzIGNvbW1hbmQgDQpnaXQgY29uZmlnIC0tZ2xvYmFsIGNvcmUuYXV0b2NybGYgdHJ1ZSAjIGl0cyBhbiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBlbmQgb2YgbGluZXMNCg0KIyBjcmVhdGVzIGEgc3NoIGtleQ0Kc3NoLWtleWdlbiAtdCBlZDI1NTE5IC1DICJ5b3VyX2VtYWlsQGV4YW1wbGUuY29tIg0KDQojIHByZXNzIGVudGVyIGF0IGFsbCBxdWVzdGlvbnMgDQojIGRvIG5vdCBmaWxsIGFueXRoaW5nLCB0aGF0IHdpbGwgYmUgdG9vIGNvbXBsaWNhdGVkIGZvciBhIHN0YXJ0DQpgYGANCg0KVGhpcyB3aWxsIGNyZWF0ZSBhIGRpcmVjdG9yeSBjYWxsZWQgYC5zc2hgIA0KDQpgYGBiYXNoDQojIGVudGVyaW5nIHRoZSBkaXJlY3RvcnkgDQpjZCAuc3NoDQoNCiMgbGlzdCB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeQ0KbHMgLWxhIA0KYGBgDQoNCllvdSBoYXZlIG5vdyB0d28gZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSAtIGZpbGVzIGZ1bmN0aW9uaW5nIGFzIHBhaXIgdG8gYWxsb3cgc3NoIA0Ka2V5IHRvIGF1dGhlbnRpY2F0ZSB5b3Ugb24gY2xvdWQgc2VydmljZXMNCg0KLSBgaWRfZWQyNTUxOWAgIHdoaWNoIGlzIGEgcHJpdmF0ZSBrZXkuICAqKllvdSBzaG91bGQgTkVWRVIgZ2l2ZSB0aGlzIGtleSB0byANCmFueW9uZSBlbHNlLCBhbmQgTkVWRVIgdXBsb2FkIGl0IGFueXdoZXJlIC0gaXRzIHN0YXlzIG9uIHlvdXIgY29tcHV0ZXIqKg0KLSBgaWRfZWQyNTUxOS5wdWJgIGlzIGEgcHVibGljIGtleS4gV2UgY2FuIHVwbG9hZCB0aGUgY29udGVudCBvZiB0aGUgcHVibGljIGtleSANCnRvIGdpdGh1Yi4NCg0KVGhvc2UgdG8ga2V5cyB3aWxsIGhlbHAgaWRlbnRpZnlpbmcgeW91IGluIGdpdGh1YiwgYW5kIHdoaWxlIHVzaW5nIFIsIHdpdGhvdXQgDQp5b3UgaGF2aW5nIHRvIHR5cGUgcGFzc3dvcmRzIGFsbCB0aGUgdGltZS4gDQoNClRoZSBwcmluY2lwbGUgb2YgdXNhZ2UgaXMgdGhhdCBpZiB5b3UgcHJvdmlkZSBhIHB1YmxpYyBrZXkgdG8gYSBjbG91ZCBzZXJ2aWNlIA0KKGVnLiBnaXRodWIpLCBpdCB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGF1dGhlbnRpY2F0ZSB5b3UuIA0KDQoqKkEgY2FyaWNhdHVyZSBpcyB0aGF0OiB0aGUgY2xvdWQgc2VydmljZSB3aWxsIGFzayB5b3VyIGNvbXB1dGVyIGlmIGl0cyB5b3UgDQp0cnlpbmcgdG8gYXV0aGVudGljYXRlLiBCZWNhdXNlIHlvdXIgY29tcHV0ZXIgcG9zc2Vzc2VzIHRoZSBwcml2YXRlIGtleSB0aGF0IGlzIA0KYXNzb2NpYXRlZCB0byB0aGUgcHVibGljIGtleSB0aGUgY2xvdWQgc2VydmljZXMgaGFzIGluZm9ybWF0aW9uIGFib3V0LCB0aGUgDQpjb21wdXRlciB3aWxsIGFuc3dlciBZRVMuIFNvIHRoZSBjbG91ZCBzZXJ2aWNlIHdpbGwgbGV0IHlvdSBpbi4qKiANCg0KKFRoaXMgaXMgd2h5IHlvdSBuZXZlciBnaXZlIHlvdXIgcHJpdmF0ZSBrZXkgdG8gYW55Ym9keSwgaXRzIHN0YXlzIG9uIHlvdXIgDQpjb21wdXRlci4gSWYgeW91IHNoYXJlIGl0LCBwZW9wbGUgd2lsbCBiZSBhYmxlIHRvIGlkZW50aWZ5IGFzIHlvdSwgYW5kIHlvdSBkbyANCm5vdCB3YW50IHRoYXQpICAgDQoNCi0tLQ0KDQojIEFkZCB0aGUgU1NIIHB1YmxpYyBrZXkgdG8geW91ciBnaXRodWIgYWNjb3VudA0KDQpZb3Ugd2lsbCBwdXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHB1YmxpYyBrZXkgaW4gdGhlIGdpdGh1YiBhY2NvdW50IHlvdSBqdXN0IA0KY3JlYXRlZCANCg0KSW4gZ2l0IGJhc2ggZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgcHVibGljIGtleQ0KDQpgYGBiYXNoDQpjYXQgaWRfZWQyNTUxOS5wdWINCiMgaXQgcHJvdmlkZXMgdGV4dCBzdGFydGluZyBieSBzc2gtZWQgLi4uIGFuZCBmaW5pc2hpbmcgYnkgeW91ciBlbWFpbA0KYGBgDQoNCi0gbG9nZ2luZyB0byB5b3VyIGdpdGh1YiBhY2NvdW50DQotIGdvdCB0byBgU2V0dGluZ3MgKHlvdXIgcHJvZmlsZSA+IHNldHRpbmdzKWANCg0KIVtdKC4vaW1hZ2VzL2ltYWdlMi5wbmcpDQoNCi0gdGhlbiBnbyB0byBgU1NIIGFuZCBHUEcga2V5cyA+IFNTSCBrZXlzYA0KDQohW10oLi9pbWFnZXMvaW1hZ2UzLnBuZykNCg0KLSBjbGljayBgbmV3IHNzaCBrZXlgDQogICAgLSBnaXZlIGEgbmFtZSB0byB0aGUgc3NoIGtleQ0KICAgIC0gcGFzdGUgdGhlIHRleHQgdGhhdCBpcyBnaXZlbiBieSBnaXQgYmFzaCBmb3IgeW91ciBwdWJsaWMga2V5IChhYm92ZSkNCiAgICAtIGNsaWNrIGFkZCBzc2gga2V5DQogICAgLSBjb25maXJtIGlmIHJlcXVlc3RlZCB1c2luZyB5b3VyIHBhc3N3b3JkDQogICAgDQoNCiFbXSguL2ltYWdlcy9pbWFnZTQucG5nKQ0KICAgIA0KLSBUZXN0aW5nIGlmIHRoZSBzc2gga2V5IHdvcmtzIDogaW4gZ2l0IGJhc2ggdHlwZSA6DQoNCmBgYGJhc2gNCnNzaCAtVCBnaXRAZ2l0aHViLmNvbQ0KYGBgDQoNCnNheSB5ZXMg4oCmIHRoZSBsYXN0IGxpbmUgb2YgdGV4dCBzaG91bGQgc2F5IHNvbWV0aGluZyBsaWtlICAtIHlvdXIgdXNlcm5hbWUgDQpzaG91bGQgYmUgd3JpdHRlbiAtIHRoZW4geW91IGtub3cgaXQgd29ya3MNCg0KYGBgYmFzaA0KSGkgPHVzZXJuYW1lPiEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQsIGJ1dCBHaXRIdWIgZG9lcyBub3QgcHJvdmlkZSANCnNoZWxsIGFjY2Vzcy4NCmBgYA0KDQotLS0NCg0KLSBjcmVhdGluZyBhIGNvbmZpZ3VyYXRpb24gZmlsZSAoaW4gZ2l0IGJhc2gpDQogICAgDQpgYGBiYXNoDQojIGdvIHRvIHRoZSBob21lIGRpcmVjdG9yeQ0KY2QgDQojIGdvIHRvIHNzaCBkaXJlY3RvcnkNCmNkIC5zc2gNCiMgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYSBjb25maWcgZmlsZSB1c2luZyBhIHNpbXBsZSB0ZXh0IGVkaXRvciA6IG5hbm8NCm5hbm8gY29uZmlnIA0KYGBgDQoNCi0gTm93IGNvcHkgYW5kIHRoZW4gcGFzdGUgdGhlIGZvbGxvd2luZyBsaW5lcyAocmlnaHQgY2xpY2spIGluIHRoZSBmaWxlIHRoYXQgaXMgDQpvcGVuLg0KICAgIC0gISBpZiB5b3UgdXNlZCBhIGRpZmZlcmVudCBwYXRoIGFuZCBpZCBvZiB0aGUga2V5IHB1dCB0aGF0IGhlcmUgKGl0IGdpdmVzIA0KICAgIHRoZSBkaXJlY3RvcnkgYW5kIHByZWZpeCB3aGVyZSB5b3VyIGtleSBwYWlyIGlzIHN0b3JlZCkNCg0KYGBgYmFzaA0KSG9zdCBbZ2l0aHViLmNvbV0oaHR0cDovL2dpdGh1Yi5jb20vKQ0KSG9zdG5hbWUgW2dpdGh1Yi5jb21dKGh0dHA6Ly9naXRodWIuY29tLykNCklkZW50aXR5RmlsZSB+Ly5zc2gvaWRfZWQyNTUxOSANCmBgYA0KDQohW10oLi9pbWFnZXMvaW1hZ2U1LnBuZykNCg0KLSBOQjogVGhlIHN5bWJvbCBgXmAgbWVhbnMgdGhlIHRvdWNoIGBjdHJsYCAobm8gbmVlZCBvZiBjYXBpdGFsIGxldHRlcnMgaGVyZSkNCi0gV2Ugc2F2ZSB0aGUgZmlsZSB1c2luZyBgY3RyK09gDQogICAgDQohW10oLi9pbWFnZXMvaW1hZ2U2LnBuZykNCiAgICANCg0KaXQgYXNrIHRvIHdyaXRlIGNvbmZpZyAgOiB0aGlzIGlzIGNvcnJlY3QgKG5vdGUgdGhpcyBpcyBjb3JyZWN0IHRoYXQgdGhlcmUgaXMgDQpubyBleHRlbnNpb24pIC0gcHJlc3MgZW50ZXIuIEl0IHNhaWQgaXQgd3JvdGUgMyBsaW5lcy4gDQoNCiFbXSguL2ltYWdlcy9pbWFnZTcucG5nKQ0KDQotIE5vdyB3ZSBjbG9zZSBpdCB1c2luZyAgYGN0cmwrWGAgLSB3ZSBzaG91bGQgcmV0dXJuIHRvIGdpdCBiYXNoIHdpbmRvdy4gV2UgaGF2ZSANCm5vdyBhIGZpbGUgdGhhdCBpcyBjYWxsZWQgY29uZmlnDQoNCiFbXSguL2ltYWdlcy9pbWFnZTgucG5nKQ0KDQotLS0NCg0KTkI6IA0KDQotIElmIHlvdSB3aXNoLCB5b3UgY2FuIGVnLiByZWFkIG1vcmUgb24gaG93IHNzaC1rZXlzIHdvcmsgaGVyZSA6ICBbaHR0cHM6Ly93d3cuc2VjdGlnby5jb20vcmVzb3VyY2UtbGlicmFyeS93aGF0LWlzLWFuLXNzaC1rZXldKGh0dHBzOi8vd3d3LnNlY3RpZ28uY29tL3Jlc291cmNlLWxpYnJhcnkvd2hhdC1pcy1hbi1zc2gta2V5KQ0KLSBUaGlzIHR1dG9yaWFsIGlzIGFuIGV4dHJhY3Qgb2YgdGhlIGd1aWRlbGluZXMgcHJvdmlkZWQgaGVyZTogW2h0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2F1dGhlbnRpY2F0aW9uL2Nvbm5lY3RpbmctdG8tZ2l0aHViLXdpdGgtc3NoL2dlbmVyYXRpbmctYS1uZXctc3NoLWtleS1hbmQtYWRkaW5nLWl0LXRvLXRoZS1zc2gtYWdlbnRdKGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2F1dGhlbnRpY2F0aW9uL2Nvbm5lY3RpbmctdG8tZ2l0aHViLXdpdGgtc3NoL2dlbmVyYXRpbmctYS1uZXctc3NoLWtleS1hbmQtYWRkaW5nLWl0LXRvLXRoZS1zc2gtYWdlbnQpDQoNCi0tLQ0KDQojIENyZWF0ZSBhIHJlcG9zaXRvcnkgb24gZ2l0aHViDQoNCi0gZ290IGJhY2sgdG8geW91ciBtYWluIGdpdGh1YiBwYWdlDQoNCiFbXSguL2ltYWdlcy9pbWFnZTkucG5nKQ0KDQotIGNsaWNrIG9uIG5ldyB0byBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQ0KLSBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeSAoeW91IGNhbiBjaG9vc2Ugb3duIG5hbWUgYW5kIGRlc2NyaXB0aW9uIC0gDQp3ZSB3aWxsIHVzZSBmb3IgdGhlIGNvdXJzZSAtIGRvIG5vdCBoYXZlIHNwYWNlIGJldHdlZW4gd29yZHMgaW4gdGhlIHJlcG9zaXRvcnkgDQpuYW1lKSBhbmQgb3RoZXJ3aXNlIHVzZSB0aGUgc2FtZSBvcHRpb25zIEkgZGlkIHVzZQ0KDQohW10oLi9pbWFnZXMvaW1hZ2UxMC5wbmcpDQoNCi0tLQ0KDQojIENvbmZpZ3VyZSBSIHRvIHVzZSB5b3VyIFNTSCBrZXkgYW5kIGdpdGh1Yg0KDQotIGFmdGVyIGhhdmluZyBpbnN0YWxsZWQgUiBhbmQgUnN0dWRpbyAoaWYgeW91IGRpZCBub3QgeWV0LCBkbyBzbykgYW5kIHRoZSANCnByZXZpb3VzIGFjdGlvbnMgYWJvdmUNCi0gbGF1bmNoIFJzdHVkaW8NCi0gZ28gdG8gYFRvb2xzID4gR2xvYmFsIE9wdGlvbnMgPiBHaXQvU1ZOYA0KICAgIC0gdmVyaWZ5IHRoYXQgdGhlIHBhdGggaW4g4oCcR2l0IGV4ZWN1dGFibGUgaXMgY29ycmVjdOKAnSAobWluZSBpcyANCiAgICBgQzovUHJvZ3JhbSBGaWxlcy9HaXQvYmluL2dpdC5leGUpYA0KICAgIC0gdmVyaWZ5IHRoYXQgdGhlIHNzaCBrZXkgcGF0aCBpcyBjb3JyZWN0KG1pbmUgaXMgDQogICAgYEM6L1VzZXJzL3VzZXJuYW1lLy5zc2gvaWRfZWQyNTUxOWAgICksIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHBhdGggDQogICAgc2hvd24gaW4gZ2l0IGJhc2gNCiAgICANCmBgYGJhc2gNCnB3ZA0KL2MvVXNlcnMvdXNlcm5hbWUvLnNzaA0KYGBgDQogICAgDQotIHByZXNzIGFwcGx5IGlmIHlvdSBjaGFuZ2VkIHNvbWV0aGluZywgb3RoZXJ3aXNlIDogY2FuY2VsDQoNCk5COiBIZXJlIGlzIHRoZSBuZXcgbGluayBvZiBSIGFuZCB2ZXJzaW9uIGNvbnRyb2wgdXNhZ2UgKGluIGNhc2UpIFtodHRwczovL2RvY3MucG9zaXQuY28vaWRlL3VzZXIvaWRlL2d1aWRlL3Rvb2xzL3ZlcnNpb24tY29udHJvbC5odG1sXShodHRwczovL2RvY3MucG9zaXQuY28vaWRlL3VzZXIvaWRlL2d1aWRlL3Rvb2xzL3ZlcnNpb24tY29udHJvbC5odG1sKQ0KDQotLS0NCg0KIyA3LiBGaW5hbCBzZXR1cCA6IE1ha2luZyBnaXQsIGdpdGh1YiBhbmQgUiB3b3JrIHRvZ2V0aGVyDQoNCkNyZWF0ZSBhIGRpcmVjdG9yeSB3aGVyZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIGhhdmUgeW91ciBSIHByb2plY3RzIG9uIHlvdXIgUEMuIA0KRXhhbXBsZSBJIGNyZWF0ZWQgb25lIGluIGBEb2N1bWVudHNgIGFuZCBjYWxsZWQgaXQgYG15X3Byb2plY3RzYA0KDQotIHJpZ2h0IGNsaWNrIG9uIGBteV9wcm9qZWN0c2AgYW5kIG9wZW4gd2l0aCDigJxnaXQgYmFzaCBoZXJl4oCdDQoNCiFbXSguL2ltYWdlcy9pbWFnZTExLnBuZykNCg0KVGhpcyBhbGxvd3MgeW91IHRvIG9wZW4g4oCcZ2l0IGJhc2jigJ0gaW4gdGhlIG15X3Byb2plY3QgZGlyZWN0b3J5LiBZb3UgY2FuIHZlcmlmeSANCnRoZSBwYXRoIHVzaW5nIGBwd2RgIHdoaWNoIGlzIHBhdGggb2YgdGhlIHdvcmtpbmcgKGN1cnJlbnQpIGRpcmVjdG9yeS4gDQooQWxsIGdvb2QuICEgKQ0KDQohW10oLi9pbWFnZXMvaW1hZ2UxMi5wbmcpDQoNCldlIHdpbGwgY3JlYXRlIGEgZGlyZWN0b3J5IGluc2lkZSBieSBzb21ldGhpbmcgdGhhdCBpcyBjYWxsZWQg4oCcY2xvbmluZyBhIGdpdGh1YiANCnJlcG9zaXRvcnnigJ0gIC0gYmFzaWNhbGx5IHdlIHdpbGwgY3JlYXRlIGEgZGlyZWN0b3J5IHRoYXQgYWxsb3dzIHRvIGxpbmsgYSANCnJlcG9zaXRvcnkgaW4gZ2l0aHViIChhbHNvIGNhbGxlZCByZW1vdGUpIHRvIGEgZGlyZWN0b3J5IG9uIHlvdXIgbG9jYWwgUEMgDQoob3JpZ2luKS4gDQpGb3Igbm93LCBqdXN0IGxldCBnaXQgYmFzaCB3aW5kb3cgb3Blbg0KDQotIGdvIHRvIGdpdGh1YiBhbmQgbG9vayBhdCB0aGUgcmVwb3NpdG9yeSB5b3UgY3JlYXRlZCAoSSBjYWxsZWQgaXQgbGVhcm5pbmdfUikuIA0KSXQgc2hvdWxkIGxvb2sgbGlrZSBzb21ldGhpbmcgbGlrZSB0aGF0OiANCg0KIVtdKC4vaW1hZ2VzL2ltYWdlMTMucG5nKQ0KDQotIGNsaWNrIG9uIHRoZSBncmVlbiBjb2RlIGJ1dHRvbiwgZ28gdG8gU1NIIGFuZCBjb3B5KHRoZSB0d28gd2luZG93cyBvbiB0aGUgcmlnaHQpDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE0LnBuZykNCg0KLSBnbyBiYWNrIHRvIGdpdCBiYXNoIHdpbmRvd3MgdGhhdCBpcyBzdGlsbCBvcGVuZWQgYW5kIHR5cGUgYGdpdCBjbG9uZWAgdGhlbiANCnBhc3RlIChyaWdodCBjbGljayBwYXN0ZSkgdGhlIGluc3RydWN0aW9uIHlvdSBqdXN0IGNvcGllZCBmb3IgbWUgaXQgZ2l2ZSB0aGF0LCANCmFuZCBwcmVzcyBlbnRlci4gSWYgaXQgaW5kaWNhdGVzIHRoYXQgaXQgcmVjZWl2ZWQgb2JqZWN0IGl0cyBhbGwgZ29vZC4NCg0KIVtdKC4vaW1hZ2VzL2ltYWdlMTUucG5nKQ0KDQpOb3cgeW91IGNhbiBsb29rIHlvdSBoYXZlIGEgc3ViLWRpcmVjdG9yeSBpbiBgbXlfcHJvamVjdHNgIC0gdGhpcyBzdWItZGlyZWN0b3J5IA0KaGFzIHRoZSBuYW1lIG9mIHRoZSBnaXRodWIgcmVwb3NpdG9yeSBgbGVhcm5pbmdfUmAg4oCmIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIA0Kd3JpdGUgeW91ciBjb2RlIGluIHRoaXMgZGlyZWN0b3J5IHdpdGggUiwgYW5kIHNhdmUgdGhlIGNvZGUgYW5kIHRyYWNrIGNoYW5nZXMsIA0KYW5kIHRoaXMgd2Ugd2lsbCBsZWFybiBob3cgdG8gc3luY2hyb25pemUgd2l0aCBnaXRodWIgZm9yIHZlcnNpb24gY29udHJvbC4NCg0KR28gdG8gdGhlIGRpcmVjdG9yeS4gSXQgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWxlcywgYW5kIGEgc3ViLWRpcmVjdG9yeSANCmNhbGxlZCAuZ2l0ICh0aGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdCBkb2VzIHRoZSB2ZXJzaW9uIHRyYWNraW5nKS4gDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE2LnBuZykNCg0KV2Ugd2lsbCBoYXZlIGFuIGJyaWVmIG92ZXJ2aWV3IG9mIHdoYXQgdGhvc2UgZmlsZXMgYXJlIGR1cmluZyB0aGUgY291cnNlLiANCg0KLSBub3cgd2Ugd2lsbCBjcmVhdGUgYSBSIHByb2plY3QgaW4gdGhpcyBzdWItZGlyZWN0b3J5LCBzbyB5b3UgY2FuIHdyaXRlIHRoZSBjb2RlIA0KZHVyaW5nIHRoZSBjb3Vyc2UuIEdvIGJhY2sgdG8gUnN0dWRpbywgYW5kIGRvICBgRmlsZSA+IE5ldyBwcm9qZWN0YCB0aGVuIA0KY2hvb3NlIGBFeGlzdGluZyBEaXJlY3RvcnlgICBhbmQgaW4gdGhlIGV4cGxvcmVyIGNob29zZSB0aGUgZGlyZWN0b3J5IHdlIGp1c3QgDQpjcmVhdGVkIGZyb20gZ2l0aHViIGBsZWFybmluZ19SYCBmb3IgbWUuDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE3LnBuZykNCg0KLSBUaGUgY2xpY2sgY3JlYXRlIHByb2plY3QuDQotIE5vdyB5b3UgY2FuIHNlZSB0aGF0IHlvdSBhcmUgaW4gdGhlIHByb2plY3Qgd2l0aCB0aGlzIHBhbmVsDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE4LnBuZykNCg0KLSBpZiB5b3UgY2xpY2sgb24gW1JFQURNRS5tZF0oaHR0cDovL1JFQURNRS5tZCkgeW91IHdpbGwgc2VlIGl0IGNvbnRhaW5zIHRoZSANCmRlc2NyaXB0aW9uIHRoYXQgd2UgZW50ZXJlZCBpbnRvIGdpdGh1Yi4NCi0gWW91IGNhbiBub3cgY2xvc2UgUnN0dWRpbyBmb3Igbm93Lg0KDQpJZiB5b3UgbWFuYWdlZCB0byByZWFjaCB0aGlzIHN0YWdlLCB3ZWxsLCB5b3UgYWxyZWFkeSBoYXZlIGRvbmUgdGhlIG1vc3QgDQpkaWZmaWN1bHQgYW5kIG1vc3QgYm9yaW5nIHBhcnQgYWxvbmUuICANCklmIG5vdCwgZG8gbm90IHdvcnJ5LCBwbGVhc2UgdGVsbCBtZSB3aGVyZSB5b3Ugc3RvcHBlZCBzbyB3ZSBjYW4gaGF2ZSBhIGxvb2sgDQpkdXJpbmcgdGhlIG1lZXRpbmcgb25saW5lLg0KDQpCYWNrIHRvIFtJbmRleF0oaW5kZXguaHRtbCk=