In this module, we will:
- take an introductory look at the Great Lakes HPC cluster
- discuss the need for requesting compute resources
- learn about several ways to access Great Lakes
- use the web-based file browser for Great Lakes
- introduce or review the nano text editor
- use the OpenOnDemand service to launch a web-based interactive job
Great Lakes - Sneak Peek
So far, we’ve briefly described Great Lakes as a general-purpose High-Performance Compute (HPC) cluster.
In this module we’ll start to get a feel for what it’s like to use an HPC cluster. It’s not intended to be a deep dive, but rather to use some of the quickest ways to get started in order to start getting some experience with this system.
Using an HPC Cluster - Must Request Resources
When using an HPC cluster, there is a pattern that is quite different from our typical interactions with a computer system - we must ask for resources before we are able to use them. This is a characteristic of a shared, large, multi-user system like Great Lakes. Within the entirety of the system, we have an enormous amount of computing power, but at the same time, we need to allow equal access to this resource to the whole university. Therefore, we use this pattern of requesting resources and receiving them before we begin our computing tasks.
Several ways to access Great Lakes
- For compute access:
- Secure Shell (ssh)
- Web-based shell
- OpenOnDemand interactive apps (e.g. RStudio, Basic Desktop)
- For file access:
- Web-based file browser
- Globus
- Direct (it’s directly connected to Great Lakes)
- Remote mount (it can be network-connected to your workstation)
scp
, rsync
, etc.
Using the web-based access methods
The web-based tools that provide access to Great Lakes and other ARC resources are a quick and easy way to get started. We’ll use these in our upcoming exercises to make our first foray into using the Great Lakes HPC. Additionally, the ‘Interactive Apps’ with ARC’s Open On Demand service offer a unique solution for when we need to run graphical applications. We’ll preview this and give some practical tips for using the RStudio and the Basic Desktop apps.
Sneak preview of the web-based file browser
Sneak preview of the web-based shell
Sneak preview of a web-based RStudio session
Sneak preview of a web-based Basic Desktop session
Quick Review or Crash Course on the Nano Editor
Before we dive into some of the exercises in this module, we should do a quick review or crash course on the nano text editor, which is a command-line-based text editor. In some of the upcoming exercises, we will be connected to Great Lakes via the web-based shell, which means that we will be limited to using command-line tools. During that time, we’ll use nano to edit READMEs and script files. Nano, along with other command-line-based text editor tools, use the keyboard as the main way of interfacing with the software. This means we will use various keystrokes to carry out tasks like saving the file and exiting the tool, which may take some practice to get comfortable with. Thankfully, nano is relatively intuitive and easy to use, which is one reason why we’ve chosen to use it for this workshop.
The basic layout of the nano editor is shown below. A helpful list of common tasks and their keyboard shortcuts is found at the bottom. The title bar and the status bar provide some additional context about the file we’re interacting with and feedback messages from nano, respectively.
Handy links for Great Lakes
Exercise - View Transferred Files
Following along with the instructor, we’ll use the web-based file browser to confirm that we’ve transferred the data files to our turbo space
Exercise - Connect with the Web-Based Shell
Following along with the instructor, we’ll use the web-based shell to connect to Great Lakes. Once there, we’ll run an introductory script, and take another look at our transferred files.
Exercise - Launch an RStudio Instance on OpenOnDemand
Following along with the instructor, we’ll use OpenOnDemand to launch an RStudio instance. Once there, we’ll run a basic R script as a quick demonstration of these capabilities.
Exercise - Launch a Basic Desktop Instance and Verify File Integrity
Following along with the instructor, we’ll use OpenOnDemand to launch a Basic Desktop instance. Once there, we’ll open a terminal and use the md5sum
utility to verify file integrity of the data that we recently transferred to our Turbo location.
Note: Using an OpenOnDemand Basic Desktop instance in order to run a command line application can be a bit of an odd pattern. We do this here primarily as a means for requesting and receiving the proper computational resources for this task. In the next module, we’ll learn about some other patterns for requesting resources and running command-line utilities which may be better choices going forward.
Exercise - Write a README File
Following along with the instructor, we will use the nano
utility to write the beginnings of a README for our project as it exists so far.
Write a README - Solution
source /nfs/turbo/umms-bioinf-wkshp/workshop/home/${USER}/source_me_for_shortcut.txt
cd ${WORKSHOP_HOME}/project_analysis
nano README.txt
Exercise - Organize your project
Following along with the instructor, we’ll organize the files that are in our $WORKSHOP_HOME
directory.
Organize Your Project - Solution
cd ${WORKSHOP_HOME}/project_analysis
mv 0042-WS input_bams
mkdir logs
mkdir scripts
Review
- Learned about different ways of accessing the Great Lakes HPC cluster
- Experienced using the web-based access methods
- With web-based file browser, examined the data that we previously transferred
- With web-based shell access, we ran an introductory script and used CLI commands to examine the data that we previously transferred
- With OpenOnDemand RStudio, we ran an introductory R script
- With OpenOnDemand Basic Desktop, we verified file integrity of data the we previously transferred, and used
nano
to write a README file
LS0tCnRpdGxlOiAiU25lYWsgcGVlazogR3JlYXQgTGFrZXMiCmF1dGhvcjogIlVNIEJpb2luZm9ybWF0aWNzIENvcmUiCm91dHB1dDoKICAgICAgICBodG1sX2RvY3VtZW50OgogICAgICAgICAgICBpbmNsdWRlczoKICAgICAgICAgICAgICAgIGluX2hlYWRlcjogaGVhZGVyLmh0bWwKICAgICAgICAgICAgdGhlbWU6IHBhcGVyCiAgICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgICAgICAgICAgZmlnX2NhcHRpb246IHRydWUKICAgICAgICAgICAgbWFya2Rvd246IEdGTQogICAgICAgICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5eyAvKiBOb3JtYWwgICovCiAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICB9CnByZSB7CiAgZm9udC1zaXplOiAxMnB0Cn0KPC9zdHlsZT4KCkluIHRoaXMgbW9kdWxlLCB3ZSB3aWxsOgoKKiB0YWtlIGFuIGludHJvZHVjdG9yeSBsb29rIGF0IHRoZSBHcmVhdCBMYWtlcyBIUEMgY2x1c3RlcgoqIGRpc2N1c3MgdGhlIG5lZWQgZm9yIHJlcXVlc3RpbmcgY29tcHV0ZSByZXNvdXJjZXMKKiBsZWFybiBhYm91dCBzZXZlcmFsIHdheXMgdG8gYWNjZXNzIEdyZWF0IExha2VzCiogdXNlIHRoZSB3ZWItYmFzZWQgZmlsZSBicm93c2VyIGZvciBHcmVhdCBMYWtlcwoqIGludHJvZHVjZSBvciByZXZpZXcgdGhlIG5hbm8gdGV4dCBlZGl0b3IKKiB1c2UgdGhlIE9wZW5PbkRlbWFuZCBzZXJ2aWNlIHRvIGxhdW5jaCBhIHdlYi1iYXNlZCBpbnRlcmFjdGl2ZSBqb2IKCiMjIEdyZWF0IExha2VzIC0gU25lYWsgUGVlawoKU28gZmFyLCB3ZSd2ZSBicmllZmx5IGRlc2NyaWJlZCBHcmVhdCBMYWtlcyBhcyBhIGdlbmVyYWwtcHVycG9zZSBIaWdoLVBlcmZvcm1hbmNlIENvbXB1dGUgKEhQQykgY2x1c3Rlci4gCgpJbiB0aGlzIG1vZHVsZSB3ZSdsbCBzdGFydCB0byBnZXQgYSBmZWVsIGZvciB3aGF0IGl0J3MgbGlrZSB0byB1c2UgYW4gSFBDIGNsdXN0ZXIuIEl0J3Mgbm90IGludGVuZGVkIHRvIGJlIGEgZGVlcCBkaXZlLCBidXQgcmF0aGVyIHRvIHVzZSBzb21lIG9mIHRoZSBxdWlja2VzdCB3YXlzIHRvIGdldCBzdGFydGVkIGluIG9yZGVyIHRvIHN0YXJ0IGdldHRpbmcgc29tZSBleHBlcmllbmNlIHdpdGggdGhpcyBzeXN0ZW0uCgojIyMgVXNpbmcgYW4gSFBDIENsdXN0ZXIgLSBNdXN0IFJlcXVlc3QgUmVzb3VyY2VzCgohW10oaW1hZ2VzL01vZHVsZTAzYV9hc2tfZm9yX3Jlc291cmNlcy5wbmcpCgpXaGVuIHVzaW5nIGFuIEhQQyBjbHVzdGVyLCB0aGVyZSBpcyBhIHBhdHRlcm4gdGhhdCBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSBvdXIgdHlwaWNhbCBpbnRlcmFjdGlvbnMgd2l0aCBhIGNvbXB1dGVyIHN5c3RlbSAtIHdlIG11c3QgYXNrIGZvciByZXNvdXJjZXMgYmVmb3JlIHdlIGFyZSBhYmxlIHRvIHVzZSB0aGVtLiBUaGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgYSBzaGFyZWQsIGxhcmdlLCBtdWx0aS11c2VyIHN5c3RlbSBsaWtlIEdyZWF0IExha2VzLiBXaXRoaW4gdGhlIGVudGlyZXR5IG9mIHRoZSBzeXN0ZW0sIHdlIGhhdmUgYW4gZW5vcm1vdXMgYW1vdW50IG9mIGNvbXB1dGluZyBwb3dlciwgYnV0IGF0IHRoZSBzYW1lIHRpbWUsIHdlIG5lZWQgdG8gYWxsb3cgZXF1YWwgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UgdG8gdGhlIHdob2xlIHVuaXZlcnNpdHkuIFRoZXJlZm9yZSwgd2UgdXNlIHRoaXMgcGF0dGVybiBvZiByZXF1ZXN0aW5nIHJlc291cmNlcyBhbmQgcmVjZWl2aW5nIHRoZW0gYmVmb3JlIHdlIGJlZ2luIG91ciBjb21wdXRpbmcgdGFza3MuCgojIyMgU2V2ZXJhbCB3YXlzIHRvIGFjY2VzcyBHcmVhdCBMYWtlcwoKLSBGb3IgY29tcHV0ZSBhY2Nlc3M6CiAgICAtIFNlY3VyZSBTaGVsbCAoc3NoKQogICAgLSBXZWItYmFzZWQgc2hlbGwKICAgIC0gT3Blbk9uRGVtYW5kIGludGVyYWN0aXZlIGFwcHMgKGUuZy4gUlN0dWRpbywgQmFzaWMgRGVza3RvcCkKLSBGb3IgZmlsZSBhY2Nlc3M6CiAgICAtIFdlYi1iYXNlZCBmaWxlIGJyb3dzZXIKICAgIC0gR2xvYnVzCiAgICAtIERpcmVjdCAoaXQncyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gR3JlYXQgTGFrZXMpCiAgICAtIFJlbW90ZSBtb3VudCAoaXQgY2FuIGJlIG5ldHdvcmstY29ubmVjdGVkIHRvIHlvdXIgd29ya3N0YXRpb24pCiAgICAtIGBzY3BgLCBgcnN5bmNgLCBldGMuCgojIyMgVXNpbmcgdGhlIHdlYi1iYXNlZCBhY2Nlc3MgbWV0aG9kcwoKVGhlIHdlYi1iYXNlZCB0b29scyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIEdyZWF0IExha2VzIGFuZCBvdGhlciBBUkMgcmVzb3VyY2VzIGFyZSBhIHF1aWNrIGFuZCBlYXN5IHdheSB0byBnZXQgc3RhcnRlZC4gV2UnbGwgdXNlIHRoZXNlIGluIG91ciB1cGNvbWluZyBleGVyY2lzZXMgdG8gbWFrZSBvdXIgZmlyc3QgZm9yYXkgaW50byB1c2luZyB0aGUgR3JlYXQgTGFrZXMgSFBDLiBBZGRpdGlvbmFsbHksIHRoZSAnSW50ZXJhY3RpdmUgQXBwcycgd2l0aCBBUkMncyBPcGVuIE9uIERlbWFuZCBzZXJ2aWNlIG9mZmVyIGEgdW5pcXVlIHNvbHV0aW9uIGZvciB3aGVuIHdlIG5lZWQgdG8gcnVuIGdyYXBoaWNhbCBhcHBsaWNhdGlvbnMuIFdlJ2xsIHByZXZpZXcgdGhpcyBhbmQgZ2l2ZSBzb21lIHByYWN0aWNhbCB0aXBzIGZvciB1c2luZyB0aGUgUlN0dWRpbyBhbmQgdGhlIEJhc2ljIERlc2t0b3AgYXBwcy4KCjxicj4KClNuZWFrIHByZXZpZXcgb2YgdGhlIHdlYi1iYXNlZCBmaWxlIGJyb3dzZXIKIVtdKGltYWdlcy9Nb2R1bGUwM2FfYWNjZXNzaW5nX3dlYl9iYXNlZF9maWxlX2Jyb3dzZXIucG5nKQohW10oaW1hZ2VzL01vZHVsZTAzYV9wcmV2aWV3X3dlYl9iYXNlZF9maWxlX2Jyb3dzZXIucG5nKQoKPGJyPgoKU25lYWsgcHJldmlldyBvZiB0aGUgd2ViLWJhc2VkIHNoZWxsCiFbXShpbWFnZXMvTW9kdWxlMDNhX2FjY2Vzc2luZ193ZWJfYmFzZWRfc2hlbGwucG5nKQohW10oaW1hZ2VzL01vZHVsZTAzYV9wcmV2aWV3X3dlYl9iYXNlZF9zaGVsbC5wbmcpCgo8YnI+CgpTbmVhayBwcmV2aWV3IG9mIGEgd2ViLWJhc2VkIFJTdHVkaW8gc2Vzc2lvbgohW10oaW1hZ2VzL01vZHVsZTAzYV9hY2Nlc3NpbmdfaW50ZXJhY3RpdmVfcnN0dWRpby5wbmcpCiFbXShpbWFnZXMvTW9kdWxlMDNhX3ByZXZpZXdfaW50ZXJhY3RpdmVfcnN0dWRpby5wbmcpCgo8YnI+CgpTbmVhayBwcmV2aWV3IG9mIGEgd2ViLWJhc2VkIEJhc2ljIERlc2t0b3Agc2Vzc2lvbgohW10oaW1hZ2VzL01vZHVsZTAzYV9hY2Nlc3NpbmdfaW50ZXJhY3RpdmVfYmFzaWNfZGVza3RvcC5wbmcpCiFbXShpbWFnZXMvTW9kdWxlMDNhX3ByZXZpZXdfaW50ZXJhY3RpdmVfYmFzaWNfZGVza3RvcC5wbmcpCgo8YnI+CgojIyBRdWljayBSZXZpZXcgb3IgQ3Jhc2ggQ291cnNlIG9uIHRoZSBOYW5vIEVkaXRvcgoKQmVmb3JlIHdlIGRpdmUgaW50byBzb21lIG9mIHRoZSBleGVyY2lzZXMgaW4gdGhpcyBtb2R1bGUsIHdlIHNob3VsZCBkbyBhIHF1aWNrIHJldmlldyBvciBjcmFzaCBjb3Vyc2Ugb24gdGhlIG5hbm8gdGV4dCBlZGl0b3IsIHdoaWNoIGlzIGEgY29tbWFuZC1saW5lLWJhc2VkIHRleHQgZWRpdG9yLiBJbiBzb21lIG9mIHRoZSB1cGNvbWluZyBleGVyY2lzZXMsIHdlIHdpbGwgYmUgY29ubmVjdGVkIHRvIEdyZWF0IExha2VzIHZpYSB0aGUgd2ViLWJhc2VkIHNoZWxsLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgYmUgbGltaXRlZCB0byB1c2luZyBjb21tYW5kLWxpbmUgdG9vbHMuIER1cmluZyB0aGF0IHRpbWUsIHdlJ2xsIHVzZSBuYW5vIHRvIGVkaXQgUkVBRE1FcyBhbmQgc2NyaXB0IGZpbGVzLiBOYW5vLCBhbG9uZyB3aXRoIG90aGVyIGNvbW1hbmQtbGluZS1iYXNlZCB0ZXh0IGVkaXRvciB0b29scywgdXNlIHRoZSBrZXlib2FyZCBhcyB0aGUgbWFpbiB3YXkgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUgc29mdHdhcmUuIFRoaXMgbWVhbnMgd2Ugd2lsbCB1c2UgdmFyaW91cyBrZXlzdHJva2VzIHRvIGNhcnJ5IG91dCB0YXNrcyBsaWtlIHNhdmluZyB0aGUgZmlsZSBhbmQgZXhpdGluZyB0aGUgdG9vbCwgd2hpY2ggbWF5IHRha2Ugc29tZSBwcmFjdGljZSB0byBnZXQgY29tZm9ydGFibGUgd2l0aC4gVGhhbmtmdWxseSwgbmFubyBpcyByZWxhdGl2ZWx5IGludHVpdGl2ZSBhbmQgZWFzeSB0byB1c2UsIHdoaWNoIGlzIG9uZSByZWFzb24gd2h5IHdlJ3ZlIGNob3NlbiB0byB1c2UgaXQgZm9yIHRoaXMgd29ya3Nob3AuCgpUaGUgYmFzaWMgbGF5b3V0IG9mIHRoZSBuYW5vIGVkaXRvciBpcyBzaG93biBiZWxvdy4gQSBoZWxwZnVsIGxpc3Qgb2YgY29tbW9uIHRhc2tzIGFuZCB0aGVpciBrZXlib2FyZCBzaG9ydGN1dHMgaXMgZm91bmQgYXQgdGhlIGJvdHRvbS4gVGhlIHRpdGxlIGJhciBhbmQgdGhlIHN0YXR1cyBiYXIgcHJvdmlkZSBzb21lIGFkZGl0aW9uYWwgY29udGV4dCBhYm91dCB0aGUgZmlsZSB3ZSdyZSBpbnRlcmFjdGluZyB3aXRoIGFuZCBmZWVkYmFjayBtZXNzYWdlcyBmcm9tIG5hbm8sIHJlc3BlY3RpdmVseS4KCiFbXShpbWFnZXMvTW9kdWxlMDNhX25hbm9fZWRpdG9yX2xheW91dC5wbmcpCgo8YnI+CgojIyBIYW5keSBsaW5rcyBmb3IgR3JlYXQgTGFrZXMKCi0gW0xpbmsgdG8gQVJDJ3MgR3JlYXQgTGFrZXMgb3ZlcnZpZXcgcGFnZV0oaHR0cHM6Ly9hcmMudW1pY2guZWR1L2dyZWF0bGFrZXMvKQotIFtMaW5rIHRvIEdyZWF0IExha2VzIERhc2hib2FyZF0oaHR0cHM6Ly9ncmVhdGxha2VzLmFyYy10cy51bWljaC5lZHUpCgo8YnI+CgojIyBFeGVyY2lzZSAtIFZpZXcgVHJhbnNmZXJyZWQgRmlsZXMKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCB1c2UgdGhlIHdlYi1iYXNlZCBmaWxlIGJyb3dzZXIgdG8gY29uZmlybSB0aGF0IHdlJ3ZlIHRyYW5zZmVycmVkIHRoZSBkYXRhIGZpbGVzIHRvIG91ciB0dXJibyBzcGFjZQoKIyMgRXhlcmNpc2UgLSBDb25uZWN0IHdpdGggdGhlIFdlYi1CYXNlZCBTaGVsbAoKRm9sbG93aW5nIGFsb25nIHdpdGggdGhlIGluc3RydWN0b3IsIHdlJ2xsIHVzZSB0aGUgd2ViLWJhc2VkIHNoZWxsIHRvIGNvbm5lY3QgdG8gR3JlYXQgTGFrZXMuIE9uY2UgdGhlcmUsIHdlJ2xsIHJ1biBhbiBpbnRyb2R1Y3Rvcnkgc2NyaXB0LCBhbmQgdGFrZSBhbm90aGVyIGxvb2sgYXQgb3VyIHRyYW5zZmVycmVkIGZpbGVzLgoKIyMgRXhlcmNpc2UgLSBMYXVuY2ggYW4gUlN0dWRpbyBJbnN0YW5jZSBvbiBPcGVuT25EZW1hbmQKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCB1c2UgT3Blbk9uRGVtYW5kIHRvIGxhdW5jaCBhbiBSU3R1ZGlvIGluc3RhbmNlLiBPbmNlIHRoZXJlLCB3ZSdsbCBydW4gYSBiYXNpYyBSIHNjcmlwdCBhcyBhIHF1aWNrIGRlbW9uc3RyYXRpb24gb2YgdGhlc2UgY2FwYWJpbGl0aWVzLgoKIyMgRXhlcmNpc2UgLSBMYXVuY2ggYSBCYXNpYyBEZXNrdG9wIEluc3RhbmNlIGFuZCBWZXJpZnkgRmlsZSBJbnRlZ3JpdHkKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCB1c2UgT3Blbk9uRGVtYW5kIHRvIGxhdW5jaCBhIEJhc2ljIERlc2t0b3AgaW5zdGFuY2UuIE9uY2UgdGhlcmUsIHdlJ2xsIG9wZW4gYSB0ZXJtaW5hbCBhbmQgdXNlIHRoZSBgbWQ1c3VtYCB1dGlsaXR5IHRvIHZlcmlmeSBmaWxlIGludGVncml0eSBvZiB0aGUgZGF0YSB0aGF0IHdlIHJlY2VudGx5IHRyYW5zZmVycmVkIHRvIG91ciBUdXJibyBsb2NhdGlvbi4KCj5Ob3RlOiBVc2luZyBhbiBPcGVuT25EZW1hbmQgQmFzaWMgRGVza3RvcCBpbnN0YW5jZSBpbiBvcmRlciB0byBydW4gYSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24gY2FuIGJlIGEgYml0IG9mIGFuIG9kZCBwYXR0ZXJuLiBXZSBkbyB0aGlzIGhlcmUgcHJpbWFyaWx5IGFzIGEgbWVhbnMgZm9yIHJlcXVlc3RpbmcgYW5kIHJlY2VpdmluZyB0aGUgcHJvcGVyIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIGZvciB0aGlzIHRhc2suIEluIHRoZSBuZXh0IG1vZHVsZSwgd2UnbGwgbGVhcm4gYWJvdXQgc29tZSBvdGhlciBwYXR0ZXJucyBmb3IgcmVxdWVzdGluZyByZXNvdXJjZXMgYW5kIHJ1bm5pbmcgY29tbWFuZC1saW5lIHV0aWxpdGllcyB3aGljaCBtYXkgYmUgYmV0dGVyIGNob2ljZXMgZ29pbmcgZm9yd2FyZC4KCiMjIEV4ZXJjaXNlIC0gV3JpdGUgYSBSRUFETUUgRmlsZQoKRm9sbG93aW5nIGFsb25nIHdpdGggdGhlIGluc3RydWN0b3IsIHdlIHdpbGwgdXNlIHRoZSBgbmFub2AgdXRpbGl0eSB0byB3cml0ZSB0aGUgYmVnaW5uaW5ncyBvZiBhIFJFQURNRSBmb3Igb3VyIHByb2plY3QgYXMgaXQgZXhpc3RzIHNvIGZhci4KCjxkZXRhaWxzPgo8c3VtbWFyeT5Xcml0ZSBhIFJFQURNRSAtIFNvbHV0aW9uPC9zdW1tYXJ5PgoKYHNvdXJjZSAvbmZzL3R1cmJvL3VtbXMtYmlvaW5mLXdrc2hwL3dvcmtzaG9wL2hvbWUvJHtVU0VSfS9zb3VyY2VfbWVfZm9yX3Nob3J0Y3V0LnR4dGAKCmBjZCAke1dPUktTSE9QX0hPTUV9L3Byb2plY3RfYW5hbHlzaXNgCgpgbmFubyBSRUFETUUudHh0YAoKPC9kZXRhaWxzPgoKIyMgRXhlcmNpc2UgLSBPcmdhbml6ZSB5b3VyIHByb2plY3QKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCBvcmdhbml6ZSB0aGUgZmlsZXMgdGhhdCBhcmUgaW4gb3VyIGAkV09SS1NIT1BfSE9NRWAgZGlyZWN0b3J5LgoKPGRldGFpbHM+CjxzdW1tYXJ5Pk9yZ2FuaXplIFlvdXIgUHJvamVjdCAtIFNvbHV0aW9uPC9zdW1tYXJ5PgoKYGNkICR7V09SS1NIT1BfSE9NRX0vcHJvamVjdF9hbmFseXNpc2AKCmBtdiAwMDQyLVdTIGlucHV0X2JhbXNgCgpgbWtkaXIgbG9nc2AKCmBta2RpciBzY3JpcHRzYAoKPC9kZXRhaWxzPgoKPGJyPgoKIyMgUmV2aWV3CgotIExlYXJuZWQgYWJvdXQgZGlmZmVyZW50IHdheXMgb2YgYWNjZXNzaW5nIHRoZSBHcmVhdCBMYWtlcyBIUEMgY2x1c3RlcgotIEV4cGVyaWVuY2VkIHVzaW5nIHRoZSB3ZWItYmFzZWQgYWNjZXNzIG1ldGhvZHMKICAtIFdpdGggd2ViLWJhc2VkIGZpbGUgYnJvd3NlciwgZXhhbWluZWQgdGhlIGRhdGEgdGhhdCB3ZSBwcmV2aW91c2x5IHRyYW5zZmVycmVkCiAgLSBXaXRoIHdlYi1iYXNlZCBzaGVsbCBhY2Nlc3MsIHdlIHJhbiBhbiBpbnRyb2R1Y3Rvcnkgc2NyaXB0IGFuZCB1c2VkIENMSSBjb21tYW5kcyB0byBleGFtaW5lIHRoZSBkYXRhIHRoYXQgd2UgcHJldmlvdXNseSB0cmFuc2ZlcnJlZAogIC0gV2l0aCBPcGVuT25EZW1hbmQgUlN0dWRpbywgd2UgcmFuIGFuIGludHJvZHVjdG9yeSBSIHNjcmlwdAogIC0gV2l0aCBPcGVuT25EZW1hbmQgQmFzaWMgRGVza3RvcCwgd2UgdmVyaWZpZWQgZmlsZSBpbnRlZ3JpdHkgb2YgZGF0YSB0aGUgd2UgcHJldmlvdXNseSB0cmFuc2ZlcnJlZCwgYW5kIHVzZWQgYG5hbm9gIHRvIHdyaXRlIGEgUkVBRE1FIGZpbGUKCjxicj4KCiMjIyBIYW5keSBMaW5rcwoKLSBbTGluayB0byBBUkMncyBHcmVhdCBMYWtlcyBvdmVydmlldyBwYWdlIChzYW1lIGFzIGFib3ZlKV0oaHR0cHM6Ly9hcmMudW1pY2guZWR1L2dyZWF0bGFrZXMvKQotIFtMaW5rIHRvIEdyZWF0IExha2VzIERhc2hib2FyZCAoc2FtZSBhcyBhYm92ZSldKGh0dHBzOi8vZ3JlYXRsYWtlcy5hcmMtdHMudW1pY2guZWR1KQotIFtsaW5rIGZyb20gQUdDIG9uIHZhbGlkYXRpbmcgZmlsZSBpbnRlZ3JpdHkgdXNpbmcgbWQ1c3VtXShodHRwOi8vbWljaG1lZC5vcmcvYWdjLW1kNXN1bSkKCgp8IFtQcmV2aW91cyBsZXNzb25dKE1vZHVsZTAyX3RyYW5zZmVycmluZ19kYXRhX2dsb2J1cy5odG1sKSB8IFtUb3Agb2YgdGhpcyBsZXNzb25dKCN0b3ApIHwgW05leHQgbGVzc29uXShNb2R1bGUwM2JfZ3JlYXRfbGFrZXNfY2x1c3Rlci5odG1sKSB8CnwgOi0tLSB8IDotLS0tOiB8IC0tLTogfAo=