Introduction
Practice SQL with the following SQLite database orgdb.db created with the script orgdb-creation.sql. You can either download and run the script and and then connect to it from R (or any other language) or download the already created database and connect to it. By using the script you learn how to create new databases (often used for creating testing and development databases).
The script has been tested in SQLite but should work with no or minor modifications also on MySQL, SQL Server, and Oracle. To write the SQL queries you can use a query console or embed the queries into {sql}
code chunks in an R Notebook – of course, after creating and then connecting to the database.
To connect to the database (once you have created or downloaded it) and execute the queries, use this R Notebook: orgdb-starter.Rmd. Of course, you can also run the queries from a query console.
Solving practice questions is the fastest way to learn any subject. The same is true for SQL. You learn SQL by doing; by writing lots of queries. So, build the queries yourself; don’t look at the solution right away. That way you will master SQL quickly.
Data Model: ERD
To create complex queries and joins, you will need a data model; if none is provided you must create one. So, inspect the database (or the database creation script) and build an ERD to help you with the queries. Alternatively, you can use a tool such as TOAD, ERwin, MySQL Workbench, or even LucidChart to build an ERD automatically.
OrgDB ERD
Practice Queries
- Retrieve the last names of all workers under the new column name LastName.
- Retrieve the first names of all workers in upper case.
- Retrieve the names of all departments without duplicates.
- Retrieve the first three characters of all last names of all workers.
- Which worker’s last names end with the character ‘a’?
- Retrieve the first names of all workers and remove any potential leading whitespace (Hint: use
ltrim()
).
- Assume that some department names have trailing whitespace. Retrieve the unique names of all departments with any trailing whitespace removed.
- Write an SQL query to list the FIRST_NAME and LAST_NAME from the Worker table into a single column COMPLETE_NAME in the form last, first, e.g., Patel, Vivek. (Hint: SQLite does not support the concat() function; instead it uses the || operator).
- Retrieve all Worker information sorted by LAST_NAME in ascending order.
- Retrieve the details for all workers with the first name of “Vipul” or “Satish”.
- Retrieve the details for all workers that do not have the first name of either “Vipul” or “Satish”.
- Which workers have a salary between 100,000 and 500,000? List their last name, first name, and salary in thousands (e.g., 100 rather than 100,000), in that order.
- How many workers have a last name that starts with ‘S’?
- Which employees joined the company in February 2014? Note that SQLite does not support the year() and month() SQL functions but does have a strftime() function. See How to Extract the Day, Month, and Year from a Date in SQLite. Or use the substr() function (See Substrings in SQLite)
- How many employees work in the department ‘Admin’?
- How many workers work for each department? List the department and number of workers in the descending order of numbers.
- List the first and last name of all workers who are managers.
- Retrieve the first five records (rows) from the Worker table sorted by salary from highest to smallest.
- Which employees have the same salary? List their last name and salary.
- Which departments that have fewer than three people in it?
- Which employees have the highest salary in each department?
- What is the total salary paid out to all employees for each department?
- Who are the employees who earn the highest salary?
- Who are the employees who earn below the average salary?
Solutions
The solutions can be found in orgdb-sql-solutions.Rmd. Of course, only look after you have exerted diligent effort in solving the queries.
To download the solution, you need to save the .Rmd file by right clicking on the link.
Disconnect from database
## Warning in connection_release(conn@ptr): Already disconnected
Conclusion
This tutorial explained the most common SQL query structures using examples.
References
Agarwal, M. (n.d.) 50 SQL Query Questions You Should Practice for Interview. link
Errata
None collected yet. Let us know.
LS0tCnRpdGxlOiAiUHJhY3RpY2UgUXVlcmllcyBmb3IgU1FMIElJIgpwYXJhbXM6CiAgY2F0ZWdvcnk6IDcwCiAgbnVtYmVyOiAxMTAKICB0aW1lOiA0NQogIGxldmVsOiBiZWdpbm5lcgogIHRhZ3M6ICJzcWwsam9pbnMsZ3JvdXAgYnkiCiAgZGVzY3JpcHRpb246ICJNb3JlIGV4YW1wbGVzIHRvIGV4cGxhaW4gdGhlIGJhc2ljIHF1ZXJ5IHN0cnVjdHVyZSBvZiBTUUwKICAgICAgICAgICAgICAgIGFuZCB0aGUgbW9zdCBjb21tb24gdHlwZXMgb2YgcXVlcmllcy4gRGVtb25zdHJhdGVzIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgZnJvbSBhIHNpbmdsZSB0YWJsZSwgYWxpYXNlcywgZmlsdGVyaW5nIHdpdGggV0hFUkUsIGlubmVyIGpvaW5zLAogICAgICAgICAgICAgICAgZ3JvdXBpbmcgd2l0aCBHUk9VUCBCWSwgYW5kIGFnZ3JlZ2F0aW9uLiIKZGF0ZTogIjxzbWFsbD5gciBTeXMuRGF0ZSgpYDwvc21hbGw+IgphdXRob3I6ICI8c21hbGw+TWFydGluIFNjaGVkbGJhdWVyPC9zbWFsbD4iCmVtYWlsOiAibS5zY2hlZGxiYXVlckBuZXUuZWR1IgphZmZpbGl0YXRpb246ICJOb3J0aGVhc3Rlcm4gVW5pdmVyc2l0eSIKb3V0cHV0OiAKICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IHNwYWNlbGFiCiAgICBoaWdobGlnaHQ6IHRhbmdvCi0tLQoKLS0tCnRpdGxlOiAiPHNtYWxsPmByIHBhcmFtcyRjYXRlZ29yeWAuYHIgcGFyYW1zJG51bWJlcmA8L3NtYWxsPjxici8+PHNwYW4gc3R5bGU9J2NvbG9yOiAjMkU0MDUzOyBmb250LXNpemU6IDAuOWVtJz5gciBybWFya2Rvd246Om1ldGFkYXRhJHRpdGxlYDwvc3Bhbj4iCi0tLQoKYGBge3IgY29kZT14ZnVuOjpyZWFkX3V0ZjgocGFzdGUwKGhlcmU6OmhlcmUoKSwnL1IvX2luc2VydDJEQi5SJykpLCBpbmNsdWRlID0gRkFMU0V9CmBgYAoKIyMgSW50cm9kdWN0aW9uCgpQcmFjdGljZSBTUUwgd2l0aCB0aGUgZm9sbG93aW5nIFNRTGl0ZSBkYXRhYmFzZSBbb3JnZGIuZGJdKG9yZ2RiLmRiKSBjcmVhdGVkIHdpdGggdGhlIHNjcmlwdCBbb3JnZGItY3JlYXRpb24uc3FsXShvcmdkYi1jcmVhdGlvbi5zcWwpLiBZb3UgY2FuIGVpdGhlciBkb3dubG9hZCBhbmQgcnVuIHRoZSBzY3JpcHQgYW5kIGFuZCB0aGVuIGNvbm5lY3QgdG8gaXQgZnJvbSBSIChvciBhbnkgb3RoZXIgbGFuZ3VhZ2UpIG9yIGRvd25sb2FkIHRoZSBhbHJlYWR5IGNyZWF0ZWQgZGF0YWJhc2UgYW5kIGNvbm5lY3QgdG8gaXQuIEJ5IHVzaW5nIHRoZSBzY3JpcHQgeW91IGxlYXJuIGhvdyB0byBjcmVhdGUgbmV3IGRhdGFiYXNlcyAob2Z0ZW4gdXNlZCBmb3IgY3JlYXRpbmcgdGVzdGluZyBhbmQgZGV2ZWxvcG1lbnQgZGF0YWJhc2VzKS4KClRoZSBzY3JpcHQgaGFzIGJlZW4gdGVzdGVkIGluIFtTUUxpdGVdKGh0dHA6Ly9zcWxpdGUub3JnJTVEKSBidXQgc2hvdWxkIHdvcmsgd2l0aCBubyBvciBtaW5vciBtb2RpZmljYXRpb25zIGFsc28gb24gTXlTUUwsIFNRTCBTZXJ2ZXIsIGFuZCBPcmFjbGUuIFRvIHdyaXRlIHRoZSBTUUwgcXVlcmllcyB5b3UgY2FuIHVzZSBhIHF1ZXJ5IGNvbnNvbGUgb3IgZW1iZWQgdGhlIHF1ZXJpZXMgaW50byA8Y29kZT57c3FsfTwvY29kZT4gY29kZSBjaHVua3MgaW4gYW4gUiBOb3RlYm9vayAtLSBvZiBjb3Vyc2UsIGFmdGVyIGNyZWF0aW5nIGFuZCB0aGVuIGNvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlLgoKVG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UgKG9uY2UgeW91IGhhdmUgY3JlYXRlZCBvciBkb3dubG9hZGVkIGl0KSBhbmQgZXhlY3V0ZSB0aGUgcXVlcmllcywgdXNlIHRoaXMgUiBOb3RlYm9vazogW29yZ2RiLXN0YXJ0ZXIuUm1kXShvcmdkYi1zdGFydGVyLlJtZCkuIE9mIGNvdXJzZSwgeW91IGNhbiBhbHNvIHJ1biB0aGUgcXVlcmllcyBmcm9tIGEgcXVlcnkgY29uc29sZS4KClNvbHZpbmcgcHJhY3RpY2UgcXVlc3Rpb25zIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBsZWFybiBhbnkgc3ViamVjdC4gVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgU1FMLiBZb3UgbGVhcm4gU1FMIGJ5IGRvaW5nOyBieSB3cml0aW5nIGxvdHMgb2YgcXVlcmllcy4gU28sIGJ1aWxkIHRoZSBxdWVyaWVzIHlvdXJzZWxmOyBkb24ndCBsb29rIGF0IHRoZSBzb2x1dGlvbiByaWdodCBhd2F5LiBUaGF0IHdheSB5b3Ugd2lsbCBtYXN0ZXIgU1FMIHF1aWNrbHkuCgojIyBEYXRhIE1vZGVsOiBFUkQKClRvIGNyZWF0ZSBjb21wbGV4IHF1ZXJpZXMgYW5kIGpvaW5zLCB5b3Ugd2lsbCBuZWVkIGEgZGF0YSBtb2RlbDsgaWYgbm9uZSBpcyBwcm92aWRlZCB5b3UgbXVzdCBjcmVhdGUgb25lLiBTbywgaW5zcGVjdCB0aGUgZGF0YWJhc2UgKG9yIHRoZSBkYXRhYmFzZSBjcmVhdGlvbiBzY3JpcHQpIGFuZCBidWlsZCBhbiBFUkQgdG8gaGVscCB5b3Ugd2l0aCB0aGUgcXVlcmllcy4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgYSB0b29sIHN1Y2ggYXMgVE9BRCwgRVJ3aW4sIE15U1FMIFdvcmtiZW5jaCwgb3IgZXZlbiBMdWNpZENoYXJ0IHRvIGJ1aWxkIGFuIEVSRCBhdXRvbWF0aWNhbGx5LgoKIVtPcmdEQiBFUkRdKG9yZ2RiLWVyZC5qcGVnKXt3aWR0aD0iNTAlIn0KCiMjIFByYWN0aWNlIFF1ZXJpZXMKCjEuICBSZXRyaWV2ZSB0aGUgbGFzdCBuYW1lcyBvZiBhbGwgd29ya2VycyB1bmRlciB0aGUgbmV3IGNvbHVtbiBuYW1lIExhc3ROYW1lLgoyLiAgUmV0cmlldmUgdGhlIGZpcnN0IG5hbWVzIG9mIGFsbCB3b3JrZXJzIGluIHVwcGVyIGNhc2UuCjMuICBSZXRyaWV2ZSB0aGUgbmFtZXMgb2YgYWxsIGRlcGFydG1lbnRzIHdpdGhvdXQgZHVwbGljYXRlcy4KNC4gIFJldHJpZXZlIHRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIG9mIGFsbCBsYXN0IG5hbWVzIG9mIGFsbCB3b3JrZXJzLgo1LiAgV2hpY2ggd29ya2VyJ3MgbGFzdCBuYW1lcyBlbmQgd2l0aCB0aGUgY2hhcmFjdGVyICdhJz8KNi4gIFJldHJpZXZlIHRoZSBmaXJzdCBuYW1lcyBvZiBhbGwgd29ya2VycyBhbmQgcmVtb3ZlIGFueSBwb3RlbnRpYWwgbGVhZGluZyB3aGl0ZXNwYWNlIChIaW50OiB1c2UgPGNvZGU+bHRyaW0oKTwvY29kZT4pLgo3LiAgQXNzdW1lIHRoYXQgc29tZSBkZXBhcnRtZW50IG5hbWVzIGhhdmUgdHJhaWxpbmcgd2hpdGVzcGFjZS4gUmV0cmlldmUgdGhlIHVuaXF1ZSBuYW1lcyBvZiBhbGwgZGVwYXJ0bWVudHMgd2l0aCBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLgo4LiAgV3JpdGUgYW4gU1FMIHF1ZXJ5IHRvIGxpc3QgdGhlIEZJUlNUX05BTUUgYW5kIExBU1RfTkFNRSBmcm9tIHRoZSBXb3JrZXIgdGFibGUgaW50byBhIHNpbmdsZSBjb2x1bW4gQ09NUExFVEVfTkFNRSBpbiB0aGUgZm9ybSBsYXN0LCBmaXJzdCwgZS5nLiwgUGF0ZWwsIFZpdmVrLiAoSGludDogU1FMaXRlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvbmNhdCgpIGZ1bmN0aW9uOyBpbnN0ZWFkIGl0IHVzZXMgdGhlIFx8XHwgb3BlcmF0b3IpLgo5LiAgUmV0cmlldmUgYWxsIFdvcmtlciBpbmZvcm1hdGlvbiBzb3J0ZWQgYnkgTEFTVF9OQU1FIGluIGFzY2VuZGluZyBvcmRlci4KMTAuIFJldHJpZXZlIHRoZSBkZXRhaWxzIGZvciBhbGwgd29ya2VycyB3aXRoIHRoZSBmaXJzdCBuYW1lIG9mICJWaXB1bCIgb3IgIlNhdGlzaCIuCjExLiBSZXRyaWV2ZSB0aGUgZGV0YWlscyBmb3IgYWxsIHdvcmtlcnMgdGhhdCBkbyBub3QgaGF2ZSB0aGUgZmlyc3QgbmFtZSBvZiBlaXRoZXIgIlZpcHVsIiBvciAiU2F0aXNoIi4KMTIuIFdoaWNoIHdvcmtlcnMgaGF2ZSBhIHNhbGFyeSBiZXR3ZWVuIDEwMCwwMDAgYW5kIDUwMCwwMDA/IExpc3QgdGhlaXIgbGFzdCBuYW1lLCBmaXJzdCBuYW1lLCBhbmQgc2FsYXJ5IGluIHRob3VzYW5kcyAoZS5nLiwgMTAwIHJhdGhlciB0aGFuIDEwMCwwMDApLCBpbiB0aGF0IG9yZGVyLgoxMy4gSG93IG1hbnkgd29ya2VycyBoYXZlIGEgbGFzdCBuYW1lIHRoYXQgc3RhcnRzIHdpdGggJ1MnPwoxNC4gV2hpY2ggZW1wbG95ZWVzIGpvaW5lZCB0aGUgY29tcGFueSBpbiBGZWJydWFyeSAyMDE0PyBOb3RlIHRoYXQgU1FMaXRlIGRvZXMgbm90IHN1cHBvcnQgdGhlIHllYXIoKSBhbmQgbW9udGgoKSBTUUwgZnVuY3Rpb25zIGJ1dCBkb2VzIGhhdmUgYSBzdHJmdGltZSgpIGZ1bmN0aW9uLiBTZWUgW0hvdyB0byBFeHRyYWN0IHRoZSBEYXksIE1vbnRoLCBhbmQgWWVhciBmcm9tIGEgRGF0ZSBpbiBTUUxpdGVdKGh0dHBzOi8vZGF0YWJhc2UuZ3VpZGUvaG93LXRvLWV4dHJhY3QtdGhlLWRheS1tb250aC1hbmQteWVhci1mcm9tLWEtZGF0ZS1pbi1zcWxpdGUvKS4gT3IgdXNlIHRoZSBzdWJzdHIoKSBmdW5jdGlvbiAoU2VlIFtTdWJzdHJpbmdzIGluIFNRTGl0ZV0oaHR0cHM6Ly93d3cuc3FsaXRldHV0b3JpYWwubmV0L3NxbGl0ZS1mdW5jdGlvbnMvc3FsaXRlLXN1YnN0ci8pKQoxNS4gSG93IG1hbnkgZW1wbG95ZWVzIHdvcmsgaW4gdGhlIGRlcGFydG1lbnQgJ0FkbWluJz8KMTYuIEhvdyBtYW55IHdvcmtlcnMgd29yayBmb3IgZWFjaCBkZXBhcnRtZW50PyBMaXN0IHRoZSBkZXBhcnRtZW50IGFuZCBudW1iZXIgb2Ygd29ya2VycyBpbiB0aGUgZGVzY2VuZGluZyBvcmRlciBvZiBudW1iZXJzLgoxNy4gTGlzdCB0aGUgZmlyc3QgYW5kIGxhc3QgbmFtZSBvZiBhbGwgd29ya2VycyB3aG8gYXJlIG1hbmFnZXJzLgoxOC4gUmV0cmlldmUgdGhlIGZpcnN0IGZpdmUgcmVjb3JkcyAocm93cykgZnJvbSB0aGUgV29ya2VyIHRhYmxlIHNvcnRlZCBieSBzYWxhcnkgZnJvbSBoaWdoZXN0IHRvIHNtYWxsZXN0LgoxOS4gV2hpY2ggZW1wbG95ZWVzIGhhdmUgdGhlIHNhbWUgc2FsYXJ5PyBMaXN0IHRoZWlyIGxhc3QgbmFtZSBhbmQgc2FsYXJ5LgoyMC4gV2hpY2ggZGVwYXJ0bWVudHMgdGhhdCBoYXZlIGZld2VyIHRoYW4gdGhyZWUgcGVvcGxlIGluIGl0PwoyMS4gV2hpY2ggZW1wbG95ZWVzIGhhdmUgdGhlIGhpZ2hlc3Qgc2FsYXJ5IGluIGVhY2ggZGVwYXJ0bWVudD8KMjIuIFdoYXQgaXMgdGhlIHRvdGFsIHNhbGFyeSBwYWlkIG91dCB0byBhbGwgZW1wbG95ZWVzIGZvciBlYWNoIGRlcGFydG1lbnQ/CjIzLiBXaG8gYXJlIHRoZSBlbXBsb3llZXMgd2hvIGVhcm4gdGhlIGhpZ2hlc3Qgc2FsYXJ5PwoyNC4gV2hvIGFyZSB0aGUgZW1wbG95ZWVzIHdobyBlYXJuIGJlbG93IHRoZSBhdmVyYWdlIHNhbGFyeT8KCiMjIFNvbHV0aW9ucwoKVGhlIHNvbHV0aW9ucyBjYW4gYmUgZm91bmQgaW4gW29yZ2RiLXNxbC1zb2x1dGlvbnMuUm1kXShvcmdkYi1zcWwtc29sdXRpb25zLlJtZCkuIE9mIGNvdXJzZSwgb25seSBsb29rIGFmdGVyIHlvdSBoYXZlIGV4ZXJ0ZWQgZGlsaWdlbnQgZWZmb3J0IGluIHNvbHZpbmcgdGhlIHF1ZXJpZXMuCgpUbyBkb3dubG9hZCB0aGUgc29sdXRpb24sIHlvdSBuZWVkIHRvIHNhdmUgdGhlICouUm1kKiBmaWxlIGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBsaW5rLgoKIyMgRGlzY29ubmVjdCBmcm9tIGRhdGFiYXNlCgpgYGB7cn0KZGJEaXNjb25uZWN0KGRiY29uKQpgYGAKCiMjIENvbmNsdXNpb24KClRoaXMgdHV0b3JpYWwgZXhwbGFpbmVkIHRoZSBtb3N0IGNvbW1vbiBTUUwgcXVlcnkgc3RydWN0dXJlcyB1c2luZyBleGFtcGxlcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgRmlsZXMgJiBSZXNvdXJjZXMKCmBgYHtyIHppcEZpbGVzLCBlY2hvPUZBTFNFfQp6aXBOYW1lID0gc3ByaW50ZigiTGVzc29uRmlsZXMtJXMtJXMuemlwIiwgCiAgICAgICAgICAgICAgICAgcGFyYW1zJGNhdGVnb3J5LAogICAgICAgICAgICAgICAgIHBhcmFtcyRudW1iZXIpCgp0ZXh0QUxpbmsgPSBwYXN0ZTAoIkFsbCBGaWxlcyBmb3IgTGVzc29uICIsIAogICAgICAgICAgICAgICBwYXJhbXMkY2F0ZWdvcnksIi4iLHBhcmFtcyRudW1iZXIpCgojIGRvd25sb2FkRmlsZXNMaW5rKCkgaXMgaW5jbHVkZWQgZnJvbSBfaW5zZXJ0MkRCLlIKa25pdHI6OnJhd19odG1sKGRvd25sb2FkRmlsZXNMaW5rKCIuIiwgemlwTmFtZSwgdGV4dEFMaW5rKSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIFJlZmVyZW5jZXMKCkFnYXJ3YWwsIE0uIChuLmQuKSA1MCBTUUwgUXVlcnkgUXVlc3Rpb25zIFlvdSBTaG91bGQgUHJhY3RpY2UgZm9yIEludGVydmlldy4gW2xpbmtdKGh0dHBzOi8vd3d3LnRlY2hiZWFtZXJzLmNvbS9zcWwtcXVlcnktcXVlc3Rpb25zLWFuc3dlcnMtZm9yLXByYWN0aWNlLykKCiMjIEVycmF0YQoKTm9uZSBjb2xsZWN0ZWQgeWV0LiBMZXQgdXMga25vdy4KCmBgYHs9aHRtbH0KPHNjcmlwdCBzcmM9Imh0dHBzOi8vZm9ybS5qb3Rmb3JtLmNvbS9zdGF0aWMvZmVlZGJhY2syLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIG5ldyBKb3Rmb3JtRmVlZGJhY2soewogICAgZm9ybUlkOiAiMjEyMTg3MDcyNzg0MTU3IiwKICAgIGJ1dHRvblRleHQ6ICJGZWVkYmFjayIsCiAgICBiYXNlOiAiaHR0cHM6Ly9mb3JtLmpvdGZvcm0uY29tLyIsCiAgICBiYWNrZ3JvdW5kOiAiI0Y1OTIwMiIsCiAgICBmb250Q29sb3I6ICIjRkZGRkZGIiwKICAgIGJ1dHRvblNpZGU6ICJsZWZ0IiwKICAgIGJ1dHRvbkFsaWduOiAiY2VudGVyIiwKICAgIHR5cGU6IGZhbHNlLAogICAgd2lkdGg6IDcwMCwKICAgIGhlaWdodDogNTAwLAogICAgaXNDYXJkRm9ybTogZmFsc2UKICB9KTsKPC9zY3JpcHQ+CmBgYApgYGB7ciBjb2RlPXhmdW46OnJlYWRfdXRmOChwYXN0ZTAoaGVyZTo6aGVyZSgpLCcvUi9fZGVwbG95S25pdC5SJykpLCBpbmNsdWRlID0gRkFMU0V9CmBgYAo=