Goal:
Give an idea about the set of distance learning classes currently offered at Austin Community College (ACC). This is done in several steps:
Step 1:
Scrapped ACC’s distance learning webpage in order to acquire:
- The broad categories of subjects that are being taught and
- The complete list of courses offered.
trimws(cat[5],which=c("both"))
Categories <- cat[-c(1,5, 10, 12,14,37,60)] # subseting the rows that were incorrectly scraped
#categClean <- gsub("\r\n\tAre you a new student and interested in our programs and trying to register for classes? If so please visit our website to learn more about our program http://www.austincc.edu/tcm Also, schedule an appointment to meet with the Departmental Advisor at davidm@austincc.edu.
#\r\n\t","",categClean) # and a last one from row 11
##\r\n\tSocial Media Communication: Degree & Certificate Courses
#View(categClean)
Categories <- gsub("[\r\n\t]","",Categories)
Findings:
There are approximately 55 course categories that are being currently offered.The complete list of categories in alphabetical order can be seen here (by clicking on the Next button you can see all the categories):
#NEED TO MAKE IT WORK
categClean2 <- as.data.frame(Categories)
categClean2
#Categories <- as.data.frame(categClean2)
#Categories
Step 2:
Taking the exploration one step further, ACC’s website is scrapped in more detail once again.
#### Scraping the courses with their (sub)-sections
acc <- html('http://www6.austincc.edu/schedule/index.php?op=browse&opclass=ViewSched_location&term=218S000&ct=CC&locationid=DIL&reporting_year=2018',
options="HUGE")
classes <- acc%>%
html_nodes("h4 a")%>%
html_text()
#classes
head(classes)
# writing this to an excel file so I have a stored dataset
#write.table(classes, file="classes.csv",sep=",",row.names=F) # exported the data under the name registration.csv
# Importing the dataset - it is included in the zip folder under the name registration.csv
registration <- read.csv("/Users/Zenodrakos/Workspaces/R_workspace/SampleProjects/Projects/registration.csv")
Findings:
There are about 430 different courses with a total of 754 course sections. The maximum number of sections that a course has is 11 and that is “English Composition II”.
class_with_most_sections$course_name
d3 <- as.data.frame(final %>%
group_by (course_name,id) %>%
summarise(total_enrolled= sum(enrolled),total_capacity = sum(class_size)))
View(d3)
# d4= d3 but sorted from largest total enrolment to smallest total enrolment
d4 <- d3[order(-d3$total_enrolled),]
View(d4) #
The top 10% courses (= 43 courses) with the highest total-across all sections student enrolment can be found below (by clicking on the Next button you can see all 43 courses with the highest enrollment):
#keeping the top 10% or the 43 classes with the most registered students in total
head(d4,n=430*10/100)
s <- head(d4,n=430*10/100)
I am plotting the first 12 courses with respect to total enrollment, by displaying for each the total enrolment and the total capacity:
d3a <- head(d3[order(d3$total_capacity, decreasing = T),], 15)
d3.plottable <- d3a[, c(1,3,4)]
d3.plottable <- melt(d3.plottable, id.vars = "course_name")
library(ggplot2)
g <- ggplot(d3.plottable, aes(x = course_name, y = value))
g <- g + geom_bar(aes(fill = variable), position = position_dodge(), stat = "identity") +
coord_flip() + theme(legend.position = "top")
g <- g + labs(x = "Course Name")
g <- g+ labs(y = "Number of Students")
g

#g <- g + labs(x = "Number of students")
#p2 <- p2 + labs(y = "Units")
#p2 <- p2 + labs(title = "Number of transactional units by Category")
#p2
LS0tCnRpdGxlOiAiUHJvamVjdCAxOiBBQ0MgRGlzdGFuY2UgTGVhcm5pbmciCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkocnZlc3QpCiNsaWJyYXJ5KHN0cmluZ3IpCnNldHdkKCcvVXNlcnMvWmVub2RyYWtvcy9Xb3Jrc3BhY2VzL1Jfd29ya3NwYWNlL1NhbXBsZVByb2plY3RzL1Byb2plY3RzJykKYGBgCgojI0dvYWw6CkdpdmUgYW4gaWRlYSBhYm91dCB0aGUgc2V0IG9mIGRpc3RhbmNlIGxlYXJuaW5nIGNsYXNzZXMgY3VycmVudGx5IG9mZmVyZWQgYXQgQXVzdGluIENvbW11bml0eSBDb2xsZWdlIChBQ0MpLgpUaGlzIGlzIGRvbmUgaW4gc2V2ZXJhbCBzdGVwczoKCiMjIyNTdGVwIDE6ClNjcmFwcGVkIEFDQydzIGRpc3RhbmNlIGxlYXJuaW5nIHdlYnBhZ2UgaW4gb3JkZXIgdG8gYWNxdWlyZToKCjEpIFRoZSBicm9hZCBjYXRlZ29yaWVzIG9mIHN1YmplY3RzIHRoYXQgYXJlIGJlaW5nIHRhdWdodCBhbmQgCjIpIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGNvdXJzZXMgb2ZmZXJlZC4KCmBgYHtyLHJlc3VsdHM9ImhpZGUifQojIFNjcmFwaW5nIHRoZSBicm9hZCBjYXRlZ29yaWVzIAphY2MyIDwtIHJlYWRfaHRtbCgnaHR0cDovL3d3dzYuYXVzdGluY2MuZWR1L3NjaGVkdWxlL2luZGV4LnBocD9vcD1icm93c2Umb3BjbGFzcz1WaWV3U2NoZWRfbG9jYXRpb24mdGVybT0yMThTMDAwJmN0PUNDJmxvY2F0aW9uaWQ9RElMJnJlcG9ydGluZ195ZWFyPTIwMTgnCiAgICAgICAgICAgICAgICAgICxvcHRpb25zID0gIkhVR0UiKQpjYXQgPC0gYWNjMiAlPiUKICBodG1sX25vZGVzKCJoMyIpICU+JQogIGh0bWxfdGV4dCgpClZpZXcoY2F0KQoKCgoKYGBgCgpgYGB7cixyZXN1bHRzPSJoaWRlIn0KCkNhdGVnb3JpZXMgPC0gY2F0Wy1jKDEsNSwgMTAsIDEyLDE0LDM3LDYwKV0gIyBzdWJzZXRpbmcgdGhlIHJvd3MgdGhhdCB3ZXJlIGluY29ycmVjdGx5IHNjcmFwZWQKI2NhdGVnQ2xlYW4gPC0gZ3N1YigiXHJcblx0QXJlIHlvdSBhIG5ldyBzdHVkZW50IGFuZCBpbnRlcmVzdGVkIGluIG91ciBwcm9ncmFtcyBhbmQgdHJ5aW5nIHRvIHJlZ2lzdGVyIGZvciBjbGFzc2VzPyBJZiBzbyBwbGVhc2UgdmlzaXQgb3VyIHdlYnNpdGUgdG8gbGVhcm4gbW9yZSBhYm91dCBvdXIgcHJvZ3JhbSBodHRwOi8vd3d3LmF1c3RpbmNjLmVkdS90Y20gQWxzbywgc2NoZWR1bGUgYW4gYXBwb2ludG1lbnQgdG8gbWVldCB3aXRoIHRoZSBEZXBhcnRtZW50YWwgQWR2aXNvciAgYXQgZGF2aWRtQGF1c3RpbmNjLmVkdS4KI1xyXG5cdCIsIiIsY2F0ZWdDbGVhbikgIyBhbmQgYSBsYXN0IG9uZSBmcm9tIHJvdyAxMQojI1xyXG5cdFNvY2lhbCBNZWRpYSBDb21tdW5pY2F0aW9uOiBEZWdyZWUgJiBDZXJ0aWZpY2F0ZSBDb3Vyc2VzCiNWaWV3KGNhdGVnQ2xlYW4pCkNhdGVnb3JpZXMgPC0gZ3N1YigiW1xyXG5cdF0iLCIiLENhdGVnb3JpZXMpCgoKYGBgCgojIyMjRmluZGluZ3M6ClRoZXJlIGFyZSBhcHByb3hpbWF0ZWx5IDU1IGNvdXJzZSBjYXRlZ29yaWVzIHRoYXQgYXJlIGJlaW5nIGN1cnJlbnRseSBvZmZlcmVkLlRoZSBjb21wbGV0ZSBsaXN0IG9mIGNhdGVnb3JpZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGNhbiBiZSBzZWVuIGhlcmUgKGJ5IGNsaWNraW5nICBvbiB0aGUgTmV4dCBidXR0b24geW91IGNhbiBzZWUgYWxsIHRoZSBjYXRlZ29yaWVzKToKCgpgYGB7cn0KI05FRUQgVE8gTUFLRSBJVCBXT1JLCmNhdGVnQ2xlYW4yIDwtIGFzLmRhdGEuZnJhbWUoQ2F0ZWdvcmllcykKY2F0ZWdDbGVhbjIKCmBgYAoKCgojIyMjU3RlcCAyOgpUYWtpbmcgdGhlIGV4cGxvcmF0aW9uIG9uZSBzdGVwIGZ1cnRoZXIsIEFDQydzIHdlYnNpdGUgaXMgc2NyYXBwZWQgaW4gbW9yZSBkZXRhaWwgb25jZSBhZ2Fpbi4KCgpgYGB7cixyZXN1bHRzPSJoaWRlIn0KIyMjIyBTY3JhcGluZyB0aGUgY291cnNlcyB3aXRoIHRoZWlyIChzdWIpLXNlY3Rpb25zCgphY2MgPC0gaHRtbCgnaHR0cDovL3d3dzYuYXVzdGluY2MuZWR1L3NjaGVkdWxlL2luZGV4LnBocD9vcD1icm93c2Umb3BjbGFzcz1WaWV3U2NoZWRfbG9jYXRpb24mdGVybT0yMThTMDAwJmN0PUNDJmxvY2F0aW9uaWQ9RElMJnJlcG9ydGluZ195ZWFyPTIwMTgnLAogICAgICAgICAgICBvcHRpb25zPSJIVUdFIikKCgpjbGFzc2VzIDwtIGFjYyU+JQogIGh0bWxfbm9kZXMoImg0IGEiKSU+JQogIGh0bWxfdGV4dCgpCgojY2xhc3NlcwpoZWFkKGNsYXNzZXMpCmBgYAoKYGBge3J9CiMgd3JpdGluZyB0aGlzIHRvIGFuIGV4Y2VsIGZpbGUgc28gSSBoYXZlIGEgc3RvcmVkIGRhdGFzZXQKI3dyaXRlLnRhYmxlKGNsYXNzZXMsIGZpbGU9ImNsYXNzZXMuY3N2IixzZXA9IiwiLHJvdy5uYW1lcz1GKSAjIGV4cG9ydGVkIHRoZSBkYXRhIHVuZGVyIHRoZSBuYW1lIHJlZ2lzdHJhdGlvbi5jc3YKCiMgSW1wb3J0aW5nIHRoZSBkYXRhc2V0IC0gaXQgaXMgaW5jbHVkZWQgaW4gdGhlIHppcCBmb2xkZXIgdW5kZXIgdGhlIG5hbWUgcmVnaXN0cmF0aW9uLmNzdgpyZWdpc3RyYXRpb24gPC0gcmVhZC5jc3YoIi9Vc2Vycy9aZW5vZHJha29zL1dvcmtzcGFjZXMvUl93b3Jrc3BhY2UvU2FtcGxlUHJvamVjdHMvUHJvamVjdHMvcmVnaXN0cmF0aW9uLmNzdiIpCgpgYGAKCmBgYHtyfQpuYW1lcyhyZWdpc3RyYXRpb24pIDwtICgiVGV4dCIpCmNvdW50ZXIgPC0gMAoKZm9yKGkgaW4gMTpucm93KHJlZ2lzdHJhdGlvbikpIHsKICBpZihzdHJfZGV0ZWN0KHJlZ2lzdHJhdGlvbiRUZXh0W2ldLCAiW0EtWl0iKSA9PSBUUlVFKXsKICAgIGNvdW50ZXIgPC0gY291bnRlciArIDEKICAgIHJlZ2lzdHJhdGlvbiRpZFtpXSA8LSBjb3VudGVyCiAgfSBlbHNlIHsKICAgIHJlZ2lzdHJhdGlvbiRpZFtpXSA8LSBjb3VudGVyCiAgfQp9ClZpZXcocmVnaXN0cmF0aW9uKQoKY291cnNlX3RleHQgPC0gcmVnaXN0cmF0aW9uICU+JSBmaWx0ZXIoc3RyX2RldGVjdChUZXh0LCAiW0EtWl0iKSkKY291cnNlX3NlYXQgPC0gcmVnaXN0cmF0aW9uICU+JSBmaWx0ZXIoIXN0cl9kZXRlY3QoVGV4dCwgIltBLVpdIikpCgpjb3Vyc2VfaW5mbyA8LSBjb3Vyc2VfdGV4dCAlPiUgbGVmdF9qb2luKGNvdXJzZV9zZWF0LCBieSA9ICJpZCIpCm5hbWVzKGNvdXJzZV9pbmZvKSA8LSBjKCJUZXh0IiwgImlkIiwgImNvdXJzZV9zZWF0IikKaGVhZChjb3Vyc2VfaW5mbykKCmNvdXJzZV9pbmZvIDwtIGNvdXJzZV9pbmZvICU+JSBzZXBhcmF0ZShjb3Vyc2Vfc2VhdCwgYygiZW5yb2xsZWQiLCAiY2xhc3Nfc2l6ZSIsICJyYW5kb20iKSwgc2VwID0gIi8iKQpWaWV3KGNvdXJzZV9pbmZvKQoKY291cnNlX2luZm8kZW5yb2xsZWQgPC0gZ3N1YigiICIsICIiLCBjb3Vyc2VfaW5mbyRlbnJvbGxlZCkKY291cnNlX2luZm8kY2xhc3Nfc2l6ZSA8LSBnc3ViKCIgIiwgIiIsIGNvdXJzZV9pbmZvJGNsYXNzX3NpemUpCmNvdXJzZV9pbmZvJHJhbmRvbSA8LSBnc3ViKCIgIiwgIiIsIGNvdXJzZV9pbmZvJHJhbmRvbSkKCmNvdXJzZV9pbmZvJGVucm9sbGVkIDwtIGFzLm51bWVyaWMoc3Vic3RyKGNvdXJzZV9pbmZvJGVucm9sbGVkLCAyLCBuY2hhcihjb3Vyc2VfaW5mbyRlbnJvbGxlZCkpKQpWaWV3KGNvdXJzZV9pbmZvKQoKY291cnNlX2luZm9fMiA8LSBjb3Vyc2VfaW5mbyAlPiUgZmlsdGVyKGVucm9sbGVkICE9ICJOQSIpCgpmb3IoaSBpbiAxOm5yb3coY291cnNlX2luZm9fMikpIHsKICBpZihzdHJfZGV0ZWN0KGNvdXJzZV9pbmZvXzIkY2xhc3Nfc2l6ZVtpXSwgIl0iKSA9PSBUUlVFKXsKICAgIGNvdXJzZV9pbmZvXzIkY2xhc3Nfc2l6ZVtpXSA8LSBhcy5udW1lcmljKHN1YnN0cihjb3Vyc2VfaW5mb18yJGNsYXNzX3NpemVbaV0sIDEsIG5jaGFyKGNvdXJzZV9pbmZvXzIkY2xhc3Nfc2l6ZVtpXSkgLSAxKSkKICB9IGVsc2UgewogICAgY291cnNlX2luZm9fMiRjbGFzc19zaXplW2ldIDwtIGFzLm51bWVyaWMoY291cnNlX2luZm9fMiRjbGFzc19zaXplW2ldKQogICAgY291cnNlX2luZm9fMiRyYW5kb21baV0gPC0gYXMubnVtZXJpYyhzdWJzdHIoY291cnNlX2luZm9fMiRyYW5kb21baV0sIDEsIG5jaGFyKGNvdXJzZV9pbmZvXzIkcmFuZG9tW2ldKSAtIDEpKQogIH0KfQoKY291cnNlX2luZm9fMiRjbGFzc19zaXplIDwtIGFzLm51bWVyaWMoY291cnNlX2luZm9fMiRjbGFzc19zaXplKQpjb3Vyc2VfaW5mb18yJHJhbmRvbSA8LSBhcy5udW1lcmljKGNvdXJzZV9pbmZvXzIkcmFuZG9tKQoKVmlldyhjb3Vyc2VfaW5mb18yKQoKcmVxdWlyZSggZGF0YS50YWJsZSApCgpjb3Vyc2VfaW5mb19kdCA8LSBkYXRhLnRhYmxlKGNvdXJzZV9pbmZvXzIpCgpjb3Vyc2VfaW5mb19kdFsgLCBJbmRleCA6PSAxOi5OICwgYnkgPSBjKCJpZCIpIF0KVmlldyhjb3Vyc2VfaW5mb19kdCkKCmNvdXJzZV9zZWN0aW9uIDwtIGNvdXJzZV9pbmZvX2R0ICU+JQogIGdyb3VwX2J5KGlkKSAlPiUKICBzdW1tYXJpc2UobnVtYmVyX3NlY3Rpb24gPSBuKCkpCgpjb3Vyc2VfaW5mb19kdDIgPC0gY291cnNlX2luZm9fZHQgJT4lIGxlZnRfam9pbihjb3Vyc2Vfc2VjdGlvbiwgYnkgPSAiaWQiKQpWaWV3KGNvdXJzZV9pbmZvX2R0MikgI3RoZXJlIGFyZSA0MzcgSUQncyB3aGljaCBtZWFucyA0MzcgZGlmZiBzdWJqZWN0cyAoSSBnZXQgNDQwLCBzbyB0aGVyZSBpcyBhbiBpbmNvbnNpc3RlbmN5IG9mIDMpCgojIyMjMyAybmQgc3RlcCAtIFdvcmsgd2l0aCBUZXh0IHJvdwpkZWYgPC0gY291cnNlX2luZm9fZHQyJFRleHQgClZpZXcoZGVmKSAKCgpjb3Vyc2VfcHJlZml4IDwtIHN1YnN0cihkZWYsIDAsIDQpCiNjb3Vyc2VfY29kZSA8LSBzdWJzdHIoZGVmLCA1LCA5KSAjIApjb3Vyc2VfY29kZSA8LSBzdWJzdHIoZGVmLCA2LCA5KSAKY291cnNlX25hbWUgPC0gc3Vic3RyKGRlZiwgMTAsIGxlbmd0aChkZWYpKQoKaGVhZChjb3Vyc2VfcHJlZml4KQpoZWFkKGNvdXJzZV9jb2RlKQpoZWFkKGNvdXJzZV9uYW1lKQpWaWV3KGRlZikKCmZpbmFsIDwtIGRhdGFfZnJhbWUoY291cnNlX3ByZWZpeCwgY291cnNlX2NvZGUsIGNvdXJzZV9uYW1lKQpoZWFkKGZpbmFsKQpWaWV3KGZpbmFsKSAKCmZpbmFsJGRlZiA8LSBkZWYKZmluYWwgPC0gZHBseXI6OnJlbmFtZShmaW5hbCwgVGV4dCA9IGRlZikKZmluYWwkaWQgPC0gY291cnNlX2luZm9fZHQyJGlkCmZpbmFsJGVucm9sbGVkIDwtIGNvdXJzZV9pbmZvX2R0MiRlbnJvbGxlZApmaW5hbCRjbGFzc19zaXplIDwtIGNvdXJzZV9pbmZvX2R0MiRjbGFzc19zaXplCmZpbmFsJHdhaXRsaXN0ZWQgPC0gY291cnNlX2luZm9fZHQyJHJhbmRvbQpmaW5hbCRJbmRleCA8LSBjb3Vyc2VfaW5mb19kdDIkSW5kZXgKZmluYWwkbnVtYmVyX3NlY3Rpb24gPC0gY291cnNlX2luZm9fZHQyJG51bWJlcl9zZWN0aW9uCgojTm93IHRoZSBkYXRhc2V0IGlzICBjbGVhbiBhbmQgcmVhZHkgZm9yIGZ1cnRoZXIgaW5zcGVjdGlvbjoKYGBgCgojIyMjRmluZGluZ3M6CgoKVGhlcmUgYXJlIGFib3V0IDQzMCBkaWZmZXJlbnQgY291cnNlcyB3aXRoIGEgdG90YWwgb2YgNzU0IGNvdXJzZSBzZWN0aW9ucy4KVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY3Rpb25zIHRoYXQgYSBjb3Vyc2UgaGFzIGlzIDExIGFuZCB0aGF0IGlzICJFbmdsaXNoIENvbXBvc2l0aW9uIElJIi4KYGBge3IscmVzdWx0cz0iaGlkZSJ9Cm5yb3coZmluYWwpICMgdGhlIHRvdGFsIG51bWJlciBvZiBzZWN0aW9ucyAoZnJvbSBhbGwgY291cnNlcykgaXMgNzU0CiMgTnVtYmVyIG9mIGRpc3RpbmN0IGNvdXJzZXMKZDEgPC0gZmluYWwgJT4lIAogIGRpc3RpbmN0KGlkKQpucm93KGQxKQoKI21pbiBhbmQgbWF4IG51bWJlciBvZiBzZWN0aW9ucyBmb3IgYSBjb3Vyc2U6CiNtaW4oZmluYWwkbnVtYmVyX3NlY3Rpb24pICNtaW4gbnVtYmVyIG9mIHNlY3Rpb25zICAjIEl0IGlzIHZlcnkgbG9naWNhbCB0aGF0IGl0IGlzIG9uZQptYXgoZmluYWwkbnVtYmVyX3NlY3Rpb24pICMgbWF4IG51bWJlciBvZiBzZWN0aW9ucwoKY2xhc3Nfd2l0aF9tb3N0X3NlY3Rpb25zIDwtIGZpbmFsICU+JQogIHNlbGVjdChjb3Vyc2VfbmFtZSxudW1iZXJfc2VjdGlvbikgJT4lIAogIGZpbHRlcihudW1iZXJfc2VjdGlvbiA9PSAnMTEnKQoKYGBgCgpgYGB7cn0KZDMgPC0gYXMuZGF0YS5mcmFtZShmaW5hbCAlPiUKICAgICAgICAgICAgICAgIGdyb3VwX2J5IChjb3Vyc2VfbmFtZSxpZCkgJT4lIAogICAgICAgICAgICAgICAgc3VtbWFyaXNlKHRvdGFsX2Vucm9sbGVkPSBzdW0oZW5yb2xsZWQpLHRvdGFsX2NhcGFjaXR5ID0gc3VtKGNsYXNzX3NpemUpKSkKVmlldyhkMykKCiMgZDQ9IGQzIGJ1dCBzb3J0ZWQgZnJvbSBsYXJnZXN0IHRvdGFsIGVucm9sbWVudCB0byBzbWFsbGVzdCB0b3RhbCBlbnJvbG1lbnQKZDQgPC0gZDNbb3JkZXIoLWQzJHRvdGFsX2Vucm9sbGVkKSxdClZpZXcoZDQpICAjCgpgYGAKCgpUaGUgdG9wIDEwJSBjb3Vyc2VzICg9IDQzIGNvdXJzZXMpIHdpdGggdGhlIGhpZ2hlc3QgdG90YWwtYWNyb3NzIGFsbCBzZWN0aW9ucyBzdHVkZW50IGVucm9sbWVudCBjYW4gYmUgZm91bmQgYmVsb3cgKGJ5IGNsaWNraW5nICBvbiB0aGUgTmV4dCBidXR0b24geW91IGNhbiBzZWUgYWxsIDQzIGNvdXJzZXMgd2l0aCB0aGUgaGlnaGVzdCBlbnJvbGxtZW50KTogCmBgYHtyfQoja2VlcGluZyB0aGUgdG9wIDEwJSBvciB0aGUgNDMgY2xhc3NlcyB3aXRoIHRoZSBtb3N0IHJlZ2lzdGVyZWQgc3R1ZGVudHMgaW4gdG90YWwKaGVhZChkNCxuPTQzMCoxMC8xMDApCnMgPC0gaGVhZChkNCxuPTQzMCoxMC8xMDApCmBgYAoKSSBhbSBwbG90dGluZyB0aGUgZmlyc3QgMTIgY291cnNlcyB3aXRoIHJlc3BlY3QgdG8gdG90YWwgZW5yb2xsbWVudCwgYnkgZGlzcGxheWluZyBmb3IgZWFjaCB0aGUgdG90YWwgZW5yb2xtZW50IGFuZCB0aGUgdG90YWwgY2FwYWNpdHk6IAoKCmBgYHtyfQpkM2EgPC0gaGVhZChkM1tvcmRlcihkMyR0b3RhbF9jYXBhY2l0eSwgZGVjcmVhc2luZyA9IFQpLF0sIDE1KQoKZDMucGxvdHRhYmxlIDwtIGQzYVssIGMoMSwzLDQpXQpkMy5wbG90dGFibGUgPC0gbWVsdChkMy5wbG90dGFibGUsIGlkLnZhcnMgPSAiY291cnNlX25hbWUiKQoKCmxpYnJhcnkoZ2dwbG90MikKZyA8LSBnZ3Bsb3QoZDMucGxvdHRhYmxlLCBhZXMoeCA9IGNvdXJzZV9uYW1lLCB5ID0gdmFsdWUpKQpnIDwtIGcgKyBnZW9tX2JhcihhZXMoZmlsbCA9IHZhcmlhYmxlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpLCBzdGF0ID0gImlkZW50aXR5IikgKyAKICBjb29yZF9mbGlwKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKZyA8LSBnICsgbGFicyh4ID0gIkNvdXJzZSBOYW1lIikKZyA8LSBnKyBsYWJzKHkgPSAiTnVtYmVyIG9mIFN0dWRlbnRzIikKZwoKCmBgYAoKCg==