Logistic models and ROC
To run your code, click run. It will let you know if your code is correct or not, and will offer hints on what to fix if needed. If you are stuck, you can see the solution by clicking Solution.
Exercise 1: Running a logit regression
This is a continuation of Session_5’s exercises.
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpYnJhcnkoZHBseXIpICMgbG9hZHMgZHBseXIgZm9yIGRhdGEgbWFuaXB1bGF0aW9uXG5kZiA8LSBkYXRhLmZyYW1lKHRpYz1yZXAoXCJXTVRcIiwxOTQpLFxuICAgICAgICAgICAgICAgICBmeWVhcnE9YygxOTcwLDE5NzAsMTk3MCwxOTcwLDE5NzEsMTk3MSwxOTcxLDE5NzEsMTk3MiwxOTcyLDE5NzIsMTk3MiwxOTczLDE5NzMsMTk3MywxOTczLDE5NzQsMTk3NCwxOTc0LDE5NzQsMTk3NSwxOTc1LDE5NzUsMTk3NSwxOTc2LDE5NzYsMTk3NiwxOTc2LDE5NzcsMTk3NywxOTc3LDE5NzcsMTk3OCwxOTc4LDE5NzgsMTk3OCwxOTc5LDE5NzksMTk3OSwxOTc5LDE5ODAsMTk4MCwxOTgwLDE5ODAsMTk4MSwxOTgxLDE5ODEsMTk4MSwxOTgyLDE5ODIsMTk4MiwxOTgyLDE5ODMsMTk4MywxOTgzLDE5ODMsMTk4NCwxOTg0LDE5ODQsMTk4NCwxOTg1LDE5ODUsMTk4NSwxOTg1LDE5ODYsMTk4NiwxOTg2LDE5ODYsMTk4NywxOTg3LDE5ODcsMTk4NywxOTg4LDE5ODgsMTk4OCwxOTg4LDE5ODksMTk4OSwxOTg5LDE5ODksMTk5MCwxOTkwLDE5OTAsMTk5MCwxOTkxLDE5OTEsMTk5MSwxOTkxLDE5OTIsMTk5MiwxOTkyLDE5OTIsMTk5MywxOTkzLDE5OTMsMTk5MywxOTk0LDE5OTQsMTk5NCwxOTk0LDE5OTUsMTk5NSwxOTk1LDE5OTUsMTk5NiwxOTk2LDE5OTYsMTk5NiwxOTk3LDE5OTcsMTk5NywxOTk3LDE5OTgsMTk5OCwxOTk4LDE5OTgsMTk5OSwxOTk5LDE5OTksMTk5OSwyMDAwLDIwMDAsMjAwMCwyMDAwLDIwMDEsMjAwMSwyMDAxLDIwMDEsMjAwMiwyMDAyLDIwMDIsMjAwMiwyMDAzLDIwMDMsMjAwMywyMDAzLDIwMDQsMjAwNCwyMDA0LDIwMDQsMjAwNSwyMDA1LDIwMDUsMjAwNSwyMDA2LDIwMDYsMjAwNiwyMDA2LDIwMDcsMjAwNywyMDA3LDIwMDcsMjAwOCwyMDA4LDIwMDgsMjAwOCwyMDA5LDIwMDksMjAwOSwyMDA5LDIwMTAsMjAxMCwyMDEwLDIwMTAsMjAxMSwyMDExLDIwMTEsMjAxMSwyMDEyLDIwMTIsMjAxMiwyMDEyLDIwMTMsMjAxMywyMDEzLDIwMTMsMjAxNCwyMDE0LDIwMTQsMjAxNCwyMDE1LDIwMTUsMjAxNSwyMDE1LDIwMTYsMjAxNiwyMDE2LDIwMTYsMjAxNywyMDE3LDIwMTcsMjAxNywyMDE4LDIwMTgpLFxuICAgICAgICAgICAgICAgICBmcXRyPWMoMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyKSxcbiAgICAgICAgICAgICAgICAgcmV2dHE9Yyg3LjI2Nyw5LjkzOSwxMS40NywxNS42MSwxMi43NTgsMTguMjA3LDE5LjIwNSwyNy44NDQsMjEuMDExLDI5LjkxOCwzMi42ODMsNDEuMjc3LDMyLjczNywzNy42NTUsNDIuMDk4LDU1LjA3MSw0Ni4zNTUsNTYuMTc3LDU5LjQ2Miw3NC4yMTUsNjQuNjUsNzguODUyLDg2LjEwOCwxMTAuNzIxLDkzLjk3MSwxMTUuMTg2LDEyMS44NzUsMTQ3Ljc3NSwxMjIuNjU1LDE1Mi4zODEsMTcyLjYzNywyMzAuNzgzLDE2Ny4yNzQsMjA0LjA4NSwyMjEuOTgyLDMwNi45NTcsMjM4LjU2OSwyOTEuNjg1LDMwMC43NDcsNDE3LjE3NSwzMTQuNTc1LDM3Mi41OTgsNDAxLjg0Miw1NTQuMTg0LDQzNC4yNTEsNTMzLjY1Myw2MzQuNDc2LDg0Mi42MTcsNjY1LjIyOSw3ODguNzA1LDgyNy43NjcsMTA5NC41NTEsODU0LjczNCwxMDk4Ljk0MiwxMTY2LjU5NCwxNTQ2LjYzOSwxMjM0Ljc2OCwxNTA4LjUzMywxNTgzLjU3MywyMDczLjk4MywxNjU1LjY2MSwxOTM0LjM1OCwyMDg3LjUzMywyNzczLjkzNiwyMzQ0LjI1MywyNzcwLjI3NiwyOTQ5LjAwOCwzODQ1LjU1NywzMjExLjc2MSwzNzMyLjIzNyw0MDE1LjAxNyw1MDAwLjIzOCw0MjgyLjAxMiw0ODQ1LjEzMyw0OTkxLjExMyw2NTMwLjczNCw1MzczLjI1OCw2MDQ2LjQxLDYyODMuNDk2LDgxMDcuNDg0LDY3NjguMTkxLDc1NDMuNTA4LDc5MzAuOTQ5LDEwMzU4Ljg5OCw5MjgwLjU2NiwxMDMzOS44OTgsMTA2MjcuNSwxMzYzOC43OTcsMTE2NDkuMzk4LDEzMDI4LjM5OCwxMzY4My43OTcsMTcxMjIsMTM5MjAuMzk4LDE2MjM2LjUsMTY4MjYuODk4LDIwMzYwLjUsMTc2ODYuMDk4LDE5OTQyLjI5NywyMDQxNy42OTksMjQ0NDcuNzk3LDIwNDQwLDIyNzIzLDIyOTE0LDI3NTUwLDIyNzcyLDI1NTg3LDI1NjQ0LDMwODU2LDI1NDA5LDI4Mzg2LDI4Nzc3LDM1Mzg2LDI5ODE5LDMzNTIxLDMzNTA5LDQwNzg1LDM1MTI5LDM4OTEzLDQwODk5LDUxODY4LDQzNDQ3LDQ2NTg4LDQ2MTgxLDU3MDc5LDQ4NTY1LDUzMTg3LDUzMTg1LDY0NzM1LDUyMTI2LDU2NzgxLDU1NzY1LDY2OTA1LDU3MjI0LDYzMjMxLDYzMDM2LDc1MTkwLDY1NDM0LDcwNTE2LDY5MjgyLDgyOTAwLDcwNzU1LDc2Njk3LDc1Mzk3LDg5MjUyLDc5Njc1LDg1NDMwLDg0NDY3LDk5MDc4LDg2Mzc4LDkyODI3LDkxNzk0LDEwNzI4OSw5NDk0MCwxMDIzNDIsOTgzNDUsMTA4NzQ3LDk0MjE0LDEwMDg3Niw5OTM3MywxMTM2MjIsOTk4MTEsMTAzNzI2LDEwMTk1MiwxMTYzNjAsMTA0MTg5LDEwOTM2NiwxMTAyMjYsMTIzMTY5LDExMzAxMCwxMTQwNjUsMTEzODAwLDEyNzc3NiwxMTQwNzAsMTE2ODMwLDExNTY4OCwxMjk3MDYsMTE0OTYwLDEyMDEyNSwxMTkwMDEsMTMxNTY1LDExNDgyNiwxMjAyMjksMTE3NDA4LDEyOTY2NywxMTU5MDQsMTIwMzE5LDExODE3OSwxMzA5MzYsMTE3NTQyLDEyMjk2OCwxMjMxNzksMTM2MjY3LDEyMjY5MCwxMjgwMjgpLFxuICAgICAgICAgICAgICAgICByZWNlc3Npb249YygxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSlcbmRmIDwtIGRmICU+JSBtdXRhdGUocmV2dHFfeW95ID0gKHJldnRxIC0gbGFnKHJldnRxLCA0KSkgLyBsYWcocmV2dHEsIDQpLFxuICAgICAgICAgICAgICAgICAgICByZWNlc3Npb25fbGFnID0gbGFnKHJlY2Vzc2lvbiksXG4gICAgICAgICAgICAgICAgICAgIHJldnRxX2Rvd24gPSBpZmVsc2UocmV2dHFfeW95PDAsMSwwKSxcbiAgICAgICAgICAgICAgICAgICAgcmV2dHFfeW95X2xhZyA9IGxhZyhyZXZ0cV95b3kpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gZnllYXJxICsgKGZxdHItMSkvNCkiLCJzYW1wbGUiOiIjIFRoZSBkYXRhZnJhbWUgYmVsb3cgY29udGFpbnMgaGlzdG9yaWNhbCByZXZlbnVlIGZvciBXYWxtYXJ0IHNpbmNlIDE5NzBcbiMgQWxsIGRhdGEgaXMgcXVhcnRlcmx5XG4jIFRoZSBmaWxlIHVzZXMgQ29tcHVzdGF0J3Mgbm9tZW5jbGF0dXJlOlxuIyAgICAgLSByZXZlbnVlIGlzIHJldnRxXG4jICAgICAtIHRpY2tlciBpcyB0aWNcbiMgICAgIC0gZnllYXJxIGlzIHllYXJcbiMgICAgIC0gZnF0ciBpcyBxdWFydGVyXG4jICAgICAtIHJlY2Vzc2lvbiBpcyBhbiBpbmRpY2F0b3IgZm9yIFVTIHJlY2Vzc2lvbnNcbiMgICAgIC0gcmV2dHFfeW95IGlzIHllYXIgb3ZlciB5ZWFyIHJldmVudWUgZ3Jvd3RoXG4jICAgICAtIHJldnRxX2Rvd24gaXMgYW4gaW5kaWNhdG9yIGVxdWFsIHRvIDEgaWYgcmV2dHFfeW95IGlzIG5lZ2F0aXZlLCBlbHNlIDBcbiMgICAgIC0gcmV2dHFfeW95X2xhZyBpcyB0aGUgbGFnIG9mIHJldnRxX3lveVxuZGZbMTo1LF1cblxuIyBDYWxjdWxhdGUgYSBsb2dpc3RpYyBtb2RlbCBvZiBhIGRlY3JlYXNlIGluIHllYXIgb3ZlciB5ZWFyIHF1YXJ0ZXJseSByZXZlbnVlXG4jIG9uIHRoZSBwcmV2aW91cyBxdWFydGVyJ3MgeWVhciBvdmVyIHllYXIgcmV2ZW51ZSBncm93dGgsIHN0b3JlIGl0IGluIG1vZDFcbm1vZDEgPC0gZ2xtKCB+ICwgZGF0YT0sIGZhbWlseT0pXG5cbiMgUHJpbnQgb3V0IGEgc3VtbWFyeSBvZiB0aGUgbW9kZWwgdXNpbmcgc3VtbWFyeVxuc3VtbWFyeShtb2QxKVxuXG4jRU5EIiwic29sdXRpb24iOiIjIFRoZSBkYXRhZnJhbWUgYmVsb3cgY29udGFpbnMgaGlzdG9yaWNhbCByZXZlbnVlIGZvciBXYWxtYXJ0IHNpbmNlIDE5NzBcbiMgQWxsIGRhdGEgaXMgcXVhcnRlcmx5XG4jIFRoZSBmaWxlIHVzZXMgQ29tcHVzdGF0J3Mgbm9tZW5jbGF0dXJlOlxuIyAgICAgLSByZXZlbnVlIGlzIHJldnRxXG4jICAgICAtIHRpY2tlciBpcyB0aWNcbiMgICAgIC0gZnllYXJxIGlzIHllYXJcbiMgICAgIC0gZnF0ciBpcyBxdWFydGVyXG4jICAgICAtIHJlY2Vzc2lvbiBpcyBhbiBpbmRpY2F0b3IgZm9yIFVTIHJlY2Vzc2lvbnNcbiMgICAgIC0gcmV2dHFfeW95IGlzIHllYXIgb3ZlciB5ZWFyIHJldmVudWUgZ3Jvd3RoXG4jICAgICAtIHJldnRxX2Rvd24gaXMgYW4gaW5kaWNhdG9yIGVxdWFsIHRvIDEgaWYgcmV2dHFfeW95IGlzIG5lZ2F0aXZlLCBlbHNlIDBcbiMgICAgIC0gcmV2dHFfeW95X2xhZyBpcyB0aGUgbGFnIG9mIHJldnRxX3lveVxuZGZbMTo1LF1cblxuIyBDYWxjdWxhdGUgYSBsb2dpc3RpYyBtb2RlbCBvZiBhIGRlY3JlYXNlIGluIHllYXIgb3ZlciB5ZWFyIHF1YXJ0ZXJseSByZXZlbnVlXG4jIG9uIHRoZSBwcmV2aW91cyBxdWFydGVyJ3MgeWVhciBvdmVyIHllYXIgcmV2ZW51ZSBncm93dGgsIHN0b3JlIGl0IGluIG1vZDFcbm1vZDEgPC0gZ2xtKHJldnRxX2Rvd24gfiByZXZ0cV95b3lfbGFnLCBkYXRhPWRmLCBmYW1pbHk9Ymlub21pYWwpXG5cbiMgUHJpbnQgb3V0IGEgc3VtbWFyeSBvZiB0aGUgbW9kZWwgdXNpbmcgc3VtbWFyeVxuc3VtbWFyeShtb2QxKVxuXG4jRU5EIiwic2N0IjoiIyBUZW1wbGF0ZSBiYXNlZCBvbiBodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvdGVzdHdoYXQvdmVyc2lvbnMvNC4xLjFcbiMgQ2hlY2sgaWYgc29tZXRoaW5nIGlzIGV4cGxpY2l0bHkgdHlwZWRcblxudGVzdF9zdHVkZW50X3R5cGVkKCdyZXZ0cV9kb3duIH4gcmV2dHFfeW95X2xhZycsbm90X3R5cGVkX21zZz0nTWFrZSBzdXJlIHRvIHJlZ3Jlc3MgYHJldnRxX2Rvd25gIG9uIGByZXZ0cV95b3lfbGFnYC4nKVxudGVzdF9zdHVkZW50X3R5cGVkKCdkYXRhPWRmJyxub3RfdHlwZWRfbXNnPSdNYWtlIHN1cmUgdG8gdXNpbmcgdGhlIGBkZmAgZGF0YSBmcmFtZSBmb3IgdGhlIHRlc3QuJylcbnRlc3Rfc3R1ZGVudF90eXBlZCgnZmFtaWx5PWJpbm9taWFsJyxub3RfdHlwZWRfbXNnPSdNYWtlIHN1cmUgdG8gc2V0IGZhbWlseSB0byBiZSBgYmlub21pYWxgLCBzbyBhcyB0byBydW4gYSBsb2dpc3RpYyByZWdyZXNzaW9uLicpXG50ZXN0X2V4cHJlc3Npb25fb3V0cHV0KFwibW9kMVwiLCBpbmNvcnJlY3RfbXNnPVwiWW91ciByZWdyZXNzaW9uIG1vZGVsIGlzbid0IHF1aXRlIHJpZ2h0LlwiKVxudGVzdF9zdHVkZW50X3R5cGVkKCdzdW1tYXJ5KG1vZDEpJyxub3RfdHlwZWRfbXNnPSdZb3VyIG1vZGVsIGlzIGNvcnJlY3QsIGJ1dCBkaWQgeW91IHJlbWVtYmVyIHRvIHN1bW1hcml6ZSBpdCB3aXRoIGBzdW1tYXJ5KClgPycpXG5cbiMgdGVzdF9zdHVkZW50X3R5cGVkKCd4IDwtIDInLCBub3RfdHlwZWRfbXNnPScnKVxuXG4jIENoZWNrIGlmIGZ1bmN0aW9uIHdhcyB1c2VkIGluIGlucHV0IGNvZGVcbiMgdGVzdF9mdW5jdGlvbignYycsaW5jb3JyZWN0X21zZz0nJykgIFxuXG4jIFJlcXVpcmVzIGFuIG9iamVjdCBgeGAgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgc29sdXRpb25cbiMgdGVzdF9vYmplY3QoXCJ4XCIsaW5jb3JyZWN0X21zZyA9IFwiXCIsdW5kZWZpbmVkX21zZyA9IFwiXCIpICBcblxuIyBSZXF1aXJlcyBhbiBvbmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvZiBgeGAgaW4gdGhlIHNvbHV0aW9uXG4jIHRlc3RfYW5fb2JqZWN0KFwieFwiLHVuZGVmaW5lZF9tc2c9XCJcIilcblxuIyBDaGVja3MgaWYgb3V0cHV0IG9mIHN0dWRlbnQncyBjb2RlIGNvbnRhaW5zIGdpdmVuIGV2YWx1YXRlZCBleHByZXNzaW9uXG4jIHRlc3Rfb3V0cHV0X2NvbnRhaW5zKFwieFwiLGluY29ycmVjdF9tc2cgPSBcIlwiKVxuXG4jIENoZWNrIGlmIGEgdmVjdG9yIG9mIHByZWRlZmluZWQgb2JqZWN0cyBhcmUgdW5jaGFuZ2VkXG4jIHRlc3RfcHJlZGVmaW5lZF9vYmplY3RzKGMoJ3gnLCd5JyksaW5jb3JyZWN0X21zZz1cIkRvbid0IG9udmVyd3JpdGUgdGhlIHByZWRlZmluZWQgdmFyaWFibGVzXCIpXG5cbiMgQ2hlY2tzIGZvciBhIHJlZ2V4IHBhdHRlcm4gaW4gdHJoZSBvdXRwdXRcbiMgdGVzdF9vdXRwdXRfcmVnZXgocGF0dGVybixmaXhlZD1GLCB0aW1lcz0xLCBpbmNvcnJlY3RfbXNnPScnKVxuXG4jIENhbiBjaGVjayBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBhY3Jvc3MgYm90aCBzb2x1dGlvbiBhbmQgc3R1ZGVudCBjb2RlXG4jdGVzdF9leHByZXNzaW9uX291dHB1dChcInR5cGVvZihjb21wYW55X25hbWUpXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IHN0b3JlIHRleHR1YWwgZGF0YSBpbiBgY29tcGFueV9uYW1lYD9cIilcblxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpXG5cbiMgT3RoZXIgZnVuY3Rpb25zIHRvIG5vdGU6XG4jICAgICAtIHRlc3Rfb3IoYSxiKSAtLSBjaGVja3MgaWYgZWl0aGVyIHRlc3QgYSBvciB0ZXN0IGIgcGFzc1xuIyAgICAgLSB0ZXN0X2dncGxvdCgpIC0tIGNhbiBjaGVjayBpZiBwbG90cyBhcmUgY29ycmVjdFxuIyAgICAgLSB0ZXN0X2Z1bmN0aW9uKCkgLS0gY2FuIGFsc28gY2hlY2sgaW5jbHVkZWQgcGFyYW1ldGVyc1xuIyAgICAgLSB0ZXN0X2xvb3AoKSAtLSBjaGVja2luZyBmb3IgYW5kIHdoaWxlIGxvb3BzXG4jICAgICAtIHRlc3RfbGlicmFyeV9mdW5jdGlvbigncGFja2FnZScsIG5vdF9jYWxsZWRfbXNnPScnLGluY29ycmVjdF9tc2c9JycpXG4jICAgICAtIHRlc3RfaWZfZWxzZSgpIC0tIGNoZWNraW5nIGlmIHN0YXRlbWVudHNcbiMgICAgIC0gdGVzdF9leHByZXNzaW9uX2Vycm9yKCkgLS0gY2FuIGNoZWNrIGlmIGZ1bmN0aW9ucyBhcmUgcHJvcGVybHkgZGVmaW5lZFxuIyAgICAgLSB0ZXN0X29wZXJhdG9yKCdvcGVyYXRvcicsKSwgbm90X2NhbGxlZF9tc2c9JycsaW5jb3JyZWN0X21zZz0nJylcbiMgICAgIC0gdGVzdF9mdW5jdGlvbl9kZWZpbml0aW9uKCkgLS0gcmlnb3JvdXNseSBjaGVjayBkZWZpbmVkIGZ1bmN0aW9uXG4jICAgICAtIHRlc3RfZGF0YV9mcmFtZSgpIC0tIGNoZWNrIGlmIGRhdGFmcmFtZSBbY29sdW1uc10gYXJlIGVxdWl2YWxlbnRcbiMgICAgIC0gdGVzdF9mdW5jdGlvbl9yZXN1bHQsIHRlc3RfZXhwcmVzc2lvbl9yZXN1bHQifQ==
Exercise 2: Exploring model predictions
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpYnJhcnkoZHBseXIpICMgbG9hZHMgZHBseXIgZm9yIGRhdGEgbWFuaXB1bGF0aW9uXG5saWJyYXJ5KGdncGxvdDIpXG5kZiA8LSBkYXRhLmZyYW1lKHRpYz1yZXAoXCJXTVRcIiwxOTQpLFxuICAgICAgICAgICAgICAgICBmeWVhcnE9YygxOTcwLDE5NzAsMTk3MCwxOTcwLDE5NzEsMTk3MSwxOTcxLDE5NzEsMTk3MiwxOTcyLDE5NzIsMTk3MiwxOTczLDE5NzMsMTk3MywxOTczLDE5NzQsMTk3NCwxOTc0LDE5NzQsMTk3NSwxOTc1LDE5NzUsMTk3NSwxOTc2LDE5NzYsMTk3NiwxOTc2LDE5NzcsMTk3NywxOTc3LDE5NzcsMTk3OCwxOTc4LDE5NzgsMTk3OCwxOTc5LDE5NzksMTk3OSwxOTc5LDE5ODAsMTk4MCwxOTgwLDE5ODAsMTk4MSwxOTgxLDE5ODEsMTk4MSwxOTgyLDE5ODIsMTk4MiwxOTgyLDE5ODMsMTk4MywxOTgzLDE5ODMsMTk4NCwxOTg0LDE5ODQsMTk4NCwxOTg1LDE5ODUsMTk4NSwxOTg1LDE5ODYsMTk4NiwxOTg2LDE5ODYsMTk4NywxOTg3LDE5ODcsMTk4NywxOTg4LDE5ODgsMTk4OCwxOTg4LDE5ODksMTk4OSwxOTg5LDE5ODksMTk5MCwxOTkwLDE5OTAsMTk5MCwxOTkxLDE5OTEsMTk5MSwxOTkxLDE5OTIsMTk5MiwxOTkyLDE5OTIsMTk5MywxOTkzLDE5OTMsMTk5MywxOTk0LDE5OTQsMTk5NCwxOTk0LDE5OTUsMTk5NSwxOTk1LDE5OTUsMTk5NiwxOTk2LDE5OTYsMTk5NiwxOTk3LDE5OTcsMTk5NywxOTk3LDE5OTgsMTk5OCwxOTk4LDE5OTgsMTk5OSwxOTk5LDE5OTksMTk5OSwyMDAwLDIwMDAsMjAwMCwyMDAwLDIwMDEsMjAwMSwyMDAxLDIwMDEsMjAwMiwyMDAyLDIwMDIsMjAwMiwyMDAzLDIwMDMsMjAwMywyMDAzLDIwMDQsMjAwNCwyMDA0LDIwMDQsMjAwNSwyMDA1LDIwMDUsMjAwNSwyMDA2LDIwMDYsMjAwNiwyMDA2LDIwMDcsMjAwNywyMDA3LDIwMDcsMjAwOCwyMDA4LDIwMDgsMjAwOCwyMDA5LDIwMDksMjAwOSwyMDA5LDIwMTAsMjAxMCwyMDEwLDIwMTAsMjAxMSwyMDExLDIwMTEsMjAxMSwyMDEyLDIwMTIsMjAxMiwyMDEyLDIwMTMsMjAxMywyMDEzLDIwMTMsMjAxNCwyMDE0LDIwMTQsMjAxNCwyMDE1LDIwMTUsMjAxNSwyMDE1LDIwMTYsMjAxNiwyMDE2LDIwMTYsMjAxNywyMDE3LDIwMTcsMjAxNywyMDE4LDIwMTgpLFxuICAgICAgICAgICAgICAgICBmcXRyPWMoMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyKSxcbiAgICAgICAgICAgICAgICAgcmV2dHE9Yyg3LjI2Nyw5LjkzOSwxMS40NywxNS42MSwxMi43NTgsMTguMjA3LDE5LjIwNSwyNy44NDQsMjEuMDExLDI5LjkxOCwzMi42ODMsNDEuMjc3LDMyLjczNywzNy42NTUsNDIuMDk4LDU1LjA3MSw0Ni4zNTUsNTYuMTc3LDU5LjQ2Miw3NC4yMTUsNjQuNjUsNzguODUyLDg2LjEwOCwxMTAuNzIxLDkzLjk3MSwxMTUuMTg2LDEyMS44NzUsMTQ3Ljc3NSwxMjIuNjU1LDE1Mi4zODEsMTcyLjYzNywyMzAuNzgzLDE2Ny4yNzQsMjA0LjA4NSwyMjEuOTgyLDMwNi45NTcsMjM4LjU2OSwyOTEuNjg1LDMwMC43NDcsNDE3LjE3NSwzMTQuNTc1LDM3Mi41OTgsNDAxLjg0Miw1NTQuMTg0LDQzNC4yNTEsNTMzLjY1Myw2MzQuNDc2LDg0Mi42MTcsNjY1LjIyOSw3ODguNzA1LDgyNy43NjcsMTA5NC41NTEsODU0LjczNCwxMDk4Ljk0MiwxMTY2LjU5NCwxNTQ2LjYzOSwxMjM0Ljc2OCwxNTA4LjUzMywxNTgzLjU3MywyMDczLjk4MywxNjU1LjY2MSwxOTM0LjM1OCwyMDg3LjUzMywyNzczLjkzNiwyMzQ0LjI1MywyNzcwLjI3NiwyOTQ5LjAwOCwzODQ1LjU1NywzMjExLjc2MSwzNzMyLjIzNyw0MDE1LjAxNyw1MDAwLjIzOCw0MjgyLjAxMiw0ODQ1LjEzMyw0OTkxLjExMyw2NTMwLjczNCw1MzczLjI1OCw2MDQ2LjQxLDYyODMuNDk2LDgxMDcuNDg0LDY3NjguMTkxLDc1NDMuNTA4LDc5MzAuOTQ5LDEwMzU4Ljg5OCw5MjgwLjU2NiwxMDMzOS44OTgsMTA2MjcuNSwxMzYzOC43OTcsMTE2NDkuMzk4LDEzMDI4LjM5OCwxMzY4My43OTcsMTcxMjIsMTM5MjAuMzk4LDE2MjM2LjUsMTY4MjYuODk4LDIwMzYwLjUsMTc2ODYuMDk4LDE5OTQyLjI5NywyMDQxNy42OTksMjQ0NDcuNzk3LDIwNDQwLDIyNzIzLDIyOTE0LDI3NTUwLDIyNzcyLDI1NTg3LDI1NjQ0LDMwODU2LDI1NDA5LDI4Mzg2LDI4Nzc3LDM1Mzg2LDI5ODE5LDMzNTIxLDMzNTA5LDQwNzg1LDM1MTI5LDM4OTEzLDQwODk5LDUxODY4LDQzNDQ3LDQ2NTg4LDQ2MTgxLDU3MDc5LDQ4NTY1LDUzMTg3LDUzMTg1LDY0NzM1LDUyMTI2LDU2NzgxLDU1NzY1LDY2OTA1LDU3MjI0LDYzMjMxLDYzMDM2LDc1MTkwLDY1NDM0LDcwNTE2LDY5MjgyLDgyOTAwLDcwNzU1LDc2Njk3LDc1Mzk3LDg5MjUyLDc5Njc1LDg1NDMwLDg0NDY3LDk5MDc4LDg2Mzc4LDkyODI3LDkxNzk0LDEwNzI4OSw5NDk0MCwxMDIzNDIsOTgzNDUsMTA4NzQ3LDk0MjE0LDEwMDg3Niw5OTM3MywxMTM2MjIsOTk4MTEsMTAzNzI2LDEwMTk1MiwxMTYzNjAsMTA0MTg5LDEwOTM2NiwxMTAyMjYsMTIzMTY5LDExMzAxMCwxMTQwNjUsMTEzODAwLDEyNzc3NiwxMTQwNzAsMTE2ODMwLDExNTY4OCwxMjk3MDYsMTE0OTYwLDEyMDEyNSwxMTkwMDEsMTMxNTY1LDExNDgyNiwxMjAyMjksMTE3NDA4LDEyOTY2NywxMTU5MDQsMTIwMzE5LDExODE3OSwxMzA5MzYsMTE3NTQyLDEyMjk2OCwxMjMxNzksMTM2MjY3LDEyMjY5MCwxMjgwMjgpLFxuICAgICAgICAgICAgICAgICByZWNlc3Npb249YygxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSlcbmRmIDwtIGRmICU+JSBtdXRhdGUocmV2dHFfeW95ID0gKHJldnRxIC0gbGFnKHJldnRxLCA0KSkgLyBsYWcocmV2dHEsIDQpLFxuICAgICAgICAgICAgICAgICAgICByZWNlc3Npb25fbGFnID0gbGFnKHJlY2Vzc2lvbiksXG4gICAgICAgICAgICAgICAgICAgIHJldnRxX2Rvd24gPSBpZmVsc2UocmV2dHFfeW95PDAsMSwwKSxcbiAgICAgICAgICAgICAgICAgICAgcmV2dHFfeW95X2xhZyA9IGxhZyhyZXZ0cV95b3kpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gZnllYXJxICsgKGZxdHItMSkvNClcbm1vZDEgPC0gZ2xtKHJldnRxX2Rvd24gfiByZXZ0cV95b3lfbGFnLCBkYXRhPWRmLCBmYW1pbHk9Ymlub21pYWwpIiwic2FtcGxlIjoiIyBUaGUgZGF0YWZyYW1lIGJlbG93IGNvbnRhaW5zIGhpc3RvcmljYWwgcmV2ZW51ZSBmb3IgV2FsbWFydCBzaW5jZSAxOTcwXG4jIEFsbCBkYXRhIGlzIHF1YXJ0ZXJseVxuIyBUaGUgZmlsZSB1c2VzIENvbXB1c3RhdCdzIG5vbWVuY2xhdHVyZTpcbiMgICAgIC0gcmV2dHFfeW95IGlzIHllYXIgb3ZlciB5ZWFyIHJldmVudWUgZ3Jvd3RoXG4jICAgICAtIHJldnRxX2Rvd24gaXMgYW4gaW5kaWNhdG9yIGVxdWFsIHRvIDEgaWYgcmV2dHFfeW95IGlzIG5lZ2F0aXZlLCBlbHNlIDBcbiMgICAgIC0gcmV2dHFfeW95X2xhZyBpcyB0aGUgbGFnIG9mIHJldnRxX3lveVxuIyAgICAgLSBkYXRlIGlzIGEgZnJhY3Rpb25hbCBkYXRlXG4jIG1vZDEgZnJvbSB0aGUgbGFzdCBleGVyY2lzZSBpcyBhbHNvIGxvYWRlZFxuXG4jIFVzZSBwcmVkaWN0KCkgdG8gY2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiBkZWNyZWFzaW5nIHllYXIgb3ZlciB5ZWFyXG4jIHJldmVudWUgZm9yIFdhbG1hcnQgYmFzZWQgb24gbW9kMVxuZGYkcHJlZCA8LSBwcmVkaWN0KG1vZDEsIGRmLCB0eXBlPVwicmVzcG9uc2VcIilcblxuIyBQbG90IG91dCB0aGUgYWN0dWFsIGRlY3JlYXNlcyBhbmQgcHJlZGljdGVkIGRlY3JlYXNlIHByb2JhYmlsaXRpZXMgYnkgeWVhclxuIyBnZ3Bsb3QyIGlzIGFscmVhZHkgbG9hZGVkXG5nZ3Bsb3QoZGF0YT1kZikgKyBcbiAgZ2VvbV9wb2ludChhZXMoeSA9ICwgeCA9ICwgY29sb3IgPSBcIkFjdHVhbFwiKSkgKyBcbiAgZ2VvbV9wb2ludChhZXMoeSA9ICwgeCA9ICwgY29sb3IgPSBcIlByZWRpY3RlZFwiKSkgKyBcbiAgeWxhYihcIkRlY3JlYXNlIGluIHJldmVudWVcIilcblxuXG4jRU5EIiwic29sdXRpb24iOiIjIFRoZSBkYXRhZnJhbWUgYmVsb3cgY29udGFpbnMgaGlzdG9yaWNhbCByZXZlbnVlIGZvciBXYWxtYXJ0IHNpbmNlIDE5NzBcbiMgQWxsIGRhdGEgaXMgcXVhcnRlcmx5XG4jIFRoZSBmaWxlIHVzZXMgQ29tcHVzdGF0J3Mgbm9tZW5jbGF0dXJlOlxuIyAgICAgLSByZXZ0cV95b3kgaXMgeWVhciBvdmVyIHllYXIgcmV2ZW51ZSBncm93dGhcbiMgICAgIC0gcmV2dHFfZG93biBpcyBhbiBpbmRpY2F0b3IgZXF1YWwgdG8gMSBpZiByZXZ0cV95b3kgaXMgbmVnYXRpdmUsIGVsc2UgMFxuIyAgICAgLSByZXZ0cV95b3lfbGFnIGlzIHRoZSBsYWcgb2YgcmV2dHFfeW95XG4jICAgICAtIGRhdGUgaXMgYSBmcmFjdGlvbmFsIGRhdGVcbiMgbW9kMSBmcm9tIHRoZSBsYXN0IGV4ZXJjaXNlIGlzIGFsc28gbG9hZGVkXG5cbiMgVXNlIHByZWRpY3QoKSB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIGRlY3JlYXNpbmcgeWVhciBvdmVyIHllYXJcbiMgcmV2ZW51ZSBmb3IgV2FsbWFydCBiYXNlZCBvbiBtb2QxXG5kZiRwcmVkIDwtIHByZWRpY3QobW9kMSwgZGYsIHR5cGU9XCJyZXNwb25zZVwiKVxuXG4jIFBsb3Qgb3V0IHRoZSBhY3R1YWwgZGVjcmVhc2VzIGFuZCBwcmVkaWN0ZWQgZGVjcmVhc2UgcHJvYmFiaWxpdGllcyBieSBkYXRlXG4jIGdncGxvdDIgaXMgYWxyZWFkeSBsb2FkZWRcbmdncGxvdChkYXRhPWRmKSArIFxuICBnZW9tX3BvaW50KGFlcyh5ID0gcmV2dHFfZG93biwgeCA9IGRhdGUsIGNvbG9yID0gXCJBY3R1YWxcIikpICsgXG4gIGdlb21fcG9pbnQoYWVzKHkgPSBwcmVkLCB4ID0gZGF0ZSwgY29sb3IgPSBcIlByZWRpY3RlZFwiKSkgKyBcbiAgeWxhYihcIkRlY3JlYXNlIGluIHJldmVudWVcIilcblxuXG4jRU5EIiwic2N0IjoiIyBUZW1wbGF0ZSBiYXNlZCBvbiBodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvdGVzdHdoYXQvdmVyc2lvbnMvNC4xLjFcbiMgQ2hlY2sgaWYgc29tZXRoaW5nIGlzIGV4cGxpY2l0bHkgdHlwZWRcblxudGVzdF9zdHVkZW50X3R5cGVkKCd4ID0gZGF0ZScsbm90X3R5cGVkX21zZz0nTWFrZSBzdXJlIHRvIHJlZ3Jlc3MgYHJldnRxX2Rvd25gIG9uIGByZXZ0cV95b3lfbGFnYC4nKVxudGVzdF9zdHVkZW50X3R5cGVkKCd5ID0gcmV2dHFfZG93bicsbm90X3R5cGVkX21zZz0nTWFrZSBzdXJlIHRvIHNldCBgeSA9IHJldnRxX2Rvd25gIHdpdGhpbiBgYWVzKClgIGZvciB0aGUgYWN0dWFsIGRlY3JlYXNlIGluIHJldmVudWUgc2VyaWVzLicpXG50ZXN0X3N0dWRlbnRfdHlwZWQoJ3kgPSBwcmVkJyxub3RfdHlwZWRfbXNnPSdNYWtlIHN1cmUgdG8gc2V0IGB5ID0gcHJlZGAgd2l0aGluIGBhZXMoKWAgZm9yIHRoZSBwcmVkaWN0ZWQgZGVjcmVhc2UgaW4gcmV2ZW51ZSBzZXJpZXMuJylcbnRlc3Rfc3R1ZGVudF90eXBlZCgndHlwZSA9IFwicmVzcG9uc2VcIicsbm90X3R5cGVkX21zZz0nTWFrZSBzdXJlIHRvIHNldCBgdHlwZSA9IFwicmVzcG9uc2VcImAgd2hlbiB1c2luZyBgcHJlZGljdCgpYC4nKVxudGVzdF9leHByZXNzaW9uX291dHB1dChcImRmJHByZWRcIiwgaW5jb3JyZWN0X21zZz1cIllvdXIgcHJlZGljdGlvbnMgaW4gYGRmJHByZWRgIGRvbid0IHNlZW0gcXVpdGUgcmlnaHQuXCIpXG5cbiMgdGVzdF9zdHVkZW50X3R5cGVkKCd4IDwtIDInLCBub3RfdHlwZWRfbXNnPScnKVxuXG4jIENoZWNrIGlmIGZ1bmN0aW9uIHdhcyB1c2VkIGluIGlucHV0IGNvZGVcbiMgdGVzdF9mdW5jdGlvbignYycsaW5jb3JyZWN0X21zZz0nJykgIFxuXG4jIFJlcXVpcmVzIGFuIG9iamVjdCBgeGAgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgc29sdXRpb25cbiMgdGVzdF9vYmplY3QoXCJ4XCIsaW5jb3JyZWN0X21zZyA9IFwiXCIsdW5kZWZpbmVkX21zZyA9IFwiXCIpICBcblxuIyBSZXF1aXJlcyBhbiBvbmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvZiBgeGAgaW4gdGhlIHNvbHV0aW9uXG4jIHRlc3RfYW5fb2JqZWN0KFwieFwiLHVuZGVmaW5lZF9tc2c9XCJcIilcblxuIyBDaGVja3MgaWYgb3V0cHV0IG9mIHN0dWRlbnQncyBjb2RlIGNvbnRhaW5zIGdpdmVuIGV2YWx1YXRlZCBleHByZXNzaW9uXG4jIHRlc3Rfb3V0cHV0X2NvbnRhaW5zKFwieFwiLGluY29ycmVjdF9tc2cgPSBcIlwiKVxuXG4jIENoZWNrIGlmIGEgdmVjdG9yIG9mIHByZWRlZmluZWQgb2JqZWN0cyBhcmUgdW5jaGFuZ2VkXG4jIHRlc3RfcHJlZGVmaW5lZF9vYmplY3RzKGMoJ3gnLCd5JyksaW5jb3JyZWN0X21zZz1cIkRvbid0IG9udmVyd3JpdGUgdGhlIHByZWRlZmluZWQgdmFyaWFibGVzXCIpXG5cbiMgQ2hlY2tzIGZvciBhIHJlZ2V4IHBhdHRlcm4gaW4gdHJoZSBvdXRwdXRcbiMgdGVzdF9vdXRwdXRfcmVnZXgocGF0dGVybixmaXhlZD1GLCB0aW1lcz0xLCBpbmNvcnJlY3RfbXNnPScnKVxuXG4jIENhbiBjaGVjayBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBhY3Jvc3MgYm90aCBzb2x1dGlvbiBhbmQgc3R1ZGVudCBjb2RlXG4jdGVzdF9leHByZXNzaW9uX291dHB1dChcInR5cGVvZihjb21wYW55X25hbWUpXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IHN0b3JlIHRleHR1YWwgZGF0YSBpbiBgY29tcGFueV9uYW1lYD9cIilcblxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpXG5cbiMgT3RoZXIgZnVuY3Rpb25zIHRvIG5vdGU6XG4jICAgICAtIHRlc3Rfb3IoYSxiKSAtLSBjaGVja3MgaWYgZWl0aGVyIHRlc3QgYSBvciB0ZXN0IGIgcGFzc1xuIyAgICAgLSB0ZXN0X2dncGxvdCgpIC0tIGNhbiBjaGVjayBpZiBwbG90cyBhcmUgY29ycmVjdFxuIyAgICAgLSB0ZXN0X2Z1bmN0aW9uKCkgLS0gY2FuIGFsc28gY2hlY2sgaW5jbHVkZWQgcGFyYW1ldGVyc1xuIyAgICAgLSB0ZXN0X2xvb3AoKSAtLSBjaGVja2luZyBmb3IgYW5kIHdoaWxlIGxvb3BzXG4jICAgICAtIHRlc3RfbGlicmFyeV9mdW5jdGlvbigncGFja2FnZScsIG5vdF9jYWxsZWRfbXNnPScnLGluY29ycmVjdF9tc2c9JycpXG4jICAgICAtIHRlc3RfaWZfZWxzZSgpIC0tIGNoZWNraW5nIGlmIHN0YXRlbWVudHNcbiMgICAgIC0gdGVzdF9leHByZXNzaW9uX2Vycm9yKCkgLS0gY2FuIGNoZWNrIGlmIGZ1bmN0aW9ucyBhcmUgcHJvcGVybHkgZGVmaW5lZFxuIyAgICAgLSB0ZXN0X29wZXJhdG9yKCdvcGVyYXRvcicsKSwgbm90X2NhbGxlZF9tc2c9JycsaW5jb3JyZWN0X21zZz0nJylcbiMgICAgIC0gdGVzdF9mdW5jdGlvbl9kZWZpbml0aW9uKCkgLS0gcmlnb3JvdXNseSBjaGVjayBkZWZpbmVkIGZ1bmN0aW9uXG4jICAgICAtIHRlc3RfZGF0YV9mcmFtZSgpIC0tIGNoZWNrIGlmIGRhdGFmcmFtZSBbY29sdW1uc10gYXJlIGVxdWl2YWxlbnRcbiMgICAgIC0gdGVzdF9mdW5jdGlvbl9yZXN1bHQsIHRlc3RfZXhwcmVzc2lvbl9yZXN1bHQifQ==
Exercise 3: ROC curve and AUC
Note: This isn’t using the RCOR library directly, but instead implements a subset of the functionality of RCOR 1.0-5.
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpYnJhcnkoZHBseXIpICMgbG9hZHMgZHBseXIgZm9yIGRhdGEgbWFuaXB1bGF0aW9uXG5saWJyYXJ5KGdncGxvdDIpXG5kZiA8LSBkYXRhLmZyYW1lKHRpYz1yZXAoXCJXTVRcIiwxOTQpLFxuICAgICAgICAgICAgICAgICBmeWVhcnE9YygxOTcwLDE5NzAsMTk3MCwxOTcwLDE5NzEsMTk3MSwxOTcxLDE5NzEsMTk3MiwxOTcyLDE5NzIsMTk3MiwxOTczLDE5NzMsMTk3MywxOTczLDE5NzQsMTk3NCwxOTc0LDE5NzQsMTk3NSwxOTc1LDE5NzUsMTk3NSwxOTc2LDE5NzYsMTk3NiwxOTc2LDE5NzcsMTk3NywxOTc3LDE5NzcsMTk3OCwxOTc4LDE5NzgsMTk3OCwxOTc5LDE5NzksMTk3OSwxOTc5LDE5ODAsMTk4MCwxOTgwLDE5ODAsMTk4MSwxOTgxLDE5ODEsMTk4MSwxOTgyLDE5ODIsMTk4MiwxOTgyLDE5ODMsMTk4MywxOTgzLDE5ODMsMTk4NCwxOTg0LDE5ODQsMTk4NCwxOTg1LDE5ODUsMTk4NSwxOTg1LDE5ODYsMTk4NiwxOTg2LDE5ODYsMTk4NywxOTg3LDE5ODcsMTk4NywxOTg4LDE5ODgsMTk4OCwxOTg4LDE5ODksMTk4OSwxOTg5LDE5ODksMTk5MCwxOTkwLDE5OTAsMTk5MCwxOTkxLDE5OTEsMTk5MSwxOTkxLDE5OTIsMTk5MiwxOTkyLDE5OTIsMTk5MywxOTkzLDE5OTMsMTk5MywxOTk0LDE5OTQsMTk5NCwxOTk0LDE5OTUsMTk5NSwxOTk1LDE5OTUsMTk5NiwxOTk2LDE5OTYsMTk5NiwxOTk3LDE5OTcsMTk5NywxOTk3LDE5OTgsMTk5OCwxOTk4LDE5OTgsMTk5OSwxOTk5LDE5OTksMTk5OSwyMDAwLDIwMDAsMjAwMCwyMDAwLDIwMDEsMjAwMSwyMDAxLDIwMDEsMjAwMiwyMDAyLDIwMDIsMjAwMiwyMDAzLDIwMDMsMjAwMywyMDAzLDIwMDQsMjAwNCwyMDA0LDIwMDQsMjAwNSwyMDA1LDIwMDUsMjAwNSwyMDA2LDIwMDYsMjAwNiwyMDA2LDIwMDcsMjAwNywyMDA3LDIwMDcsMjAwOCwyMDA4LDIwMDgsMjAwOCwyMDA5LDIwMDksMjAwOSwyMDA5LDIwMTAsMjAxMCwyMDEwLDIwMTAsMjAxMSwyMDExLDIwMTEsMjAxMSwyMDEyLDIwMTIsMjAxMiwyMDEyLDIwMTMsMjAxMywyMDEzLDIwMTMsMjAxNCwyMDE0LDIwMTQsMjAxNCwyMDE1LDIwMTUsMjAxNSwyMDE1LDIwMTYsMjAxNiwyMDE2LDIwMTYsMjAxNywyMDE3LDIwMTcsMjAxNywyMDE4LDIwMTgpLFxuICAgICAgICAgICAgICAgICBmcXRyPWMoMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyLDMsNCwxLDIsMyw0LDEsMiwzLDQsMSwyKSxcbiAgICAgICAgICAgICAgICAgcmV2dHE9Yyg3LjI2Nyw5LjkzOSwxMS40NywxNS42MSwxMi43NTgsMTguMjA3LDE5LjIwNSwyNy44NDQsMjEuMDExLDI5LjkxOCwzMi42ODMsNDEuMjc3LDMyLjczNywzNy42NTUsNDIuMDk4LDU1LjA3MSw0Ni4zNTUsNTYuMTc3LDU5LjQ2Miw3NC4yMTUsNjQuNjUsNzguODUyLDg2LjEwOCwxMTAuNzIxLDkzLjk3MSwxMTUuMTg2LDEyMS44NzUsMTQ3Ljc3NSwxMjIuNjU1LDE1Mi4zODEsMTcyLjYzNywyMzAuNzgzLDE2Ny4yNzQsMjA0LjA4NSwyMjEuOTgyLDMwNi45NTcsMjM4LjU2OSwyOTEuNjg1LDMwMC43NDcsNDE3LjE3NSwzMTQuNTc1LDM3Mi41OTgsNDAxLjg0Miw1NTQuMTg0LDQzNC4yNTEsNTMzLjY1Myw2MzQuNDc2LDg0Mi42MTcsNjY1LjIyOSw3ODguNzA1LDgyNy43NjcsMTA5NC41NTEsODU0LjczNCwxMDk4Ljk0MiwxMTY2LjU5NCwxNTQ2LjYzOSwxMjM0Ljc2OCwxNTA4LjUzMywxNTgzLjU3MywyMDczLjk4MywxNjU1LjY2MSwxOTM0LjM1OCwyMDg3LjUzMywyNzczLjkzNiwyMzQ0LjI1MywyNzcwLjI3NiwyOTQ5LjAwOCwzODQ1LjU1NywzMjExLjc2MSwzNzMyLjIzNyw0MDE1LjAxNyw1MDAwLjIzOCw0MjgyLjAxMiw0ODQ1LjEzMyw0OTkxLjExMyw2NTMwLjczNCw1MzczLjI1OCw2MDQ2LjQxLDYyODMuNDk2LDgxMDcuNDg0LDY3NjguMTkxLDc1NDMuNTA4LDc5MzAuOTQ5LDEwMzU4Ljg5OCw5MjgwLjU2NiwxMDMzOS44OTgsMTA2MjcuNSwxMzYzOC43OTcsMTE2NDkuMzk4LDEzMDI4LjM5OCwxMzY4My43OTcsMTcxMjIsMTM5MjAuMzk4LDE2MjM2LjUsMTY4MjYuODk4LDIwMzYwLjUsMTc2ODYuMDk4LDE5OTQyLjI5NywyMDQxNy42OTksMjQ0NDcuNzk3LDIwNDQwLDIyNzIzLDIyOTE0LDI3NTUwLDIyNzcyLDI1NTg3LDI1NjQ0LDMwODU2LDI1NDA5LDI4Mzg2LDI4Nzc3LDM1Mzg2LDI5ODE5LDMzNTIxLDMzNTA5LDQwNzg1LDM1MTI5LDM4OTEzLDQwODk5LDUxODY4LDQzNDQ3LDQ2NTg4LDQ2MTgxLDU3MDc5LDQ4NTY1LDUzMTg3LDUzMTg1LDY0NzM1LDUyMTI2LDU2NzgxLDU1NzY1LDY2OTA1LDU3MjI0LDYzMjMxLDYzMDM2LDc1MTkwLDY1NDM0LDcwNTE2LDY5MjgyLDgyOTAwLDcwNzU1LDc2Njk3LDc1Mzk3LDg5MjUyLDc5Njc1LDg1NDMwLDg0NDY3LDk5MDc4LDg2Mzc4LDkyODI3LDkxNzk0LDEwNzI4OSw5NDk0MCwxMDIzNDIsOTgzNDUsMTA4NzQ3LDk0MjE0LDEwMDg3Niw5OTM3MywxMTM2MjIsOTk4MTEsMTAzNzI2LDEwMTk1MiwxMTYzNjAsMTA0MTg5LDEwOTM2NiwxMTAyMjYsMTIzMTY5LDExMzAxMCwxMTQwNjUsMTEzODAwLDEyNzc3NiwxMTQwNzAsMTE2ODMwLDExNTY4OCwxMjk3MDYsMTE0OTYwLDEyMDEyNSwxMTkwMDEsMTMxNTY1LDExNDgyNiwxMjAyMjksMTE3NDA4LDEyOTY2NywxMTU5MDQsMTIwMzE5LDExODE3OSwxMzA5MzYsMTE3NTQyLDEyMjk2OCwxMjMxNzksMTM2MjY3LDEyMjY5MCwxMjgwMjgpLFxuICAgICAgICAgICAgICAgICByZWNlc3Npb249YygxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSlcbmRmIDwtIGRmICU+JSBtdXRhdGUocmV2dHFfeW95ID0gKHJldnRxIC0gbGFnKHJldnRxLCA0KSkgLyBsYWcocmV2dHEsIDQpLFxuICAgICAgICAgICAgICAgICAgICByZWNlc3Npb25fbGFnID0gbGFnKHJlY2Vzc2lvbiksXG4gICAgICAgICAgICAgICAgICAgIHJldnRxX2Rvd24gPSBpZmVsc2UocmV2dHFfeW95PDAsMSwwKSxcbiAgICAgICAgICAgICAgICAgICAgcmV2dHFfeW95X2xhZyA9IGxhZyhyZXZ0cV95b3kpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gZnllYXJxICsgKGZxdHItMSkvNClcbm1vZDEgPC0gZ2xtKHJldnRxX2Rvd24gfiByZXZ0cV95b3lfbGFnLCBkYXRhPWRmLCBmYW1pbHk9Ymlub21pYWwpXG5kZiRwcmVkIDwtIHByZWRpY3QobW9kMSwgZGYsIHR5cGU9XCJyZXNwb25zZVwiKVxuXG5cbnByZWRpY3Rpb24gPC0gZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgbGFiZWwub3JkZXJpbmc9TlVMTCkge1xuXG4gICAgIyMgYnJpbmcgJ3ByZWRpY3Rpb25zJyBhbmQgJ2xhYmVscycgaW50byBsaXN0IGZvcm1hdCxcbiAgICAjIyBlYWNoIGxpc3QgZW50cnkgcmVwcmVzZW50aW5nIG9uZSB4LXZhbGlkYXRpb24gcnVuXG5cbiAgICAjIyBjb252ZXJ0IHByZWRpY3Rpb25zIGludG8gY2Fub25pY2FsIGxpc3QgZm9ybWF0XG4gICAgaWYgKGlzLmRhdGEuZnJhbWUocHJlZGljdGlvbnMpKSB7XG4gICAgICAgIG5hbWVzKHByZWRpY3Rpb25zKSA8LSBjKClcbiAgICAgICAgcHJlZGljdGlvbnMgPC0gYXMubGlzdChwcmVkaWN0aW9ucylcbiAgICB9IGVsc2UgaWYgKGlzLm1hdHJpeChwcmVkaWN0aW9ucykpIHtcbiAgICAgICAgcHJlZGljdGlvbnMgPC0gYXMubGlzdChkYXRhLmZyYW1lKHByZWRpY3Rpb25zKSlcbiAgICAgICAgbmFtZXMocHJlZGljdGlvbnMpIDwtIGMoKVxuICAgIH0gZWxzZSBpZiAoaXMudmVjdG9yKHByZWRpY3Rpb25zKSAmJiAhaXMubGlzdChwcmVkaWN0aW9ucykpIHtcbiAgICAgICAgcHJlZGljdGlvbnMgPC0gbGlzdChwcmVkaWN0aW9ucylcbiAgICB9IGVsc2UgaWYgKCFpcy5saXN0KHByZWRpY3Rpb25zKSkge1xuICAgICAgICBzdG9wKFwiRm9ybWF0IG9mIHByZWRpY3Rpb25zIGlzIGludmFsaWQuXCIpXG4gICAgfSBcbiAgICAjIyBpZiBwcmVkaWN0aW9ucyBpcyBhIGxpc3QgLT4ga2VlcCB1bmFsdGVyZWRcbiAgXG4gICAgIyMgY29udmVydCBsYWJlbHMgaW50byBjYW5vbmljYWwgbGlzdCBmb3JtYXRcbiAgICBpZiAoaXMuZGF0YS5mcmFtZShsYWJlbHMpKSB7XG4gICAgICAgIG5hbWVzKGxhYmVscykgPC0gYygpXG4gICAgICAgIGxhYmVscyA8LSBhcy5saXN0KCBsYWJlbHMpXG4gICAgfSBlbHNlIGlmIChpcy5tYXRyaXgobGFiZWxzKSkge1xuICAgICAgICBsYWJlbHMgPC0gYXMubGlzdCggZGF0YS5mcmFtZSggbGFiZWxzKSlcbiAgICAgICAgbmFtZXMobGFiZWxzKSA8LSBjKClcbiAgICB9IGVsc2UgaWYgKChpcy52ZWN0b3IobGFiZWxzKSB8fFxuICAgICAgICAgICAgICAgIGlzLm9yZGVyZWQobGFiZWxzKSB8fFxuICAgICAgICAgICAgICAgIGlzLmZhY3RvcihsYWJlbHMpKSAmJlxuICAgICAgICAgICAgICAgIWlzLmxpc3QobGFiZWxzKSkge1xuICAgICAgICBsYWJlbHMgPC0gbGlzdCggbGFiZWxzKVxuICAgIH0gZWxzZSBpZiAoIWlzLmxpc3QobGFiZWxzKSkge1xuICAgICAgICBzdG9wKFwiRm9ybWF0IG9mIGxhYmVscyBpcyBpbnZhbGlkLlwiKVxuICAgIH1cbiAgICAjIyBpZiBsYWJlbHMgaXMgYSBsaXN0IC0+IGtlZXAgdW5hbHRlcmVkXG5cbiAgICAjIyBMZW5ndGggY29uc2lzdGVuY3kgY2hlY2tzXG4gICAgaWYgKGxlbmd0aChwcmVkaWN0aW9ucykgIT0gbGVuZ3RoKGxhYmVscykpXG4gICAgICBzdG9wKHBhc3RlKFwiTnVtYmVyIG9mIGNyb3NzLXZhbGlkYXRpb24gcnVucyBtdXN0IGJlIGVxdWFsXCIsXG4gICAgICAgICAgICAgICAgIFwiZm9yIHByZWRpY3Rpb25zIGFuZCBsYWJlbHMuXCIpKVxuICAgIGlmICghIGFsbChzYXBwbHkocHJlZGljdGlvbnMsIGxlbmd0aCkgPT0gc2FwcGx5KGxhYmVscywgbGVuZ3RoKSkpXG4gICAgICBzdG9wKHBhc3RlKFwiTnVtYmVyIG9mIHByZWRpY3Rpb25zIGluIGVhY2ggcnVuIG11c3QgYmUgZXF1YWxcIixcbiAgICAgICAgICAgICAgICAgXCJ0byB0aGUgbnVtYmVyIG9mIGxhYmVscyBmb3IgZWFjaCBydW4uXCIpKVxuICAgIFxuICAgICMjIG9ubHkga2VlcCBwcmVkaWN0aW9uL2xhYmVsIHBhaXJzIHRoYXQgYXJlIGZpbml0ZSBudW1iZXJzXG4gICAgZm9yIChpIGluIDE6bGVuZ3RoKHByZWRpY3Rpb25zKSkge1xuICAgICAgICBmaW5pdGUuYm9vbCA8LSBpcy5maW5pdGUoIHByZWRpY3Rpb25zW1tpXV0gKVxuICAgICAgICBwcmVkaWN0aW9uc1tbaV1dIDwtIHByZWRpY3Rpb25zW1tpXV1bIGZpbml0ZS5ib29sIF1cbiAgICAgICAgbGFiZWxzW1tpXV0gPC0gbGFiZWxzW1tpXV1bIGZpbml0ZS5ib29sIF1cbiAgICB9XG5cbiAgICAjIyBhYm9ydCBpZiAnbGFiZWxzJyBmb3JtYXQgaXMgaW5jb25zaXN0ZW50IGFjcm9zc1xuICAgICMjIGRpZmZlcmVudCBjcm9zcy12YWxpZGF0aW9uIHJ1bnNcbiAgICBsYWJlbC5mb3JtYXQ9XCJcIiAgIyMgb25lIG9mICdub3JtYWwnLCdmYWN0b3InLCdvcmRlcmVkJ1xuICAgIGlmIChhbGwoc2FwcGx5KCBsYWJlbHMsIGlzLmZhY3RvcikpICYmXG4gICAgICAgICFhbnkoc2FwcGx5KGxhYmVscywgaXMub3JkZXJlZCkpKSB7XG4gICAgICAgIGxhYmVsLmZvcm1hdCA8LSBcImZhY3RvclwiXG4gICAgfSBlbHNlIGlmIChhbGwoc2FwcGx5KCBsYWJlbHMsIGlzLm9yZGVyZWQpKSkge1xuICAgICAgICBsYWJlbC5mb3JtYXQgPC0gXCJvcmRlcmVkXCJcbiAgICB9IGVsc2UgaWYgKGFsbChzYXBwbHkoIGxhYmVscywgaXMuY2hhcmFjdGVyKSkgfHwgXG4gICAgICAgICAgICAgICBhbGwoc2FwcGx5KCBsYWJlbHMsIGlzLm51bWVyaWMpKSB8fFxuICAgICAgICAgICAgICAgYWxsKHNhcHBseSggbGFiZWxzLCBpcy5sb2dpY2FsKSkpIHtcbiAgICAgICAgbGFiZWwuZm9ybWF0IDwtIFwibm9ybWFsXCJcbiAgICB9IGVsc2Uge1xuICAgICAgICBzdG9wKHBhc3RlKFwiSW5jb25zaXN0ZW50IGxhYmVsIGRhdGEgdHlwZSBhY3Jvc3MgZGlmZmVyZW50XCIsXG4gICAgICAgICAgICAgICAgICAgXCJjcm9zcy12YWxpZGF0aW9uIHJ1bnMuXCIpKVxuICAgIH1cbiAgICBcbiAgICAjIyBhYm9ydCBpZiBsZXZlbHMgYXJlIG5vdCBjb25zaXN0ZW50IGFjcm9zcyBkaWZmZXJlbnRcbiAgICAjIyBjcm9zcy12YWxpZGF0aW9uIHJ1bnNcbiAgICBpZiAoISBhbGwoc2FwcGx5KGxhYmVscywgbGV2ZWxzKT09bGV2ZWxzKGxhYmVsc1tbMV1dKSkgKSB7XG4gICAgICAgIHN0b3AocGFzdGUoXCJJbmNvbnNpc3RlbnQgZmFjdG9yIGxldmVscyBhY3Jvc3MgZGlmZmVyZW50XCIsXG4gICAgICAgICAgICAgICAgICAgXCJjcm9zcy12YWxpZGF0aW9uIHJ1bnMuXCIpKVxuICAgIH1cbiAgICAgICAgXG4gICAgIyMgY29udmVydCAnbGFiZWxzJyBpbnRvIG9yZGVyZWQgZmFjdG9ycywgYWJvcnRpbmcgaWYgdGhlIG51bWJlclxuICAgICMjIG9mIGNsYXNzZXMgaXMgbm90IGVxdWFsIHRvIDIuXG4gICAgbGV2ZWxzIDwtIGMoKVxuICAgIGlmICggbGFiZWwuZm9ybWF0ID09IFwib3JkZXJlZFwiICkge1xuICAgICAgICBpZiAoIWlzLm51bGwobGFiZWwub3JkZXJpbmcpKSB7XG4gICAgICAgICAgICBzdG9wKHBhc3RlKFwiJ2xhYmVscycgaXMgYWxyZWFkeSBvcmRlcmVkLiBObyBhZGRpdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIFwiJ2xhYmVsLm9yZGVyaW5nJyBtdXN0IGJlIHN1cHBsaWVkLlwiKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldmVscyA8LSBsZXZlbHMobGFiZWxzW1sxXV0pXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIGlzLm51bGwoIGxhYmVsLm9yZGVyaW5nICkpIHtcbiAgICAgICAgICAgIGlmICggbGFiZWwuZm9ybWF0ID09IFwiZmFjdG9yXCIgKSBsZXZlbHMgPC0gc29ydChsZXZlbHMobGFiZWxzW1sxXV0pKVxuICAgICAgICAgICAgZWxzZSBsZXZlbHMgPC0gc29ydCggdW5pcXVlKCB1bmxpc3QoIGxhYmVscykpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICMjIGlmICghc2V0ZXF1YWwoIGxldmVscywgbGFiZWwub3JkZXJpbmcpKSB7XG4gICAgICAgICAgaWYgKCFzZXRlcXVhbCggdW5pcXVlKHVubGlzdChsYWJlbHMpKSwgbGFiZWwub3JkZXJpbmcgKSkge1xuICAgICAgICAgICAgc3RvcChcIkxhYmVsIG9yZGVyaW5nIGRvZXMgbm90IG1hdGNoIGNsYXNzIGxhYmVscy5cIilcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV2ZWxzIDwtIGxhYmVsLm9yZGVyaW5nXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpIGluIDE6bGVuZ3RoKGxhYmVscykpIHtcbiAgICAgICAgICAgIGlmIChpcy5mYWN0b3IobGFiZWxzKSlcbiAgICAgICAgICAgICAgbGFiZWxzW1tpXV0gPC0gb3JkZXJlZChhcy5jaGFyYWN0ZXIobGFiZWxzW1tpXV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1sZXZlbHMpXG4gICAgICAgICAgICBlbHNlIGxhYmVsc1tbaV1dIDwtIG9yZGVyZWQoIGxhYmVsc1tbaV1dLCBsZXZlbHM9bGV2ZWxzKVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAobGVuZ3RoKGxldmVscykgIT0gMikge1xuICAgICAgICBtZXNzYWdlIDwtIHBhc3RlKFwiTnVtYmVyIG9mIGNsYXNzZXMgaXMgbm90IGVxdWFsIHRvIDIuXFxuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXCJST0NSIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IGV2YWx1YXRpb24gb2YgXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXCJiaW5hcnkgY2xhc3NpZmljYXRpb24gdGFza3MuXCIsc2VwPVwiXCIpXG4gICAgICAgIHN0b3AobWVzc2FnZSlcbiAgICB9XG5cbiAgICAjIyBkZXRlcm1pbmUgd2hldGhlciBwcmVkaWN0aW9ucyBhcmUgY29udGludW91cyBvciBjYXRlZ29yaWNhbFxuICAgICMjIChpbiB0aGUgbGF0dGVyIGNhc2Ugc3RvcDsgc2NoZWR1bGVkIGZvciB0aGUgbmV4dCBST0NSIHZlcnNpb24pXG4gICAgaWYgKCFpcy5udW1lcmljKCB1bmxpc3QoIHByZWRpY3Rpb25zICkpKSB7XG4gICAgICAgIHN0b3AoXCJDdXJyZW50bHksIG9ubHkgY29udGludW91cyBwcmVkaWN0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IFJPQ1IuXCIpXG4gICAgfVxuXG4gICAgIyMgY29tcHV0ZSBjdXRvZmYvZnAvdHAgZGF0YVxuXG4gICAgY3V0b2ZmcyA8LSBsaXN0KClcbiAgICBmcCA8LSBsaXN0KClcbiAgICB0cCA8LSBsaXN0KClcbiAgICBmbiA8LSBsaXN0KClcbiAgICB0biA8LSBsaXN0KClcbiAgICBuLnBvcyA8LSBsaXN0KClcbiAgICBuLm5lZyA8LSBsaXN0KClcbiAgICBuLnBvcy5wcmVkIDwtIGxpc3QoKVxuICAgIG4ubmVnLnByZWQgPC0gbGlzdCgpXG4gICAgZm9yIChpIGluIDE6bGVuZ3RoKHByZWRpY3Rpb25zKSkge1xuICAgICAgICBuLnBvcyA8LSBjKCBuLnBvcywgc3VtKCBsYWJlbHNbW2ldXSA9PSBsZXZlbHNbMl0gKSlcbiAgICAgICAgbi5uZWcgPC0gYyggbi5uZWcsIHN1bSggbGFiZWxzW1tpXV0gPT0gbGV2ZWxzWzFdICkpXG4gICAgICAgIGFucyA8LSAuY29tcHV0ZS51bm5vcm1hbGl6ZWQucm9jLmN1cnZlKCBwcmVkaWN0aW9uc1tbaV1dLCBsYWJlbHNbW2ldXSApXG4gICAgICAgIGN1dG9mZnMgPC0gYyggY3V0b2ZmcywgbGlzdCggYW5zJGN1dG9mZnMgKSlcbiAgICAgICAgZnAgPC0gYyggZnAsIGxpc3QoIGFucyRmcCApKVxuICAgICAgICB0cCA8LSBjKCB0cCwgbGlzdCggYW5zJHRwICkpXG4gICAgICAgIGZuIDwtIGMoIGZuLCBsaXN0KCBuLnBvc1tbaV1dIC0gdHBbW2ldXSApKVxuICAgICAgICB0biA8LSBjKCB0biwgbGlzdCggbi5uZWdbW2ldXSAtIGZwW1tpXV0gKSlcbiAgICAgICAgbi5wb3MucHJlZCA8LSBjKG4ucG9zLnByZWQsIGxpc3QodHBbW2ldXSArIGZwW1tpXV0pIClcbiAgICAgICAgbi5uZWcucHJlZCA8LSBjKG4ubmVnLnByZWQsIGxpc3QodG5bW2ldXSArIGZuW1tpXV0pIClcbiAgICB9XG5cblxuICAgIHJldHVybiggbmV3KFwicHJlZGljdGlvblwiLCBwcmVkaWN0aW9ucz1wcmVkaWN0aW9ucyxcbiAgICAgICAgICAgICAgICBsYWJlbHM9bGFiZWxzLFxuICAgICAgICAgICAgICAgIGN1dG9mZnM9Y3V0b2ZmcyxcbiAgICAgICAgICAgICAgICBmcD1mcCxcbiAgICAgICAgICAgICAgICB0cD10cCxcbiAgICAgICAgICAgICAgICBmbj1mbixcbiAgICAgICAgICAgICAgICB0bj10bixcbiAgICAgICAgICAgICAgICBuLnBvcz1uLnBvcyxcbiAgICAgICAgICAgICAgICBuLm5lZz1uLm5lZyxcbiAgICAgICAgICAgICAgICBuLnBvcy5wcmVkPW4ucG9zLnByZWQsXG4gICAgICAgICAgICAgICAgbi5uZWcucHJlZD1uLm5lZy5wcmVkKSlcbn1cblxuXG4jIyBmYXN0IGZwL3RwIGNvbXB1dGF0aW9uIGJhc2VkIG9uIGN1bXVsYXRpdmUgc3VtbWluZ1xuLmNvbXB1dGUudW5ub3JtYWxpemVkLnJvYy5jdXJ2ZSA8LSBmdW5jdGlvbiggcHJlZGljdGlvbnMsIGxhYmVscyApIHtcbiAgICAjIyBkZXRlcm1pbmUgdGhlIGxhYmVscyB0aGF0IGFyZSB1c2VkIGZvciB0aGUgcG9zLiByZXNwLiBuZWcuIGNsYXNzIDpcbiAgICBwb3MubGFiZWwgPC0gbGV2ZWxzKGxhYmVscylbMl1cbiAgICBuZWcubGFiZWwgPC0gbGV2ZWxzKGxhYmVscylbMV1cblxuICAgIHByZWQub3JkZXIgPC0gb3JkZXIocHJlZGljdGlvbnMsIGRlY3JlYXNpbmc9VFJVRSlcbiAgICBwcmVkaWN0aW9ucy5zb3J0ZWQgPC0gcHJlZGljdGlvbnNbcHJlZC5vcmRlcl1cbiAgICB0cCA8LSBjdW1zdW0obGFiZWxzW3ByZWQub3JkZXJdPT1wb3MubGFiZWwpXG4gICAgZnAgPC0gY3Vtc3VtKGxhYmVsc1twcmVkLm9yZGVyXT09bmVnLmxhYmVsKVxuXG4gICAgIyMgcmVtb3ZlIGZwICYgdHAgZm9yIGR1cGxpY2F0ZWQgcHJlZGljdGlvbnNcbiAgICAjIyBhcyBkdXBsaWNhdGVkIGtlZXBzIHRoZSBmaXJzdCBvY2N1cnJlbmNlLCBidXQgd2Ugd2FudCB0aGUgbGFzdCwgdHdvXG4gICAgIyMgcmV2IGFyZSB1c2VkLlxuICAgICMjIEhpZ2hlc3QgY3V0b2ZmIChJbmZpbml0eSkgY29ycmVzcG9uZHMgdG8gdHA9MCwgZnA9MFxuICAgIGR1cHMgPC0gcmV2KGR1cGxpY2F0ZWQocmV2KHByZWRpY3Rpb25zLnNvcnRlZCkpKVxuICAgIHRwIDwtIGMoMCwgdHBbIWR1cHNdKVxuICAgIGZwIDwtIGMoMCwgZnBbIWR1cHNdKVxuICAgIGN1dG9mZnMgPC0gYyhJbmYsIHByZWRpY3Rpb25zLnNvcnRlZFshZHVwc10pXG4gICAgXG4gICAgcmV0dXJuKGxpc3QoIGN1dG9mZnM9Y3V0b2ZmcywgZnA9ZnAsIHRwPXRwICkpXG59XG5cbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIyMgY2xhc3NpY2FsIG1hY2hpbmUgbGVhcm5pbmcgY29udGluZ2VuY3kgdGFibGUgbWVhc3VyZXNcbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucGVyZm9ybWFuY2UuYWNjdXJhY3kgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgIFxuICAgICAgbGlzdCggY3V0b2ZmcywgKHRuK3RwKSAvIGxlbmd0aChwcmVkaWN0aW9ucykgKVxuICB9XG5cbi5wZXJmb3JtYW5jZS5lcnJvci5yYXRlIDwtXG4gIGZ1bmN0aW9uKHByZWRpY3Rpb25zLCBsYWJlbHMsIGN1dG9mZnMsIGZwLCB0cCwgZm4sIHRuLFxuICAgICAgICAgICBuLnBvcywgbi5uZWcsIG4ucG9zLnByZWQsIG4ubmVnLnByZWQpIHtcblxuICAgICAgbGlzdCggY3V0b2ZmcywgKGZuK2ZwKSAvIGxlbmd0aChwcmVkaWN0aW9ucykgKVxuICB9XG5cbi5wZXJmb3JtYW5jZS5mYWxzZS5wb3NpdGl2ZS5yYXRlIDwtXG4gIGZ1bmN0aW9uKHByZWRpY3Rpb25zLCBsYWJlbHMsIGN1dG9mZnMsIGZwLCB0cCwgZm4sIHRuLFxuICAgICAgICAgICBuLnBvcywgbi5uZWcsIG4ucG9zLnByZWQsIG4ubmVnLnByZWQpIHtcbiAgICBcbiAgICAgIGxpc3QoIGN1dG9mZnMsIGZwIC8gbi5uZWcgKVxuICB9XG5cbi5wZXJmb3JtYW5jZS50cnVlLnBvc2l0aXZlLnJhdGUgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgIFxuICAgICAgbGlzdCggY3V0b2ZmcywgdHAgLyBuLnBvcyApXG4gIH1cblxuLnBlcmZvcm1hbmNlLmZhbHNlLm5lZ2F0aXZlLnJhdGUgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgIFxuICAgICAgbGlzdCggY3V0b2ZmcywgZm4gLyBuLnBvcyApXG4gIH1cblxuLnBlcmZvcm1hbmNlLnRydWUubmVnYXRpdmUucmF0ZSA8LVxuICBmdW5jdGlvbihwcmVkaWN0aW9ucywgbGFiZWxzLCBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLCBuLm5lZy5wcmVkKSB7XG4gICAgXG4gICAgICBsaXN0KCBjdXRvZmZzLCB0biAvIG4ubmVnIClcbiAgfVxuXG4ucGVyZm9ybWFuY2UucG9zaXRpdmUucHJlZGljdGl2ZS52YWx1ZSA8LVxuICBmdW5jdGlvbihwcmVkaWN0aW9ucywgbGFiZWxzLCBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLCBuLm5lZy5wcmVkKSB7XG4gICAgXG4gICAgICBwcHYgPC0gdHAgLyAoZnAgKyB0cClcbiAgICAgIGxpc3QoIGN1dG9mZnMsIHBwdiApXG4gIH1cblxuLnBlcmZvcm1hbmNlLm5lZ2F0aXZlLnByZWRpY3RpdmUudmFsdWUgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgIFxuICAgICAgbnB2IDwtIHRuIC8gKHRuICsgZm4pXG4gICAgICBsaXN0KCBjdXRvZmZzLCBucHYgKVxuICB9XG5cbi5wZXJmb3JtYW5jZS5wcmVkaWN0aW9uLmNvbmRpdGlvbmVkLmZhbGxvdXQgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgICAgcHB2IDwtIC5wZXJmb3JtYW5jZS5wb3NpdGl2ZS5wcmVkaWN0aXZlLnZhbHVlKHByZWRpY3Rpb25zLCBsYWJlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubmVnLnByZWQpW1syXV1cbiAgICAgIGxpc3QoIGN1dG9mZnMsIDEgLSBwcHYgKVxuICB9XG5cbi5wZXJmb3JtYW5jZS5wcmVkaWN0aW9uLmNvbmRpdGlvbmVkLm1pc3MgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgICAgbnB2IDwtIC5wZXJmb3JtYW5jZS5uZWdhdGl2ZS5wcmVkaWN0aXZlLnZhbHVlKHByZWRpY3Rpb25zLCBsYWJlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubmVnLnByZWQpW1syXV1cbiAgICAgIGxpc3QoIGN1dG9mZnMsIDEgLSBucHYgKVxuICB9XG5cbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIyMgLi4ubm90IGFjdHVhbGx5IHBlcmZvcm1hbmNlIG1lYXN1cmVzLCBidXQgdmVyeSB1c2VmdWwgYXMgYSBzZWNvbmQgYXhpc1xuIyMgYWdhaW5zdCB3aGljaCB0byBwbG90IGEgXCJyZWFsXCIgcGVyZm9ybWFuY2UgbWVhc3VyZVxuIyMgKHBvcHVsYXIgZXhhbXBsZTogbGlmdCBjaGFydHMpXG4jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnBlcmZvcm1hbmNlLnJhdGUub2YucG9zaXRpdmUucHJlZGljdGlvbnMgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuXG4gICAgICBsaXN0KCBjdXRvZmZzLCBuLnBvcy5wcmVkIC8gKG4ucG9zICsgbi5uZWcpIClcbiAgfVxuXG4ucGVyZm9ybWFuY2UucmF0ZS5vZi5uZWdhdGl2ZS5wcmVkaWN0aW9ucyA8LVxuICBmdW5jdGlvbihwcmVkaWN0aW9ucywgbGFiZWxzLCBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLCBuLm5lZy5wcmVkKSB7XG5cbiAgICAgIGxpc3QoIGN1dG9mZnMsIG4ubmVnLnByZWQgLyAobi5wb3MgKyBuLm5lZykgKVxuICB9XG5cblxuIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4jIyBDbGFzc2ljYWwgc3RhdGlzdGljYWwgY29udGluZ2VuY3kgdGFibGUgbWVhc3VyZXNcbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucGVyZm9ybWFuY2UucGhpIDwtXG4gIGZ1bmN0aW9uKHByZWRpY3Rpb25zLCBsYWJlbHMsIGN1dG9mZnMsIGZwLCB0cCwgZm4sIHRuLFxuICAgICAgICAgICBuLnBvcywgbi5uZWcsIG4ucG9zLnByZWQsIG4ubmVnLnByZWQpIHtcblxuICAgICAgbGlzdChjdXRvZmZzLFxuICAgICAgICAgICAodG4qdHAgLSBmbipmcCkgLyBzcXJ0KG4ucG9zICogbi5uZWcgKiBuLnBvcy5wcmVkICogbi5uZWcucHJlZCkgKVxuICB9XG5cbi5wZXJmb3JtYW5jZS5tdXR1YWwuaW5mb3JtYXRpb24gPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuXG4gICAgICBuLnNhbXBsZXMgPC0gbi5wb3MgKyBuLm5lZ1xuICAgICAgbWkgPC0gYygpXG4gICAgICBmb3IgKGsgaW4gMTpsZW5ndGgoY3V0b2ZmcykpIHtcbiAgICAgICAgICBraWogPC0gcmJpbmQoIGModG5ba10sZm5ba10pLCBjKGZwW2tdLHRwW2tdKSApXG5cbiAgICAgICAgICBraS5qLiA8LSByYmluZChjKG4ubmVnICogbi5uZWcucHJlZFtrXSwgbi5uZWcucHJlZFtrXSAqIG4ucG9zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBjKG4ubmVnICogbi5wb3MucHJlZFtrXSwgbi5wb3MgKiBuLnBvcy5wcmVkW2tdKSlcblxuICAgICAgICAgIGxvZy5tYXRyaXggPC0gbG9nMigga2lqIC8ga2kuai4pXG4gICAgICAgICAgbG9nLm1hdHJpeFtraWova2kuai49PTBdIDwtIDBcbiAgICAgICAgICBcbiAgICAgICAgICBtaSA8LSBjKG1pLCAgbG9nMihuLnNhbXBsZXMpICsgc3VtKCBraWogKiBsb2cubWF0cml4KSAvIG4uc2FtcGxlcyAgKVxuICAgICAgfVxuXG4gICAgICBsaXN0KCBjdXRvZmZzLCBtaSApXG4gIH1cblxuXG4ucGVyZm9ybWFuY2UuY2hpc3EgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuXG4gICAgICBjaGlzcSA8LSBjKClcbiAgICAgIGZvciAoaSBpbiAxOmxlbmd0aChjdXRvZmZzKSkge1xuICAgICAgICAgIEEgPC0gcmJpbmQoIGMoIHRuW2ldLCBmbltpXSksIGMoZnBbaV0sIHRwW2ldKSApXG4gICAgICAgICAgY2hpc3EgPC0gYyhjaGlzcSwgY2hpc3EudGVzdChBLCBjb3JyZWN0PUZBTFNFKSRzdGF0aXN0aWMgKVxuICAgICAgfVxuICAgICAgbGlzdCggY3V0b2ZmcywgY2hpc3EgKVxuICB9XG5cbi5wZXJmb3JtYW5jZS5vZGRzLnJhdGlvIDwtIFxuICBmdW5jdGlvbihwcmVkaWN0aW9ucywgbGFiZWxzLCBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLCBuLm5lZy5wcmVkKSB7XG4gICAgICBcblxuICAgIGxpc3QoIGN1dG9mZnMsIHRwICogdG4gLyAoZm4gKiBmcCkgKVxuICAgIFxufVxuXG4jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiMjIE90aGVyIG1lYXN1cmVzIGJhc2VkIG9uIGNvbnRpbmdlbmN5IHRhYmxlc1xuIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5wZXJmb3JtYW5jZS5saWZ0IDwtXG4gIGZ1bmN0aW9uKHByZWRpY3Rpb25zLCBsYWJlbHMsIGN1dG9mZnMsIGZwLCB0cCwgZm4sIHRuLFxuICAgICAgICAgICBuLnBvcywgbi5uZWcsIG4ucG9zLnByZWQsIG4ubmVnLnByZWQpIHtcbiAgICAgIFxuICAgICAgbi5zYW1wbGVzIDwtIG4ucG9zICsgbi5uZWdcbiAgICAgIGxpc3QoIGN1dG9mZnMsICh0cCAvIG4ucG9zKSAvIChuLnBvcy5wcmVkIC8gbi5zYW1wbGVzKSApXG4gIH1cblxuLnBlcmZvcm1hbmNlLmYgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCwgYWxwaGEpIHtcblxuICAgICAgcHJlYyA8LSAucGVyZm9ybWFuY2UucG9zaXRpdmUucHJlZGljdGl2ZS52YWx1ZShwcmVkaWN0aW9ucywgbGFiZWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm5lZy5wcmVkKVtbMl1dXG4gICAgICBsaXN0KCBjdXRvZmZzLCAgMS8gKCBhbHBoYSooMS9wcmVjKSArICgxLWFscGhhKSooMS8odHAvbi5wb3MpKSAgKSApXG4gIH1cblxuLnBlcmZvcm1hbmNlLnJvY2NvbnZleGh1bGwgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgICAgXG4gICAgICB4IDwtIGZwIC8gbi5uZWdcbiAgICAgIHkgPC0gdHAgLyBuLnBvc1xuXG4gICAgICBmaW5pdGUuYm9vbCA8LSBpcy5maW5pdGUoeCkgJiBpcy5maW5pdGUoeSlcbiAgICAgIHggPC0geFsgZmluaXRlLmJvb2wgXVxuICAgICAgeSA8LSB5WyBmaW5pdGUuYm9vbCBdXG4gICAgICBpZiAobGVuZ3RoKHgpIDwgMikge1xuICAgICAgICAgIHN0b3AoXCJOb3QgZW5vdWdoIGRpc3RpbmN0IHByZWRpY3Rpb25zIHRvIGNvbXB1dGUgUk9DIGNvbnZleCBodWxsLlwiKVxuICAgICAgfVxuXG4gICAgICAjIyBrZWVwIG9ubHkgcG9pbnRzIG9uIHRoZSBjb252ZXggaHVsbFxuICAgICAgaW5kIDwtIGNodWxsKHgsIHkpXG4gICAgICB4LmNoIDwtIHhbaW5kXVxuICAgICAgeS5jaCA8LSB5W2luZF1cblxuICAgICAgIyMga2VlcCBvbmx5IGNvbnZleCBodWxsIHBvaW50cyBhYm92ZSB0aGUgZGlhZ29uYWwsIGV4Y2VwdCAoMCwwKVxuICAgICAgIyMgYW5kICgxLDEpXG4gICAgICBpbmQudXBwZXIudHJpYW5nbGUgPC0geC5jaCA8IHkuY2hcbiAgICAgIHguY2ggPC0gYygwLCB4LmNoW2luZC51cHBlci50cmlhbmdsZV0sIDEpXG4gICAgICB5LmNoIDwtIGMoMCwgeS5jaFtpbmQudXBwZXIudHJpYW5nbGVdLCAxKVxuXG4gICAgICAjIyBzb3J0IHJlbWFpbmluZyBwb2ludHMgYnkgYXNjZW5kaW5nIHggdmFsdWVcbiAgICAgIGluZCA8LSBvcmRlcih4LmNoKVxuICAgICAgeC5jaCA8LSB4LmNoW2luZF1cbiAgICAgIHkuY2ggPC0geS5jaFtpbmRdXG5cbiAgICAgIGxpc3QoIHguY2gsIHkuY2ggKVxuICB9XG5cbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiMjIEN1dG9mZi1pbmRlcGVuZGVudCBtZWFzdXJlc1xuIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucGVyZm9ybWFuY2UuYXVjIDwtXG4gIGZ1bmN0aW9uKHByZWRpY3Rpb25zLCBsYWJlbHMsIGN1dG9mZnMsIGZwLCB0cCwgZm4sIHRuLFxuICAgICAgICAgICBuLnBvcywgbi5uZWcsIG4ucG9zLnByZWQsIG4ubmVnLnByZWQsIGZwci5zdG9wKSB7XG4gICAgICBcbiAgICAgIHggPC0gZnAgLyBuLm5lZ1xuICAgICAgeSA8LSB0cCAvIG4ucG9zXG5cbiAgICAgIGZpbml0ZS5ib29sIDwtIGlzLmZpbml0ZSh4KSAmIGlzLmZpbml0ZSh5KVxuICAgICAgeCA8LSB4WyBmaW5pdGUuYm9vbCBdXG4gICAgICB5IDwtIHlbIGZpbml0ZS5ib29sIF1cbiAgICAgIGlmIChsZW5ndGgoeCkgPCAyKSB7XG4gICAgICAgICAgc3RvcChwYXN0ZShcIk5vdCBlbm91Z2ggZGlzdGluY3QgcHJlZGljdGlvbnMgdG8gY29tcHV0ZSBhcmVhXCIsXG4gICAgICAgICAgICAgICAgICAgICBcInVuZGVyIHRoZSBST0MgY3VydmUuXCIpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZnByLnN0b3AgPCAxKSB7XG4gICAgICAgIGluZCA8LSBtYXgod2hpY2goIHggPD0gZnByLnN0b3AgKSlcbiAgICAgICAgdHByLnN0b3AgPC0gYXBwcm94ZnVuKCB4W2luZDooaW5kKzEpXSwgeVtpbmQ6KGluZCsxKV0gKShmcHIuc3RvcClcbiAgICAgICAgeCA8LSBjKHhbMTppbmRdLCBmcHIuc3RvcClcbiAgICAgICAgeSA8LSBjKHlbMTppbmRdLCB0cHIuc3RvcClcbiAgICAgIH1cbiAgICAgIFxuICAgICAgYW5zIDwtIGxpc3QoKVxuICAgICAgYXVjIDwtIDBcbiAgICAgIGZvciAoaSBpbiAyOmxlbmd0aCh4KSkge1xuICAgICAgICAgIGF1YyA8LSBhdWMgKyAwLjUgKiAoeFtpXSAtIHhbaS0xXSkgKiAoeVtpXSArIHlbaS0xXSlcbiAgICAgIH1cbiAgICAgIGFucyA8LSBsaXN0KCBjKCksIGF1YylcbiAgICAgIG5hbWVzKGFucykgPC0gYyhcIngudmFsdWVzXCIsXCJ5LnZhbHVlc1wiKVxuICAgICAgcmV0dXJuKGFucylcbiAgfVxuXG4ucGVyZm9ybWFuY2UucHJlY2lzaW9uLnJlY2FsbC5icmVhay5ldmVuLnBvaW50IDwtXG4gIGZ1bmN0aW9uKHByZWRpY3Rpb25zLCBsYWJlbHMsIGN1dG9mZnMsIGZwLCB0cCwgZm4sIHRuLFxuICAgICAgICAgICBuLnBvcywgbi5uZWcsIG4ucG9zLnByZWQsIG4ubmVnLnByZWQpIHtcblxuICAgICAgcHJlZCA8LSBwcmVkaWN0aW9uKCBwcmVkaWN0aW9ucywgbGFiZWxzKVxuICAgICAgcGVyZiA8LSBwZXJmb3JtYW5jZSggcHJlZCwgbWVhc3VyZT1cInByZWNcIiwgeC5tZWFzdXJlPVwicmVjXCIpXG4gICAgICB4IDwtIHJldihwZXJmQHgudmFsdWVzW1sxXV0pXG4gICAgICB5IDwtIHJldihwZXJmQHkudmFsdWVzW1sxXV0pXG4gICAgICBhbHBoYSA8LSByZXYocGVyZkBhbHBoYS52YWx1ZXNbWzFdXSlcblxuICAgICAgZmluaXRlLmJvb2wgPC0gaXMuZmluaXRlKGFscGhhKSAmIGlzLmZpbml0ZSh4KSAmIGlzLmZpbml0ZSh5KVxuICAgICAgeCA8LSB4WyBmaW5pdGUuYm9vbCBdXG4gICAgICB5IDwtIHlbIGZpbml0ZS5ib29sIF1cbiAgICAgIGFscGhhIDwtIGFscGhhWyBmaW5pdGUuYm9vbCBdXG5cbiAgICAgIGlmIChsZW5ndGgoeCkgPCAyKSB7XG4gICAgICAgICAgc3RvcChwYXN0ZShcIk5vdCBlbm91Z2ggZGlzdGluY3QgcHJlZGljdGlvbnMgdG8gY29tcHV0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgXCJwcmVjaXNpb24vcmVjYWxsIGludGVyc2VjdGlvbnMuXCIpKVxuICAgICAgfVxuICAgICAgaW50ZXJzZWN0aW9uLmN1dG9mZiA8LSBjKClcbiAgICAgIGludGVyc2VjdGlvbi5wciA8LSBjKClcbiAgICAgIFxuICAgICAgIyMgZmluZCBhbGwgaW50ZXJzZWN0aW9uIHBvaW50cyBieSBsb29raW5nIGF0IGFsbCBpbnRlcnZhbHMgKGksaSsxKTpcbiAgICAgICMjIGlmIHRoZSBkaWZmZXJlbmNlIGZ1bmN0aW9uIGJldHdlZW4geCBhbmQgeSBoYXMgZGlmZmVyZW50IHNpZ25zIGF0IHRoZVxuICAgICAgIyMgaW50ZXJ2YWwgYm91bmRhcmllcywgdGhlbiBhbiBpbnRlcnNlY3Rpb24gcG9pbnQgaXMgaW4gdGhlIGludGVydmFsO1xuICAgICAgIyMgY29tcHV0ZSBhcyB0aGUgcm9vdCBvZiB0aGUgZGlmZmVyZW5jZSBmdW5jdGlvblxuICAgICAgaWYgKCAoeFsxXS15WzFdKSA9PSAwKSB7XG4gICAgICAgICAgaW50ZXJzZWN0aW9uLmN1dG9mZiA8LSBjKCBhbHBoYVsxXSApXG4gICAgICAgICAgaW50ZXJzZWN0aW9uLnByIDwtIGMoIHhbMV0gKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGkgaW4gKDE6KGxlbmd0aChhbHBoYSktMSkpKSB7XG4gICAgICAgICAgaWYgKCh4W2krMV0teVtpKzFdKSA9PSAwKSB7XG4gICAgICAgICAgICAgIGludGVyc2VjdGlvbi5jdXRvZmYgPC0gYyggaW50ZXJzZWN0aW9uLmN1dG9mZiwgYWxwaGFbaSsxXSApXG4gICAgICAgICAgICAgIGludGVyc2VjdGlvbi5wciA8LSBjKCBpbnRlcnNlY3Rpb24ucHIsIHhbaSsxXSApXG4gICAgICAgICAgfSBlbHNlIGlmICgoeFtpXS15W2ldKSooeFtpKzFdLXlbaSsxXSkgPCAwICkge1xuICAgICAgICAgICAgICBhbnMgPC0gdW5pcm9vdChhcHByb3hmdW4oYyhhbHBoYVtpXSwgYWxwaGFbaSsxXSApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyh4W2ldLXlbaV0sIHhbaSsxXS15W2krMV0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhhbHBoYVtpXSxhbHBoYVtpKzFdKSlcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uLmN1dG9mZiA8LSBjKGludGVyc2VjdGlvbi5jdXRvZmYsIGFucyRyb290KVxuICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24ucHIgPC0gYyhpbnRlcnNlY3Rpb24ucHIsIGFucyRmLnJvb3QpXG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsaXN0KCByZXYoaW50ZXJzZWN0aW9uLmN1dG9mZiksIHJldihpbnRlcnNlY3Rpb24ucHIpIClcbiAgfVxuXG5cbi5wZXJmb3JtYW5jZS5jYWxpYnJhdGlvbi5lcnJvciA8LVxuICBmdW5jdGlvbihwcmVkaWN0aW9ucywgbGFiZWxzLCBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLCBuLm5lZy5wcmVkLCB3aW5kb3cuc2l6ZSkge1xuXG4gICAgICBpZiAod2luZG93LnNpemUgPiBsZW5ndGgocHJlZGljdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcChcIldpbmRvdyBzaXplIGV4Y2VlZHMgbnVtYmVyIG9mIHByZWRpY3Rpb25zLlwiKVxuICAgICAgfVxuICAgICAgaWYgKG1pbihwcmVkaWN0aW9ucyk8MCB8fCBtYXgocHJlZGljdGlvbnMpPjEpIHtcbiAgICAgICAgICBzdG9wKFwiQ2FsaWJyYXRpb24gZXJyb3IgbmVlZHMgcHJlZGljdGlvbnMgYmV0d2VlbiAwIGFuZCAxXCIpXG4gICAgICB9XG4gICAgICBcbiAgICAgIHBvcy5sYWJlbCA8LSBsZXZlbHMobGFiZWxzKVsyXVxuICAgICAgbmVnLmxhYmVsIDwtIGxldmVscyhsYWJlbHMpWzFdXG5cbiAgICAgIG9yZGVyaW5nIDwtIHJldihvcmRlciggcHJlZGljdGlvbnMgKSlcbiAgICAgIHByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zWyBvcmRlcmluZyBdXG4gICAgICBsYWJlbHMgPC0gbGFiZWxzWyBvcmRlcmluZyBdXG5cbiAgICAgIG1lZGlhbi5jdXRvZmZzIDwtIGMoKVxuICAgICAgY2FsaWJyYXRpb24uZXJyb3JzIDwtIGMoKVxuXG4gICAgICBmb3IgKGxlZnQuaW5kZXggaW4gMSA6IChsZW5ndGgocHJlZGljdGlvbnMpIC0gd2luZG93LnNpemUrMSkgKSB7XG4gICAgICAgICAgcmlnaHQuaW5kZXggPC0gbGVmdC5pbmRleCArIHdpbmRvdy5zaXplIC0gMVxuICAgICAgICAgIHBvcy5mcmFjdGlvbiA8LVxuICAgICAgICAgICAgc3VtKGxhYmVsc1tsZWZ0LmluZGV4IDogcmlnaHQuaW5kZXhdID09IHBvcy5sYWJlbCkgLyB3aW5kb3cuc2l6ZVxuICAgICAgICAgIG1lYW4ucHJlZGljdGlvbiA8LSBtZWFuKCBwcmVkaWN0aW9uc1sgbGVmdC5pbmRleCA6IHJpZ2h0LmluZGV4IF0gKVxuXG4gICAgICAgICAgY2FsaWJyYXRpb24uZXJyb3JzIDwtIGMoY2FsaWJyYXRpb24uZXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhwb3MuZnJhY3Rpb24gLSBtZWFuLnByZWRpY3Rpb24pKVxuICAgICAgICAgIG1lZGlhbi5jdXRvZmZzIDwtIGMobWVkaWFuLmN1dG9mZnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4ocHJlZGljdGlvbnNbbGVmdC5pbmRleDpyaWdodC5pbmRleF0pKVxuICAgICAgfVxuICAgICAgbGlzdCggbWVkaWFuLmN1dG9mZnMsIGNhbGlicmF0aW9uLmVycm9ycyApXG4gIH1cblxuXG4ucGVyZm9ybWFuY2UubWVhbi5jcm9zcy5lbnRyb3B5IDwtXG4gIGZ1bmN0aW9uKHByZWRpY3Rpb25zLCBsYWJlbHMsIGN1dG9mZnMsIGZwLCB0cCwgZm4sIHRuLFxuICAgICAgICAgICBuLnBvcywgbi5uZWcsIG4ucG9zLnByZWQsIG4ubmVnLnByZWQpIHtcblxuICAgICAgaWYgKCEgYWxsKGxldmVscyhsYWJlbHMpPT1jKDAsMSkpIHx8XG4gICAgICAgICAgYW55KHByZWRpY3Rpb25zPDApIHx8IGFueShwcmVkaWN0aW9ucz4xKSApIHtcbiAgICAgICAgICBzdG9wKHBhc3RlKFwiQ2xhc3MgbGFiZWxzIG5lZWQgdG8gYmUgMCBhbmQgMSBhbmQgcHJlZGljdGlvbnMgYmV0d2VlblwiLFxuICAgICAgICAgICAgICAgICAgICAgXCIwIGFuZCAxIGZvciBtZWFuIGNyb3NzIGVudHJvcHkuXCIpKVxuICAgICAgfVxuICAgICAgXG4gICAgICBwb3MubGFiZWwgPC0gbGV2ZWxzKGxhYmVscylbMl1cbiAgICAgIG5lZy5sYWJlbCA8LSBsZXZlbHMobGFiZWxzKVsxXVxuICAgIFxuICAgICAgbGlzdCggYygpLCAtIDEvbGVuZ3RoKHByZWRpY3Rpb25zKSAqXG4gICAgICAgICAgIChzdW0oIGxvZyggcHJlZGljdGlvbnNbd2hpY2gobGFiZWxzPT1wb3MubGFiZWwpXSApKSAgK1xuICAgICAgICAgICAgc3VtKCBsb2coIDEgLSBwcmVkaWN0aW9uc1t3aGljaChsYWJlbHM9PW5lZy5sYWJlbCldICkpKSApXG4gIH1cblxuXG4ucGVyZm9ybWFuY2Uucm9vdC5tZWFuLnNxdWFyZWQuZXJyb3IgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgICAgIyMgY29udmVydCBsYWJlbHMgZnJvbSBmYWN0b3IgdG8gbnVtZXJpYyB2YWx1ZXNcbiAgICAgIGxhYmVscyA8LSBhcy5udW1lcmljKGxldmVscyhsYWJlbHMpKVtsYWJlbHNdXG4gICAgICBpZiAoYW55KGlzLm5hKGxhYmVscykpKSB7XG4gICAgICAgICAgc3RvcChcIkZvciBybXNlIHByZWRpY3Rpb25zIGhhdmUgdG8gYmUgbnVtZXJpYy5cIilcbiAgICAgIH1cbiAgICAgIGxpc3QoIGMoKSwgIHNxcnQoIDEvbGVuZ3RoKHByZWRpY3Rpb25zKSAqXG4gICAgICAgICAgICAgICAgICAgICAgc3VtKCAocHJlZGljdGlvbnMgLSBsYWJlbHMpXjIgKSkgIClcbiAgfVxuXG4jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4jIyBEZXJpdmVkIG1lYXN1cmVzOlxuIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucGVyZm9ybWFuY2Uuc2FyIDwtIGZ1bmN0aW9uKCBwcmVkaWN0aW9ucywgbGFiZWxzLCBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLCBuLm5lZy5wcmVkKSB7XG5cbiAgICBwcmVkIDwtIHByZWRpY3Rpb24oIHByZWRpY3Rpb25zLCBsYWJlbHMpXG4gICAgcGVyZi5hY2MgPC0gcGVyZm9ybWFuY2UoIHByZWQsIG1lYXN1cmU9XCJhY2NcIilcbiAgICBwZXJmLnJtc2UgPC0gcGVyZm9ybWFuY2UoIHByZWQsIG1lYXN1cmU9XCJybXNlXCIpXG4gICAgcGVyZi5hdWMgPC0gcGVyZm9ybWFuY2UoIHByZWQsIG1lYXN1cmU9XCJhdWNcIilcblxuICAgIGxpc3QoY3V0b2ZmcyxcbiAgICAgICAgIDEvMyAqIChwZXJmLmFjY0B5LnZhbHVlc1tbMV1dICtcbiAgICAgICAgICAgICAgICAoMSAtIHBlcmYucm1zZUB5LnZhbHVlc1tbMV1dKSArXG4gICAgICAgICAgICAgICAgcGVyZi5hdWNAeS52YWx1ZXNbWzFdXSkpXG59XG5cbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiMjIE1lYXN1cmVzIHRha2luZyBpbnRvIGFjY291bnQgYWN0dWFsIGNvc3QgY29uc2lkZXJhdGlvbnNcbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnBlcmZvcm1hbmNlLmV4cGVjdGVkLmNvc3QgPC1cbiAgZnVuY3Rpb24ocHJlZGljdGlvbnMsIGxhYmVscywgY3V0b2ZmcywgZnAsIHRwLCBmbiwgdG4sXG4gICAgICAgICAgIG4ucG9zLCBuLm5lZywgbi5wb3MucHJlZCwgbi5uZWcucHJlZCkge1xuICAgICAgXG4gICAgICAjIyBraWNrIG91dCBzdWJvcHRpbWFsIHZhbHVlcyAoaS5lLiBmcHIvdHByIHBhaXIgZm9yIHdoaWNoIGFub3RoZXIgb25lXG4gICAgICAjIyB3aXRoIHNhbWUgZnByIGFuZCBoaWdoZXIgdHByIGV4aXN0cywgXG4gICAgICAjIyBvciBvbmUgZm9yIHdoaWNoIG9uZSB3aXRoIHNhbWUgdHByIGJ1dCBsb3dlciBmcHIgZXhpc3RzXG5cbiAgICAgIGlmIChuLm5lZz09MCB8fCBuLnBvcz09MCkge1xuICAgICAgICAgIHN0b3AocGFzdGUoXCJBdCBsZWFzdCBvbmUgcG9zaXRpdmUgYW5kIG9uZSBuZWdhdGl2ZSBzYW1wbGUgYXJlXCIsXG4gICAgICAgICAgICAgICAgICAgICBcIm5lZWRlZCB0byBjb21wdXRlIGEgY29zdCBjdXJ2ZS5cIikpXG4gICAgICB9XG4gICAgICBmcHIgPC0gZnAgLyBuLm5lZ1xuICAgICAgdHByIDwtIHRwIC8gbi5wb3NcblxuICAgICAgIyMgc29ydCBieSBmcHIgKGFzY2VuZGluZyksIGluIGNhc2Ugb2YgdGllcyBieSBkZXNjZW5kaW5nIHRwclxuICAgICAgaW5kIDwtIG9yZGVyKGZwciwtdHByKVxuICAgICAgXG4gICAgICBmcHIgPC0gZnByW2luZF1cbiAgICAgIHRwciA8LSB0cHJbaW5kXVxuICAgICAgIyMgZm9yIHRpZWQgZnBycywgb25seSB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3QgdHByIGlzIGtlcHRcbiAgICAgIGluZCA8LSAhZHVwbGljYXRlZChmcHIpXG4gICAgICBmcHIgPC0gZnByW2luZF1cbiAgICAgIHRwciA8LSB0cHJbaW5kXVxuXG4gICAgICAjIyBmb3IgdGllZCB0cHJzLCBvbmx5IGtlZXAgdGhlIG9uZSB3aXRoIHRoZSBsb3dlc3QgZnByXG4gICAgICBpbmQgPC0gb3JkZXIoLXRwcixmcHIpXG4gICAgICBmcHIgPC0gZnByW2luZF1cbiAgICAgIHRwciA8LSB0cHJbaW5kXVxuICAgICAgaW5kIDwtICFkdXBsaWNhdGVkKHRwcilcbiAgICAgIGZwciA8LSBmcHJbaW5kXVxuICAgICAgdHByIDwtIHRwcltpbmRdXG5cbiAgICAgIGlmICghYW55KDA9PWZwciAmIDA9PXRwcikpIHtcbiAgICAgICAgICBmcHIgPC0gYygwLGZwcilcbiAgICAgICAgICB0cHIgPC0gYygwLHRwcilcbiAgICAgIH1cbiAgICAgIGlmICghYW55KDE9PWZwciAmIDE9PXRwcikpIHtcbiAgICAgICAgICBmcHIgPC0gYyhmcHIsMSlcbiAgICAgICAgICB0cHIgPC0gYyh0cHIsMSlcbiAgICAgIH1cbiAgICAgIFxuICAgICAgIyMgY29tcHV0ZSBhbGwgZnVuY3Rpb25zXG4gICAgICBmIDwtIGxpc3QoKVxuICAgICAgZm9yIChpIGluIDE6bGVuZ3RoKGZwcikpIHtcbiAgICAgICAgICBmIDwtIGMoZiwgLmNvbnN0cnVjdC5saW5lZnVuY3QoIDAsIGZwcltpXSwgMSwgMS10cHJbaV0gKSlcbiAgICAgIH1cbiAgICAgIFxuICAgICAgIyMgY29tcHV0ZSBhbGwgaW50ZXJzZWN0aW9uIHBvaW50c1xuICAgICAgeC52YWx1ZXMgPC0gYygpXG4gICAgICB5LnZhbHVlcyA8LSBjKClcbiAgICAgIGZvciAoaSBpbiAxOihsZW5ndGgoZnByKS0xKSkge1xuICAgICAgICAgIGZvciAoaiBpbiAoaSsxKTpsZW5ndGgoZnByKSkge1xuICAgICAgICAgICAgICBhbnMgPC0gLmludGVyc2VjdGlvbi5wb2ludCggZltbaV1dLCBmW1tqXV0gKVxuICAgICAgICAgICAgICBpZiAoYWxsKGlzLmZpbml0ZShhbnMpKSkge1xuICAgICAgICAgICAgICAgICAgeS52YWx1ZXMuYXQuY3VycmVudC54IDwtIGMoKVxuICAgICAgICAgICAgICAgICAgZm9yIChrIGluIDE6bGVuZ3RoKGYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgeS52YWx1ZXMuYXQuY3VycmVudC54IDwtIGMoeS52YWx1ZXMuYXQuY3VycmVudC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZbW2tdXShhbnNbMV0pKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGFicyhhbnNbMl0gLSBtaW4oeS52YWx1ZXMuYXQuY3VycmVudC54ICkpIDxcbiAgICAgICAgICAgICAgICAgICAgICBzcXJ0KC5NYWNoaW5lJGRvdWJsZS5lcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgeC52YWx1ZXMgPC0gYyh4LnZhbHVlcywgYW5zWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIHkudmFsdWVzIDwtIGMoeS52YWx1ZXMsIGFuc1syXSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhbnkoMD09eC52YWx1ZXMgJiAwPT15LnZhbHVlcykpIHtcbiAgICAgICAgICB4LnZhbHVlcyA8LSBjKDAseC52YWx1ZXMpXG4gICAgICAgICAgeS52YWx1ZXMgPC0gYygwLHkudmFsdWVzKVxuICAgICAgfVxuICAgICAgaWYgKCFhbnkoMT09eC52YWx1ZXMgJiAwPT15LnZhbHVlcykpIHtcbiAgICAgICAgICB4LnZhbHVlcyA8LSBjKHgudmFsdWVzLDEpXG4gICAgICAgICAgeS52YWx1ZXMgPC0gYyh5LnZhbHVlcywwKVxuICAgICAgfVxuXG4gICAgICBpbmQgPC0gb3JkZXIoIHgudmFsdWVzKVxuICAgICAgbGlzdCggeC52YWx1ZXNbaW5kXSwgeS52YWx1ZXNbaW5kXSApXG4gIH1cblxuXG4ucGVyZm9ybWFuY2UuY29zdCA8LVxuICBmdW5jdGlvbihwcmVkaWN0aW9ucywgbGFiZWxzLCBjdXRvZmZzLCBmcCwgdHAsIGZuLCB0bixcbiAgICAgICAgICAgbi5wb3MsIG4ubmVnLCBuLnBvcy5wcmVkLCBuLm5lZy5wcmVkLCBjb3N0LmZwLCBjb3N0LmZuKSB7XG4gICAgICBcbiAgICBuLnNhbXBsZXMgPC0gbi5wb3MgKyBuLm5lZ1xuICAgIGNvc3QgPC0gKChuLnBvcyAvIG4uc2FtcGxlcykgKiAoZm4gLyBuLnBvcykgKiBjb3N0LmZuICtcbiAgICAgICAgICAgICAobi5uZWcgLyBuLnNhbXBsZXMpICogKGZwIC8gbi5uZWcpICogY29zdC5mcClcbiAgICBsaXN0KCBjdXRvZmZzLCBjb3N0IClcbn1cblxuXG5cblxuc2V0Q2xhc3MoXCJwcmVkaWN0aW9uXCIsXG4gICAgICAgICByZXByZXNlbnRhdGlvbihwcmVkaWN0aW9ucyA9IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzICAgICAgPSBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnMgICAgID0gXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmcCAgICAgICAgICA9IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHAgICAgICAgICAgPSBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRuICAgICAgICAgID0gXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbiAgICAgICAgICA9IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbi5wb3MgICAgICAgPSBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG4ubmVnICAgICAgID0gXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuLnBvcy5wcmVkICA9IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbi5uZWcucHJlZCAgPSBcImxpc3RcIikpXG5cbnNldENsYXNzKFwicGVyZm9ybWFuY2VcIixcbiAgICAgICAgIHJlcHJlc2VudGF0aW9uKHgubmFtZSAgICAgICA9IFwiY2hhcmFjdGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB5Lm5hbWUgICAgICAgPSBcImNoYXJhY3RlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubmFtZSAgID0gXCJjaGFyYWN0ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHgudmFsdWVzICAgICA9IFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgeS52YWx1ZXMgICAgID0gXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS52YWx1ZXMgPSBcImxpc3RcIiApKVxuXG5cblxuIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4jIyBEZWFsaW5nIHdpdGggYXJndW1lbnQgbGlzdHMsIGVzcGVjaWFsbHkgJy4uLidcbiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4jIyByZXR1cm4gbGlzdCBvZiBzZWxlY3RlZCBhcmd1bWVudHMsIHNraXBwaW5nIHRob3NlIHRoYXRcbiMjIGFyZSBub3QgcHJlc2VudCBpbiBhcmdsaXN0XG4uc2VsZWN0LmFyZ3MgPC0gZnVuY3Rpb24oIGFyZ2xpc3QsIGFyZ3MudG8uc2VsZWN0LCBjb21wbGVtZW50PUZBTFNFKSB7XG4gICAgbWF0Y2guYm9vbCA8LSBuYW1lcyhhcmdsaXN0KSAlaW4lIGFyZ3MudG8uc2VsZWN0XG4gICAgaWYgKGNvbXBsZW1lbnQ9PVRSVUUpIG1hdGNoLmJvb2wgPC0gIW1hdGNoLmJvb2xcbiAgICByZXR1cm4oIGFyZ2xpc3RbIG1hdGNoLmJvb2xdIClcbn1cblxuIyMgcmV0dXJuIGFyZ3VtZW50cyBpbiBhcmdsaXN0IHdoaWNoIG1hdGNoIHByZWZpeCwgd2l0aCBwcmVmaXggcmVtb3ZlZFxuIyMgQVNTVU1QVElPTjogcHJlZml4IGlzIHNlcGFyYXRlZCBmcm9tIHJlc3QgYnkgYSAnLic7IHRoaXMgaXMgcmVtb3ZlZCBhbG9uZ1xuIyMgd2l0aCB0aGUgcHJlZml4XG4uc2VsZWN0LnByZWZpeCA8LSBmdW5jdGlvbiggYXJnbGlzdCwgcHJlZml4ZXMsIGNvbXBsZW1lbnQ9RkFMU0UgKSB7XG4gICAgbWF0Y2guZXhwciA8LSBwYXN0ZShwYXN0ZSgnKF4nLHByZWZpeGVzLCdcXFxcLiknLHNlcD1cIlwiKSxjb2xsYXBzZT0nfCcpXG4gICAgbWF0Y2guYm9vbCA8LSAoMTpsZW5ndGgoYXJnbGlzdCkpICVpbiUgZ3JlcCggbWF0Y2guZXhwciwgbmFtZXMoYXJnbGlzdCkgKVxuICAgIGlmIChjb21wbGVtZW50PT1UUlVFKSBtYXRjaC5ib29sIDwtICFtYXRjaC5ib29sXG4gICAgYXJnbGlzdCA8LSBhcmdsaXN0WyBtYXRjaC5ib29sXVxuICAgIG5hbWVzKGFyZ2xpc3QpIDwtIHN1YiggbWF0Y2guZXhwciwgJycsIG5hbWVzKGFyZ2xpc3QpKVxuICAgIFxuICAgIHJldHVybiggYXJnbGlzdCApXG59XG5cbi5nYXJnIDwtIGZ1bmN0aW9uKCBhcmdsaXN0LCBhcmcsIGk9MSkge1xuICAgIGlmIChpcy5saXN0KGFyZ2xpc3RbW2FyZ11dKSkgYXJnbGlzdFtbIGFyZyBdXVtbaV1dXG4gICAgZWxzZSBhcmdsaXN0W1sgYXJnIF1dXG59XG5cbi5zYXJnIDwtIGZ1bmN0aW9uKCBhcmdsaXN0LCAuLi4pIHtcbiAgICBsbCA8LSBsaXN0KC4uLilcbiAgICBmb3IgKGFyZ25hbWUgaW4gbmFtZXMobGwpICkge1xuICAgICAgICBhcmdsaXN0W1sgYXJnbmFtZSBdXSA8LSBsbFtbIGFyZ25hbWUgXV1cbiAgICB9XG4gICAgcmV0dXJuKGFyZ2xpc3QpXG59XG5cbi5mYXJnIDwtIGZ1bmN0aW9uKCBhcmdsaXN0LCAuLi4pIHtcbiAgICBsbCA8LSBsaXN0KC4uLilcbiAgICBmb3IgKGFyZ25hbWUgaW4gbmFtZXMobGwpICkge1xuICAgICAgICBpZiAobGVuZ3RoKGFyZ2xpc3RbW2FyZ25hbWVdXSk9PTApXG4gICAgICAgICAgYXJnbGlzdFtbIGFyZ25hbWUgXV0gPC0gbGxbWyBhcmduYW1lIF1dXG4gICAgfVxuICAgIHJldHVybihhcmdsaXN0KVxufVxuXG4uc2xpY2UucnVuIDwtIGZ1bmN0aW9uKCBhcmdsaXN0LCBydW5pPTEpIHtcbiAgICByIDwtIGxhcHBseSggbmFtZXMoYXJnbGlzdCksIGZ1bmN0aW9uKG5hbWUpIC5nYXJnKCBhcmdsaXN0LCBuYW1lLCBydW5pKSlcbiAgICBuYW1lcyhyKSA8LSBuYW1lcyhhcmdsaXN0KVxuICAgIHJcbn1cblxucGVyZm9ybWFuY2UgPC0gZnVuY3Rpb24ocHJlZGljdGlvbi5vYmosIG1lYXN1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICB4Lm1lYXN1cmU9XCJjdXRvZmZcIiwgLi4uKSB7XG5cbiAgICAjIyBkZWZpbmUgdGhlIG5lZWRlZCBlbnZpcm9ubWVudHNcbiAgICBlbnZpci5saXN0IDwtIC5kZWZpbmUuZW52aXJvbm1lbnRzKClcbiAgICBsb25nLnVuaXQubmFtZXMgPC0gZW52aXIubGlzdCRsb25nLnVuaXQubmFtZXNcbiAgICBmdW5jdGlvbi5uYW1lcyA8LSBlbnZpci5saXN0JGZ1bmN0aW9uLm5hbWVzXG4gICAgb2JsaWdhdG9yeS54LmF4aXMgPC0gZW52aXIubGlzdCRvYmxpZ2F0b3J5LnguYXhpc1xuICAgIG9wdGlvbmFsLmFyZ3VtZW50cyA8LSBlbnZpci5saXN0JG9wdGlvbmFsLmFyZ3VtZW50c1xuICAgIGRlZmF1bHQudmFsdWVzIDwtIGVudmlyLmxpc3QkZGVmYXVsdC52YWx1ZXNcbiAgICBcbiAgICBcbiAgICBcbiAgICAjIyBhYm9ydCwgaWYgYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSBhIG1lYXN1cmUgdGhhdCBoYXMgYW4gb2JsaWdhdG9yeVxuICAgICMjIHguYXhpcyBhcyB0aGUgeC5tZWFzdXJlIChjYW5ub3QgYmUgY29tYmluZWQpXG4gICAgaWYgKGV4aXN0cyggeC5tZWFzdXJlLCB3aGVyZT1vYmxpZ2F0b3J5LnguYXhpcywgaW5oZXJpdHM9RkFMU0UgKSkge1xuICAgICAgICBtZXNzYWdlIDwtIHBhc3RlKFwiVGhlIHBlcmZvcm1hbmNlIG1lYXN1cmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICB4Lm1lYXN1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgXCJjYW4gb25seSBiZSB1c2VkIGFzICdtZWFzdXJlJywgYmVjYXVzZSBpdCBoYXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICBcInRoZSBmb2xsb3dpbmcgb2JsaWdhdG9yeSAneC5tZWFzdXJlJzpcXG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoIHgubWVhc3VyZSwgZW52aXI9b2JsaWdhdG9yeS54LmF4aXMpKVxuICAgICAgICBzdG9wKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgIyMgaWYgbWVhc3VyZSBpcyBhIHBlcmZvcm1hbmNlIG1lYXN1cmUgd2l0aCBvYmxpZ2F0b3J5IHguYXhpcywgdGhlblxuICAgICMjIGVuZm9yY2UgdGhpcyBheGlzOlxuICAgIGlmIChleGlzdHMoIG1lYXN1cmUsIHdoZXJlPW9ibGlnYXRvcnkueC5heGlzLCBpbmhlcml0cz1GQUxTRSApKSB7XG4gICAgICAgIHgubWVhc3VyZSA8LSBnZXQoIG1lYXN1cmUsIGVudmlyPW9ibGlnYXRvcnkueC5heGlzIClcbiAgICB9XG5cbiAgICBpZiAoeC5tZWFzdXJlID09IFwiY3V0b2ZmXCIgfHxcbiAgICAgICAgZXhpc3RzKCBtZWFzdXJlLCB3aGVyZT1vYmxpZ2F0b3J5LnguYXhpcywgaW5oZXJpdHM9RkFMU0UgKSkge1xuXG4gICAgICAgICMjIGZldGNoIGZyb20gJy4uLicgYW55IG9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHBlcmZvcm1hbmNlXG4gICAgICAgICMjIG1lYXN1cmUgYXQgaGFuZCB0aGF0IGFyZSBnaXZlbiwgb3RoZXJ3aXNlIGZpbGwgdXAgdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgIG9wdGlvbmFsLmFyZ3MgPC0gbGlzdCguLi4pXG4gICAgICAgIGFyZ25hbWVzIDwtIGMoKVxuICAgICAgICBpZiAoIGV4aXN0cyggbWVhc3VyZSwgd2hlcmU9b3B0aW9uYWwuYXJndW1lbnRzLCBpbmhlcml0cz1GQUxTRSApKSB7XG4gICAgICAgICAgICBhcmduYW1lcyA8LSBnZXQoIG1lYXN1cmUsIGVudmlyPW9wdGlvbmFsLmFyZ3VtZW50cyApXG4gICAgICAgICAgICBkZWZhdWx0LmFyZ2xpc3QgPC0gbGlzdCgpXG4gICAgICAgICAgICBmb3IgKGkgaW4gMTpsZW5ndGgoYXJnbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdC5hcmdsaXN0IDwtIGMoZGVmYXVsdC5hcmdsaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldChwYXN0ZShtZWFzdXJlLFwiOlwiLGFyZ25hbWVzW2ldLHNlcD1cIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXI9ZGVmYXVsdC52YWx1ZXMsIGluaGVyaXRzPUZBTFNFKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWVzKGRlZmF1bHQuYXJnbGlzdCkgPC0gYXJnbmFtZXNcblxuICAgICAgICAgICAgZm9yIChpIGluIDE6bGVuZ3RoKGFyZ25hbWVzKSkge1xuICAgICAgICAgICAgICAgIHRlbXBsaXN0IDwtIGxpc3Qob3B0aW9uYWwuYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQuYXJnbGlzdFtbaV1dKVxuICAgICAgICAgICAgICAgIG5hbWVzKHRlbXBsaXN0KSA8LSBjKCdhcmdsaXN0JywgYXJnbmFtZXNbaV0pXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgb3B0aW9uYWwuYXJncyA8LSBkby5jYWxsKCcuZmFyZycsIHRlbXBsaXN0KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbmFsLmFyZ3MgPC0gLnNlbGVjdC5hcmdzKCBvcHRpb25hbC5hcmdzLCBhcmduYW1lcyApXG4gICAgICAgIFxuICAgICAgICAjIyBkZXRlcm1pbmUgZnVuY3Rpb24gbmFtZVxuICAgICAgICBmdW5jdGlvbi5uYW1lIDwtIGdldCggbWVhc3VyZSwgZW52aXI9ZnVuY3Rpb24ubmFtZXMgKVxuXG4gICAgICAgICMjIGZvciBlYWNoIHgtdmFsaWRhdGlvbiBydW4sIGNvbXB1dGUgdGhlIHJlcXVlc3RlZCBwZXJmb3JtYW5jZSBtZWFzdXJlXG4gICAgICAgIHgudmFsdWVzIDwtIGxpc3QoKVxuICAgICAgICB5LnZhbHVlcyA8LSBsaXN0KClcbiAgICAgICAgZm9yIChpIGluIDE6bGVuZ3RoKCBwcmVkaWN0aW9uLm9iakBwcmVkaWN0aW9ucyApKSB7XG4gICAgICAgICAgICBhcmd1bWVudGxpc3QgPC0gLnNhcmcob3B0aW9uYWwuYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aW9ucz0gcHJlZGljdGlvbi5vYmpAcHJlZGljdGlvbnNbW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9IHByZWRpY3Rpb24ub2JqQGxhYmVsc1tbaV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnM9IHByZWRpY3Rpb24ub2JqQGN1dG9mZnNbW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcD0gcHJlZGljdGlvbi5vYmpAZnBbW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cD0gcHJlZGljdGlvbi5vYmpAdHBbW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbj0gcHJlZGljdGlvbi5vYmpAZm5bW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bj0gcHJlZGljdGlvbi5vYmpAdG5bW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnBvcz0gcHJlZGljdGlvbi5vYmpAbi5wb3NbW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm5lZz0gcHJlZGljdGlvbi5vYmpAbi5uZWdbW2ldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnBvcy5wcmVkPSBwcmVkaWN0aW9uLm9iakBuLnBvcy5wcmVkW1tpXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5uZWcucHJlZD0gcHJlZGljdGlvbi5vYmpAbi5uZWcucHJlZFtbaV1dKVxuXG4gICAgICAgICAgICBhbnMgPC0gZG8uY2FsbCggZnVuY3Rpb24ubmFtZSwgYXJndW1lbnRsaXN0IClcblxuICAgICAgICAgICAgaWYgKCFpcy5udWxsKGFuc1tbMV1dKSkgeC52YWx1ZXMgPC0gYyggeC52YWx1ZXMsIGxpc3QoIGFuc1tbMV1dICkpXG4gICAgICAgICAgICB5LnZhbHVlcyA8LSBjKCB5LnZhbHVlcywgbGlzdCggYW5zW1syXV0gKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIChsZW5ndGgoeC52YWx1ZXMpPT0wIHx8IGxlbmd0aCh4LnZhbHVlcyk9PWxlbmd0aCh5LnZhbHVlcykpICkge1xuICAgICAgICAgICAgc3RvcChcIkNvbnNpc3RlbmN5IGVycm9yLlwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAjIyBjcmVhdGUgYSBuZXcgcGVyZm9ybWFuY2Ugb2JqZWN0XG4gICAgICAgIHJldHVybiggbmV3KFwicGVyZm9ybWFuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgeC5uYW1lICAgICAgID0gZ2V0KCB4Lm1lYXN1cmUsIGVudmlyPWxvbmcudW5pdC5uYW1lcyApLFxuICAgICAgICAgICAgICAgICAgICB5Lm5hbWUgICAgICAgPSBnZXQoIG1lYXN1cmUsIGVudmlyPWxvbmcudW5pdC5uYW1lcyApLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYS5uYW1lICAgPSBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICAgICAgeC52YWx1ZXMgICAgID0geC52YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgIHkudmFsdWVzICAgICA9IHkudmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYS52YWx1ZXMgPSBsaXN0KCkgKSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBwZXJmLm9iai4xIDwtIHBlcmZvcm1hbmNlKCBwcmVkaWN0aW9uLm9iaiwgbWVhc3VyZT14Lm1lYXN1cmUsIC4uLiApXG4gICAgICAgIHBlcmYub2JqLjIgPC0gcGVyZm9ybWFuY2UoIHByZWRpY3Rpb24ub2JqLCBtZWFzdXJlPW1lYXN1cmUsIC4uLiApXG4gICAgICAgIHJldHVybiggLmNvbWJpbmUucGVyZm9ybWFuY2Uub2JqZWN0cyggcGVyZi5vYmouMSwgcGVyZi5vYmouMiApIClcbiAgICB9XG59XG5cbi5jb21iaW5lLnBlcmZvcm1hbmNlLm9iamVjdHMgPC0gZnVuY3Rpb24oIHAub2JqLjEsIHAub2JqLjIgKSB7XG4gICAgIyMgc29tZSBjaGVja3MgZm9yIG1pc3VzYWdlIChpbiBhbnkgd2F5LCB0aGlzIGZ1bmN0aW9uIGlzXG4gICAgIyMgb25seSBmb3IgaW50ZXJuYWwgdXNlKVxuICAgIGlmICggcC5vYmouMUB4Lm5hbWUgIT0gcC5vYmouMkB4Lm5hbWUgKSB7XG4gICAgICAgIHN0b3AoXCJFcnJvcjogT2JqZWN0cyBuZWVkIHRvIGhhdmUgaWRlbnRpY2FsIHggYXhpcy5cIilcbiAgICB9XG4gICAgaWYgKCBwLm9iai4xQGFscGhhLm5hbWUgIT0gXCJub25lXCIgfHwgcC5vYmouMkBhbHBoYS5uYW1lICE9IFwibm9uZVwiKSB7XG4gICAgICAgIHN0b3AoXCJFcnJvcjogQXQgbGVhc3Qgb25lIG9mIHRoZSB0d28gb2JqZWN0cyBoYXMgYWxyZWFkeSBiZWVuIG1lcmdlZC5cIilcbiAgICB9XG4gICAgaWYgKGxlbmd0aChwLm9iai4xQHgudmFsdWVzKSAhPSBsZW5ndGgocC5vYmouMkB4LnZhbHVlcykpIHtcbiAgICAgICAgc3RvcChwYXN0ZShcIk9ubHkgcGVyZm9ybWFuY2Ugb2JqZWN0cyB3aXRoIGlkZW50aWNhbCBudW1iZXIgb2ZcIixcbiAgICAgICAgICAgICAgICAgICBcImNyb3NzLXZhbGlkYXRpb24gcnVucyBjYW4gYmUgY29tYmluZWQuXCIpKVxuICAgIH1cblxuICAgIHgudmFsdWVzIDwtIGxpc3QoKVxuICAgIHgubmFtZSA8LSBwLm9iai4xQHkubmFtZVxuICAgIHkudmFsdWVzIDwtIGxpc3QoKVxuICAgIHkubmFtZSA8LSBwLm9iai4yQHkubmFtZVxuICAgIGFscGhhLnZhbHVlcyA8LSBsaXN0KClcbiAgICBhbHBoYS5uYW1lIDwtIHAub2JqLjFAeC5uYW1lXG5cbiAgICBmb3IgKGkgaW4gMTpsZW5ndGgoIHAub2JqLjFAeC52YWx1ZXMgKSkge1xuICAgICAgICB4LnZhbHVlcy4xIDwtIHAub2JqLjFAeC52YWx1ZXNbW2ldXVxuICAgICAgICB5LnZhbHVlcy4xIDwtIHAub2JqLjFAeS52YWx1ZXNbW2ldXVxuICAgICAgICB4LnZhbHVlcy4yIDwtIHAub2JqLjJAeC52YWx1ZXNbW2ldXVxuICAgICAgICB5LnZhbHVlcy4yIDwtIHAub2JqLjJAeS52YWx1ZXNbW2ldXVxuXG4gICAgICAgICMjIGN1dG9mZnMgb2YgY29tYmluZWQgb2JqZWN0ID0gbWVyZ2VkIGN1dG9mZnMgb2Ygc2ltcGxlIG9iamVjdHNcbiAgICAgICAgY3V0b2ZmcyA8LSBzb3J0KCB1bmlxdWUoIGMoeC52YWx1ZXMuMSwgeC52YWx1ZXMuMikpLCBkZWNyZWFzaW5nPVRSVUUgKVxuXG4gICAgICAgICMjIGNhbGN1bGF0ZSB5LnZhbHVlcyBhdCBjdXRvZmZzIHVzaW5nIHN0ZXAgZnVuY3Rpb25cbiAgICAgICAgeS52YWx1ZXMuaW50LjEgPC0gYXBwcm94ZnVuKHgudmFsdWVzLjEsIHkudmFsdWVzLjEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q9XCJjb25zdGFudFwiLGY9MSxydWxlPTIpKGN1dG9mZnMpXG4gICAgICAgIHkudmFsdWVzLmludC4yIDwtIGFwcHJveGZ1bih4LnZhbHVlcy4yLCB5LnZhbHVlcy4yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPVwiY29uc3RhbnRcIixmPTEscnVsZT0yKShjdXRvZmZzKVxuXG4gICAgICAgICMjICdhcHByb3hmdW4nIGlnbm9yZXMgTkEgYW5kIE5hTlxuICAgICAgICBvYmpzIDwtIGxpc3QoIHkudmFsdWVzLmludC4xLCB5LnZhbHVlcy5pbnQuMilcbiAgICAgICAgb2Jqcy54IDwtIGxpc3QoIHgudmFsdWVzLjEsIHgudmFsdWVzLjIgKVxuICAgICAgICBuYS5jdXRvZmZzLjEuYm9vbCA8LSBpcy5uYSggeS52YWx1ZXMuMSkgJiAhaXMubmFuKCB5LnZhbHVlcy4xIClcbiAgICAgICAgbmFuLmN1dG9mZnMuMS5ib29sIDwtIGlzLm5hbiggeS52YWx1ZXMuMSlcbiAgICAgICAgbmEuY3V0b2Zmcy4yLmJvb2wgPC0gaXMubmEoIHkudmFsdWVzLjIpICYgIWlzLm5hbiggeS52YWx1ZXMuMiApXG4gICAgICAgIG5hbi5jdXRvZmZzLjIuYm9vbCA8LSBpcy5uYW4oIHkudmFsdWVzLjIpXG4gICAgICAgIGJvb2xzIDwtIGxpc3QobmEuY3V0b2Zmcy4xLmJvb2wsIG5hbi5jdXRvZmZzLjEuYm9vbCxcbiAgICAgICAgICAgICAgICAgICAgICBuYS5jdXRvZmZzLjIuYm9vbCwgbmFuLmN1dG9mZnMuMi5ib29sKVxuICAgICAgICB2YWx1ZXMgPC0gYyhOQSxOYU4sTkEsTmFOKVxuICAgICAgICBcbiAgICAgICAgZm9yIChqIGluIDE6NCkge1xuICAgICAgICAgICAgZm9yIChrIGluIHdoaWNoKGJvb2xzW1tqXV0pKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWwubWF4IDwtIG9ianMueFtbIGNlaWxpbmcoai8yKSBdXVtrXVxuICAgICAgICAgICAgICAgIGludGVydmFsLm1pbiA8LSAtSW5mXG4gICAgICAgICAgICAgICAgaWYgKGsgPCBsZW5ndGgob2Jqcy54W1sgY2VpbGluZyhqLzIpIF1dKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC5taW4gPC0gb2Jqcy54W1sgY2VpbGluZyhqLzIpIF1dW2srMV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Jqc1tbIGNlaWxpbmcoai8yKSBdXVtjdXRvZmZzIDw9IGludGVydmFsLm1heCAmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzID4gaW50ZXJ2YWwubWluIF0gPC0gdmFsdWVzW2pdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhbHBoYS52YWx1ZXMgPC0gYyhhbHBoYS52YWx1ZXMsIGxpc3QoY3V0b2ZmcykpXG4gICAgICAgIHgudmFsdWVzIDwtIGMoeC52YWx1ZXMsIGxpc3Qob2Jqc1tbMV1dKSlcbiAgICAgICAgeS52YWx1ZXMgPC0gYyh5LnZhbHVlcywgbGlzdChvYmpzW1syXV0pKVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4oIG5ldyhcInBlcmZvcm1hbmNlXCIsXG4gICAgICAgICAgICAgICAgeC5uYW1lPXgubmFtZSwgeS5uYW1lPXkubmFtZSxcbiAgICAgICAgICAgICAgICBhbHBoYS5uYW1lPWFscGhhLm5hbWUsIHgudmFsdWVzPXgudmFsdWVzLFxuICAgICAgICAgICAgICAgIHkudmFsdWVzPXkudmFsdWVzLCBhbHBoYS52YWx1ZXM9YWxwaGEudmFsdWVzKSlcbn1cblxuLmRlZmluZS5lbnZpcm9ubWVudHMgPC0gZnVuY3Rpb24oKSB7XG4gICAgIyMgVGhlcmUgYXJlIGZpdmUgZW52aXJvbm1lbnRzOiBsb25nLnVuaXQubmFtZXMsIGZ1bmN0aW9uLm5hbWVzLFxuICAgICMjIG9ibGlnYXRvcnkueC5heGlzLCBvcHRpb25hbC5hcmd1bWVudHMsIGRlZmF1bHQudmFsdWVzXG4gICAgXG4gICAgIyMgRGVmaW5lIGxvbmcgbmFtZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbWVhc3VyZSBhYmJyZXZpYXRpb25zLlxuICAgIGxvbmcudW5pdC5uYW1lcyA8LSBuZXcuZW52KClcbiAgICBhc3NpZ24oXCJub25lXCIsXCJOb25lXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJjdXRvZmZcIiwgXCJDdXRvZmZcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcImFjY1wiLCBcIkFjY3VyYWN5XCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJlcnJcIiwgXCJFcnJvciBSYXRlXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJmcHJcIiwgXCJGYWxzZSBwb3NpdGl2ZSByYXRlXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJ0cHJcIiwgXCJUcnVlIHBvc2l0aXZlIHJhdGVcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcInJlY1wiLCBcIlJlY2FsbFwiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwic2Vuc1wiLCBcIlNlbnNpdGl2aXR5XCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJmbnJcIiwgXCJGYWxzZSBuZWdhdGl2ZSByYXRlXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJ0bnJcIiwgXCJUcnVlIG5lZ2F0aXZlIHJhdGVcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcInNwZWNcIiwgXCJTcGVjaWZpY2l0eVwiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwicHB2XCIsIFwiUG9zaXRpdmUgcHJlZGljdGl2ZSB2YWx1ZVwiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwicHJlY1wiLCBcIlByZWNpc2lvblwiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwibnB2XCIsIFwiTmVnYXRpdmUgcHJlZGljdGl2ZSB2YWx1ZVwiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwiZmFsbFwiLCBcIkZhbGxvdXRcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcIm1pc3NcIiwgXCJNaXNzXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJwY2ZhbGxcIiwgXCJQcmVkaWN0aW9uLWNvbmRpdGlvbmVkIGZhbGxvdXRcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcInBjbWlzc1wiLCBcIlByZWRpY3Rpb24tY29uZGl0aW9uZWQgbWlzc1wiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwicnBwXCIsIFwiUmF0ZSBvZiBwb3NpdGl2ZSBwcmVkaWN0aW9uc1wiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwicm5wXCIsIFwiUmF0ZSBvZiBuZWdhdGl2ZSBwcmVkaWN0aW9uc1wiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwiYXVjXCIsXCJBcmVhIHVuZGVyIHRoZSBST0MgY3VydmVcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcImNhbFwiLCBcIkNhbGlicmF0aW9uIGVycm9yXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJtd3BcIiwgXCJNZWRpYW4gd2luZG93IHBvc2l0aW9uXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJwcmJlXCIsXCJQcmVjaXNpb24vcmVjYWxsIGJyZWFrLWV2ZW4gcG9pbnRcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcInJjaFwiLCBcIlJPQyBjb252ZXggaHVsbFwiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwibXhlXCIsIFwiTWVhbiBjcm9zcy1lbnRyb3B5XCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJybXNlXCIsXCJSb290LW1lYW4tc3F1YXJlIGVycm9yXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJwaGlcIiwgXCJQaGkgY29ycmVsYXRpb24gY29lZmZpY2llbnRcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcIm1hdFwiLFwiTWF0dGhld3MgY29ycmVsYXRpb24gY29lZmZpY2llbnRcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcIm1pXCIsIFwiTXV0dWFsIGluZm9ybWF0aW9uXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJjaGlzcVwiLCBcIkNoaS1zcXVhcmUgdGVzdCBzdGF0aXN0aWNcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcIm9kZHNcIixcIk9kZHMgcmF0aW9cIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcImxpZnRcIiwgXCJMaWZ0IHZhbHVlXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJmXCIsXCJQcmVjaXNpb24tUmVjYWxsIEYgbWVhc3VyZVwiLCBlbnZpcj1sb25nLnVuaXQubmFtZXMpXG4gICAgYXNzaWduKFwic2FyXCIsIFwiU0FSXCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcbiAgICBhc3NpZ24oXCJlY29zdFwiLCBcIkV4cGVjdGVkIGNvc3RcIiwgZW52aXI9bG9uZy51bml0Lm5hbWVzKVxuICAgIGFzc2lnbihcImNvc3RcIiwgXCJFeHBsaWNpdCBjb3N0XCIsIGVudmlyPWxvbmcudW5pdC5uYW1lcylcblxuICAgICMjIERlZmluZSBmdW5jdGlvbiBuYW1lcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZWFzdXJlIGFiYnJldmlhdGlvbnMuXG4gICAgZnVuY3Rpb24ubmFtZXMgPC0gbmV3LmVudigpXG4gICAgYXNzaWduKFwiYWNjXCIsIFwiLnBlcmZvcm1hbmNlLmFjY3VyYWN5XCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcImVyclwiLCBcIi5wZXJmb3JtYW5jZS5lcnJvci5yYXRlXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcImZwclwiLCBcIi5wZXJmb3JtYW5jZS5mYWxzZS5wb3NpdGl2ZS5yYXRlXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcInRwclwiLCBcIi5wZXJmb3JtYW5jZS50cnVlLnBvc2l0aXZlLnJhdGVcIiwgZW52aXI9ZnVuY3Rpb24ubmFtZXMpXG4gICAgYXNzaWduKFwicmVjXCIsIFwiLnBlcmZvcm1hbmNlLnRydWUucG9zaXRpdmUucmF0ZVwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJzZW5zXCIsIFwiLnBlcmZvcm1hbmNlLnRydWUucG9zaXRpdmUucmF0ZVwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJmbnJcIiwgXCIucGVyZm9ybWFuY2UuZmFsc2UubmVnYXRpdmUucmF0ZVwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJ0bnJcIiwgXCIucGVyZm9ybWFuY2UudHJ1ZS5uZWdhdGl2ZS5yYXRlXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcInNwZWNcIiwgXCIucGVyZm9ybWFuY2UudHJ1ZS5uZWdhdGl2ZS5yYXRlXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcInBwdlwiLCBcIi5wZXJmb3JtYW5jZS5wb3NpdGl2ZS5wcmVkaWN0aXZlLnZhbHVlXCIsXG4gICAgICAgICAgIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcInByZWNcIiwgXCIucGVyZm9ybWFuY2UucG9zaXRpdmUucHJlZGljdGl2ZS52YWx1ZVwiLFxuICAgICAgICAgICBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJucHZcIiwgXCIucGVyZm9ybWFuY2UubmVnYXRpdmUucHJlZGljdGl2ZS52YWx1ZVwiLFxuICAgICAgICAgICBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJmYWxsXCIsIFwiLnBlcmZvcm1hbmNlLmZhbHNlLnBvc2l0aXZlLnJhdGVcIiwgZW52aXI9ZnVuY3Rpb24ubmFtZXMpXG4gICAgYXNzaWduKFwibWlzc1wiLCBcIi5wZXJmb3JtYW5jZS5mYWxzZS5uZWdhdGl2ZS5yYXRlXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcInBjZmFsbFwiLCBcIi5wZXJmb3JtYW5jZS5wcmVkaWN0aW9uLmNvbmRpdGlvbmVkLmZhbGxvdXRcIixcbiAgICAgICAgICAgZW52aXI9ZnVuY3Rpb24ubmFtZXMpXG4gICAgYXNzaWduKFwicGNtaXNzXCIsIFwiLnBlcmZvcm1hbmNlLnByZWRpY3Rpb24uY29uZGl0aW9uZWQubWlzc1wiLFxuICAgICAgICAgICBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJycHBcIiwgXCIucGVyZm9ybWFuY2UucmF0ZS5vZi5wb3NpdGl2ZS5wcmVkaWN0aW9uc1wiLFxuICAgICAgICAgICBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJybnBcIiwgXCIucGVyZm9ybWFuY2UucmF0ZS5vZi5uZWdhdGl2ZS5wcmVkaWN0aW9uc1wiLFxuICAgICAgICAgICBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJhdWNcIiwgXCIucGVyZm9ybWFuY2UuYXVjXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcImNhbFwiLCBcIi5wZXJmb3JtYW5jZS5jYWxpYnJhdGlvbi5lcnJvclwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJwcmJlXCIsIFwiLnBlcmZvcm1hbmNlLnByZWNpc2lvbi5yZWNhbGwuYnJlYWsuZXZlbi5wb2ludFwiLFxuICAgICAgICAgICBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJyY2hcIiwgXCIucGVyZm9ybWFuY2Uucm9jY29udmV4aHVsbFwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJteGVcIiwgXCIucGVyZm9ybWFuY2UubWVhbi5jcm9zcy5lbnRyb3B5XCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcInJtc2VcIiwgXCIucGVyZm9ybWFuY2Uucm9vdC5tZWFuLnNxdWFyZWQuZXJyb3JcIixcbiAgICAgICAgICAgZW52aXI9ZnVuY3Rpb24ubmFtZXMpXG4gICAgYXNzaWduKFwicGhpXCIsIFwiLnBlcmZvcm1hbmNlLnBoaVwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJtYXRcIiwgXCIucGVyZm9ybWFuY2UucGhpXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcIm1pXCIsIFwiLnBlcmZvcm1hbmNlLm11dHVhbC5pbmZvcm1hdGlvblwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJjaGlzcVwiLCBcIi5wZXJmb3JtYW5jZS5jaGlzcVwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJvZGRzXCIsIFwiLnBlcmZvcm1hbmNlLm9kZHMucmF0aW9cIiwgZW52aXI9ZnVuY3Rpb24ubmFtZXMpXG4gICAgYXNzaWduKFwibGlmdFwiLCBcIi5wZXJmb3JtYW5jZS5saWZ0XCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcImZcIiwgXCIucGVyZm9ybWFuY2UuZlwiLCBlbnZpcj1mdW5jdGlvbi5uYW1lcylcbiAgICBhc3NpZ24oXCJzYXJcIiwgXCIucGVyZm9ybWFuY2Uuc2FyXCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuICAgIGFzc2lnbihcImVjb3N0XCIsIFwiLnBlcmZvcm1hbmNlLmV4cGVjdGVkLmNvc3RcIiwgZW52aXI9ZnVuY3Rpb24ubmFtZXMpXG4gICAgYXNzaWduKFwiY29zdFwiLCBcIi5wZXJmb3JtYW5jZS5jb3N0XCIsIGVudmlyPWZ1bmN0aW9uLm5hbWVzKVxuXG4gICAgIyMgSWYgYSBtZWFzdXJlIGNvbWVzIGFsb25nIHdpdGggYW4gb2JsaWdhdG9yeSB4IGF4aXMgKGluY2x1ZGluZyBcIm5vbmVcIiksXG4gICAgIyMgbGlzdCBpdCBoZXJlLlxuICAgIG9ibGlnYXRvcnkueC5heGlzIDwtIG5ldy5lbnYoKVxuICAgIGFzc2lnbihcIm14ZVwiLCBcIm5vbmVcIiwgZW52aXI9b2JsaWdhdG9yeS54LmF4aXMpXG4gICAgYXNzaWduKFwicm1zZVwiLCBcIm5vbmVcIiwgZW52aXI9b2JsaWdhdG9yeS54LmF4aXMpXG4gICAgYXNzaWduKFwicHJiZVwiLCBcIm5vbmVcIiwgZW52aXI9b2JsaWdhdG9yeS54LmF4aXMpXG4gICAgYXNzaWduKFwiYXVjXCIsIFwibm9uZVwiLCBlbnZpcj1vYmxpZ2F0b3J5LnguYXhpcylcbiAgICBhc3NpZ24oXCJyY2hcIixcIm5vbmVcIiwgZW52aXI9b2JsaWdhdG9yeS54LmF4aXMpXG4gICAgIyMgZWNvc3QgcmVxdWlyZXMgcHJvYmFiaWxpdHkgY29zdCBmdW5jdGlvbiBhcyB4IGF4aXMsIHdoaWNoIGlzIGhhbmRsZWRcbiAgICAjIyBpbXBsaWNpdGx5LCBub3QgYXMgYW4gZXhwbGljaXQgcGVyZm9ybWFuY2UgbWVhc3VyZS5cbiAgICBhc3NpZ24oXCJlY29zdFwiLFwibm9uZVwiLCBlbnZpcj1vYmxpZ2F0b3J5LnguYXhpcykgIFxuICAgIFxuICAgICMjIElmIGEgbWVhc3VyZSBoYXMgb3B0aW9uYWwgYXJndW1lbnRzLCBsaXN0IHRoZSBuYW1lcyBvZiB0aGVcbiAgICAjIyBhcmd1bWVudHMgaGVyZS5cbiAgICBvcHRpb25hbC5hcmd1bWVudHMgPC0gbmV3LmVudigpXG4gICAgYXNzaWduKFwiY2FsXCIsIFwid2luZG93LnNpemVcIiwgZW52aXI9b3B0aW9uYWwuYXJndW1lbnRzKVxuICAgIGFzc2lnbihcImZcIiwgXCJhbHBoYVwiLCBlbnZpcj1vcHRpb25hbC5hcmd1bWVudHMpXG4gICAgYXNzaWduKFwiY29zdFwiLCBjKFwiY29zdC5mcFwiLCBcImNvc3QuZm5cIiksIGVudmlyPW9wdGlvbmFsLmFyZ3VtZW50cylcbiAgICBhc3NpZ24oXCJhdWNcIiwgXCJmcHIuc3RvcFwiLCBlbnZpcj1vcHRpb25hbC5hcmd1bWVudHMpXG4gICAgICAgIFxuICAgICMjIElmIGEgbWVhc3VyZSBoYXMgYWRkaXRpb25hbCBhcmd1bWVudHMsIGxpc3QgdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgIyMgZm9yIHRoZW0gaGVyZS4gTmFtaW5nIGNvbnZlbnRpb246IGUuZy4gXCJjYWxcIiBoYXMgYW4gb3B0aW9uYWxcbiAgICAjIyBhcmd1bWVudCBcIndpbmRvdy5zaXplXCIgdGhlIGtleSB0byB1c2UgaGVyZSBpcyBcImNhbDp3aW5kb3cuc2l6ZVwiXG4gICAgIyMgKGNvbG9uIGFzIHNlcGFyYXRvcilcbiAgICBkZWZhdWx0LnZhbHVlcyA8LSBuZXcuZW52KClcbiAgICBhc3NpZ24oXCJjYWw6d2luZG93LnNpemVcIiwgMTAwLCBlbnZpcj1kZWZhdWx0LnZhbHVlcylcbiAgICBhc3NpZ24oXCJmOmFscGhhXCIsIDAuNSwgZW52aXI9ZGVmYXVsdC52YWx1ZXMpXG4gICAgYXNzaWduKFwiY29zdDpjb3N0LmZwXCIsIDEsIGVudmlyPWRlZmF1bHQudmFsdWVzKVxuICAgIGFzc2lnbihcImNvc3Q6Y29zdC5mblwiLCAxLCBlbnZpcj1kZWZhdWx0LnZhbHVlcylcbiAgICBhc3NpZ24oXCJhdWM6ZnByLnN0b3BcIiwgMSwgZW52aXI9ZGVmYXVsdC52YWx1ZXMpIFxuICAgIFxuICAgIGxpc3QobG9uZy51bml0Lm5hbWVzPWxvbmcudW5pdC5uYW1lcywgZnVuY3Rpb24ubmFtZXM9ZnVuY3Rpb24ubmFtZXMsXG4gICAgICAgICBvYmxpZ2F0b3J5LnguYXhpcz1vYmxpZ2F0b3J5LnguYXhpcyxcbiAgICAgICAgIG9wdGlvbmFsLmFyZ3VtZW50cz1vcHRpb25hbC5hcmd1bWVudHMsXG4gICAgICAgICBkZWZhdWx0LnZhbHVlcz1kZWZhdWx0LnZhbHVlcylcbn0iLCJzYW1wbGUiOiIjIGRmLCBpbmNsdWRpbmcgcHJlZCwgaXMgbG9hZGVkXG5cbiMgVXNlIHRoZSBwcmVkaWN0aW9uIGZ1bmN0aW9uIGZyb20gUkNPUiAocHJlbG9hZGVkKSB0byBtYWtlIGEgcHJlZGljdGlvbiBvYmplY3RcbiMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIG91ciBwcmVkaWN0aW9uIGZyb20gdGhlIHJlZ3Jlc3Npb24sIGFuZCB0aGUgc2Vjb25kIGlzXG4jIFRoZSBhY3R1YWwgb3V0Y29tZVxuUk9DcHJlZCA8LSBwcmVkaWN0aW9uKCwgKVxuXG4jIFVzZSB0aGUgcGVyZm9ybWFuY2UgZnVuY3Rpb24gKHByZWxvYWRlZCkgZnJvbSBST0NSIGFsb25nIHdpdGggUk9DcHJlZFxuIyBUaGUgY3JlYXRlZCBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBsb3QgYSBST0MgY3VydmUsIGFuZCB0aHVzIG5lZWRzXG4jIHRydWUgcG9zaXRpdmUgcmF0ZSAoJ3RwcicpIGFuZCBmYWxzZSBwb3NpdGl2ZSByYXRlICgnZnByJylcblJPQ3BlcmYgPC0gcGVyZm9ybWFuY2UoLCAnJywnJylcblxuIyBDcmVhdGUgYSBkYXRhIGZyYW1lIGZvciBwYXNzaW5nIHRvIGdncGxvdDIgZm9yIHBsb3R0aW5nIHRoZSBjdXJ2ZVxuIyBUaGlzIHBhcnQgaXMgYWxyZWFkeSBkb25lXG5kZl9ST0MgPC0gZGF0YS5mcmFtZShGYWxzZVBvc2l0aXZlPWMoUk9DcGVyZkB4LnZhbHVlc1tbMV1dKSxcbiAgICAgICAgICAgICAgICAgICAgIFRydWVQb3NpdGl2ZT1jKFJPQ3BlcmZAeS52YWx1ZXNbWzFdXSkpXG5cbiMgQ2FsY3VsYXRlIFJPQyBBVUMgKCdhdWMnKSB1c2luZyBwZXJmb3JtYW5jZSgpIGFuZCBST0NwcmVkXG5BVUMgPC0gcGVyZm9ybWFuY2UoLCAnJylcblxuIyBEaXNwbGF5IHRoZSBBVUMgdmFsdWUgLS0gdGhpcyBsaW5lIGlzIGFscmVhZHkgZG9uZVxuIyBUaGUgQCBpcyBpbiBwbGFjZSBvZiBhICQsIGR1ZSB0byBST0NSIHVzaW5nIFM0IG9iamVjdHMgaW5zdGVhZCBvZiBsaXN0c1xuQVVDQHkudmFsdWVzW1sxXV1cbiNFTkQiLCJzb2x1dGlvbiI6IiMgZGYsIGluY2x1ZGluZyBwcmVkLCBpcyBsb2FkZWRcblxuIyBVc2UgdGhlIHByZWRpY3Rpb24gZnVuY3Rpb24gZnJvbSBSQ09SIChwcmVsb2FkZWQpIHRvIG1ha2UgYSBwcmVkaWN0aW9uIG9iamVjdFxuIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgb3VyIHByZWRpY3Rpb24gZnJvbSB0aGUgcmVncmVzc2lvbiwgYW5kIHRoZSBzZWNvbmQgaXNcbiMgVGhlIGFjdHVhbCBvdXRjb21lXG5ST0NwcmVkIDwtIHByZWRpY3Rpb24oYXMubnVtZXJpYyhkZiRwcmVkKSwgYXMubnVtZXJpYyhkZiRyZXZ0cV9kb3duKSlcblxuIyBVc2UgdGhlIHBlcmZvcm1hbmNlIGZ1bmN0aW9uIChwcmVsb2FkZWQpIGZyb20gUk9DUiBhbG9uZyB3aXRoIFJPQ3ByZWRcbiMgVGhlIGNyZWF0ZWQgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBwbG90IGEgUk9DIGN1cnZlLCBhbmQgdGh1cyBuZWVkc1xuIyB0cnVlIHBvc2l0aXZlIHJhdGUgKCd0cHInKSBhbmQgZmFsc2UgcG9zaXRpdmUgcmF0ZSAoJ2ZwcicpXG5ST0NwZXJmIDwtIHBlcmZvcm1hbmNlKFJPQ3ByZWQsICd0cHInLCdmcHInKVxuXG4jIENyZWF0ZSBhIGRhdGEgZnJhbWUgZm9yIHBhc3NpbmcgdG8gZ2dwbG90MiBmb3IgcGxvdHRpbmcgdGhlIGN1cnZlXG4jIFRoaXMgcGFydCBpcyBhbHJlYWR5IGRvbmVcbmRmX1JPQyA8LSBkYXRhLmZyYW1lKEZhbHNlUG9zaXRpdmU9YyhST0NwZXJmQHgudmFsdWVzW1sxXV0pLFxuICAgICAgICAgICAgICAgICAgICAgVHJ1ZVBvc2l0aXZlPWMoUk9DcGVyZkB5LnZhbHVlc1tbMV1dKSlcblxuIyBDYWxjdWxhdGUgUk9DIEFVQyAoJ2F1YycpIHVzaW5nIHBlcmZvcm1hbmNlKCkgYW5kIFJPQ3ByZWRcbkFVQyA8LSBwZXJmb3JtYW5jZShST0NwcmVkLCAnYXVjJylcblxuIyBEaXNwbGF5IHRoZSBBVUMgdmFsdWUgLS0gdGhpcyBsaW5lIGlzIGFscmVhZHkgZG9uZVxuIyBUaGUgQCBpcyBpbiBwbGFjZSBvZiBhICQsIGR1ZSB0byBST0NSIHVzaW5nIFM0IG9iamVjdHMgaW5zdGVhZCBvZiBsaXN0c1xuQVVDQHkudmFsdWVzW1sxXV1cbiNFTkQiLCJzY3QiOiIjIFRlbXBsYXRlIGJhc2VkIG9uIGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy90ZXN0d2hhdC92ZXJzaW9ucy80LjEuMVxuIyBDaGVjayBpZiBzb21ldGhpbmcgaXMgZXhwbGljaXRseSB0eXBlZFxuXG50ZXN0X2V4cHJlc3Npb25fb3V0cHV0KFwiUk9DcHJlZFwiLCBpbmNvcnJlY3RfbXNnPVwiWW91ciByZWdyZXNzaW9uIG1vZGVsIGlzbid0IHF1aXRlIHJpZ2h0LlwiKVxudGVzdF9leHByZXNzaW9uX291dHB1dChcIlJPQ3BlcmZcIiwgaW5jb3JyZWN0X21zZz1cIllvdXIgcmVncmVzc2lvbiBtb2RlbCBpc24ndCBxdWl0ZSByaWdodC5cIilcbnRlc3RfZXhwcmVzc2lvbl9vdXRwdXQoXCJBVUNAeS52YWx1ZXNbWzFdXVwiLCBpbmNvcnJlY3RfbXNnPVwiWW91ciByZWdyZXNzaW9uIG1vZGVsIGlzbid0IHF1aXRlIHJpZ2h0LlwiKVxuXG5cbiN0ZXN0X3N0dWRlbnRfdHlwZWQoJ3JldnRxX2Rvd24gfiByZWNlc3Npb25fbGFnJyxub3RfdHlwZWRfbXNnPSdNYWtlIHN1cmUgdG8gcmVncmVzcyBgcmV2dHFfZG93bmAgb24gYHJlY2Vzc2lvbl9sYWdgLicpXG5cblxuIyB0ZXN0X3N0dWRlbnRfdHlwZWQoJ3ggPC0gMicsIG5vdF90eXBlZF9tc2c9JycpXG5cbiMgQ2hlY2sgaWYgZnVuY3Rpb24gd2FzIHVzZWQgaW4gaW5wdXQgY29kZVxuIyB0ZXN0X2Z1bmN0aW9uKCdjJyxpbmNvcnJlY3RfbXNnPScnKSAgXG5cbiMgUmVxdWlyZXMgYW4gb2JqZWN0IGB4YCB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBzb2x1dGlvblxuIyB0ZXN0X29iamVjdChcInhcIixpbmNvcnJlY3RfbXNnID0gXCJcIix1bmRlZmluZWRfbXNnID0gXCJcIikgIFxuXG4jIFJlcXVpcmVzIGFuIG9uamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIGB4YCBpbiB0aGUgc29sdXRpb25cbiMgdGVzdF9hbl9vYmplY3QoXCJ4XCIsdW5kZWZpbmVkX21zZz1cIlwiKVxuXG4jIENoZWNrcyBpZiBvdXRwdXQgb2Ygc3R1ZGVudCdzIGNvZGUgY29udGFpbnMgZ2l2ZW4gZXZhbHVhdGVkIGV4cHJlc3Npb25cbiMgdGVzdF9vdXRwdXRfY29udGFpbnMoXCJ4XCIsaW5jb3JyZWN0X21zZyA9IFwiXCIpXG5cbiMgQ2hlY2sgaWYgYSB2ZWN0b3Igb2YgcHJlZGVmaW5lZCBvYmplY3RzIGFyZSB1bmNoYW5nZWRcbiMgdGVzdF9wcmVkZWZpbmVkX29iamVjdHMoYygneCcsJ3knKSxpbmNvcnJlY3RfbXNnPVwiRG9uJ3Qgb252ZXJ3cml0ZSB0aGUgcHJlZGVmaW5lZCB2YXJpYWJsZXNcIilcblxuIyBDaGVja3MgZm9yIGEgcmVnZXggcGF0dGVybiBpbiB0cmhlIG91dHB1dFxuIyB0ZXN0X291dHB1dF9yZWdleChwYXR0ZXJuLGZpeGVkPUYsIHRpbWVzPTEsIGluY29ycmVjdF9tc2c9JycpXG5cbiMgQ2FuIGNoZWNrIGFuIGFyYml0cmFyeSBleHByZXNzaW9uIGFjcm9zcyBib3RoIHNvbHV0aW9uIGFuZCBzdHVkZW50IGNvZGVcbiN0ZXN0X2V4cHJlc3Npb25fb3V0cHV0KFwidHlwZW9mKGNvbXBhbnlfbmFtZSlcIiwgaW5jb3JyZWN0X21zZz1cIkRpZCB5b3Ugc3RvcmUgdGV4dHVhbCBkYXRhIGluIGBjb21wYW55X25hbWVgP1wiKVxuXG50ZXN0X2Vycm9yKClcbnN1Y2Nlc3NfbXNnKFwiQXdlc29tZSFcIilcblxuIyBPdGhlciBmdW5jdGlvbnMgdG8gbm90ZTpcbiMgICAgIC0gdGVzdF9vcihhLGIpIC0tIGNoZWNrcyBpZiBlaXRoZXIgdGVzdCBhIG9yIHRlc3QgYiBwYXNzXG4jICAgICAtIHRlc3RfZ2dwbG90KCkgLS0gY2FuIGNoZWNrIGlmIHBsb3RzIGFyZSBjb3JyZWN0XG4jICAgICAtIHRlc3RfZnVuY3Rpb24oKSAtLSBjYW4gYWxzbyBjaGVjayBpbmNsdWRlZCBwYXJhbWV0ZXJzXG4jICAgICAtIHRlc3RfbG9vcCgpIC0tIGNoZWNraW5nIGZvciBhbmQgd2hpbGUgbG9vcHNcbiMgICAgIC0gdGVzdF9saWJyYXJ5X2Z1bmN0aW9uKCdwYWNrYWdlJywgbm90X2NhbGxlZF9tc2c9JycsaW5jb3JyZWN0X21zZz0nJylcbiMgICAgIC0gdGVzdF9pZl9lbHNlKCkgLS0gY2hlY2tpbmcgaWYgc3RhdGVtZW50c1xuIyAgICAgLSB0ZXN0X2V4cHJlc3Npb25fZXJyb3IoKSAtLSBjYW4gY2hlY2sgaWYgZnVuY3Rpb25zIGFyZSBwcm9wZXJseSBkZWZpbmVkXG4jICAgICAtIHRlc3Rfb3BlcmF0b3IoJ29wZXJhdG9yJywpLCBub3RfY2FsbGVkX21zZz0nJyxpbmNvcnJlY3RfbXNnPScnKVxuIyAgICAgLSB0ZXN0X2Z1bmN0aW9uX2RlZmluaXRpb24oKSAtLSByaWdvcm91c2x5IGNoZWNrIGRlZmluZWQgZnVuY3Rpb25cbiMgICAgIC0gdGVzdF9kYXRhX2ZyYW1lKCkgLS0gY2hlY2sgaWYgZGF0YWZyYW1lIFtjb2x1bW5zXSBhcmUgZXF1aXZhbGVudFxuIyAgICAgLSB0ZXN0X2Z1bmN0aW9uX3Jlc3VsdCwgdGVzdF9leHByZXNzaW9uX3Jlc3VsdCJ9
Exercise 4: Plotting a ROC curve
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpYnJhcnkoZ2dwbG90MilcbmRmX1JPQyA8LSBkYXRhLmZyYW1lKEZhbHNlUG9zaXRpdmU9YygwLCAwLjAwNTQzNDc4MjYwODY5NTY1LCAwLjAxMDg2OTU2NTIxNzM5MTMsIDAuMDEwODY5NTY1MjE3MzkxMywgMC4wMTA4Njk1NjUyMTczOTEzLCAwLjAxNjMwNDM0NzgyNjA4NywgMC4wMjE3MzkxMzA0MzQ3ODI2LCAwLjAyMTczOTEzMDQzNDc4MjYsIDAuMDI3MTczOTEzMDQzNDc4MywgMC4wMzI2MDg2OTU2NTIxNzM5LCAwLjAzODA0MzQ3ODI2MDg2OTYsIDAuMDQzNDc4MjYwODY5NTY1MiwgMC4wNDg5MTMwNDM0NzgyNjA5LCAwLjA1NDM0NzgyNjA4Njk1NjUsIDAuMDU0MzQ3ODI2MDg2OTU2NSwgMC4wNTk3ODI2MDg2OTU2NTIyLCAwLjA1OTc4MjYwODY5NTY1MjIsIDAuMDY1MjE3MzkxMzA0MzQ3OCwgMC4wNzA2NTIxNzM5MTMwNDM1LCAwLjA3NjA4Njk1NjUyMTczOTEsIDAuMDgxNTIxNzM5MTMwNDM0OCwgMC4wODY5NTY1MjE3MzkxMzA0LCAwLjA5MjM5MTMwNDM0NzgyNjEsIDAuMDk3ODI2MDg2OTU2NTIxNywgMC4xMDMyNjA4Njk1NjUyMTcsIDAuMTA4Njk1NjUyMTczOTEzLCAwLjExNDEzMDQzNDc4MjYwOSwgMC4xMTk1NjUyMTczOTEzMDQsIDAuMTI1LCAwLjEzMDQzNDc4MjYwODY5NiwgMC4xMzU4Njk1NjUyMTczOTEsIDAuMTQxMzA0MzQ3ODI2MDg3LCAwLjE0NjczOTEzMDQzNDc4MywgMC4xNTIxNzM5MTMwNDM0NzgsIDAuMTU3NjA4Njk1NjUyMTc0LCAwLjE2MzA0MzQ3ODI2MDg3LCAwLjE2ODQ3ODI2MDg2OTU2NSwgMC4xNzM5MTMwNDM0NzgyNjEsIDAuMTc5MzQ3ODI2MDg2OTU3LCAwLjE4NDc4MjYwODY5NTY1MiwgMC4xOTAyMTczOTEzMDQzNDgsIDAuMTk1NjUyMTczOTEzMDQzLCAwLjIwMTA4Njk1NjUyMTczOSwgMC4yMDY1MjE3MzkxMzA0MzUsIDAuMjExOTU2NTIxNzM5MTMsIDAuMjE3MzkxMzA0MzQ3ODI2LCAwLjIyMjgyNjA4Njk1NjUyMiwgMC4yMjgyNjA4Njk1NjUyMTcsIDAuMjMzNjk1NjUyMTczOTEzLCAwLjIzOTEzMDQzNDc4MjYwOSwgMC4yNDQ1NjUyMTczOTEzMDQsIDAuMjUsIDAuMjU1NDM0NzgyNjA4Njk2LCAwLjI2MDg2OTU2NTIxNzM5MSwgMC4yNjYzMDQzNDc4MjYwODcsIDAuMjcxNzM5MTMwNDM0NzgzLCAwLjI3NzE3MzkxMzA0MzQ3OCwgMC4yODI2MDg2OTU2NTIxNzQsIDAuMjg4MDQzNDc4MjYwODcsIDAuMjkzNDc4MjYwODY5NTY1LCAwLjI5ODkxMzA0MzQ3ODI2MSwgMC4zMDQzNDc4MjYwODY5NTcsIDAuMzA5NzgyNjA4Njk1NjUyLCAwLjMxNTIxNzM5MTMwNDM0OCwgMC4zMjA2NTIxNzM5MTMwNDMsIDAuMzI2MDg2OTU2NTIxNzM5LCAwLjMzMTUyMTczOTEzMDQzNSwgMC4zMzY5NTY1MjE3MzkxMywgMC4zNDIzOTEzMDQzNDc4MjYsIDAuMzQ3ODI2MDg2OTU2NTIyLCAwLjM1MzI2MDg2OTU2NTIxNywgMC4zNTg2OTU2NTIxNzM5MTMsIDAuMzY0MTMwNDM0NzgyNjA5LCAwLjM2OTU2NTIxNzM5MTMwNCwgMC4zNzUsIDAuMzgwNDM0NzgyNjA4Njk2LCAwLjM4NTg2OTU2NTIxNzM5MSwgMC4zOTEzMDQzNDc4MjYwODcsIDAuMzk2NzM5MTMwNDM0NzgzLCAwLjQwMjE3MzkxMzA0MzQ3OCwgMC40MDc2MDg2OTU2NTIxNzQsIDAuNDEzMDQzNDc4MjYwODcsIDAuNDE4NDc4MjYwODY5NTY1LCAwLjQyMzkxMzA0MzQ3ODI2MSwgMC40MjkzNDc4MjYwODY5NTcsIDAuNDM0NzgyNjA4Njk1NjUyLCAwLjQ0MDIxNzM5MTMwNDM0OCwgMC40NDU2NTIxNzM5MTMwNDMsIDAuNDUxMDg2OTU2NTIxNzM5LCAwLjQ1NjUyMTczOTEzMDQzNSwgMC40NjE5NTY1MjE3MzkxMywgMC40NjczOTEzMDQzNDc4MjYsIDAuNDcyODI2MDg2OTU2NTIyLCAwLjQ3ODI2MDg2OTU2NTIxNywgMC40ODM2OTU2NTIxNzM5MTMsIDAuNDg5MTMwNDM0NzgyNjA5LCAwLjQ5NDU2NTIxNzM5MTMwNCwgMC41LCAwLjUwNTQzNDc4MjYwODY5NiwgMC41MTA4Njk1NjUyMTczOTEsIDAuNTE2MzA0MzQ3ODI2MDg3LCAwLjUyMTczOTEzMDQzNDc4MywgMC41MjcxNzM5MTMwNDM0NzgsIDAuNTMyNjA4Njk1NjUyMTc0LCAwLjUzODA0MzQ3ODI2MDg3LCAwLjU0MzQ3ODI2MDg2OTU2NSwgMC41NDg5MTMwNDM0NzgyNjEsIDAuNTU0MzQ3ODI2MDg2OTU3LCAwLjU1OTc4MjYwODY5NTY1MiwgMC41NjUyMTczOTEzMDQzNDgsIDAuNTcwNjUyMTczOTEzMDQzLCAwLjU3NjA4Njk1NjUyMTczOSwgMC41ODE1MjE3MzkxMzA0MzUsIDAuNTg2OTU2NTIxNzM5MTMsIDAuNTkyMzkxMzA0MzQ3ODI2LCAwLjU5NzgyNjA4Njk1NjUyMiwgMC42MDMyNjA4Njk1NjUyMTcsIDAuNjA4Njk1NjUyMTczOTEzLCAwLjYxNDEzMDQzNDc4MjYwOSwgMC42MTk1NjUyMTczOTEzMDQsIDAuNjI1LCAwLjYzMDQzNDc4MjYwODY5NiwgMC42MzU4Njk1NjUyMTczOTEsIDAuNjQxMzA0MzQ3ODI2MDg3LCAwLjY0NjczOTEzMDQzNDc4MywgMC42NTIxNzM5MTMwNDM0NzgsIDAuNjU3NjA4Njk1NjUyMTc0LCAwLjY2MzA0MzQ3ODI2MDg3LCAwLjY2ODQ3ODI2MDg2OTU2NSwgMC42NzM5MTMwNDM0NzgyNjEsIDAuNjc5MzQ3ODI2MDg2OTU3LCAwLjY4NDc4MjYwODY5NTY1MiwgMC42OTAyMTczOTEzMDQzNDgsIDAuNjk1NjUyMTczOTEzMDQzLCAwLjcwMTA4Njk1NjUyMTczOSwgMC43MDY1MjE3MzkxMzA0MzUsIDAuNzExOTU2NTIxNzM5MTMsIDAuNzE3MzkxMzA0MzQ3ODI2LCAwLjcyMjgyNjA4Njk1NjUyMiwgMC43MjgyNjA4Njk1NjUyMTcsIDAuNzMzNjk1NjUyMTczOTEzLCAwLjczOTEzMDQzNDc4MjYwOSwgMC43NDQ1NjUyMTczOTEzMDQsIDAuNzUsIDAuNzU1NDM0NzgyNjA4Njk2LCAwLjc2MDg2OTU2NTIxNzM5MSwgMC43NjYzMDQzNDc4MjYwODcsIDAuNzcxNzM5MTMwNDM0NzgzLCAwLjc3NzE3MzkxMzA0MzQ3OCwgMSksXG4gICAgICAgICAgICAgICAgICAgICBUcnVlUG9zaXRpdmU9YygwLCAwLCAwLCAwLjIsIDAuNCwgMC40LCAwLjQsIDAuNiwgMC42LCAwLjYsIDAuNiwgMC42LCAwLjYsIDAuNiwgMC44LCAwLjgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpKSIsInNhbXBsZSI6IiMgZGZfUk9DLCBmcm9tIHRoZSBwcmV2aW91cyBleGVyY2lzZSwgaXMgbG9hZGVkXG5kZl9ST0NbMTo1LF1cblxuIyBQbG90IHRoZSBST0MgY3VydmUgLS0gZmlsbCBpbiB0aGUgYmVsb3cgY29tbWFuZFxuZ2dwbG90KGRhdGE9LCBhZXMoeD0sIHk9KSkgK1xuICBnZW9tX2xpbmUoKSArXG4gIGdlb21fYWJsaW5lKHNsb3BlPTEpXG5cbiNFTkQiLCJzb2x1dGlvbiI6IiMgZGZfUk9DLCBmcm9tIHRoZSBwcmV2aW91cyBleGVyY2lzZSwgaXMgbG9hZGVkXG5kZl9ST0NbMTo1LF1cblxuIyBQbG90IHRoZSBST0MgY3VydmUgLS0gZmlsbCBpbiB0aGUgYmVsb3cgY29tbWFuZFxuZ2dwbG90KGRhdGE9ZGZfUk9DLCBhZXMoeD1GYWxzZVBvc2l0aXZlLCB5PVRydWVQb3NpdGl2ZSkpICtcbiAgZ2VvbV9saW5lKCkgK1xuICBnZW9tX2FibGluZShzbG9wZT0xKVxuXG4jRU5EIiwic2N0IjoiIyBUZW1wbGF0ZSBiYXNlZCBvbiBodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvdGVzdHdoYXQvdmVyc2lvbnMvNC4xLjFcbiMgQ2hlY2sgaWYgc29tZXRoaW5nIGlzIGV4cGxpY2l0bHkgdHlwZWRcblxudGVzdF9zdHVkZW50X3R5cGVkKCdkYXRhPWRmX1JPQycsbm90X3R5cGVkX21zZz0nTWFrZSBzdXJlIHRvIHVzZSBgZGZfUk9DYCBhcyB0aGUgZGF0YSBmcmFtZS4nKVxudGVzdF9zdHVkZW50X3R5cGVkKCd4PUZhbHNlUG9zaXRpdmUnLG5vdF90eXBlZF9tc2c9J01ha2Ugc3VyZSB0byBwdXQgYEZhbHNlUG9zaXRpdmVgIGFzIHRoZSBkYXRhIHBsb3R0ZWQgb24gdGhlIHgtYXhpcycpXG50ZXN0X3N0dWRlbnRfdHlwZWQoJ3k9RmFsc2VQb3NpdGl2ZScsbm90X3R5cGVkX21zZz0nTWFrZSBzdXJlIHRvIHB1dCBgVHJ1ZVBvc2l0aXZlYCBhcyB0aGUgZGF0YSBwbG90dGVkIG9uIHRoZSB5LWF4aXMnKVxuXG4jIHRlc3Rfc3R1ZGVudF90eXBlZCgneCA8LSAyJywgbm90X3R5cGVkX21zZz0nJylcblxuIyBDaGVjayBpZiBmdW5jdGlvbiB3YXMgdXNlZCBpbiBpbnB1dCBjb2RlXG4jIHRlc3RfZnVuY3Rpb24oJ2MnLGluY29ycmVjdF9tc2c9JycpICBcblxuIyBSZXF1aXJlcyBhbiBvYmplY3QgYHhgIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHNvbHV0aW9uXG4jIHRlc3Rfb2JqZWN0KFwieFwiLGluY29ycmVjdF9tc2cgPSBcIlwiLHVuZGVmaW5lZF9tc2cgPSBcIlwiKSAgXG5cbiMgUmVxdWlyZXMgYW4gb25qZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgYHhgIGluIHRoZSBzb2x1dGlvblxuIyB0ZXN0X2FuX29iamVjdChcInhcIix1bmRlZmluZWRfbXNnPVwiXCIpXG5cbiMgQ2hlY2tzIGlmIG91dHB1dCBvZiBzdHVkZW50J3MgY29kZSBjb250YWlucyBnaXZlbiBldmFsdWF0ZWQgZXhwcmVzc2lvblxuIyB0ZXN0X291dHB1dF9jb250YWlucyhcInhcIixpbmNvcnJlY3RfbXNnID0gXCJcIilcblxuIyBDaGVjayBpZiBhIHZlY3RvciBvZiBwcmVkZWZpbmVkIG9iamVjdHMgYXJlIHVuY2hhbmdlZFxuIyB0ZXN0X3ByZWRlZmluZWRfb2JqZWN0cyhjKCd4JywneScpLGluY29ycmVjdF9tc2c9XCJEb24ndCBvbnZlcndyaXRlIHRoZSBwcmVkZWZpbmVkIHZhcmlhYmxlc1wiKVxuXG4jIENoZWNrcyBmb3IgYSByZWdleCBwYXR0ZXJuIGluIHRyaGUgb3V0cHV0XG4jIHRlc3Rfb3V0cHV0X3JlZ2V4KHBhdHRlcm4sZml4ZWQ9RiwgdGltZXM9MSwgaW5jb3JyZWN0X21zZz0nJylcblxuIyBDYW4gY2hlY2sgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gYWNyb3NzIGJvdGggc29sdXRpb24gYW5kIHN0dWRlbnQgY29kZVxuI3Rlc3RfZXhwcmVzc2lvbl9vdXRwdXQoXCJ0eXBlb2YoY29tcGFueV9uYW1lKVwiLCBpbmNvcnJlY3RfbXNnPVwiRGlkIHlvdSBzdG9yZSB0ZXh0dWFsIGRhdGEgaW4gYGNvbXBhbnlfbmFtZWA/XCIpXG5cbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJBd2Vzb21lIVwiKVxuXG4jIE90aGVyIGZ1bmN0aW9ucyB0byBub3RlOlxuIyAgICAgLSB0ZXN0X29yKGEsYikgLS0gY2hlY2tzIGlmIGVpdGhlciB0ZXN0IGEgb3IgdGVzdCBiIHBhc3NcbiMgICAgIC0gdGVzdF9nZ3Bsb3QoKSAtLSBjYW4gY2hlY2sgaWYgcGxvdHMgYXJlIGNvcnJlY3RcbiMgICAgIC0gdGVzdF9mdW5jdGlvbigpIC0tIGNhbiBhbHNvIGNoZWNrIGluY2x1ZGVkIHBhcmFtZXRlcnNcbiMgICAgIC0gdGVzdF9sb29wKCkgLS0gY2hlY2tpbmcgZm9yIGFuZCB3aGlsZSBsb29wc1xuIyAgICAgLSB0ZXN0X2xpYnJhcnlfZnVuY3Rpb24oJ3BhY2thZ2UnLCBub3RfY2FsbGVkX21zZz0nJyxpbmNvcnJlY3RfbXNnPScnKVxuIyAgICAgLSB0ZXN0X2lmX2Vsc2UoKSAtLSBjaGVja2luZyBpZiBzdGF0ZW1lbnRzXG4jICAgICAtIHRlc3RfZXhwcmVzc2lvbl9lcnJvcigpIC0tIGNhbiBjaGVjayBpZiBmdW5jdGlvbnMgYXJlIHByb3Blcmx5IGRlZmluZWRcbiMgICAgIC0gdGVzdF9vcGVyYXRvcignb3BlcmF0b3InLCksIG5vdF9jYWxsZWRfbXNnPScnLGluY29ycmVjdF9tc2c9JycpXG4jICAgICAtIHRlc3RfZnVuY3Rpb25fZGVmaW5pdGlvbigpIC0tIHJpZ29yb3VzbHkgY2hlY2sgZGVmaW5lZCBmdW5jdGlvblxuIyAgICAgLSB0ZXN0X2RhdGFfZnJhbWUoKSAtLSBjaGVjayBpZiBkYXRhZnJhbWUgW2NvbHVtbnNdIGFyZSBlcXVpdmFsZW50XG4jICAgICAtIHRlc3RfZnVuY3Rpb25fcmVzdWx0LCB0ZXN0X2V4cHJlc3Npb25fcmVzdWx0In0=