About
This worksheet includes three main tasks: data modeling (a key step to understand the data), basic steps to compute a simple signal-to-noise ratio, and data exploration to identify trends & patterns using Watson Analytics.
Setup
Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.
Note
For your assignment you may be using different data sets than what is included here. Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color (visible in preview) and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.
Execute all code chunks, preview, publish, and submit link on Sakai.
Task 1: Data Modeling
To begin the Lab, examine the content of the csv file ‘creditrisk.csv’ by opening the file in RStudio. You can view the file separetely in Excel or use File -> Import Dataset in RStudio for that purpose.
##### 1A) Create a simple star relational schema in ERDPlus standalone feature https://erdplus.com/#/standalone, take a screenshot of the image, and add it below. Consider using one fact table for loan, one dimension table for customer profile, and one dimension table for credit risk.
To add a picture, use the directions found in Lab00. Below are steps and an example to create a simple star relational schema in ERDPlus.
Steps to create an star relation schema using erdplus.

From the drop-down option select New Start Schema

Example of how to create an start schema using erdplus

Completed Star schema example
Finally export the diagram as an image.


Task 2: Signal-to-Noise Ratio
Next, read the csv file into R Studio. It can be useful to name your data to create a shortcut to it. Here we will label the data, ‘mydata’. To see the top head data in the console, one can ‘call’ it using the function ‘head’ and referring to it by its given shortcut name.
mydata = read.csv(file="data/creditrisk.csv")
head(mydata)
To capture, or extract, the checking and savings columns and perform some analytics on them, we must first be able to extract the columns from the data separately. Using the ‘$’ sign following the label for the data extracts a specific column. For convenience, we relabel the extracted data. Below, we have extracted the checking column.
#Extracting the Checking Column
checking = mydata$Checking
#Calling the Checking Column to display top head values
head(checking)
[1] 0 0 0 638 963 2827
##### 2A) Repeat here the above code chunk to extract instead the savings column. Be careful to use different variable naming.
#Extranting the Savings Column
Savings = mydata$Savings
#Calling the Savings Column to display top head values
head(Savings)
[1] 739 1230 389 347 4754 0
In order to calculate the mean, or the average by hand of the checking column, one can add each individual row entry and divide by the total number of rows. Thankfully, R has a built-in command for this. We have done an example using the checking column.
#Using the 'mean' function on checking to calculate the checking average and naming the average 'meanChecking'
meanChecking = mean(checking)
#Calling the average
meanChecking
[1] 1048.014
We similarly compute the standard deviation or spread of the checking column
#Computing the standard deviation of checking
spreadChecking = sd(checking)
Now, to compute the SNR, the signal to noise ratio, a formula is created because there is no built in function. SNR is the mean, or average, divided by the spread.
#Compute the snr of Checking and name it snr_Checking
snr_Checking = meanChecking/spreadChecking
#Call snr_Checking
snr_Checking
[1] 0.3330006
##### 2B) Repeat here the above code chunks calculations to derive instead the SNR for the savings column. Watch your variable namings to differentiate the checking calculations from the savings.
#Computing the average of Savings
meanSavings = mean(Savings)
#Computing the standard deviation of checking
spreadSavings = sd(Savings)
#Compute the snr of Savings and name it snr_Savings
snr_Savings = meanSavings/spreadSavings
#Call snr_Savings
snr_Savings
[1] 0.5038695
##### 2C) Of the checking and savings data , which one has a higher SNR? What does it mean in terms of possible data quality?
#Savings data (0.5038695) has a higher SNR than Checking data (0.3330006).
#A higher SNR means that the data has a better quality because the ratio signal to noise is higher (signal/noise = average/spread),ie. there is less "junk" data. The reason is that either the data is less spread in Savings or the mean is higher. In terms of quality data, a higher signal to noise ratio is desirable.
Task 3: Data Trends & Patterns
Login to Watson Analytics https://www.ibm.com/watson-analytics and upload the file creditrisk.csv to your account.
##### 3A) Consider the trend of ‘Months Employed over Age by Gender’. Include a screenshot of your plot. Refer to first lab session lab00 worksheet on how to include a picture. Write a small paragraph sharing your observations on the general data trends and data behavior.
The plot shows the trend of months employed over age by gender. First of all, there is a visual difference between females and males subjects: the line of males employed is generally beyond the females one except in small three cases (24, 28 and 32 years old). So, we could say that above the range of people that asked for a loan, there majority of them are men and all of them have been employed longer than the women who applied for a loan. Thereason for this could lay down on the tendency of the society and the role of women and men. It is also very interesting the fact that all the female that applied for a loan are divorce (coincidence?).
Another trend is that people between 26 to 42 conforms the range of higher months employed. And there are also different picks among this range.
Furthermore, it is not possible to say that there is a correlation between genders or that both genders work the same because in some causes it seems that they have the same direction but this is not right in all the cases.
Analysing this trend could be interesting to analyse the credit risk if make the connexion relating many months employed with, for example, lower risk because the customers employed for longer time are supposed to have more income that a customer who has not been employed, in general terms.
.
LS0tCnRpdGxlOiAiQlNBRDM0MyBGYWxsIDIwMTggTGFiIFdvcmtzaGVldCAwMiIKYXV0aG9yOiAiRWxlbmEgUMOpcmV6IFZlbGFzY28iCmRhdGU6ICIwOS8xNS8xOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CnN1YnRpdGxlOiBEYXRhIE1vZGVsaW5nICYgRXhwbG9yYXRpb24gKGJzYWQtbGFiMDIpCi0tLQoKIyMjIEFib3V0CgpUaGlzIHdvcmtzaGVldCBpbmNsdWRlcyB0aHJlZSBtYWluIHRhc2tzOiBkYXRhIG1vZGVsaW5nIChhIGtleSBzdGVwIHRvIHVuZGVyc3RhbmQgdGhlIGRhdGEpLCBiYXNpYyBzdGVwcyB0byBjb21wdXRlIGEgc2ltcGxlIHNpZ25hbC10by1ub2lzZSByYXRpbywgYW5kIGRhdGEgZXhwbG9yYXRpb24gdG8gaWRlbnRpZnkgdHJlbmRzICYgcGF0dGVybnMgdXNpbmcgV2F0c29uIEFuYWx5dGljcy4KCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkZvciB5b3VyIGFzc2lnbm1lbnQgeW91IG1heSBiZSB1c2luZyBkaWZmZXJlbnQgZGF0YSBzZXRzIHRoYW4gd2hhdCBpcyBpbmNsdWRlZCBoZXJlLiBBbHdheXMgcmVhZCBjYXJlZnVsbHkgdGhlIGluc3RydWN0aW9ucyBvbiBTYWthaS4gIEZvciBjbGFyaXR5LCB0YXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgY29sb3IgKHZpc2libGUgaW4gcHJldmlldykgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4KCkV4ZWN1dGUgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkuCgotLS0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMTogRGF0YSBNb2RlbGluZwoKVG8gYmVnaW4gdGhlIExhYiwgZXhhbWluZSB0aGUgY29udGVudCBvZiB0aGUgY3N2IGZpbGUgJ2NyZWRpdHJpc2suY3N2JyBieSBvcGVuaW5nIHRoZSBmaWxlIGluIFJTdHVkaW8uIFlvdSBjYW4gdmlldyB0aGUgZmlsZSBzZXBhcmV0ZWx5IGluIEV4Y2VsIG9yIHVzZSBGaWxlIC0+IEltcG9ydCBEYXRhc2V0IGluIFJTdHVkaW8gZm9yIHRoYXQgcHVycG9zZS4KCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUEpIENyZWF0ZSBhIHNpbXBsZSBzdGFyIHJlbGF0aW9uYWwgc2NoZW1hIGluIEVSRFBsdXMgc3RhbmRhbG9uZSBmZWF0dXJlIFtodHRwczovL2VyZHBsdXMuY29tLyMvc3RhbmRhbG9uZV0oaHR0cHM6Ly9lcmRwbHVzLmNvbS8jL3N0YW5kYWxvbmUpLCB0YWtlIGEgc2NyZWVuc2hvdCBvZiB0aGUgaW1hZ2UsIGFuZCBhZGQgaXQgYmVsb3cuIENvbnNpZGVyIHVzaW5nIG9uZSBmYWN0IHRhYmxlIGZvciBsb2FuLCBvbmUgZGltZW5zaW9uIHRhYmxlIGZvciBjdXN0b21lciBwcm9maWxlLCBhbmQgb25lIGRpbWVuc2lvbiB0YWJsZSBmb3IgY3JlZGl0IHJpc2suCiA8L3NwYW4+CgpUbyBhZGQgYSBwaWN0dXJlLCB1c2UgdGhlIGRpcmVjdGlvbnMgZm91bmQgaW4gTGFiMDAuIEJlbG93IGFyZSBzdGVwcyBhbmQgYW4gZXhhbXBsZSB0byBjcmVhdGUgYSBzaW1wbGUgc3RhciByZWxhdGlvbmFsIHNjaGVtYSBpbiBFUkRQbHVzLiAKCiMjIyMjIFN0ZXBzIHRvIGNyZWF0ZSBhbiBzdGFyIHJlbGF0aW9uIHNjaGVtYSB1c2luZyBlcmRwbHVzLgoKIVtdKGltZ3MvaW1nMDEucG5nKQoKIyMjIyMgRnJvbSB0aGUgZHJvcC1kb3duIG9wdGlvbiBzZWxlY3QgKipOZXcgU3RhcnQgU2NoZW1hKioKCiFbXShpbWdzL2ltZzAyLnBuZykKCiMjIyMjIEV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhbiBzdGFydCBzY2hlbWEgdXNpbmcgZXJkcGx1cwoKIVtdKGh0dHBzOi8vZXJkcGx1cy5jb20vYXNzZXRzL2ltYWdlcy9TdGFyU2NoZW1hRGVtb1RpbnkuZ2lmKQoKIyMjIyMgQ29tcGxldGVkIFN0YXIgc2NoZW1hIGV4YW1wbGUKCkZpbmFsbHkgZXhwb3J0IHRoZSBkaWFncmFtIGFzIGFuIGltYWdlLgoKIVtdKGltZ3MvaW1nMDMucG5nKQoKIVtdKGltZ3MvaW1nMDQucG5nKQoKIVtMb2FuIFN0YXIgRGlhZ3JhbSAtIENyZWRpdCBSaXNrXShpbWdzL2VyZHBsdXMtZGlhZ3JhbWRlZml0dC5wbmcpIAoKLS0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMjogU2lnbmFsLXRvLU5vaXNlIFJhdGlvCgpOZXh0LCByZWFkIHRoZSBjc3YgZmlsZSBpbnRvIFIgU3R1ZGlvLiBJdCBjYW4gYmUgdXNlZnVsIHRvIG5hbWUgeW91ciBkYXRhIHRvIGNyZWF0ZSBhIHNob3J0Y3V0IHRvIGl0LiBIZXJlIHdlIHdpbGwgbGFiZWwgdGhlIGRhdGEsICdteWRhdGEnLiBUbyBzZWUgdGhlIHRvcCBoZWFkIGRhdGEgaW4gdGhlIGNvbnNvbGUsIG9uZSBjYW4gJ2NhbGwnIGl0IHVzaW5nIHRoZSBmdW5jdGlvbiAnaGVhZCcgYW5kIHJlZmVycmluZyB0byBpdCBieSBpdHMgZ2l2ZW4gc2hvcnRjdXQgbmFtZS4KCmBgYHtyfQpteWRhdGEgPSByZWFkLmNzdihmaWxlPSJkYXRhL2NyZWRpdHJpc2suY3N2IikKaGVhZChteWRhdGEpCmBgYAoKVG8gY2FwdHVyZSwgb3IgZXh0cmFjdCwgdGhlIGNoZWNraW5nIGFuZCBzYXZpbmdzIGNvbHVtbnMgYW5kIHBlcmZvcm0gc29tZSBhbmFseXRpY3Mgb24gdGhlbSwgd2UgbXVzdCBmaXJzdCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhlIGNvbHVtbnMgZnJvbSB0aGUgZGF0YSBzZXBhcmF0ZWx5LiBVc2luZyB0aGUgJyQnIHNpZ24gZm9sbG93aW5nIHRoZSBsYWJlbCBmb3IgdGhlIGRhdGEgZXh0cmFjdHMgYSBzcGVjaWZpYyBjb2x1bW4uIEZvciBjb252ZW5pZW5jZSwgd2UgcmVsYWJlbCB0aGUgZXh0cmFjdGVkIGRhdGEuIEJlbG93LCB3ZSBoYXZlIGV4dHJhY3RlZCB0aGUgY2hlY2tpbmcgY29sdW1uLiAKCmBgYHtyfQojRXh0cmFjdGluZyB0aGUgQ2hlY2tpbmcgQ29sdW1uCmNoZWNraW5nID0gbXlkYXRhJENoZWNraW5nIAoKI0NhbGxpbmcgdGhlIENoZWNraW5nIENvbHVtbiB0byBkaXNwbGF5IHRvcCBoZWFkIHZhbHVlcwpoZWFkKGNoZWNraW5nKQpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQSkgUmVwZWF0IGhlcmUgdGhlIGFib3ZlIGNvZGUgY2h1bmsgdG8gZXh0cmFjdCBpbnN0ZWFkIHRoZSBzYXZpbmdzIGNvbHVtbi4gQmUgY2FyZWZ1bCB0byB1c2UgZGlmZmVyZW50IHZhcmlhYmxlIG5hbWluZy4KPC9zcGFuPgpgYGB7cn0KCiNFeHRyYW50aW5nIHRoZSBTYXZpbmdzIENvbHVtbgpTYXZpbmdzID0gbXlkYXRhJFNhdmluZ3MKCiNDYWxsaW5nIHRoZSBTYXZpbmdzIENvbHVtbiB0byBkaXNwbGF5IHRvcCBoZWFkIHZhbHVlcwpoZWFkKFNhdmluZ3MpCgpgYGAKCgpJbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIG1lYW4sIG9yIHRoZSBhdmVyYWdlIGJ5IGhhbmQgb2YgdGhlIGNoZWNraW5nIGNvbHVtbiwgb25lIGNhbiBhZGQgZWFjaCBpbmRpdmlkdWFsIHJvdyBlbnRyeSBhbmQgZGl2aWRlIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gVGhhbmtmdWxseSwgUiBoYXMgYSBidWlsdC1pbiBjb21tYW5kIGZvciB0aGlzLiBXZSBoYXZlIGRvbmUgYW4gZXhhbXBsZSB1c2luZyB0aGUgY2hlY2tpbmcgY29sdW1uLiAKCmBgYHtyfQojVXNpbmcgdGhlICdtZWFuJyBmdW5jdGlvbiBvbiBjaGVja2luZyB0byBjYWxjdWxhdGUgdGhlIGNoZWNraW5nIGF2ZXJhZ2UgYW5kIG5hbWluZyB0aGUgYXZlcmFnZSAnbWVhbkNoZWNraW5nJwptZWFuQ2hlY2tpbmcgPSBtZWFuKGNoZWNraW5nKQoKI0NhbGxpbmcgdGhlIGF2ZXJhZ2UKbWVhbkNoZWNraW5nCmBgYAoKV2Ugc2ltaWxhcmx5IGNvbXB1dGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvciBzcHJlYWQgb2YgdGhlIGNoZWNraW5nIGNvbHVtbgoKYGBge3J9CiNDb21wdXRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBjaGVja2luZwpzcHJlYWRDaGVja2luZyA9IHNkKGNoZWNraW5nKQpgYGAKCk5vdywgdG8gY29tcHV0ZSB0aGUgU05SLCB0aGUgc2lnbmFsIHRvIG5vaXNlIHJhdGlvLCBhIGZvcm11bGEgaXMgY3JlYXRlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIGJ1aWx0IGluIGZ1bmN0aW9uLiBTTlIgaXMgdGhlIG1lYW4sIG9yIGF2ZXJhZ2UsIGRpdmlkZWQgYnkgdGhlIHNwcmVhZC4gCgpgYGB7cn0KI0NvbXB1dGUgdGhlIHNuciBvZiBDaGVja2luZyBhbmQgbmFtZSBpdCBzbnJfQ2hlY2tpbmcKc25yX0NoZWNraW5nID0gbWVhbkNoZWNraW5nL3NwcmVhZENoZWNraW5nCgojQ2FsbCBzbnJfQ2hlY2tpbmcKc25yX0NoZWNraW5nCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJCKSBSZXBlYXQgaGVyZSB0aGUgYWJvdmUgY29kZSBjaHVua3MgY2FsY3VsYXRpb25zIHRvIGRlcml2ZSBpbnN0ZWFkIHRoZSBTTlIgZm9yIHRoZSBzYXZpbmdzIGNvbHVtbi4gV2F0Y2ggeW91ciB2YXJpYWJsZSBuYW1pbmdzIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNoZWNraW5nIGNhbGN1bGF0aW9ucyBmcm9tIHRoZSBzYXZpbmdzLgo8L3NwYW4+CgpgYGB7cn0KI0NvbXB1dGluZyB0aGUgYXZlcmFnZSBvZiBTYXZpbmdzCm1lYW5TYXZpbmdzID0gbWVhbihTYXZpbmdzKQoKI0NvbXB1dGluZyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGNoZWNraW5nCnNwcmVhZFNhdmluZ3MgPSBzZChTYXZpbmdzKQoKI0NvbXB1dGUgdGhlIHNuciBvZiBTYXZpbmdzIGFuZCBuYW1lIGl0IHNucl9TYXZpbmdzCnNucl9TYXZpbmdzID0gbWVhblNhdmluZ3Mvc3ByZWFkU2F2aW5ncwoKI0NhbGwgc25yX1NhdmluZ3MKc25yX1NhdmluZ3MKYGBgCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJDKSBPZiB0aGUgY2hlY2tpbmcgYW5kIHNhdmluZ3MgZGF0YSAsIHdoaWNoIG9uZSBoYXMgYSBoaWdoZXIgU05SPyBXaGF0IGRvZXMgaXQgbWVhbiBpbiB0ZXJtcyBvZiBwb3NzaWJsZSBkYXRhIHF1YWxpdHk/Cjwvc3Bhbj4KCgpgYGB7cn0KI1NhdmluZ3MgZGF0YSAoMC41MDM4Njk1KSBoYXMgYSBoaWdoZXIgU05SIHRoYW4gQ2hlY2tpbmcgZGF0YSAoMC4zMzMwMDA2KS4gCgojQSBoaWdoZXIgU05SIG1lYW5zIHRoYXQgdGhlIGRhdGEgaGFzIGEgYmV0dGVyIHF1YWxpdHkgYmVjYXVzZSB0aGUgcmF0aW8gc2lnbmFsIHRvIG5vaXNlIGlzIGhpZ2hlciAoc2lnbmFsL25vaXNlID0gYXZlcmFnZS9zcHJlYWQpLGllLiB0aGVyZSBpcyBsZXNzICJqdW5rIiBkYXRhLiBUaGUgcmVhc29uIGlzIHRoYXQgZWl0aGVyIHRoZSBkYXRhIGlzIGxlc3Mgc3ByZWFkIGluIFNhdmluZ3Mgb3IgdGhlIG1lYW4gaXMgaGlnaGVyLiBJbiB0ZXJtcyBvZiBxdWFsaXR5IGRhdGEsIGEgaGlnaGVyIHNpZ25hbCB0byBub2lzZSByYXRpbyBpcyBkZXNpcmFibGUuCmBgYAoKCi0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMzogRGF0YSBUcmVuZHMgJiBQYXR0ZXJucwoKTG9naW4gdG8gIFdhdHNvbiBBbmFseXRpY3MgW2h0dHBzOi8vd3d3LmlibS5jb20vd2F0c29uLWFuYWx5dGljc10oaHR0cHM6Ly93d3cuaWJtLmNvbS93YXRzb24tYW5hbHl0aWNzKSBhbmQgdXBsb2FkIHRoZSBmaWxlIGNyZWRpdHJpc2suY3N2IHRvIHlvdXIgYWNjb3VudC4gCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgM0EpICBDb25zaWRlciB0aGUgdHJlbmQgb2YgJ01vbnRocyBFbXBsb3llZCBvdmVyIEFnZSBieSBHZW5kZXInLiBJbmNsdWRlIGEgc2NyZWVuc2hvdCBvZiB5b3VyIHBsb3QuIFJlZmVyIHRvIGZpcnN0IGxhYiBzZXNzaW9uIGxhYjAwIHdvcmtzaGVldCBvbiBob3cgdG8gaW5jbHVkZSBhIHBpY3R1cmUuIFdyaXRlIGEgc21hbGwgcGFyYWdyYXBoIHNoYXJpbmcgeW91ciBvYnNlcnZhdGlvbnMgb24gdGhlIGdlbmVyYWwgZGF0YSB0cmVuZHMgYW5kIGRhdGEgYmVoYXZpb3IuIAo8L3NwYW4+CgohW1RyZW5kIG9mIG1vbnRocyBlbXBsb3llZCBvdmVyIGFnZSBieSBnZW5kZXIuXShpbWdzL3Bsb3R3YXRzb24ucG5nKQoKCgpUaGUgcGxvdCBzaG93cyB0aGUgdHJlbmQgb2YgbW9udGhzIGVtcGxveWVkIG92ZXIgYWdlIGJ5IGdlbmRlci4gRmlyc3Qgb2YgYWxsLCB0aGVyZSBpcyBhIHZpc3VhbCBkaWZmZXJlbmNlIGJldHdlZW4gZmVtYWxlcyBhbmQgbWFsZXMgc3ViamVjdHM6IHRoZSBsaW5lIG9mIG1hbGVzIGVtcGxveWVkIGlzIGdlbmVyYWxseSBiZXlvbmQgdGhlIGZlbWFsZXMgb25lIGV4Y2VwdCBpbiBzbWFsbCB0aHJlZSBjYXNlcyAoMjQsIDI4IGFuZCAzMiB5ZWFycyBvbGQpLiBTbywgd2UgY291bGQgc2F5IHRoYXQgYWJvdmUgdGhlIHJhbmdlIG9mIHBlb3BsZSB0aGF0IGFza2VkIGZvciBhIGxvYW4sIHRoZXJlIG1ham9yaXR5IG9mIHRoZW0gYXJlIG1lbiBhbmQgYWxsIG9mIHRoZW0gaGF2ZSBiZWVuIGVtcGxveWVkIGxvbmdlciB0aGFuIHRoZSB3b21lbiB3aG8gYXBwbGllZCBmb3IgYSBsb2FuLiBUaGVyZWFzb24gZm9yIHRoaXMgY291bGQgbGF5IGRvd24gb24gdGhlIHRlbmRlbmN5IG9mIHRoZSBzb2NpZXR5IGFuZCB0aGUgcm9sZSBvZiB3b21lbiBhbmQgbWVuLiBJdCBpcyBhbHNvIHZlcnkgaW50ZXJlc3RpbmcgdGhlIGZhY3QgdGhhdCBhbGwgdGhlIGZlbWFsZSB0aGF0IGFwcGxpZWQgZm9yIGEgbG9hbiBhcmUgZGl2b3JjZSAoY29pbmNpZGVuY2U/KS4gCgpBbm90aGVyIHRyZW5kIGlzIHRoYXQgcGVvcGxlIGJldHdlZW4gMjYgdG8gNDIgY29uZm9ybXMgdGhlIHJhbmdlIG9mIGhpZ2hlciBtb250aHMgZW1wbG95ZWQuIEFuZCB0aGVyZSBhcmUgYWxzbyBkaWZmZXJlbnQgcGlja3MgYW1vbmcgdGhpcyByYW5nZS4gCgpGdXJ0aGVybW9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNheSB0aGF0IHRoZXJlIGlzIGEgY29ycmVsYXRpb24gYmV0d2VlbiBnZW5kZXJzIG9yIHRoYXQgYm90aCBnZW5kZXJzIHdvcmsgdGhlIHNhbWUgYmVjYXVzZSBpbiBzb21lIGNhdXNlcyBpdCBzZWVtcyB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZSBkaXJlY3Rpb24gYnV0IHRoaXMgaXMgbm90IHJpZ2h0IGluIGFsbCB0aGUgY2FzZXMuIAoKQW5hbHlzaW5nIHRoaXMgdHJlbmQgY291bGQgYmUgaW50ZXJlc3RpbmcgdG8gYW5hbHlzZSB0aGUgY3JlZGl0IHJpc2sgaWYgbWFrZSB0aGUgY29ubmV4aW9uIHJlbGF0aW5nIG1hbnkgbW9udGhzIGVtcGxveWVkIHdpdGgsIGZvciBleGFtcGxlLCBsb3dlciByaXNrIGJlY2F1c2UgdGhlIGN1c3RvbWVycyBlbXBsb3llZCBmb3IgbG9uZ2VyIHRpbWUgYXJlIHN1cHBvc2VkIHRvIGhhdmUgbW9yZSBpbmNvbWUgdGhhdCBhIGN1c3RvbWVyIHdobyBoYXMgbm90IGJlZW4gZW1wbG95ZWQsIGluIGdlbmVyYWwgdGVybXMuIAoKCgoKLgoK