VmVyc2lvbiAzLjExCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQowMi8xNS8xOCAgYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBtaW5vciBidWdzIHJlbGF0ZWQgdG8gcmUgZmxhZ3MgYW5kIHRva2VuIG9yZGVyLiAgCiAgICAgICAgICBHaXRodWIgcHVsbCByZXF1ZXN0cyAjMTUxIGFuZCAjMTUzLgoKMDIvMTUvMTggIGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgc2V0X2xleHBvcygpIG1ldGhvZCB0byBncmFtbWFyIHN5bWJvbHMuICBHaXRodWIgaXNzdWUgIzE0OC4KCgowNC8xMy8xNyAgYmVhemxleQogICAgICAgICAgTW9zdGx5IG1pbm9yIGJ1ZyBmaXhlcyBhbmQgc21hbGwgY29kZSBjbGVhbnVwcy4KClZlcnNpb24gMy4xMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDEvMzEvMTc6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgZ3JhbW1hciBzaWduYXR1cmUgY29tcHV0YXRpb24gdG8gbm90IGludm9sdmUgaGFzaGluZwogICAgICAgICAgZnVuY3Rpb25zLiBQYXJ0cyBhcmUganVzdCBjb21iaW5lZCBpbnRvIGEgYmlnIHN0cmluZy4KCjEwLzA3LzE2OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBJc3N1ZSAjMTAxOiBJbmNvcnJlY3Qgc2hpZnQtcmVkdWNlIGNvbmZsaWN0IHJlc29sdXRpb24gd2l0aAogICAgICAgICAgcHJlY2VkZW5jZSBzcGVjaWZpZXIuCgogICAgICAgICAgUExZIHdhcyBpbmNvcnJlY3RseSByZXNvbHZpbmcgc2hpZnQtcmVkdWNlIGNvbmZsaWN0cyBpbiBjZXJ0YWluCiAgICAgICAgICBjYXNlcy4gIEZvciBleGFtcGxlLCBpbiB0aGUgZXhhbXBsZS9jYWxjL2NhbGMucHkgZXhhbXBsZSwgeW91IAogICAgICAgICAgY291bGQgdHJpZ2dlciBpdCBkb2luZyB0aGlzOgoKICAgICAgICAgIGNhbGMgPiAtMyAtIDQgICAgICAgICAgICAKICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgKGNvcnJlY3QgYW5zd2VyIHNob3VsZCBiZSAtNykKICAgICAgICAgIGNhbGMgPgoKICAgICAgICAgIElzc3VlIGFuZCBzdWdnZXN0ZWQgcGF0Y2ggY29udHJpYnV0ZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL1JvbWFWaXMKICAgICAgICAgICAKVmVyc2lvbiAzLjkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA4LzMwLzE2OiBiZWF6bGV5CiAgICAgICAgICBFeHBvc2VkIHRoZSBwYXJzZXIgc3RhdGUgbnVtYmVyIGFzIHRoZSBwYXJzZXIuc3RhdGUgYXR0cmlidXRlCiAgICAgICAgICBpbiBwcm9kdWN0aW9ucyBhbmQgZXJyb3IgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICBkZWYgcF9zb21lcnVsZShwKToKICAgICAgICAgICAgICAnJycKICAgICAgICAgICAgICBydWxlIDogQSBCIEMKICAgICAgICAgICAgICAnJycKICAgICAgICAgICAgICBwcmludCgnU3RhdGU6JywgcC5wYXJzZXIuc3RhdGUpCgogICAgICAgICAgTWF5IGFkZHJlc3MgaXNzdWUgIzY1IChwdWJsaXNoIGN1cnJlbnQgc3RhdGUgaW4gZXJyb3IgY2FsbGJhY2spLgoKMDgvMzAvMTY6IGJlYXpsZXkgCiAgICAgICAgICBGaXhlZCBJc3N1ZSAjODguIFB5dGhvbjMgY29tcGF0aWJpbGl0eSB3aXRoIHBseS9jcHAuCgowOC8zMC8xNjogYmVhemxleQogICAgICAgICAgRml4ZWQgSXNzdWUgIzkzLiBQbHkgY2FuIGNyYXNoIGlmIFN5bnRheEVycm9yIGlzIHJhaXNlZCBpbnNpZGUKICAgICAgICAgIGEgcHJvZHVjdGlvbi4gICBOb3QgYWN0dWFsbHkgc3VyZSBpZiB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24KICAgICAgICAgIHdvcmtlZCBhcyBkb2N1bWVudGVkIGF0IGFsbC4gIFlhY2MgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93CiAgICAgICAgICB0aGUgc3BlYyBhcyBvdXRsaW5lZCBpbiB0aGUgQ0hBTkdFUyBub3RlZCBmb3IgMTEvMjcvMDcgYmVsb3cuCgowOC8zMC8xNjogYmVhemxleQogICAgICAgICAgRml4ZWQgSXNzdWUgIzk3LiBGYWlsdXJlIHdpdGggY29kZSB2YWxpZGF0aW9uIHdoZW4gdGhlIG9yaWdpbmFsCiAgICAgICAgICBzb3VyY2UgZmlsZXMgYXJlbid0IHByZXNlbnQuICAgVmFsaWRhdGlvbiBzdGVwIG5vdyBpZ25vcmVzCiAgICAgICAgICB0aGUgbWlzc2luZyBmaWxlLgoKMDgvMzAvMTY6IGJlYXpsZXkKICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIHZlcnNpb24gbnVtYmVycy4KClZlcnNpb24gMy44Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoxMC8wMi8xNTogYmVhemxleQogICAgICAgICAgRml4ZWQgaXNzdWVzIHJlbGF0ZWQgdG8gUHl0aG9uIDMuNS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkgQmFycnkgV2Fyc2F3LgoKVmVyc2lvbiAzLjcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA4LzI1LzE1OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtcyB3aGVuIHJlYWRpbmcgdGFibGUgZmlsZXMgZnJvbSBwaWNrbGVkIGRhdGEuCgowNS8wNy8xNTogYmVhemxleQogICAgICAgICAgRml4ZWQgcmVncmVzc2lvbiBpbiBoYW5kbGluZyBvZiB0YWJsZSBtb2R1bGVzIGlmIHNwZWNpZmllZCBhcyBtb2R1bGUKICAgICAgICAgIG9iamVjdHMuICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYWJlYXovcGx5L2lzc3Vlcy82MwoKVmVyc2lvbiAzLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA0LzI1LzE1OiBiZWF6bGV5CiAgICAgICAgICBJZiBQTFkgaXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgJ3BhcnNlci5vdXQnIG9yICdwYXJzZXRhYi5weScgZmlsZXMgZHVlCiAgICAgICAgICB0byBwZXJtaXNzaW9uIGlzc3VlcywgaXQgbm93IGp1c3QgaXNzdWVzIGEgd2FybmluZyBtZXNzYWdlIGFuZAogICAgICAgICAgY29udGludWVzIHRvIG9wZXJhdGUuIFRoaXMgY291bGQgaGFwcGVuIGlmIGEgbW9kdWxlIHVzaW5nIFBMWQoJICBpcyBpbnN0YWxsZWQgaW4gYSBmdW5ueSB3YXkgd2hlcmUgdGFibGVzIGhhdmUgdG8gYmUgcmVnZW5lcmF0ZWQsIGJ1dAogICAgICAgICAgZm9yIHdoYXRldmVyIHJlYXNvbiwgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gb24KICAgICAgICAgIHRoZSBkaXJlY3Rvcnkgd2hlcmUgUExZIHdhbnRzIHRvIHB1dCB0aGVtLiAgCgowNC8yNC8xNTogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBpc3N1ZXMgcmVsYXRlZCB0byB1c2Ugb2YgcGFja2FnZXMgYW5kIHRhYmxlIGZpbGUKICAgICAgICAgIG1vZHVsZXMuICBKdXN0IHRvIGVtcGhhc2l6ZSwgUExZIG5vdyBnZW5lcmF0ZXMgaXRzIHNwZWNpYWwKICAgICAgICAgIGZpbGVzIHN1Y2ggYXMgJ3BhcnNldGFiLnB5JyBhbmQgJ2xleHRhYi5weScgaW4gdGhlICpTQU1FKgogICAgICAgICAgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UgZmlsZSB0aGF0IHVzZXMgbGV4KCkgYW5kIHlhY2MoKS4KCgkgIElmIGZvciBzb21lIHJlYXNvbiwgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB0YWJsZQogICAgICAgICAgbW9kdWxlLCB1c2UgdGhlIHRhYm1vZHVsZSBhbmQgbGV4dGFiIG9wdGlvbnM6CgogICAgICAgICAgICAgbGV4ZXIgPSBsZXgubGV4KGxleHRhYj0nc3BhbWxleHRhYicpCiAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPSdzcGFtcGFyc2V0YWInKQoKICAgICAgICAgIElmIHlvdSBzcGVjaWZ5IGEgc2ltcGxlIG5hbWUgYXMgc2hvd24sIHRoZSBtb2R1bGUgd2lsbCBzdGlsbCBiZQogICAgICAgICAgY3JlYXRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgaW52b2tpbmcgbGV4KCkgb3IgeWFjYygpLgogICAgICAgICAgSWYgeW91IHdhbnQgdGhlIHRhYmxlIGZpbGVzIHRvIGJlIHBsYWNlZCBpbnRvIGEgZGlmZmVyZW50IHBhY2thZ2UsCiAgICAgICAgICB0aGVuIGdpdmUgYSBmdWxseSBxdWFsaWZpZWQgcGFja2FnZSBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgbGV4ZXIgPSBsZXgubGV4KGxleHRhYj0ncGtnbmFtZS5maWxlcy5sZXh0YWInKQogICAgICAgICAgICAgcGFyc2VyID0geWFjYy55YWNjKHRhYm1vZHVsZT0ncGtnbmFtZS5maWxlcy5wYXJzZXRhYicpCgogICAgICAgICAgRm9yIHRoaXMgdG8gd29yaywgJ3BrZ25hbWUuZmlsZXMnIG11c3QgYWxyZWFkeSBleGlzdCBhcyBhIHZhbGlkIAogICAgICAgICAgUHl0aG9uIHBhY2thZ2UgKGkuZS4sIHRoZSBkaXJlY3RvcmllcyBtdXN0IGFscmVhZHkgZXhpc3QgYW5kIGJlCiAgICAgICAgICBzZXQgdXAgd2l0aCB0aGUgcHJvcGVyIF9faW5pdF9fLnB5IGZpbGVzLCBldGMuKS4KClZlcnNpb24gMy41Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQowNC8yMS8xNTogYmVhemxleQogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGVmYXVsdGVkX3N0YXRlcyBpbiB0aGUgcGFyc2VyLiAgQQogICAgICAgICAgZGVmYXVsdGVkX3N0YXRlIGlzIGEgc3RhdGUgd2hlcmUgdGhlIG9ubHkgbGVnYWwgYWN0aW9uIGlzIGEKICAgICAgICAgIHJlZHVjdGlvbiBvZiBhIHNpbmdsZSBncmFtbWFyIHJ1bGUgYWNyb3NzIGFsbCB2YWxpZCBpbnB1dAogICAgICAgICAgdG9rZW5zLiAgRm9yIHN1Y2ggc3RhdGVzLCB0aGUgcnVsZSBpcyByZWR1Y2VkIGFuZCB0aGUKICAgICAgICAgIHJlYWRpbmcgb2YgdGhlIG5leHQgbG9va2FoZWFkIHRva2VuIGlzIGRlbGF5ZWQgdW50aWwgaXQgaXMKICAgICAgICAgIGFjdHVhbGx5IG5lZWRlZCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuCgoJICBUaGlzIGRlbGF5IGluIGNvbnN1bWluZyB0aGUgbmV4dCBsb29rYWhlYWQgdG9rZW4gaXMgYQoJICBwb3RlbnRpYWxseSBpbXBvcnRhbnQgZmVhdHVyZSBpbiBhZHZhbmNlZCBwYXJzaW5nCgkgIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgdGlnaHQgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUKCSAgbGV4ZXIgYW5kIHRoZSBwYXJzZXIuICBGb3IgZXhhbXBsZSwgYSBncmFtbWFyIHJ1bGUgY2hhbmdlCgkgIG1vZGlmeSB0aGUgbGV4ZXIgc3RhdGUgdXBvbiByZWR1Y3Rpb24gYW5kIGhhdmUgc3VjaCBjaGFuZ2VzCgkgIHRha2UgZWZmZWN0IGJlZm9yZSB0aGUgbmV4dCBpbnB1dCB0b2tlbiBpcyByZWFkLgoKCSAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgIE9uZSBwb3RlbnRpYWwgZGFuZ2VyIG9mIGRlZmF1bHRlZF9zdGF0ZXMgaXMgdGhhdCBzeW50YXgKCSAgZXJyb3JzIG1pZ2h0IGJlIGRlZmVycmVkIHRvIGEgYSBsYXRlciBwb2ludCBvZiBwcm9jZXNzaW5nCgkgIHRoYW4gd2hlcmUgdGhleSB3ZXJlIGRldGVjdGVkIGluIHBhc3QgdmVyc2lvbnMgb2YgUExZLgoJICBUaHVzLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91ciBlcnJvciBoYW5kbGluZyBjb3VsZCBjaGFuZ2UKCSAgc2xpZ2h0bHkgb24gdGhlIHNhbWUgaW5wdXRzLiAgZGVmYXVsdGVkX3N0YXRlcyBkbyBub3QgY2hhbmdlCgkgIHRoZSBvdmVyYWxsIHBhcnNpbmcgb2YgdGhlIGlucHV0IChpLmUuLCB0aGUgc2FtZSBncmFtbWFyIGlzCgkgIGFjY2VwdGVkKS4KCgkgIElmIGZvciBzb21lIHJlYXNvbiwgeW91IG5lZWQgdG8gZGlzYWJsZSBkZWZhdWx0ZWQgc3RhdGVzLAoJICB5b3UgY2FuIGRvIHRoaXM6CgogICAgICAgICAgICAgIHBhcnNlciA9IHlhY2MueWFjYygpCiAgICAgICAgICAgICAgcGFyc2VyLmRlZmF1bHRlZF9zdGF0ZXMgPSB7fQoKMDQvMjEvMTU6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGRlYnVnIGxvZ2dpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHdhc24ndCBwcm9wZXJseSByZXBvcnRpbmcgZ290byBzdGF0ZXMKICAgICAgICAgIG9uIGdyYW1tYXIgcnVsZSByZWR1Y3Rpb25zLgoKMDQvMjAvMTU6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGFjdGlvbnMgdG8gYmUgZGVmaW5lZCB0byBjaGFyYWN0ZXIgbGl0ZXJhbHMgKElzc3VlICMzMikuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgbGl0ZXJhbHMgPSBbICd7JywgJ30nIF0KCiAgICAgICAgICAgICAgZGVmIHRfbGJyYWNlKHQpOgogICAgICAgICAgICAgICAgICByJ1x7JwogICAgICAgICAgICAgICAgICAjIFNvbWUgYWN0aW9uCiAgICAgICAgICAgICAgICAgIHQudHlwZSA9ICd7JwogICAgICAgICAgICAgICAgICByZXR1cm4gdAoKICAgICAgICAgICAgICBkZWYgdF9yYnJhY2UodCk6CiAgICAgICAgICAgICAgICAgIHInXH0nCiAgICAgICAgICAgICAgICAgICMgU29tZSBhY3Rpb24KICAgICAgICAgICAgICAgICAgdC50eXBlID0gJ30nCiAgICAgICAgICAgICAgICAgIHJldHVybiB0CgowNC8xOS8xNTogYmVhemxleQogICAgICAgICAgSW1wb3J0IG9mIHRoZSAncGFyc2V0YWIucHknIGZpbGUgaXMgbm93IGNvbnN0cmFpbmVkIHRvIG9ubHkgY29uc2lkZXIgdGhlCiAgICAgICAgICBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBvdXRwdXRkaXIgYXJndW1lbnQgdG8geWFjYygpLiAgSWYgbm90IHN1cHBsaWVkLAogICAgICAgICAgdGhlIGltcG9ydCB3aWxsIG9ubHkgY29uc2lkZXIgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZ3JhbW1hciBpcyBkZWZpbmVkLgogICAgICAgICAgVGhpcyBzaG91bGQgZ3JlYXRseSByZWR1Y2UgcHJvYmxlbXMgd2l0aCB0aGUgd3JvbmcgcGFyc2V0YWIucHkgZmlsZSBiZWluZwogICAgICAgICAgaW1wb3J0ZWQgYnkgbWlzdGFrZS4gRm9yIGV4YW1wbGUsIGlmIGl0J3MgZm91bmQgc29tZXdoZXJlIGVsc2Ugb24gdGhlIHBhdGgKICAgICAgICAgIGJ5IGFjY2lkZW50LgoKCSAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBtaWdodCBicmVhayBzb21lCiAgICAgICAgICBwYWNrYWdpbmcvZGVwbG95bWVudCBzZXR1cCBpZiBQTFkgd2FzIGluc3RydWN0ZWQgdG8gcGxhY2UgaXRzIHBhcnNldGFiLnB5CiAgICAgICAgICBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbi4gIFlvdSdsbCBoYXZlIHRvIHNwZWNpZnkgYSBwcm9wZXIgb3V0cHV0ZGlyPSBhcmd1bWVudAogICAgICAgICAgdG8geWFjYygpIHRvIGZpeCB0aGlzIGlmIG5lZWRlZC4KCjA0LzE5LzE1OiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byBiZSB0aGUgc2FtZSBhcyB0aGF0IGluIHdoaWNoIHRoZQogICAgICAgICAgeWFjYyBncmFtbWFyIGlzIGRlZmluZWQuICBJZiB5b3VyIGdyYW1tYXIgaXMgaW4gYSBmaWxlICdjYWxjLnB5JywKICAgICAgICAgIHRoZW4gdGhlIHBhcnNldGFiLnB5IGFuZCBwYXJzZXIub3V0IGZpbGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4gdGhlCiAgICAgICAgICBzYW1lIGRpcmVjdG9yeSBhcyB0aGF0IGZpbGUuICBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGNhbiBiZSBjaGFuZ2VkCiAgICAgICAgICB1c2luZyB0aGUgb3V0cHV0ZGlyPSBhcmd1bWVudCB0byB5YWNjKCkuCgowNC8xOS8xNTogYmVhemxleQogICAgICAgICAgQ2hhbmdlZCB0aGUgcGFyc2V0YWIucHkgZmlsZSBzaWduYXR1cmUgc2xpZ2h0bHkgc28gdGhhdCB0aGUgcGFyc2V0YWIgd29uJ3QKICAgICAgICAgIHJlZ2VuZXJhdGUgaWYgY3JlYXRlZCBvbiBhIGRpZmZlcmVudCBtYWpvciB2ZXJzaW9uIG9mIFB5dGhvbiAoaWUuLCBhIAogICAgICAgICAgcGFyc2V0YWIgY3JlYXRlZCBvbiBQeXRob24gMiB3aWxsIHdvcmsgd2l0aCBQeXRob24gMykuCgowNC8xNi8xNTogYmVhemxleQogICAgICAgICAgRml4ZWQgSXNzdWUgIzQ0IGNhbGxfZXJyb3JmdW5jKCkgc2hvdWxkIHJldHVybiB0aGUgcmVzdWx0IG9mIGVycm9yZnVuYygpCgowNC8xNi8xNTogYmVhemxleQogICAgICAgICAgU3VwcG9ydCBmb3IgdmVyc2lvbnMgb2YgUHl0aG9uIDwyLjcgaXMgb2ZmaWNpYWxseSBkcm9wcGVkLiAgUExZIG1heSB3b3JrLCBidXQKICAgICAgICAgIHRoZSB1bml0IHRlc3RzIHJlcXVpcmVzIFB5dGhvbiAyLjcgb3IgbmV3ZXIuCgowNC8xNi8xNTogYmVhemxleQogICAgICAgICAgRml4ZWQgYnVnIHJlbGF0ZWQgdG8gY2FsbGluZyB5YWNjKHN0YXJ0PS4uLikuICAgUExZIHdhc24ndCByZWdlbmVyYXRpbmcgdGhlCiAgICAgICAgICB0YWJsZSBmaWxlIGNvcnJlY3RseSBmb3IgdGhpcyBjYXNlLgoKMDQvMTYvMTU6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHNraXBwZWQgdGVzdHMgZm9yIFB5UHkgYW5kIEphdmEuICBSZWxhdGVkIHRvIHVzZSBvZiBQeXRob24ncyAtTyBvcHRpb24uCgowNS8yOS8xMzogYmVhemxleQogICAgICAgICAgQWRkZWQgZmlsdGVyIHRvIG1ha2UgdW5pdCB0ZXN0cyBwYXNzIHVuZGVyICdweXRob24gLTMnLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTmVpbCBNdWxsZXIuCiAgICAgICAKMDUvMjkvMTM6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIENQUF9JTlRFR0VSIHJlZ2V4IGluIHBseS9jcHAucHkgKElzc3VlIDIxKS4KCSAgUmVwb3J0ZWQgYnkgQHZicmF1bi4KIAowNS8yOS8xMzogYmVhemxleQogICAgICAgICAgRml4ZWQgeWFjYyB2YWxpZGF0aW9uIGJ1Z3Mgd2hlbiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKICAgICAgICAgIGlzIGJlaW5nIHVzZWQuICBSZXBvcnRlZCBieSBLZW5uIEtub3dsZXMuCgowNS8yOS8xMzogYmVhemxleQogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgVHJhdmlzLUNJLiAgQ29udHJpYnV0ZWQgYnkgS2VubiBLbm93bGVzLgoKMDUvMjkvMTM6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgLmdpdGlnbm9yZSBmaWxlLiAgU3VnZ2VzdGVkIGJ5IEtlbm4gS25vd2xlcy4KCjA1LzI5LzEzOiBiZWF6bGV5CgkgIEZpeGVkIHZhbGlkYXRpb24gcHJvYmxlbXMgZm9yIHNvdXJjZSBmaWxlcyB0aGF0IGluY2x1ZGUgYSAKICAgICAgICAgIGRpZmZlcmVudCBzb3VyY2UgY29kZSBlbmNvZGluZyBzcGVjaWZpZXIuICBGaXggcmVsaWVzIG9uCiAgICAgICAgICB0aGUgaW5zcGVjdCBtb2R1bGUuICBTaG91bGQgd29yayBvbiBQeXRob24gMi42IGFuZCBuZXdlci4KICAgICAgICAgIE5vdCBzdXJlIGFib3V0IG9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbi4KICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgRHJvZXR0Ym9vbQoKMDUvMjEvMTM6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHVuaXQgdGVzdHMgZm9yIHlhY2MgdG8gZWxpbWluYXRlIHJhbmRvbSBmYWlsdXJlcyBkdWUgdG8gZGljdCBoYXNoIHZhbHVlCgkgIHJhbmRvbWl6YXRpb24gaW4gUHl0aG9uIDMuMwoJICBSZXBvcnRlZCBieSBBcmZyZXZlcgoKMTAvMTUvMTI6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGNvbW1lbnQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nIGJ1Z3MgaW4gcGx5L2NwcC5weS4KICAgICAgICAgIFJlcG9ydGVkIGJ5IEFsZXhlaSBQb3Nvc2luLgoKMTAvMTUvMTI6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHRva2VuIG5hbWVzIGluIHBseS9jdG9rZW5zLnB5IHRvIG1hdGNoIHJ1bGUgbmFtZXMuCiAgICAgICAgICBSZXBvcnRlZCBieSBBbGV4ZWkgUG9zb3Npbi4KCjA0LzI2LzEyOiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VzIHRvIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gcGFuaWMgbW9kZSBlcnJvciByZWNvdmVyLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMKICAgICAgICAgIG9mIFBMWSwgdGhlIGZvbGxvd2luZyBnbG9iYWwgZnVuY3Rpb25zIHdlcmUgYXZhaWxhYmxlIGZvciB1c2UgaW4gdGhlIHBfZXJyb3IoKSBydWxlOgoKICAgICAgICAgICAgICAgICB5YWNjLmVycm9rKCkgICAgICAgIyBSZXNldCBlcnJvciBzdGF0ZQogICAgICAgICAgICAgICAgIHlhY2MudG9rZW4oKSAgICAgICAjIEdldCB0aGUgbmV4dCB0b2tlbgogICAgICAgICAgICAgICAgIHlhY2MucmVzdGFydCgpICAgICAjIFJlc2V0IHRoZSBwYXJzaW5nIHN0YWNrCgogICAgICAgICAgVGhlIHVzZSBvZiBnbG9iYWwgdmFyaWFibGVzIHdhcyBwcm9ibGVtYXRpYyBmb3IgY29kZSBpbnZvbHZpbmcgbXVsdGlwbGUgcGFyc2VycwogICAgICAgICAgYW5kIGZyYW5rbHkgd2FzIGEgcG9vciBkZXNpZ24gb3ZlcmFsbC4gICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIHRvIG1ldGhvZHMKICAgICAgICAgIG9mIHRoZSBwYXJzZXIgaW5zdGFuY2UgY3JlYXRlZCBieSB0aGUgeWFjYygpIGZ1bmN0aW9uLiAgIFlvdSBzaG91bGQgd3JpdGUgY29kZSBsaWtlCiAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgIGRlZiBwX2Vycm9yKHApOgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIHBhcnNlci5lcnJvaygpCgogICAgICAgICAgICAgICAgcGFyc2VyID0geWFjYy55YWNjKCkKCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFRoZSBvcmlnaW5hbCBnbG9iYWwgZnVuY3Rpb25zIG5vdyBpc3N1ZSBhCiAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcuCiAgICAgICAgIAowNC8xOS8xMjogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGxpbmUgYW5kIHBvc2l0aW9uIHRyYWNraW5nIGFuZCB0aGUgdXNlIG9mIGVycm9yCiAgICAgICAgICBzeW1ib2xzLiAgIElmIHlvdSBoYXZlIGEgZ3JhbW1hciBydWxlIGludm9sdmluZyBhbiBlcnJvciBydWxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGRlZiBwX2Fzc2lnbm1lbnRfYmFkKHApOgogICAgICAgICAgICAgICAgICAgJycnYXNzaWdubWVudCA6IGxvY2F0aW9uIEVRVUFMUyBlcnJvciBTRU1JJycnCiAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICBZb3UgY2FuIG5vdyBkbyBsaW5lIGFuZCBwb3NpdGlvbiB0cmFja2luZyBvbiB0aGUgZXJyb3IgdG9rZW4uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGRlZiBwX2Fzc2lnbm1lbnRfYmFkKHApOgogICAgICAgICAgICAgICAgICAgJycnYXNzaWdubWVudCA6IGxvY2F0aW9uIEVRVUFMUyBlcnJvciBTRU1JJycnCiAgICAgICAgICAgICAgICAgICBzdGFydF9saW5lID0gcC5saW5lbm8oMykKICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcyAgPSBwLmxleHBvcygzKQoKICAgICAgICAgIElmIHRoZSB0cmFja25nPVRydWUgb3B0aW9uIGlzIHN1cHBsaWVkIHRvIHBhcnNlKCksIHlvdSBjYW4gYWRkaXRpb25hbGx5IGdldAogICAgICAgICAgc3BhbnM6CgogICAgICAgICAgICAgICBkZWYgcF9hc3NpZ25tZW50X2JhZChwKToKICAgICAgICAgICAgICAgICAgICcnJ2Fzc2lnbm1lbnQgOiBsb2NhdGlvbiBFUVVBTFMgZXJyb3IgU0VNSScnJwogICAgICAgICAgICAgICAgICAgc3RhcnRfbGluZSwgZW5kX2xpbmUgPSBwLmxpbmVzcGFuKDMpCiAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsIGVuZF9wb3MgPSBwLmxleHNwYW4oMykKCiAgICAgICAgICBOb3RlIHRoYXQgZXJyb3IgaGFuZGxpbmcgaXMgc3RpbGwgYSBoYWlyeSB0aGluZyBpbiBQTFkuIFRoaXMgd29uJ3Qgd29yawogICAgICAgICAgdW5sZXNzIHlvdXIgbGV4ZXIgaXMgcHJvdmlkaW5nIGFjY3VyYXRlIGluZm9ybWF0aW9uLiAgIFBsZWFzZSByZXBvcnQgYnVncy4KICAgICAgICAgIFN1Z2dlc3RlZCBieSBhIGJ1ZyByZXBvcnRlZCBieSBEYXZpcyBIZXJyaW5nLgogICAgICAgICAgICAgIAowNC8xOC8xMjogYmVhemxleQogICAgICAgICAgQ2hhbmdlIHRvIGRvYyBzdHJpbmcgaGFuZGxpbmcgaW4gbGV4IG1vZHVsZS4gIFJlZ2V4IHBhdHRlcm5zIGFyZSBub3cgZmlyc3QKICAgICAgICAgIHB1bGxlZCBmcm9tIGEgZnVuY3Rpb24ncyAucmVnZXggYXR0cmlidXRlLiAgSWYgdGhhdCBkb2Vzbid0IGV4aXN0LCB0aGVuCgkgIC5kb2MgaXMgY2hlY2tlZCBhcyBhIGZhbGxiYWNrLiAgIFRoZSBAVE9LRU4gZGVjb3JhdG9yIG5vdyBzZXRzIHRoZSAucmVnZXgKCSAgYXR0cmlidXRlIG9mIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBpdHMgZG9jIHN0cmluZy4KCSAgQ2hhbmdlZCBzdWdnZXN0ZWQgYnkgS3Jpc3RvZmZlciBFbGxlcnNnYWFyZCBLb2NoLgoKMDQvMTgvMTI6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGlzc3VlICMxOiBGaXhlZCBfdGFidmVyc2lvbi4gSXQgc2hvdWxkIHVzZSBfX3RhYnZlcnNpb25fXyBpbnN0ZWFkIG9mIF9fdmVyc2lvbl9fCiAgICAgICAgICBSZXBvcnRlZCBieSBEYW5pZWxlIFRyaWNvbGkKCjA0LzE4LzEyOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBpc3N1ZSAjODogTGl0ZXJhbHMgZW1wdHkgbGlzdCBjYXVzZXMgSW5kZXhFcnJvcgogICAgICAgICAgUmVwb3J0ZWQgYnkgV2FsdGVyIE5pc3Nlbi4KCjA0LzE4LzEyOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBpc3N1ZSAjMTI6IFR5cG8gaW4gY29kZSBzbmlwcGV0IGluIGRvY3VtZW50YXRpb24KICAgICAgICAgIFJlcG9ydGVkIGJ5IGZsb3JpYW5zY2hhbmRhLgoKMDQvMTgvMTI6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGlzc3VlICMxMDogQ29ycmVjdGx5IGVzY2FwZSB0X1hPUkVRVUFMIHBhdHRlcm4uCiAgICAgICAgICBSZXBvcnRlZCBieSBBbmR5IEtpdHRuZXIuCgpWZXJzaW9uIDMuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDIvMTcvMTE6IGJlYXpsZXkKICAgICAgICAgIE1pbm9yIHBhdGNoIHRvIG1ha2UgY3BwLnB5IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMy4gIE5vdGU6IFRoaXMKICAgICAgICAgIGlzIGFuIGV4cGVyaW1lbnRhbCBmaWxlIG5vdCBjdXJyZW50bHkgdXNlZCBieSB0aGUgcmVzdCBvZiBQTFkuCgowMi8xNy8xMTogYmVhemxleQogICAgICAgICAgRml4ZWQgc2V0dXAucHkgdHJvdmUgY2xhc3NpZmllcnMgdG8gcHJvcGVybHkgbGlzdCBQTFkgYXMKICAgICAgICAgIFB5dGhvbiAzIGNvbXBhdGlibGUuCgowMS8wMi8xMTogYmVhemxleQogICAgICAgICAgTWlncmF0aW9uIG9mIHJlcG9zaXRvcnkgdG8gZ2l0aHViLgoKVmVyc2lvbiAzLjMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDgvMjUvMDk6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGlzc3VlIDE1IHJlbGF0ZWQgdG8gdGhlIHNldF9saW5lbm8oKSBtZXRob2QgaW4geWFjYy4gIFJlcG9ydGVkIGJ5CgkgIG1kc2hlcnJ5LgoKMDgvMjUvMDk6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gcmVndWxhciBleHByZXNzaW9uIGNvbXBpbGF0aW9uIGZsYWdzIG5vdCBiZWluZwogICAgICAgICAgcHJvcGVybHkgc3RvcmVkIGluIGxleHRhYi5weSBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBsZXhlciB3aGVuIHJ1bm5pbmcKICAgICAgICAgIGluIG9wdGltaXplIG1vZGUuICBSZXBvcnRlZCBieSBCcnVjZSBGcmVkZXJpa3Nlbi4KCgpWZXJzaW9uIDMuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQowMy8yNC8wOTogYmVhemxleQogICAgICAgICAgQWRkZWQgYW4gZXh0cmEgY2hlY2sgdG8gbm90IHByaW50IGR1cGxpY2F0ZWQgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgYWJvdXQgcmVkdWNlL3JlZHVjZSBjb25mbGljdHMuCgowMy8yNC8wOTogYmVhemxleQogICAgICAgICAgU3dpdGNoZWQgUExZIG92ZXIgdG8gYSBCU0QtbGljZW5zZS4KCjAzLzIzLzA5OiBiZWF6bGV5CiAgICAgICAgICBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBEaXNjb3ZlcmVkIGEgZmV3IHBsYWNlcyB0byBtYWtlCiAgICAgICAgICBzcGVlZHVwcyBpbiBMUiB0YWJsZSBnZW5lcmF0aW9uLgoKMDMvMjMvMDk6IGJlYXpsZXkKICAgICAgICAgIE5ldyB3YXJuaW5nIG1lc3NhZ2UuICBQTFkgbm93IHdhcm5zIGFib3V0IHJ1bGVzIG5ldmVyIAogICAgICAgICAgcmVkdWNlZCBkdWUgdG8gcmVkdWNlL3JlZHVjZSBjb25mbGljdHMuICBTdWdnZXN0ZWQgYnkKICAgICAgICAgIEJydWNlIEZyZWRlcmlrc2VuLgoKMDMvMjMvMDk6IGJlYXpsZXkKICAgICAgICAgIFNvbWUgY2xlYW4tdXAgb2Ygd2FybmluZyBtZXNzYWdlcyByZWxhdGVkIHRvIHJlZHVjZS9yZWR1Y2UgZXJyb3JzLgoKMDMvMjMvMDk6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgbmV3IHBpY2tsZWZpbGUgb3B0aW9uIHRvIHlhY2MoKSB0byB3cml0ZSB0aGUgcGFyc2luZwogICAgICAgICAgdGFibGVzIHRvIGEgZmlsZW5hbWUgdXNpbmcgdGhlIHBpY2tsZSBtb2R1bGUuICAgSGVyZSBpcyBob3cKICAgICAgICAgIGl0IHdvcmtzOgoKICAgICAgICAgICAgICB5YWNjKHBpY2tsZWZpbGU9InBhcnNldGFiLnAiKQoKICAgICAgICAgIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIGlmIHRoZSBub3JtYWwgcGFyc2V0YWIucHkgZmlsZSBpcwogICAgICAgICAgZXh0cmVtZWx5IGxhcmdlLiAgRm9yIGV4YW1wbGUsIG9uIGp5dGhvbiwgaXQgaXMgaW1wb3NzaWJsZQogICAgICAgICAgdG8gcmVhZCBwYXJzaW5nIHRhYmxlcyBpZiB0aGUgcGFyc2V0YWIucHkgZXhjZWVkcyBhIGNlcnRhaW4KICAgICAgICAgIHRocmVzaG9sZC4KCiAgICAgICAgICBUaGUgZmlsZW5hbWUgc3VwcGxpZWQgdG8gdGhlIHBpY2tsZWZpbGUgb3B0aW9uIGlzIG9wZW5lZAogICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIFB5dGhvbiAKICAgICAgICAgIGludGVycHJldGVyLiAgSWYgeW91IG5lZWQgdG8gcmVmZXIgdG8gdGhlIGZpbGUgZWxzZXdoZXJlLAogICAgICAgICAgeW91IHdpbGwgbmVlZCB0byBzdXBwbHkgYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aC4KCiAgICAgICAgICBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgdGhlIHBpY2tsZSBmaWxlIGlzIHdyaXR0ZW4KICAgICAgICAgIHVzaW5nIHByb3RvY29sIDAuIAogCjAzLzEzLzA5OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiBwYXJzZXIub3V0IGdlbmVyYXRpb24gd2hlcmUgdGhlIHJ1bGUgbnVtYmVycwogICAgICAgICAgd2hlcmUgb2ZmIGJ5IG9uZS4KCjAzLzEzLzA5OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIHN0cmluZyBmb3JtYXR0aW5nIGJ1ZyB3aXRoIG9uZSBvZiB0aGUgZXJyb3IgbWVzc2FnZXMuCiAgICAgICAgICBSZXBvcnRlZCBieSBSaWNoYXJkIFJlaXRtZXllcgoKVmVyc2lvbiAzLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDIvMjgvMDk6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGJyb2tlbiBzdGFydCBhcmd1bWVudCB0byB5YWNjKCkuICBQTFktMy4wIGJyb2tlIHRoaXMKICAgICAgICAgIGZlYXR1cmUgYnkgYWNjaWRlbnQuCgowMi8yOC8wOTogYmVhemxleQogICAgICAgICAgRml4ZWQgZGVidWdnaW5nIG91dHB1dC4geWFjYygpIG5vIGxvbmdlciByZXBvcnRzIHNoaWZ0L3JlZHVjZQogICAgICAgICAgb3IgcmVkdWNlL3JlZHVjZSBjb25mbGljdHMgaWYgZGVidWdnaW5nIGlzIHR1cm5lZCBvZmYuICBUaGlzCiAgICAgICAgICByZXN0b3JlcyBzaW1pbGFyIGJlaGF2aW9yIGluIFBMWS0yLjUuICAgUmVwb3J0ZWQgYnkgQW5kcmV3IFdhdGVycy4KClZlcnNpb24gMy4wCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjAyLzAzLzA5OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBtaXNzaW5nIGxleGVyIGF0dHJpYnV0ZSBvbiBjZXJ0YWluIHRva2VucyB3aGVuCiAgICAgICAgICBpbnZva2luZyB0aGUgcGFyc2VyIHBfZXJyb3IoKSBmdW5jdGlvbi4gIFJlcG9ydGVkIGJ5IAogICAgICAgICAgQmFydCBXaGl0ZWxleS4KCjAyLzAyLzA5OiBiZWF6bGV5CiAgICAgICAgICBUaGUgbGV4KCkgY29tbWFuZCBub3cgZG9lcyBhbGwgZXJyb3ItcmVwb3J0aW5nIGFuZCBkaWFnb25pc3RpY3MKICAgICAgICAgIHVzaW5nIHRoZSBsb2dnaW5nIG1vZHVsZSBpbnRlcmZhY2UuICAgUGFzcyBpbiBhIExvZ2dlciBvYmplY3QKICAgICAgICAgIHVzaW5nIHRoZSBlcnJvcmxvZyBwYXJhbWV0ZXIgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBsb2dnZXIuCgowMi8wMi8wOTogYmVhemxleQogICAgICAgICAgUmVmYWN0b3JlZCBwbHkubGV4IHRvIHVzZSBhIG1vcmUgb2JqZWN0LW9yaWVudGVkIGFuZCBvcmdhbml6ZWQKICAgICAgICAgIGFwcHJvYWNoIHRvIGNvbGxlY3RpbmcgbGV4ZXIgaW5mb3JtYXRpb24uCgowMi8wMS8wOTogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbm93YXJuIG9wdGlvbiBmcm9tIGxleCgpLiAgQWxsIG91dHB1dCBpcyBjb250cm9sbGVkCiAgICAgICAgICBieSBwYXNzaW5nIGluIGEgbG9nZ2VyIG9iamVjdC4gICBKdXN0IHBhc3MgaW4gYSBsb2dnZXIgd2l0aCBhIGhpZ2gKICAgICAgICAgIGxldmVsIHNldHRpbmcgdG8gc3VwcHJlc3Mgb3V0cHV0LiAgIFRoaXMgYXJndW1lbnQgd2FzIG5ldmVyIAogICAgICAgICAgZG9jdW1lbnRlZCB0byBiZWdpbiB3aXRoIHNvIGhvcGVmdWxseSBubyBvbmUgd2FzIHJlbHlpbmcgdXBvbiBpdC4KCjAyLzAxLzA5OiBiZWF6bGV5CiAgICAgICAgICBEaXNjb3ZlcmVkIGFuZCByZW1vdmVkIGEgZGVhZCBpZi1zdGF0ZW1lbnQgaW4gdGhlIGxleGVyLiAgVGhpcwogICAgICAgICAgcmVzdWx0ZWQgaW4gYSA2LTclIHNwZWVkdXAgaW4gbGV4aW5nIHdoZW4gSSB0ZXN0ZWQgaXQuCgowMS8xMy8wOTogYmVhemxleQogICAgICAgICAgTWlub3IgY2hhbmdlIHRvIHRoZSBwcm9jZWR1cmUgZm9yIHNpZ25hbGxpbmcgYSBzeW50YXggZXJyb3IgaW4gYQogICAgICAgICAgcHJvZHVjdGlvbiBydWxlLiAgQSBub3JtYWwgU3ludGF4RXJyb3IgZXhjZXB0aW9uIHNob3VsZCBiZSByYWlzZWQKICAgICAgICAgIGluc3RlYWQgb2YgeWFjYy5TeW50YXhFcnJvci4KCjAxLzEzLzA5OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBhIG5ldyBtZXRob2QgcC5zZXRfbGluZW5vKG4sbGluZW5vKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldCB0aGUKICAgICAgICAgIGxpbmUgbnVtYmVyIG9mIHN5bWJvbCBuIGluIGdyYW1tYXIgcnVsZXMuICAgVGhpcyBzaW1wbGlmaWVzIG1hbnVhbAogICAgICAgICAgdHJhY2tpbmcgb2YgbGluZSBudW1iZXJzLgoKMDEvMTEvMDk6IGJlYXpsZXkKICAgICAgICAgIFZhc3RseSBpbXByb3ZlZCBkZWJ1Z2dpbmcgc3VwcG9ydCBmb3IgeWFjYy5wYXJzZSgpLiAgIEluc3RlYWQgb2YgcGFzc2luZwogICAgICAgICAgZGVidWcgYXMgYW4gaW50ZWdlciwgeW91IGNhbiBzdXBwbHkgYSBMb2dnaW5nIG9iamVjdCAoc2VlIHRoZSBsb2dnaW5nCiAgICAgICAgICBtb2R1bGUpLiBNZXNzYWdlcyB3aWxsIGJlIGdlbmVyYXRlZCBhdCB0aGUgRVJST1IsIElORk8sIGFuZCBERUJVRwoJICBsb2dnaW5nIGxldmVscywgZWFjaCBsZXZlbCBwcm92aWRpbmcgcHJvZ3Jlc3NpdmVseSBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgVGhlIGRlYnVnZ2luZyB0cmFjZSBhbHNvIHNob3dzIHN0YXRlcywgZ3JhbW1hciBydWxlLCB2YWx1ZXMgcGFzc2VkCiAgICAgICAgICBpbnRvIGdyYW1tYXIgcnVsZXMsIGFuZCB0aGUgcmVzdWx0IG9mIGVhY2ggcmVkdWN0aW9uLgoKMDEvMDkvMDk6IGJlYXpsZXkKICAgICAgICAgIFRoZSB5YWNjKCkgY29tbWFuZCBub3cgZG9lcyBhbGwgZXJyb3ItcmVwb3J0aW5nIGFuZCBkaWFnbm9zdGljcyB1c2luZwogICAgICAgICAgdGhlIGludGVyZmFjZSBvZiB0aGUgbG9nZ2luZyBtb2R1bGUuICBVc2UgdGhlIGVycm9ybG9nIHBhcmFtZXRlciB0bwogICAgICAgICAgc3BlY2lmeSBhIGxvZ2dpbmcgb2JqZWN0IGZvciBlcnJvciBtZXNzYWdlcy4gIFVzZSB0aGUgZGVidWdsb2cgcGFyYW1ldGVyCiAgICAgICAgICB0byBzcGVjaWZ5IGEgbG9nZ2luZyBvYmplY3QgZm9yIHRoZSAncGFyc2VyLm91dCcgb3V0cHV0LgoKMDEvMDkvMDk6IGJlYXpsZXkKICAgICAgICAgICpIVUdFKiByZWZhY3RvcmluZyBvZiB0aGUgdGhlIHBseS55YWNjKCkgaW1wbGVtZW50YXRpb24uICAgVGhlIGhpZ2gtbGV2ZWwKCSAgdXNlciBpbnRlcmZhY2UgaXMgYmFja3dhcmRzIGNvbXBhdGlibGUsIGJ1dCB0aGUgaW50ZXJuYWxzIGFyZSBjb21wbGV0ZWx5CiAgICAgICAgICByZW9yZ2FuaXplZCBpbnRvIGNsYXNzZXMuICBObyBtb3JlIGdsb2JhbCB2YXJpYWJsZXMuICAgIFRoZSBpbnRlcm5hbHMKICAgICAgICAgIGFyZSBhbHNvIG1vcmUgZXh0ZW5zaWJsZS4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB0aGUgY2xhc3NlcyB0byAKICAgICAgICAgIGNvbnN0cnVjdCBhIExBTFIoMSkgcGFyc2VyIGluIGFuIGVudGlyZWx5IGRpZmZlcmVudCBtYW5uZXIgdGhhbiAKICAgICAgICAgIHdoYXQgaXMgY3VycmVudGx5IHRoZSBjYXNlLiAgRG9jdW1lbnRhdGlvbiBpcyBmb3J0aGNvbWluZy4KCjAxLzA3LzA5OiBiZWF6bGV5CiAgICAgICAgICBWYXJpb3VzIGNsZWFudXAgYW5kIHJlZmFjdG9yaW5nIG9mIHlhY2MgaW50ZXJuYWxzLiAgCgowMS8wNi8wOTogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBwcmVjZWRlbmNlIGFzc2lnbm1lbnQuICB5YWNjIHdhcyBhc3NpZ25pbmcgdGhlIHByZWNlZGVuY2UKICAgICAgICAgIGVhY2ggcnVsZSBiYXNlZCBvbiB0aGUgbGVmdC1tb3N0IHRva2VuLCB3aGVuIGluIGZhY3QsIGl0IHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgIHVzaW5nIHRoZSByaWdodC1tb3N0IHRva2VuLiAgUmVwb3J0ZWQgYnkgQnJ1Y2UgRnJlZGVyaWtzZW4uCgoxMS8yNy8wODogYmVhemxleQogICAgICAgICAgTnVtZXJvdXMgY2hhbmdlcyB0byBzdXBwb3J0IFB5dGhvbiAzLjAgaW5jbHVkaW5nIHJlbW92YWwgb2YgZGVwcmVjYXRlZCAKICAgICAgICAgIHN0YXRlbWVudHMgKGUuZy4sIGhhc19rZXkpIGFuZCB0aGUgYWRkaXRpb25hbCBvZiBjb21wYXRpYmlsaXR5IGNvZGUKICAgICAgICAgIHRvIGVtdWxhdGUgZmVhdHVyZXMgZnJvbSBQeXRob24gMiB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLCBidXQgd2hpY2gKICAgICAgICAgIGFyZSBuZWVkZWQuICAgRml4ZWQgdGhlIHVuaXQgdGVzdGluZyBzdWl0ZSB0byB3b3JrIHdpdGggUHl0aG9uIDMuMC4KICAgICAgICAgIFRoZSBjb2RlIHNob3VsZCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLgoKMTEvMjYvMDg6IGJlYXpsZXkKICAgICAgICAgIExvb3NlbmVkIHRoZSBydWxlcyBvbiB3aGF0IGtpbmQgb2Ygb2JqZWN0cyBjYW4gYmUgcGFzc2VkIGluIGFzIHRoZQogICAgICAgICAgIm1vZHVsZSIgcGFyYW1ldGVyIHRvIGxleCgpIGFuZCB5YWNjKCkuICBQcmV2aW91c2x5LCB5b3UgY291bGQgb25seSB1c2UKICAgICAgICAgIGEgbW9kdWxlIG9yIGFuIGluc3RhbmNlLiAgTm93LCBQTFkganVzdCB1c2VzIGRpcigpIHRvIGdldCBhIGxpc3Qgb2YKICAgICAgICAgIHN5bWJvbHMgb24gd2hhdGV2ZXIgdGhlIG9iamVjdCBpcyB3aXRob3V0IHJlZ2FyZCBmb3IgaXRzIHR5cGUuCgoxMS8yNi8wODogYmVhemxleQogICAgICAgICAgQ2hhbmdlZCBhbGwgZXhjZXB0OiBzdGF0ZW1lbnRzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBQeXRob24yLngvMy54IHN5bnRheC4KCjExLzI2LzA4OiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIGFsbCByYWlzZSBFeGNlcHRpb24sIHZhbHVlIHN0YXRlbWVudHMgdG8gcmFpc2UgRXhjZXB0aW9uKHZhbHVlKSBmb3IKICAgICAgICAgIGZvcndhcmQgY29tcGF0aWJpbGl0eS4KCjExLzI2LzA4OiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIGFsbCBwcmludCBzdGF0ZW1lbnRzIGZyb20gbGV4IGFuZCB5YWNjLCB1c2luZyBzeXMuc3Rkb3V0IGFuZCBzeXMuc3RkZXJyCiAgICAgICAgICBkaXJlY3RseS4gIFByZXBhcmF0aW9uIGZvciBQeXRob24gMy4wIHN1cHBvcnQuCgoxMS8wNC8wODogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCByZWZlcnJpbmcgdG8gc3ltYm9scyBvbiB0aGUgdGhlIHBhcnNpbmcgc3RhY2sgdXNpbmcgbmVnYXRpdmUKICAgICAgICAgIGluZGljZXMuCgowNS8yOS8wODogYmVhemxleQogICAgICAgICAgQ29tcGxldGVseSByZXZhbXBlZCB0aGUgdGVzdGluZyBzeXN0ZW0gdG8gdXNlIHRoZSB1bml0dGVzdCBtb2R1bGUgZm9yIGV2ZXJ5dGhpbmcuCiAgICAgICAgICBBZGRlZCBhZGRpdGlvbmFsIHRlc3RzIHRvIGNvdmVyIG5ldyBlcnJvcnMvd2FybmluZ3MuCgpWZXJzaW9uIDIuNQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQowNS8yOC8wODogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCB3cml0aW5nIGxleC10YWJsZXMgaW4gb3B0aW1pemVkIG1vZGUgYW5kIHN0YXJ0IHN0YXRlcy4KICAgICAgICAgIFJlcG9ydGVkIGJ5IEtldmluIEhlbnJ5LgoKVmVyc2lvbiAyLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDUvMDQvMDg6IGJlYXpsZXkKICAgICAgICAgIEEgdmVyc2lvbiBudW1iZXIgaXMgbm93IGVtYmVkZGVkIGluIHRoZSB0YWJsZSBmaWxlIHNpZ25hdHVyZSBzbyB0aGF0IAogICAgICAgICAgeWFjYyBjYW4gbW9yZSBncmFjZWZ1bGx5IGFjY29tb2RhdGUgY2hhbmdlcyB0byB0aGUgb3V0cHV0IGZvcm1hdAogICAgICAgICAgaW4gdGhlIGZ1dHVyZS4KCjA1LzA0LzA4OiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHVuZG9jdW1lbnRlZCAucHVzaGJhY2soKSBtZXRob2Qgb24gZ3JhbW1hciBwcm9kdWN0aW9ucy4gIEknbQogICAgICAgICAgbm90IHN1cmUgdGhpcyBldmVyIHdvcmtlZCBhbmQgY2FuJ3QgcmVjYWxsIGV2ZXIgdXNpbmcgaXQuICBNaWdodCBoYXZlCiAgICAgICAgICBiZWVuIGFuIGFiYW5kb25lZCBpZGVhIHRoYXQgbmV2ZXIgcmVhbGx5IGdvdCBmbGVzaGVkIG91dC4gIFRoaXMKICAgICAgICAgIGZlYXR1cmUgd2FzIG5ldmVyIGRlc2NyaWJlZCBvciB0ZXN0ZWQgc28gcmVtb3ZpbmcgaXQgaXMgaG9wZWZ1bGx5CiAgICAgICAgICBoYXJtbGVzcy4KCjA1LzA0LzA4OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBleHRyYSBlcnJvciBjaGVja2luZyB0byB5YWNjKCkgdG8gZGV0ZWN0IHByZWNlZGVuY2UgcnVsZXMgZGVmaW5lZAogICAgICAgICAgZm9yIHVuZGVmaW5lZCB0ZXJtaW5hbCBzeW1ib2xzLiAgIFRoaXMgYWxsb3dzIHlhY2MoKSB0byBkZXRlY3QgYSBwb3RlbnRpYWwKICAgICAgICAgIHByb2JsZW0gdGhhdCBjYW4gYmUgcmVhbGx5IHRyaWNreSB0byBkZWJ1ZyBpZiBubyB3YXJuaW5nIG1lc3NhZ2Ugb3IgZXJyb3IKICAgICAgICAgIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGFib3V0IGl0LgoKMDUvMDQvMDg6IGJlYXpsZXkKICAgICAgICAgIGxleCgpIG5vdyBoYXMgYW4gb3V0cHV0ZGlyIHRoYXQgY2FuIHNwZWNpZnkgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yCiAgICAgICAgICB0YWJsZXMgd2hlbiBydW5uaW5nIGluIG9wdGltaXplIG1vZGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBsZXhlciA9IGxleC5sZXgob3B0aW1pemU9VHJ1ZSwgbGV4dGFiPSJsdGFiIiwgb3V0cHV0ZGlyPSJmb28vYmFyIikKIAogICAgICAgICAgVGhlIGJlaGF2aW9yIG9mIHNwZWNpZnlpbmcgYSB0YWJsZSBtb2R1bGUgYW5kIG91dHB1dCBkaXJlY3RvcnkgYXJlCiAgICAgICAgICBtb3JlIGFsaWduZWQgd2l0aCB0aGUgYmVoYXZpb3Igb2YgeWFjYygpLgogICAgICAgICAgCjA1LzA0LzA4OiBiZWF6bGV5CiAgICAgICAgICBbSXNzdWUgOV0KICAgICAgICAgIEZpeGVkIGZpbGVuYW1lIGJ1ZyBpbiB3aGVuIHNwZWNpZnlpbmcgdGhlIG1vZHVsZW5hbWUgaW4gbGV4KCkgYW5kIHlhY2MoKS4gCiAgICAgICAgICBJZiB5b3Ugc3BlY2lmaWVkIG9wdGlvbnMgc3VjaCBhcyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgIHBhcnNlciA9IHlhY2MueWFjYyh0YWJtb2R1bGU9ImZvby5iYXIucGFyc2V0YWIiLG91dHB1dGRpcj0iZm9vL2JhciIpCgogICAgICAgICAgeWFjYyB3b3VsZCBjcmVhdGUgYSBmaWxlICJmb28uYmFyLnBhcnNldGFiLnB5IiBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogICAgICAgICAgTm93LCBpdCBzaW1wbHkgZ2VuZXJhdGVzIGEgZmlsZSAicGFyc2V0YWIucHkiIGluIHRoYXQgZGlyZWN0b3J5LiAKICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBjcHRiaW5oby4KCjA1LzA0LzA4OiBiZWF6bGV5CiAgICAgICAgICBTbGlnaHQgbW9kaWZpY2F0aW9uIHRvIGxleCgpIGFuZCB5YWNjKCkgdG8gYWxsb3cgdGhlaXIgdGFibGUgZmlsZXMKCSAgdG8gYmUgbG9hZGVkIGZyb20gYSBwcmV2aW91c2x5IGxvYWRlZCBtb2R1bGUuICAgVGhpcyBtaWdodCBtYWtlCgkgIGl0IGVhc2llciB0byBsb2FkIHRoZSBwYXJzaW5nIHRhYmxlcyBmcm9tIGEgY29tcGxpY2F0ZWQgcGFja2FnZQogICAgICAgICAgc3RydWN0dXJlLiAgRm9yIGV4YW1wbGU6CgoJICAgICAgIGltcG9ydCBmb28uYmFyLnNwYW0ucGFyc2V0YWIgYXMgcGFyc2V0YWIKICAgICAgICAgICAgICAgcGFyc2VyID0geWFjYy55YWNjKHRhYm1vZHVsZT1wYXJzZXRhYikKCiAgICAgICAgICBOb3RlOiAgbGV4IGFuZCB5YWNjIHdpbGwgbmV2ZXIgcmVnZW5lcmF0ZSB0aGUgdGFibGUgZmlsZSBpZiB1c2VkCiAgICAgICAgICBpbiB0aGUgZm9ybS0tLXlvdSB3aWxsIGdldCBhIHdhcm5pbmcgbWVzc2FnZSBpbnN0ZWFkLiAKICAgICAgICAgIFRoaXMgaWRlYSBzdWdnZXN0ZWQgYnkgQnJpYW4gQ2xhcHBlci4KCgowNC8yOC8wODogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBiaWcgd2l0aCBwX2Vycm9yKCkgZnVuY3Rpb25zIGJlaW5nIHBpY2tlZCB1cCBjb3JyZWN0bHkKICAgICAgICAgIHdoZW4gcnVubmluZyBpbiB5YWNjKG9wdGltaXplPTEpIG1vZGUuICBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgQmFydCBXaGl0ZWxleS4KCjAyLzI4LzA4OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoICdub25hc3NvYycgcHJlY2VkZW5jZSBydWxlcy4gICBCYXNpY2FsbHkgdGhlCiAgICAgICAgICBub24tcHJlY2VkZW5jZSB3YXMgYmVpbmcgaWdub3JlZCBhbmQgbm90IHByb2R1Y2luZyB0aGUgY29ycmVjdAogICAgICAgICAgcnVuLXRpbWUgYmVoYXZpb3IgaW4gdGhlIHBhcnNlci4KCjAyLzE2LzA4OiBiZWF6bGV5CiAgICAgICAgICBTbGlnaHQgcmVsYXhhdGlvbiBvZiB3aGF0IHRoZSBpbnB1dCgpIG1ldGhvZCB0byBhIGxleGVyIHdpbGwKICAgICAgICAgIGFjY2VwdCBhcyBhIHN0cmluZy4gICBJbnN0ZWFkIG9mIHRlc3RpbmcgdGhlIGlucHV0IHRvIHNlZQogICAgICAgICAgaWYgdGhlIGlucHV0IGlzIGEgc3RyaW5nIG9yIHVuaWNvZGUgc3RyaW5nLCBpdCBjaGVja3MgdG8gc2VlCiAgICAgICAgICBpZiB0aGUgaW5wdXQgb2JqZWN0IGxvb2tzIGxpa2UgaXQgY29udGFpbnMgc3RyaW5nIGRhdGEuCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYWtlcyBpdCBwb3NzaWJsZSB0byBwYXNzIHN0cmluZy1saWtlIG9iamVjdHMKICAgICAgICAgIGluIGFzIGlucHV0LiAgRm9yIGV4YW1wbGUsIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgbW1hcC4KCiAgICAgICAgICAgICAgaW1wb3J0IG1tYXAsIG9zCiAgICAgICAgICAgICAgZGF0YSA9IG1tYXAubW1hcChvcy5vcGVuKGZpbGVuYW1lLG9zLk9fUkRPTkxZKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZ2V0c2l6ZShmaWxlbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKICAgICAgICAgICAgICBsZXhlci5pbnB1dChkYXRhKQogICAgICAgICAgIAoKMTEvMjkvMDc6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWNhdGlvbiBvZiBwbHkubGV4IHRvIGFsbG93IHRva2VuIGZ1bmN0aW9ucyB0byBhbGlhc2VkLgogICAgICAgICAgVGhpcyBpcyBzdWJ0bGUsIGJ1dCBpdCBtYWtlcyBpdCBlYXNpZXIgdG8gY3JlYXRlIGxpYnJhcmllcyBhbmQKICAgICAgICAgIHRvIHJldXNlIHRva2VuIHNwZWNpZmljYXRpb25zLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGRlZmluZWQKICAgICAgICAgIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgZGVmIG51bWJlcih0KToKICAgICAgICAgICAgICAgICAgICByJ1xkKycKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQKCiAgICAgICAgICBUaGlzIGNoYW5nZSB3b3VsZCBhbGxvdyB5b3UgdG8gZGVmaW5lIGEgdG9rZW4gcnVsZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICB0X05VTUJFUiA9IG51bWJlcgoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHRva2VuIHR5cGUgd2lsbCBiZSBzZXQgdG8gJ05VTUJFUicgYW5kIHVzZQogICAgICAgICAgdGhlIGFzc29jaWF0ZWQgbnVtYmVyKCkgZnVuY3Rpb24gdG8gcHJvY2VzcyB0b2tlbnMuICAgCiAgICAgICAgICAgCjExLzI4LzA3OiBiZWF6bGV5CiAgICAgICAgICBTbGlnaHQgbW9kaWZpY2F0aW9uIHRvIGxleCBhbmQgeWFjYyB0byBncmFiIHN5bWJvbHMgZnJvbSBib3RoCiAgICAgICAgICB0aGUgbG9jYWwgYW5kIGdsb2JhbCBkaWN0aW9uYXJpZXMgb2YgdGhlIGNhbGxlci4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gYWxsb3dzIGxleGVycyBhbmQgcGFyc2VycyB0byBiZSBkZWZpbmVkIHVzaW5nCiAgICAgICAgICBpbm5lciBmdW5jdGlvbnMgYW5kIGNsb3N1cmVzLgoKMTEvMjgvMDc6IGJlYXpsZXkKICAgICAgICAgIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogIFRoZSBsZXhlci5sZXhtYXRjaCBhbmQgdC5sZXhlcgogICAgICAgICAgYXR0cmlidXRlcyBhcmUgbm8gbG9uZ2VyIHNldCBmb3IgbGV4ZXIgdG9rZW5zIHRoYXQgYXJlIG5vdAogICAgICAgICAgZGVmaW5lZCBieSBmdW5jdGlvbnMuICAgVGhlIG9ubHkgbm9ybWFsIHVzZSBvZiB0aGVzZSBhdHRyaWJ1dGVzCiAgICAgICAgICB3b3VsZCBiZSBpbiBsZXhlciBydWxlcyB0aGF0IG5lZWQgdG8gcGVyZm9ybSBzb21lIGtpbmQgb2YgCiAgICAgICAgICBzcGVjaWFsIHByb2Nlc3NpbmcuICBUaHVzLCBpdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlIHRvIHNldAogICAgICAgICAgdGhlbSBvbiBldmVyeSB0b2tlbi4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFRoaXMgbWlnaHQgYnJlYWsgY29kZQogICAgICAgICAgdGhhdCBpcyBtdWNraW5nIGFyb3VuZCB3aXRoIGludGVybmFsIGxleGVyIHN0YXRlIGluIHNvbWUKICAgICAgICAgIHNvcnQgb2YgbWFnaWNhbCB3YXkuCgoxMS8yNy8wNzogYmVhemxleQogICAgICAgICAgQWRkZWQgdGhlIGFiaWxpdHkgdG8gcHV0IHRoZSBwYXJzZXIgaW50byBlcnJvci1oYW5kbGluZyBtb2RlCiAgICAgICAgICBmcm9tIHdpdGhpbiBhIG5vcm1hbCBwcm9kdWN0aW9uLiAgIFRvIGRvIHRoaXMsIHNpbXBseSByYWlzZQogICAgICAgICAgYSB5YWNjLlN5bnRheEVycm9yIGV4Y2VwdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgZGVmIHBfc29tZV9wcm9kdWN0aW9uKHApOgogICAgICAgICAgICAgICdzb21lX3Byb2R1Y3Rpb24gOiBwcm9kMSBwcm9kMicKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICByYWlzZSB5YWNjLlN5bnRheEVycm9yICAgICAgIyBTaWduYWwgYW4gZXJyb3IKCiAgICAgICAgICBBIG51bWJlciBvZiB0aGluZ3MgaGFwcGVuIGFmdGVyIHRoaXMgb2NjdXJzOgoKICAgICAgICAgIC0gVGhlIGxhc3Qgc3ltYm9sIHNoaWZ0ZWQgb250byB0aGUgc3ltYm9sIHN0YWNrIGlzIGRpc2NhcmRlZAogICAgICAgICAgICBhbmQgcGFyc2VyIHN0YXRlIGJhY2tlZCB1cCB0byB3aGF0IGl0IHdhcyBiZWZvcmUgdGhlCiAgICAgICAgICAgIHRoZSBydWxlIHJlZHVjdGlvbi4KCiAgICAgICAgICAtIFRoZSBjdXJyZW50IGxvb2thaGVhZCBzeW1ib2wgaXMgc2F2ZWQgYW5kIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgIHRoZSAnZXJyb3InIHN5bWJvbC4KCiAgICAgICAgICAtIFRoZSBwYXJzZXIgZW50ZXJzIGVycm9yIHJlY292ZXJ5IG1vZGUgd2hlcmUgaXQgdHJpZXMKICAgICAgICAgICAgdG8gZWl0aGVyIHJlZHVjZSB0aGUgJ2Vycm9yJyBydWxlIG9yIGl0IHN0YXJ0cyAKICAgICAgICAgICAgZGlzY2FyZGluZyBpdGVtcyBvZmYgb2YgdGhlIHN0YWNrIHVudGlsIHRoZSBwYXJzZXIKICAgICAgICAgICAgcmVzZXRzLgoKICAgICAgICAgIFdoZW4gYW4gZXJyb3IgaXMgbWFudWFsbHkgc2V0LCB0aGUgcGFyc2VyIGRvZXMgKm5vdCogY2FsbCAKICAgICAgICAgIHRoZSBwX2Vycm9yKCkgZnVuY3Rpb24gKGlmIGFueSBpcyBkZWZpbmVkKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKiogU3VnZ2VzdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QKCjExLzI3LzA3OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzdHJ1Y3R1cmUgYnVnIGluIGV4YW1wbGVzL2Fuc2ljLiAgUmVwb3J0ZWQgYnkgRGlvbiBCbGF6YWtpcy4KCjExLzI3LzA3OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgbGV4ZXIgcmVsYXRlZCB0byBzdGFydCBjb25kaXRpb25zIGFuZCBpZ25vcmVkCiAgICAgICAgICB0b2tlbiBydWxlcy4gIElmIGEgcnVsZSB3YXMgZGVmaW5lZCB0aGF0IGNoYW5nZWQgc3RhdGUsIGJ1dAogICAgICAgICAgcmV0dXJuZWQgbm8gdG9rZW4sIHRoZSBsZXhlciBjb3VsZCBiZSBsZWZ0IGluIGFuIGluY29uc2lzdGVudAogICAgICAgICAgc3RhdGUuICBSZXBvcnRlZCBieSAKICAgICAgICAgIAoxMS8yNy8wNzogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgc2V0dXAucHkgdG8gc3VwcG9ydCBQeXRob24gRWdncy4gICBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgU2ltb24gQ3Jvc3MuCgoxMS8wOS8wNzogYmVhemVseQogICAgICAgICAgRml4ZWQgYSBidWcgaW4gZXJyb3IgaGFuZGxpbmcgaW4geWFjYy4gIElmIGEgc3ludGF4IGVycm9yIG9jY3VycmVkIGFuZCB0aGUKICAgICAgICAgIHBhcnNlciByb2xsZWQgdGhlIGVudGlyZSBwYXJzZSBzdGFjayBiYWNrLCB0aGUgcGFyc2VyIHdvdWxkIGJlIGxlZnQgaW4gaW4KICAgICAgICAgIGluY29uc2lzdGVudCBzdGF0ZSB0aGF0IHdvdWxkIGNhdXNlIGl0IHRvIHRyaWdnZXIgaW5jb3JyZWN0IGFjdGlvbnMgb24KICAgICAgICAgIHN1YnNlcXVlbnQgaW5wdXQuICBSZXBvcnRlZCBieSBUb24gQmllZ3N0cmFhdGVuLCBKdXN0aW4gS2luZywgYW5kIG90aGVycy4KCjExLzA5LzA3OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aGVuIHBhc3NpbmcgZW1wdHkgaW5wdXQgc3RyaW5ncyB0byB5YWNjLnBhcnNlKCkuICAgVGhpcyAKICAgICAgICAgIHdvdWxkIHJlc3VsdCBpbiBhbiBlcnJvciBtZXNzYWdlIGFib3V0ICJObyBpbnB1dCBnaXZlbiIuICBSZXBvcnRlZAogICAgICAgICAgYnkgQW5kcmV3IERhbGtlLgoKVmVyc2lvbiAyLjMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDIvMjAvMDc6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggY2hhcmFjdGVyIGxpdGVyYWxzIGlmIHRoZSBsaXRlcmFsICcuJyBhcHBlYXJlZCBhcyB0aGUKICAgICAgICAgIGxhc3Qgc3ltYm9sIG9mIGEgZ3JhbW1hciBydWxlLiAgUmVwb3J0ZWQgYnkgQWxlcyBTbXJja2EuCgowMi8xOS8wNzogYmVhemxleQogICAgICAgICAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IHJlZGlyZWN0ZWQgdG8gc3RkZXJyIGluc3RlYWQgb2YgYmVpbmcgcHJpbnRlZAogICAgICAgICAgdG8gc3RhbmRhcmQgb3V0cHV0LgoKMDIvMTkvMDc6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIHRvIGxleC5weSBpZiBpdCBkZXRlY3RzIGEgbGl0ZXJhbCBiYWNrc2xhc2gKICAgICAgICAgIGNoYXJhY3RlciBpbnNpZGUgdGhlIHRfaWdub3JlIGRlY2xhcmF0aW9uLiAgVGhpcyBpcyB0byBoZWxwCiAgICAgICAgICBwcm9ibGVtcyB0aGF0IG1pZ2h0IG9jY3VyIGlmIHNvbWVvbmUgYWNjaWRlbnRhbGx5IGRlZmluZXMgdF9pZ25vcmUKICAgICAgICAgIGFzIGEgUHl0aG9uIHJhdyBzdHJpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdF9pZ25vcmUgPSByJyBcdCcKCiAgICAgICAgICBUaGUgaWRlYSBmb3IgdGhpcyBpcyBmcm9tIGFuIGVtYWlsIEkgcmVjZWl2ZWQgZnJvbSBEYXZpZCBDaW1pbWkgd2hvCiAgICAgICAgICByZXBvcnRlZCBiaXphcnJlIGJlaGF2aW9yIGluIGxleGluZyBhcyBhIHJlc3VsdCBvZiBkZWZpbmluZyB0X2lnbm9yZQogICAgICAgICAgYXMgYSByYXcgc3RyaW5nIGJ5IGFjY2lkZW50LgoKMDIvMTgvMDc6IGJlYXpsZXkKICAgICAgICAgIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbAogICAgICAgICAgdGFibGUgb3JnYW5pemF0aW9uIGFuZCBMUiBwYXJzZXIgdG8gaW1wcm92ZSBwYXJzaW5nIHBlcmZvcm1hbmNlLgoKMDIvMTgvMDc6IGJlYXpsZXkKICAgICAgICAgIEF1dG9tYXRpYyB0cmFja2luZyBvZiBsaW5lIG51bWJlciBhbmQgcG9zaXRpb24gaW5mb3JtYXRpb24gbXVzdCBub3cgYmUgCiAgICAgICAgICBlbmFibGVkIGJ5IGEgc3BlY2lhbCBmbGFnIHRvIHBhcnNlKCkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgeWFjYy5wYXJzZShkYXRhLHRyYWNraW5nPVRydWUpCgogICAgICAgICAgSW4gbWFueSBhcHBsaWNhdGlvbnMsIGl0J3MganVzdCBub3QgdGhhdCBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUKICAgICAgICAgIHBhcnNlciBhdXRvbWF0aWNhbGx5IHRyYWNrIGFsbCBsaW5lIG51bWJlcnMuICBCeSBtYWtpbmcgdGhpcyBhbiAKICAgICAgICAgIG9wdGlvbmFsIGZlYXR1cmUsIGl0IGFsbG93cyB0aGUgcGFyc2VyIHRvIHJ1biBzaWduaWZpY2FudGx5IGZhc3RlcgogICAgICAgICAgKG1vcmUgdGhhbiBhIDIwJSBzcGVlZCBpbmNyZWFzZSBpbiBtYW55IGNhc2VzKS4gICAgTm90ZTogcG9zaXRpb25hbAogICAgICAgICAgaW5mb3JtYXRpb24gaXMgYWx3YXlzIGF2YWlsYWJsZSBmb3IgcmF3IHRva2Vucy0tLXRoaXMgY2hhbmdlIG9ubHkKICAgICAgICAgIGFwcGxpZXMgdG8gcG9zaXRpb25hbCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggbm9udGVybWluYWwKICAgICAgICAgIGdyYW1tYXIgc3ltYm9scy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAKMDIvMTgvMDc6IGJlYXpsZXkKICAgICAgICAgIFlhY2Mgbm8gbG9uZ2VyIHN1cHBvcnRzIGV4dGVuZGVkIHNsaWNlcyBvZiBncmFtbWFyIHByb2R1Y3Rpb25zLgogICAgICAgICAgSG93ZXZlciwgaXQgZG9lcyBzdXBwb3J0IHJlZ3VsYXIgc2xpY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgZGVmIHBfZm9vKHApOgogICAgICAgICAgICAgICcnJ2ZvbzogYSBiIGMgZCBlJycnCiAgICAgICAgICAgICAgcFswXSA9IHBbMTozXQoKICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGEgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgdG8gdGhlIHBhcnNlci0taXQgc3RyZWFtbGluZXMKICAgICAgICAgIG5vcm1hbCBhY2Nlc3MgdG8gdGhlIGdyYW1tYXIgdmFsdWVzIHNpbmNlIHNsaWNlcyBhcmUgbm93IGhhbmRsZWQgaW4KICAgICAgICAgIGEgX19nZXRzbGljZV9fKCkgbWV0aG9kIGFzIG9wcG9zZWQgdG8gX19nZXRpdGVtX18oKS4KCjAyLzEyLzA3OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgaGFuZGxpbmcgb2YgdG9rZW4gbmFtZXMgd2hlbiBjb21iaW5lZCB3aXRoCiAgICAgICAgICBzdGFydCBjb25kaXRpb25zLiAgIEJ1ZyByZXBvcnRlZCBieSBUb2RkIE8nQnJ5YW4uCgpWZXJzaW9uIDIuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMTEvMDEvMDY6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGxleHBvcygpIGFuZCBsZXhzcGFuKCkgbWV0aG9kcyB0byBncmFtbWFyIHN5bWJvbHMuICBUaGVzZQogICAgICAgICAgbWlycm9yIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb2YgbGluZW5vKCkgYW5kIGxpbmVzcGFuKCkuICBGb3IKICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgZGVmIHBfZXhwcihwKToKICAgICAgICAgICAgICAnZXhwciA6IGV4cHIgUExVUyBleHByJwogICAgICAgICAgICAgICBwLmxleHBvcygxKSAgICAgIyBMZXhpbmcgcG9zaXRpb24gb2YgbGVmdC1oYW5kLWV4cHJlc3Npb24KICAgICAgICAgICAgICAgcC5sZXhwb3MoMSkgICAgICMgTGV4aW5nIHBvc2l0aW9uIG9mIFBMVVMKICAgICAgICAgICAgICAgc3RhcnQsZW5kID0gcC5sZXhzcGFuKDMpICAjIExleGluZyByYW5nZSBvZiByaWdodCBoYW5kIGV4cHJlc3Npb24KCjExLzAxLzA2OiBiZWF6bGV5CiAgICAgICAgICBNaW5vciBjaGFuZ2UgdG8gZXJyb3IgaGFuZGxpbmcuICBUaGUgcmVjb21tZW5kZWQgd2F5IHRvIHNraXAgY2hhcmFjdGVycwogICAgICAgICAgaW4gdGhlIGlucHV0IGlzIHRvIHVzZSB0LmxleGVyLnNraXAoKSBhcyBzaG93biBoZXJlOgoKICAgICAgICAgICAgIGRlZiB0X2Vycm9yKHQpOgogICAgICAgICAgICAgICAgIHByaW50ICJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0KICAgICAgICAgICAgICAgICB0LmxleGVyLnNraXAoMSkKICAgICAgICAgIAogICAgICAgICAgVGhlIG9sZCBhcHByb2FjaCBvZiBqdXN0IHVzaW5nIHQuc2tpcCgxKSB3aWxsIHN0aWxsIHdvcmssIGJ1dCB3b24ndAogICAgICAgICAgYmUgZG9jdW1lbnRlZC4KCjEwLzMxLzA2OiBiZWF6bGV5CiAgICAgICAgICBEaXNjYXJkZWQgdG9rZW5zIGNhbiBub3cgYmUgc3BlY2lmaWVkIGFzIHNpbXBsZSBzdHJpbmdzIGluc3RlYWQgb2YKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRvIGRvIHRoaXMsIHNpbXBseSBpbmNsdWRlIHRoZSB0ZXh0ICJpZ25vcmVfIiBpbiB0aGUKICAgICAgICAgIHRva2VuIGRlY2xhcmF0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRfaWdub3JlX2NwcGNvbW1lbnQgPSByJy8vLionCiAgICAgICAgICAKICAgICAgICAgIFByZXZpb3VzbHksIHRoaXMgaGFkIHRvIGJlIGRvbmUgd2l0aCBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGRlZiB0X2lnbm9yZV9jcHBjb21tZW50KHQpOgogICAgICAgICAgICAgICAgICByJy8vLionCiAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICBJZiBzdGFydCBjb25kaXRpb25zL3N0YXRlcyBhcmUgYmVpbmcgdXNlZCwgc3RhdGUgbmFtZXMgc2hvdWxkIGFwcGVhcgogICAgICAgICAgYmVmb3JlIHRoZSAiaWdub3JlXyIgdGV4dC4KCjEwLzE5LzA2OiBiZWF6bGV5CiAgICAgICAgICBUaGUgTGV4IG1vZHVsZSBub3cgcHJvdmlkZXMgc3VwcG9ydCBmb3IgZmxleC1zdHlsZSBzdGFydCBjb25kaXRpb25zCiAgICAgICAgICBhcyBkZXNjcmliZWQgYXQgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2ZsZXgvbWFudWFsL2h0bWxfY2hhcHRlci9mbGV4XzExLmh0bWwuCiAgICAgICAgICBQbGVhc2UgcmVmZXIgdG8gdGhpcyBkb2N1bWVudCB0byB1bmRlcnN0YW5kIHRoaXMgY2hhbmdlIG5vdGUuICBSZWZlciB0bwogICAgICAgICAgdGhlIFBMWSBkb2N1bWVudGF0aW9uIGZvciBQTFktc3BlY2lmaWMgZXhwbGFuYXRpb24gb2YgaG93IHRoaXMgd29ya3MuCgogICAgICAgICAgVG8gdXNlIHN0YXJ0IGNvbmRpdGlvbnMsIHlvdSBmaXJzdCBuZWVkIHRvIGRlY2xhcmUgYSBzZXQgb2Ygc3RhdGVzIGluCiAgICAgICAgICB5b3VyIGxleGVyIGZpbGU6CgogICAgICAgICAgc3RhdGVzID0gKAogICAgICAgICAgICAgICAgICAgICgnZm9vJywnZXhjbHVzaXZlJyksCiAgICAgICAgICAgICAgICAgICAgKCdiYXInLCdpbmNsdXNpdmUnKQogICAgICAgICAgKQoKICAgICAgICAgIFRoaXMgc2VydmVzIHRoZSBzYW1lIHJvbGUgYXMgdGhlICVzIGFuZCAleCBzcGVjaWZpZXJzIGluIGZsZXguCgogICAgICAgICAgT25lIGEgc3RhdGUgaGFzIGJlZW4gZGVjbGFyZWQsIHRva2VucyBmb3IgdGhhdCBzdGF0ZSBjYW4gYmUgCiAgICAgICAgICBkZWNsYXJlZCBieSBkZWZpbmluZyBydWxlcyBvZiB0aGUgZm9ybSB0X3N0YXRlX1RPSy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgdF9QTFVTID0gJ1wrJyAgICAgICAgICAjIFJ1bGUgZGVmaW5lZCBpbiBJTklUSUFMIHN0YXRlCiAgICAgICAgICAgIHRfZm9vX05VTSA9ICdcZCsnICAgICAgIyBSdWxlIGRlZmluZWQgaW4gZm9vIHN0YXRlCiAgICAgICAgICAgIHRfYmFyX05VTSA9ICdcZCsnICAgICAgIyBSdWxlIGRlZmluZWQgaW4gYmFyIHN0YXRlCgogICAgICAgICAgICB0X2Zvb19iYXJfTlVNID0gJ1xkKycgICMgUnVsZSBkZWZpbmVkIGluIGJvdGggZm9vIGFuZCBiYXIKICAgICAgICAgICAgdF9BTllfTlVNID0gJ1xkKycgICAgICAjIFJ1bGUgZGVmaW5lZCBpbiBhbGwgc3RhdGVzCgogICAgICAgICAgSW4gYWRkaXRpb24gdG8gZGVmaW5pbmcgdG9rZW5zIGZvciBlYWNoIHN0YXRlLCB0aGUgdF9pZ25vcmUgYW5kIHRfZXJyb3IKICAgICAgICAgIHNwZWNpZmljYXRpb25zIGNhbiBiZSBjdXN0b21pemVkIGZvciBzcGVjaWZpYyBzdGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIHRfZm9vX2lnbm9yZSA9ICIgIiAgICAgIyBJZ25vcmVkIGNoYXJhY3RlcnMgZm9yIGZvbyBzdGF0ZQogICAgICAgICAgICBkZWYgdF9iYXJfZXJyb3IodCk6ICAgCiAgICAgICAgICAgICAgICAjIEhhbmRsZSBlcnJvcnMgaW4gYmFyIHN0YXRlCgogICAgICAgICAgV2l0aCB0b2tlbiBydWxlcywgdGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSBzdGF0ZXMKICAgICAgICAgIAogICAgICAgICAgICBkZWYgdF9UT0tOQU1FKHQpOgogICAgICAgICAgICAgICAgdC5sZXhlci5iZWdpbignZm9vJykgICAgICAgICMgQmVnaW4gc3RhdGUgJ2ZvbycKICAgICAgICAgICAgICAgIHQubGV4ZXIucHVzaF9zdGF0ZSgnZm9vJykgICAjIEJlZ2luIHN0YXRlICdmb28nLCBwdXNoIG9sZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb250byBhIHN0YWNrCiAgICAgICAgICAgICAgICB0LmxleGVyLnBvcF9zdGF0ZSgpICAgICAgICAgIyBSZXN0b3JlIHByZXZpb3VzIHN0YXRlCiAgICAgICAgICAgICAgICB0LmxleGVyLmN1cnJlbnRfc3RhdGUoKSAgICAgIyBSZXR1cm5zIG5hbWUgb2YgY3VycmVudCBzdGF0ZQoKICAgICAgICAgIFRoZXNlIG1ldGhvZHMgbWlycm9yIHRoZSBCRUdJTigpLCB5eV9wdXNoX3N0YXRlKCksIHl5X3BvcF9zdGF0ZSgpLCBhbmQKICAgICAgICAgIHl5X3RvcF9zdGF0ZSgpIGZ1bmN0aW9ucyBpbiBmbGV4LgoKICAgICAgICAgIFRoZSB1c2Ugb2Ygc3RhcnQgc3RhdGVzIGNhbiBiZSB1c2VkIGFzIG9uZSB3YXkgdG8gd3JpdGUgc3ViLWxleGVycy4KICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgbGV4ZXIgb3IgcGFyc2VyIG1pZ2h0IGluc3RydWN0IHRoZSBsZXhlciB0byBzdGFydAogICAgICAgICAgZ2VuZXJhdGluZyBhIGRpZmZlcmVudCBzZXQgb2YgdG9rZW5zIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4KICAgICAgICAgIAogICAgICAgICAgZXhhbXBsZS95cGx5L3lsZXgucHkgc2hvd3MgdGhlIHVzZSBvZiBzdGFydCBzdGF0ZXMgdG8gZ3JhYiBDL0MrKyAKICAgICAgICAgIGNvZGUgZnJhZ21lbnRzIG91dCBvZiB0cmFkaXRpb25hbCB5YWNjIHNwZWNpZmljYXRpb24gZmlsZXMuCgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKiBTdWdnZXN0ZWQgYnkgRGFuaWVsIExhcnJheiB3aXRoIHdob20gSSBhbHNvCiAgICAgICAgICBkaXNjdXNzZWQgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBkZXNpZ24uCgoxMC8xOS8wNjogYmVhemxleQogICAgICAgICAgTWlub3IgY2hhbmdlIHRvIHRoZSB3YXkgaW4gd2hpY2ggeWFjYy5weSB3YXMgcmVwb3J0aW5nIHNoaWZ0L3JlZHVjZQogICAgICAgICAgY29uZmxpY3RzLiAgQWx0aG91Z2ggdGhlIHVuZGVybHlpbmcgTEFMUigxKSBhbGdvcml0aG0gd2FzIGNvcnJlY3QsCiAgICAgICAgICBQTFkgd2FzIHVuZGVyLXJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIGNvbmZsaWN0cyBjb21wYXJlZCB0byB5YWNjL2Jpc29uCiAgICAgICAgICB3aGVuIHByZWNlZGVuY2UgcnVsZXMgd2VyZSBpbiBlZmZlY3QuICBUaGlzIGNoYW5nZSBzaG91bGQgbWFrZSBQTFkKICAgICAgICAgIHJlcG9ydCB0aGUgc2FtZSBudW1iZXIgb2YgY29uZmxpY3RzIGFzIHlhY2MuCgoxMC8xOS8wNjogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgeWFjYyBzbyB0aGF0IGdyYW1tYXIgcnVsZXMgY291bGQgYWxzbyBpbmNsdWRlIHRoZSAnLScgCiAgICAgICAgICBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGRlZiBwX2V4cHJfbGlzdChwKToKICAgICAgICAgICAgICAgICdleHByZXNzaW9uLWxpc3QgOiBleHByZXNzaW9uLWxpc3QgZXhwcmVzc2lvbicKCiAgICAgICAgICBTdWdnZXN0ZWQgYnkgT2xkcmljaCBKZWRsaWNrYS4KCjEwLzE4LzA2OiBiZWF6bGV5CiAgICAgICAgICBBdHRyaWJ1dGUgbGV4ZXIubGV4bWF0Y2ggYWRkZWQgc28gdGhhdCB0b2tlbiBydWxlcyBjYW4gYWNjZXNzIHRoZSByZSAKICAgICAgICAgIG1hdGNoIG9iamVjdCB0aGF0IHdhcyBnZW5lcmF0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICBkZWYgdF9GT08odCk6CiAgICAgICAgICAgICAgcidzb21lIHJlZ2V4JwogICAgICAgICAgICAgIG0gPSB0LmxleGVyLmxleG1hdGNoCiAgICAgICAgICAgICAgIyBEbyBzb21ldGhpbmcgd2l0aCBtCgoKICAgICAgICAgIFRoaXMgbWF5IGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgbmFtZWQgZ3JvdXBzIHNwZWNpZmllZCB3aXRoaW4KICAgICAgICAgIHRoZSByZWdleCBmb3IgYSBzcGVjaWZpYyB0b2tlbi4gU3VnZ2VzdGVkIGJ5IE9sZHJpY2ggSmVkbGlja2EuCiAgICAgICAgICAKMTAvMTYvMDY6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCByZXN1bHRzIGlmIGFuIGlsbGVnYWwgY2hhcmFjdGVyCiAgICAgICAgICBpcyBlbmNvdW50ZXJlZCBhbmQgbm8gZGVmYXVsdCBlcnJvciBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIGxleC4KICAgICAgICAgIFRoZSBleGNlcHRpb24gaXMgbm93IG1vcmUgaW5mb3JtYXRpdmUgYWJvdXQgdGhlIGFjdHVhbCBjYXVzZSBvZgogICAgICAgICAgdGhlIGVycm9yLgogICAgICAKVmVyc2lvbiAyLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjEwLzAyLzA2OiBiZWF6bGV5CiAgICAgICAgICBUaGUgbGFzdCBMZXhlciBvYmplY3QgYnVpbHQgYnkgbGV4KCkgY2FuIGJlIGZvdW5kIGluIGxleC5sZXhlci4KICAgICAgICAgIFRoZSBsYXN0IFBhcnNlciBvYmplY3QgYnVpbHQgIGJ5IHlhY2MoKSBjYW4gYmUgZm91bmQgaW4geWFjYy5wYXJzZXIuCgoxMC8wMi8wNjogYmVhemxleQogICAgICAgICAgTmV3IGV4YW1wbGUgYWRkZWQ6ICBleGFtcGxlcy95cGx5CgogICAgICAgICAgVGhpcyBleGFtcGxlIHVzZXMgUExZIHRvIGNvbnZlcnQgVW5peC15YWNjIHNwZWNpZmljYXRpb24gZmlsZXMgdG8KICAgICAgICAgIFBMWSBwcm9ncmFtcyB3aXRoIHRoZSBzYW1lIGdyYW1tYXIuICAgVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBjb252ZXJ0IGEgZ3JhbW1hciBmcm9tIGJpc29uL3lhY2MgdG8gdXNlIHdpdGggUExZLgogICAgCjEwLzAyLzA2OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhIHN0YXJ0IHN5bWJvbCB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIHlhY2MKICAgICAgICAgIGlucHV0IGZpbGUgaXRzZWxmLiAgSnVzdCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgc3RhcnQgPSAnbmFtZScKCiAgICAgICAgICB3aGVyZSAnbmFtZScgbWF0Y2hlcyBzb21lIGdyYW1tYXIgcnVsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgZGVmIHBfbmFtZShwKToKICAgICAgICAgICAgICAgICAgICduYW1lIDogQSBCIEMnCiAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICBUaGlzIG1pcnJvcnMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHlhY2MgJXN0YXJ0IHNwZWNpZmllci4KCjA5LzMwLzA2OiBiZWF6bGV5CiAgICAgICAgICBTb21lIG5ldyBleGFtcGxlcyBhZGRlZC46CgogICAgICAgICAgZXhhbXBsZXMvR2FyZGVuU25ha2UgOiBBIHNpbXBsZSBpbmRlbnRhdGlvbiBiYXNlZCBsYW5ndWFnZSBzaW1pbGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFB5dGhvbi4gIFNob3dzIGhvdyB5b3UgbWlnaHQgaGFuZGxlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlLiAgQ29udHJpYnV0ZWQgYnkgQW5kcmV3IERhbGtlLgoKICAgICAgICAgIGV4YW1wbGVzL0JBU0lDICAgICAgIDogQW4gaW1wbGVtZW50YXRpb24gb2YgMTk2NCBEYXJ0bW91dGggQkFTSUMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IERhdmUgYWdhaW5zdCBoaXMgYmV0dGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1ZGdlbWVudC4KCjA5LzI4LzA2OiBiZWF6bGV5CiAgICAgICAgICBNaW5vciBwYXRjaCB0byBhbGxvdyBuYW1lZCBncm91cHMgdG8gYmUgdXNlZCBpbiBsZXggcmVndWxhcgogICAgICAgICAgZXhwcmVzc2lvbiBydWxlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0X1FTVFJJTkcgPSByJycnKD9QPHF1b3RlPlsnIl0pLio/KD9QPXF1b3RlKScnJwoKICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBBZGFtIFJpbmcuCiAKMDkvMjgvMDY6IGJlYXpsZXkKICAgICAgICAgIExBTFIoMSkgaXMgbm93IHRoZSBkZWZhdWx0IHBhcnNpbmcgbWV0aG9kLiAgIFRvIHVzZSBTTFIsIHVzZQogICAgICAgICAgeWFjYy55YWNjKG1ldGhvZD0iU0xSIikuICBOb3RlOiB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpbXBhY3QKICAgICAgICAgIG9uIHBhcnNpbmcgd2hlbiB1c2luZyBMQUxSKDEpIGluc3RlYWQgb2YgU0xSLiBIb3dldmVyLCBjb25zdHJ1Y3RpbmcKICAgICAgICAgIHRoZSBwYXJzaW5nIHRhYmxlcyB3aWxsIHRha2UgYSBsaXR0bGUgbG9uZ2VyLgoKMDkvMjYvMDY6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZSB0byBsaW5lIG51bWJlciB0cmFja2luZy4gIFRvIG1vZGlmeSBsaW5lIG51bWJlcnMsIG1vZGlmeQogICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBsZXhlciBpdHNlbGYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICBkZWYgdF9ORVdMSU5FKHQpOgogICAgICAgICAgICAgIHInXG4nCiAgICAgICAgICAgICAgdC5sZXhlci5saW5lbm8gKz0gMQoKICAgICAgICAgIFRoaXMgbW9kaWZpY2F0aW9uIGlzIGJvdGggY2xlYW51cCBhbmQgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uCiAgICAgICAgICBJbiBwYXN0IHZlcnNpb25zLCBsZXggd2FzIG1vbml0b3JpbmcgZXZlcnkgdG9rZW4gZm9yIGNoYW5nZXMgaW4KICAgICAgICAgIHRoZSBsaW5lIG51bWJlci4gIFRoaXMgZXh0cmEgcHJvY2Vzc2luZyBpcyB1bm5lY2Vzc2FyeSBmb3IgYSB2YXN0CiAgICAgICAgICBtYWpvcml0eSBvZiB0b2tlbnMuIFRodXMsIHRoaXMgbmV3IGFwcHJvYWNoIGNsZWFucyBpdCB1cCBhIGJpdC4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gY2hhbmdlIGNvZGUgaW4geW91ciBsZXhlciB0aGF0IHVwZGF0ZXMgdGhlIGxpbmUKICAgICAgICAgIG51bWJlci4gRm9yIGV4YW1wbGUsICJ0LmxpbmVubyArPSAxIiBiZWNvbWVzICJ0LmxleGVyLmxpbmVubyArPSAxIgogICAgICAgICAKMDkvMjYvMDY6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHRoZSBsZXhpbmcgcG9zaXRpb24gdG8gdG9rZW5zIGFzIGFuIGF0dHJpYnV0ZSBsZXhwb3MuIFRoaXMKICAgICAgICAgIGlzIHRoZSByYXcgaW5kZXggaW50byB0aGUgaW5wdXQgdGV4dCBhdCB3aGljaCBhIHRva2VuIGFwcGVhcnMuCiAgICAgICAgICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgY29sdW1uIG51bWJlcnMgYW5kIG90aGVyCiAgICAgICAgICBkZXRhaWxzIChlLmcuLCBzY2FuIGJhY2t3YXJkcyBmcm9tIGxleHBvcyB0byB0aGUgZmlyc3QgbmV3bGluZQogICAgICAgICAgdG8gZ2V0IGEgY29sdW1uIHBvc2l0aW9uKS4KCjA5LzI1LzA2OiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBfX2NvcHlfXygpIG1ldGhvZCBvbiB0aGUgTGV4ZXIgY2xhc3MKICAgICAgICAgIHRvIGNsb25lKCkuICBUaGlzIGlzIHVzZWQgdG8gY2xvbmUgYSBMZXhlciBvYmplY3QgKGUuZy4sIGlmCiAgICAgICAgICB5b3UncmUgcnVubmluZyBkaWZmZXJlbnQgbGV4ZXJzIGF0IHRoZSBzYW1lIHRpbWUpLgoKMDkvMjEvMDY6IGJlYXpsZXkKICAgICAgICAgIExpbWl0YXRpb25zIHJlbGF0ZWQgdG8gdGhlIHVzZSBvZiB0aGUgcmUgbW9kdWxlIGhhdmUgYmVlbiBlbGltaW5hdGVkLgogICAgICAgICAgU2V2ZXJhbCB1c2VycyByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZXhjZWVkaW5nCiAgICAgICAgICBtb3JlIHRoYW4gMTAwIG5hbWVkIGdyb3Vwcy4gVG8gc29sdmUgdGhpcywgbGV4LnB5IGlzIG5vdyBjYXBhYmxlCiAgICAgICAgICBvZiBhdXRvbWF0aWNhbGx5IHNwbGl0dGluZyBpdHMgbWFzdGVyIHJlZ3VsYXIgcmVndWxhciBleHByZXNzaW9uIGludG8KICAgICAgICAgIHNtYWxsZXIgZXhwcmVzc2lvbnMgYXMgbmVlZGVkLiAgIFRoaXMgc2hvdWxkLCBpbiB0aGVvcnksIG1ha2UgaXQKICAgICAgICAgIHBvc3NpYmxlIHRvIHNwZWNpZnkgYW4gYXJiaXRyYXJpbHkgbGFyZ2UgbnVtYmVyIG9mIHRva2Vucy4KCjA5LzIxLzA2OiBiZWF6bGV5CiAgICAgICAgICBJbXByb3ZlZCBlcnJvciBjaGVja2luZyBpbiBsZXgucHkuICBSdWxlcyB0aGF0IG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcKICAgICAgICAgIGFyZSBub3cgcmVqZWN0ZWQgKG90aGVyd2lzZSB0aGV5IGNhdXNlIHRoZSBsZXhlciB0byBlbnRlciBhbiBpbmZpbml0ZQogICAgICAgICAgbG9vcCkuICBBbiBleHRyYSBjaGVjayBmb3IgcnVsZXMgY29udGFpbmluZyAnIycgaGFzIGFsc28gYmVlbiBhZGRlZC4KICAgICAgICAgIFNpbmNlIGxleCBjb21waWxlcyByZWd1bGFyIGV4cHJlc3Npb25zIGluIHZlcmJvc2UgbW9kZSwgJyMnIGlzIGludGVycHJldGVkCiAgICAgICAgICBhcyBhIHJlZ2V4IGNvbW1lbnQsIGl0IGlzIGNyaXRpY2FsIHRvIHVzZSAnXCMnIGluc3RlYWQuICAKCjA5LzE4LzA2OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBhIEBUT0tFTiBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gbGV4LnB5IHRoYXQgY2FuIGJlIHVzZWQgdG8gCiAgICAgICAgICBkZWZpbmUgdG9rZW4gcnVsZXMgd2hlcmUgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG1pZ2h0IGJlIGNvbXB1dGVkCiAgICAgICAgICBpbiBzb21lIHdheS4KICAgICAgICAgIAogICAgICAgICAgZGlnaXQgICAgICAgICAgICA9IHInKFswLTldKScKICAgICAgICAgIG5vbmRpZ2l0ICAgICAgICAgPSByJyhbX0EtWmEtel0pJwogICAgICAgICAgaWRlbnRpZmllciAgICAgICA9IHInKCcgKyBub25kaWdpdCArIHInKCcgKyBkaWdpdCArIHInfCcgKyBub25kaWdpdCArIHInKSopJyAgICAgICAgCgogICAgICAgICAgZnJvbSBwbHkubGV4IGltcG9ydCBUT0tFTgoKICAgICAgICAgIEBUT0tFTihpZGVudGlmaWVyKQogICAgICAgICAgZGVmIHRfSUQodCk6CiAgICAgICAgICAgICAgICMgRG8gd2hhdGV2ZXIKCiAgICAgICAgICBUaGUgQFRPS0VOIGRlY29yYXRvciBtZXJlbHkgc2V0cyB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgb2YgdGhlCiAgICAgICAgICBhc3NvY2lhdGVkIHRva2VuIGZ1bmN0aW9uIGFzIG5lZWRlZCBmb3IgbGV4IHRvIHdvcmsuICAKCiAgICAgICAgICBOb3RlOiBBbiBhbHRlcm5hdGl2ZSBzb2x1dGlvbiBpcyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgIGRlZiB0X0lEKHQpOgogICAgICAgICAgICAgICMgRG8gd2hhdGV2ZXIKICAgCiAgICAgICAgICB0X0lELl9fZG9jX18gPSBpZGVudGlmaWVyCgogICAgICAgICAgTm90ZTogRGVjb3JhdG9ycyByZXF1aXJlIHRoZSB1c2Ugb2YgUHl0aG9uIDIuNCBvciBsYXRlci4gIElmIGNvbXBhdGliaWxpdHkKICAgICAgICAgIHdpdGggb2xkIHZlcnNpb25zIGlzIG5lZWRlZCwgdXNlIHRoZSBsYXR0ZXIgc29sdXRpb24uCgogICAgICAgICAgVGhlIG5lZWQgZm9yIHRoaXMgZmVhdHVyZSB3YXMgc3VnZ2VzdGVkIGJ5IENlbSBLYXJhbi4KCjA5LzE0LzA2OiBiZWF6bGV5CiAgICAgICAgICBTdXBwb3J0IGZvciBzaW5nbGUtY2hhcmFjdGVyIGxpdGVyYWwgdG9rZW5zIGhhcyBiZWVuIGFkZGVkIHRvIHlhY2MuCiAgICAgICAgICBUaGVzZSBsaXRlcmFscyBtdXN0IGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgIGRlZiBwX2V4cHIocCk6CiAgICAgICAgICAgICAgICJleHByIDogZXhwciAnKycgZXhwciIKICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgZGVmIHBfZXhwcihwKToKICAgICAgICAgICAgICAgJ2V4cHIgOiBleHByICItIiBleHByJwogICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBpdCBpcyBuZWNlc3NhcnkgdG8gdGVsbCB0aGUgbGV4ZXIgbW9kdWxlIGFib3V0CiAgICAgICAgICBsaXRlcmFsIGNoYXJhY3RlcnMuICAgVGhpcyBpcyBkb25lIGJ5IGRlZmluaW5nIHRoZSB2YXJpYWJsZSAnbGl0ZXJhbHMnCiAgICAgICAgICBhcyBhIGxpc3Qgb2YgY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkICBiZSBkZWZpbmVkIGluIHRoZSBtb2R1bGUgdGhhdAogICAgICAgICAgaW52b2tlcyB0aGUgbGV4LmxleCgpIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgbGl0ZXJhbHMgPSBbJysnLCctJywnKicsJy8nLCcoJywnKScsJz0nXQogCiAgICAgICAgICBvciBzaW1wbHkKCiAgICAgICAgICAgICBsaXRlcmFscyA9ICcrPSovKCk9JwoKICAgICAgICAgIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgbGl0ZXJhbHMgY2FuIG9ubHkgYmUgYSBzaW5nbGUgY2hhcmFjdGVyLgogICAgICAgICAgV2hlbiB0aGUgbGV4ZXIgZmFpbHMgdG8gbWF0Y2ggYSB0b2tlbiB1c2luZyBpdHMgbm9ybWFsIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgcnVsZXMsIGl0IHdpbGwgY2hlY2sgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGFnYWluc3QgdGhlIGxpdGVyYWwgbGlzdC4KICAgICAgICAgIElmIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHdpdGggYSB0b2tlbiB0eXBlIHNldCB0byBtYXRjaCB0aGUgbGl0ZXJhbAogICAgICAgICAgY2hhcmFjdGVyLiAgT3RoZXJ3aXNlLCBhbiBpbGxlZ2FsIGNoYXJhY3RlciB3aWxsIGJlIHNpZ25hbGxlZC4KCgowOS8xNC8wNjogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgUExZIHRvIGluc3RhbGwgaXRzZWxmIGFzIGEgcHJvcGVyIFB5dGhvbiBwYWNrYWdlIGNhbGxlZCAncGx5Jy4KICAgICAgICAgIFRoaXMgd2lsbCBtYWtlIGl0IGEgbGl0dGxlIG1vcmUgZnJpZW5kbHkgdG8gb3RoZXIgbW9kdWxlcy4gIFRoaXMKICAgICAgICAgIGNoYW5nZXMgdGhlIHVzYWdlIG9mIFBMWSBvbmx5IHNsaWdodGx5LiAgSnVzdCBkbyB0aGlzIHRvIGltcG9ydCB0aGUKICAgICAgICAgIG1vZHVsZXMKCiAgICAgICAgICAgICAgICBpbXBvcnQgcGx5LmxleCBhcyBsZXgKICAgICAgICAgICAgICAgIGltcG9ydCBwbHkueWFjYyBhcyB5YWNjCgogICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgoKICAgICAgICAgICAgICAgIGZyb20gcGx5IGltcG9ydCAqCgogICAgICAgICAgV2hpY2ggaW1wb3J0cyBib3RoIHRoZSBsZXggYW5kIHlhY2MgbW9kdWxlcy4KICAgICAgICAgIENoYW5nZSBzdWdnZXN0ZWQgYnkgTGVlIEp1bmUuCgowOS8xMy8wNjogYmVhemxleQogICAgICAgICAgQ2hhbmdlZCB0aGUgaGFuZGxpbmcgb2YgbmVnYXRpdmUgaW5kaWNlcyB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBydWxlcy4KICAgICAgICAgIEEgbmVnYXRpdmUgcHJvZHVjdGlvbiBpbmRleCBub3cgYWNjZXNzZXMgYWxyZWFkeSBwYXJzZWQgc3ltYm9scyBvbiB0aGUKICAgICAgICAgIHBhcnNpbmcgc3RhY2suICBGb3IgZXhhbXBsZSwgCgogICAgICAgICAgICAgIGRlZiBwX2ZvbyhwKToKICAgICAgICAgICAgICAgICAgICJmb286IEEgQiBDIEQiCiAgICAgICAgICAgICAgICAgICBwcmludCBwWzFdICAgICAgICMgVmFsdWUgb2YgJ0EnIHN5bWJvbAogICAgICAgICAgICAgICAgICAgcHJpbnQgcFsyXSAgICAgICAjIFZhbHVlIG9mICdCJyBzeW1ib2wKICAgICAgICAgICAgICAgICAgIHByaW50IHBbLTFdICAgICAgIyBWYWx1ZSBvZiB3aGF0ZXZlciBzeW1ib2wgYXBwZWFycyBiZWZvcmUgQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9uIHRoZSBwYXJzaW5nIHN0YWNrLgoKICAgICAgICAgICAgICAgICAgIHBbMF0gPSBzb21lX3ZhbCAgIyBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ2ZvbycgZ3JhbW1lciBzeW1ib2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBUaGlzIGJlaGF2aW9yIG1ha2VzIGl0IGVhc2llciB0byB3b3JrIHdpdGggZW1iZWRkZWQgYWN0aW9ucyB3aXRoaW4gdGhlCiAgICAgICAgICBwYXJzaW5nIHJ1bGVzLiBGb3IgZXhhbXBsZSwgaW4gQy15YWNjLCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBjb2RlIGxpa2UKICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICBiYXI6ICAgQSB7IHByaW50Zigic2VlbiBhbiBBID0gJWRcbiIsICQxKTsgfSBCIHsgZG9fc3R1ZmY7IH0KCiAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBwcmludGYoKSBjb2RlIGV4ZWN1dGVzIGltbWVkaWF0ZWx5IGFmdGVyIEEgaGFzIGJlZW4KICAgICAgICAgIHBhcnNlZC4gIFdpdGhpbiB0aGUgZW1iZWRkZWQgYWN0aW9uIGNvZGUsICQxIHJlZmVycyB0byB0aGUgQSBzeW1ib2wgb24KICAgICAgICAgIHRoZSBzdGFjay4KCiAgICAgICAgICBUbyBwZXJmb3JtIHRoaXMgZXF1aXZhbGVudCBhY3Rpb24gaW4gUExZLCB5b3UgbmVlZCB0byB3cml0ZSBhIHBhaXIKICAgICAgICAgIG9mIHJ1bGVzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGRlZiBwX2JhcihwKToKICAgICAgICAgICAgICAgICAgICAgImJhciA6IEEgc2Vlbl9BIEIiCiAgICAgICAgICAgICAgICAgICAgIGRvX3N0dWZmCgogICAgICAgICAgICAgICBkZWYgcF9zZWVuX0EocCk6CiAgICAgICAgICAgICAgICAgICAgICJzZWVuX0EgOiIKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNlZW4gYW4gQSA9IiwgcFstMV0KCiAgICAgICAgICBUaGUgc2Vjb25kIHJ1bGUgInNlZW5fQSIgaXMgbWVyZWx5IGEgZW1wdHkgcHJvZHVjdGlvbiB3aGljaCBzaG91bGQgYmUKICAgICAgICAgIHJlZHVjZWQgYXMgc29vbiBhcyBBIGlzIHBhcnNlZCBpbiB0aGUgImJhciIgcnVsZSBhYm92ZS4gIFRoZSB1c2UgCiAgICAgICAgICBvZiB0aGUgbmVnYXRpdmUgaW5kZXggcFstMV0gaXMgdXNlZCB0byBhY2Nlc3Mgd2hhdGV2ZXIgc3ltYm9sIGFwcGVhcmVkCiAgICAgICAgICBiZWZvcmUgdGhlIHNlZW5fQSBzeW1ib2wuCgogICAgICAgICAgVGhpcyBmZWF0dXJlIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gc3VwcG9ydCBpbmhlcml0ZWQgYXR0cmlidXRlcy4KICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgZGVmIHBfZGVjbChwKToKICAgICAgICAgICAgICAgICAgICAgImRlY2wgOiBzY29wZSBuYW1lIgoKICAgICAgICAgICAgICAgZGVmIHBfc2NvcGUocCk6CiAgICAgICAgICAgICAgICAgICAgICIiInNjb3BlIDogR0xPQkFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTE9DQUwiIiIKICAgICAgICAgICAgICAgICAgIHBbMF0gPSBwWzFdCgogICAgICAgICAgICAgICBkZWYgcF9uYW1lKHApOgogICAgICAgICAgICAgICAgICAgICAibmFtZSA6IElEIgogICAgICAgICAgICAgICAgICAgICBpZiBwWy0xXSA9PSAiR0xPQkFMIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIHBbLTFdID09ICJMT0NBTCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgIy4uLgoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIG5hbWUgcnVsZSBpcyBpbmhlcml0aW5nIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZQogICAgICAgICAgc2NvcGUgZGVjbGFyYXRpb24gdGhhdCBwcmVjZWRlcyBpdC4KICAgICAgIAogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBJZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyBuZWdhdGl2ZSBpbmRpY2VzIHdpdGhpbiBleGlzdGluZyBncmFtbWFyIHJ1bGVzLAogICAgICAgICAgeW91ciBjb2RlIHdpbGwgYnJlYWsuICBUaGlzIHNob3VsZCBiZSBleHRyZW1lbHkgcmFyZSBpZiBub24tZXhpc3RlbnQgaW4KICAgICAgICAgIG1vc3QgY2FzZXMuICBUaGUgYXJndW1lbnQgdG8gdmFyaW91cyBncmFtbWFyIHJ1bGVzIGlzIG5vdCB1c3VhbGx5IG5vdAogICAgICAgICAgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIHdheSBhcyBhIGxpc3Qgb2YgaXRlbXMuCiAgICAgICAgICAKVmVyc2lvbiAyLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA5LzA3LzA2OiBiZWF6bGV5CiAgICAgICAgICBNYWpvciBjbGVhbnVwIGFuZCByZWZhY3RvcmluZyBvZiB0aGUgTFIgdGFibGUgZ2VuZXJhdGlvbiBjb2RlLiAgQm90aCBTTFIKICAgICAgICAgIGFuZCBMQUxSKDEpIHRhYmxlIGdlbmVyYXRpb24gaXMgbm93IHBlcmZvcm1lZCBieSB0aGUgc2FtZSBjb2RlIGJhc2Ugd2l0aAogICAgICAgICAgb25seSBtaW5vciBleHRlbnNpb25zIGZvciBleHRyYSBMQUxSKDEpIHByb2Nlc3NpbmcuCgowOS8wNy8wNjogYmVhemxleQogICAgICAgICAgQ29tcGxldGVseSByZWltcGxlbWVudGVkIHRoZSBlbnRpcmUgTEFMUigxKSBwYXJzaW5nIGVuZ2luZSB0byB1c2UgdGhlCiAgICAgICAgICBEZVJlbWVyIGFuZCBQZW5uZWxsbyBhbGdvcml0aG0gZm9yIGNhbGN1bGF0aW5nIGxvb2thaGVhZCBzZXRzLiAgVGhpcwogICAgICAgICAgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgZ2VuZXJhdGluZyBMQUxSKDEpIHRhYmxlcwogICAgICAgICAgYW5kIGhhcyB0aGUgYWRkZWQgZmVhdHVyZSBvZiBhY3R1YWxseSB3b3JraW5nIGNvcnJlY3RseSEgIElmIHlvdQogICAgICAgICAgZXhwZXJpZW5jZWQgd2VpcmQgYmVoYXZpb3Igd2l0aCBMQUxSKDEpIGluIHByaW9yIHJlbGVhc2VzLCB0aGlzIHNob3VsZAogICAgICAgICAgaG9wZWZ1bGx5IHJlc29sdmUgYWxsIG9mIHRob3NlIHByb2JsZW1zLiAgTWFueSB0aGFua3MgdG8gCiAgICAgICAgICBBbmRyZXcgV2F0ZXJzIGFuZCBNYXJrdXMgU2Nob2VwZmxpbiBmb3Igc3VibWl0dGluZyBidWcgcmVwb3J0cwogICAgICAgICAgYW5kIGhlbHBpbmcgbWUgdGVzdCBvdXQgdGhlIHJldmlzZWQgTEFMUigxKSBzdXBwb3J0LgoKVmVyc2lvbiAxLjgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA4LzAyLzA2OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgZGVmYXVsdCBhY3Rpb25zIGluIExBTFIoMSkKICAgICAgICAgIHBhcnNpbmcuICBJZiB5b3UgZXhwZXJpZW5jZWQgc3VidGxlIGFuZC9vciBiaXphcnJlIGJlaGF2aW9yIHdoZW4gdHJ5aW5nCiAgICAgICAgICB0byB1c2UgdGhlIExBTFIoMSkgZW5naW5lLCB0aGlzIG1heSBjb3JyZWN0IHRob3NlIHByb2JsZW1zLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1c3MgQ294LiAgTm90ZTogVGhpcyBwYXRjaCBoYXMgYmVlbiBzdXBlcmNlZGVkIGJ5IAogICAgICAgICAgcmV2aXNpb25zIGZvciBMQUxSKDEpIHBhcnNpbmcgaW4gUGx5LTIuMC4KCjA4LzAyLzA2OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBzbGljaW5nIG9mIHByb2R1Y3Rpb25zIGluIHlhY2MuICAKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFBhdHJpY2sgTWV6YXJkLgoKVmVyc2lvbiAxLjcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjAzLzAyLzA2OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBpbmZpbml0ZSByZWN1cnNpb24gcHJvYmxlbSBSZWR1Y2VUb1Rlcm1pbmFscygpIGZ1bmN0aW9uIHRoYXQKICAgICAgICAgIHdvdWxkIHNvbWV0aW1lcyBjb21lIHVwIGluIExBTFIoMSkgdGFibGUgZ2VuZXJhdGlvbi4gIFJlcG9ydGVkIGJ5IAogICAgICAgICAgTWFya3VzIFNjaG9lcGZsaW4uCgowMy8wMS8wNjogYmVhemxleQogICAgICAgICAgQWRkZWQgInJlZmxhZ3MiIGFyZ3VtZW50IHRvIGxleCgpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBsZXgubGV4KHJlZmxhZ3M9cmUuVU5JQ09ERSkKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb3B0aW9uYWwgZmxhZ3MgdG8gdGhlIHJlLmNvbXBpbGUoKSBmdW5jdGlvbgogICAgICAgICAgdXNlZCBpbnNpZGUgdGhlIGxleGVyLiAgIFRoaXMgbWF5IGJlIG5lY2Vzc2FyeSBmb3Igc3BlY2lhbCBzaXR1YXRpb25zIHN1Y2gKICAgICAgICAgIGFzIHByb2Nlc3NpbmcgVW5pY29kZSAoZS5nLiwgaWYgeW91IHdhbnQgZXNjYXBlcyBsaWtlIFx3IGFuZCBcYiB0byBjb25zdWx0CiAgICAgICAgICB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydHkgZGF0YWJhc2UpLiAgIFRoZSBuZWVkIGZvciB0aGlzIHN1Z2dlc3RlZCBieQogICAgICAgICAgQW5kcmVhcyBKdW5nLgoKMDMvMDEvMDY6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvbiByZXBlYXRlZCBpbnN0YW50aWF0aW9ucyBvZiBwYXJzZXIKICAgICAgICAgIG9iamVjdHMgd2hlbiB0aGUgd3JpdGVfdGFibGVzPTAgYXJndW1lbnQgd2FzIHVzZWQuICAgUmVwb3J0ZWQgYnkgTWljaGFlbCBCcm93bi4KCjAzLzAxLzA2OiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCBsZXgucHkgdG8gYWNjZXB0IFVuaWNvZGUgc3RyaW5ncyBib3RoIGFzIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGZvcgogICAgICAgICAgdG9rZW5zIGFuZCBhcyBpbnB1dC4gSG9wZWZ1bGx5IHRoaXMgaXMgdGhlIG9ubHkgY2hhbmdlIG5lZWRlZCBmb3IgVW5pY29kZSBzdXBwb3J0LgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSm9oYW4gRGFobC4KCjAzLzAxLzA2OiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgY2xhc3MtYmFzZWQgaW50ZXJmYWNlIHRvIHdvcmsgd2l0aCBuZXctc3R5bGUgb3Igb2xkLXN0eWxlIGNsYXNzZXMuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBNaWNoYWVsIEJyb3duIChhbHRob3VnaCBJIHR3ZWFrZWQgaXQgc2xpZ2h0bHkgc28gaXQgd291bGQgd29yawogICAgICAgICAgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBQeXRob24pLgoKVmVyc2lvbiAxLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA1LzI3LzA1OiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2ggY29udHJpYnV0ZWQgYnkgQ2hyaXN0b3BoZXIgU3Rhd2FyeiB0byBmaXggYW4gZXh0cmVtZWx5CiAgICAgICAgICBkZXZpb3VzIGJ1ZyBpbiBMQUxSKDEpIHBhcnNlciBnZW5lcmF0aW9uLiAgIFRoaXMgcGF0Y2ggc2hvdWxkIGZpeCBwcm9ibGVtcwogICAgICAgICAgbnVtZXJvdXMgcGVvcGxlIHJlcG9ydGVkIHdpdGggTEFMUiBwYXJzaW5nLgoKMDUvMjcvMDU6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBsZXgucHkgY29weSBjb25zdHJ1Y3Rvci4gIFJlcG9ydGVkIGJ5IERhdmUgQWl0ZWwsIEFhcm9uIExhdiwKICAgICAgICAgIGFuZCBUaGFkIEF1c3Rpbi4gCgowNS8yNy8wNTogYmVhemxleQogICAgICAgICAgQWRkZWQgb3V0cHV0ZGlyIG9wdGlvbiB0byB5YWNjKCkgIHRvIGNvbnRyb2wgb3V0cHV0IGRpcmVjdG9yeS4gQ29udHJpYnV0ZWQKICAgICAgICAgIGJ5IENocmlzdG9waGVyIFN0YXdhcnouCgowNS8yNy8wNTogYmVhemxleQogICAgICAgICAgQWRkZWQgcnVudW5pdC5weSB0ZXN0IHNjcmlwdCB0byBydW4gdGVzdHMgdXNpbmcgdGhlIFB5dGhvbiB1bml0dGVzdCBtb2R1bGUuCiAgICAgICAgICBDb250cmlidXRlZCBieSBNaWtpIFRlYmVrYS4KClZlcnNpb24gMS41Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQowNS8yNi8wNDogYmVhemxleQogICAgICAgICAgTWFqb3IgZW5oYW5jZW1lbnQuIExBTFIoMSkgcGFyc2luZyBzdXBwb3J0IGlzIG5vdyB3b3JraW5nLgogICAgICAgICAgVGhpcyBmZWF0dXJlIHdhcyBpbXBsZW1lbnRlZCBieSBFbGlhcyBJb3VwIChlemlvdXBAYWx1bW5pLnVjaGljYWdvLmVkdSkKICAgICAgICAgIGFuZCBvcHRpbWl6ZWQgYnkgRGF2aWQgQmVhemxleS4gVG8gdXNlIExBTFIoMSkgcGFyc2luZyBkbwogICAgICAgICAgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgIHlhY2MueWFjYyhtZXRob2Q9IkxBTFIiKQoKICAgICAgICAgIENvbXB1dGluZyBMQUxSKDEpIHBhcnNpbmcgdGFibGVzIHRha2VzIGFib3V0IHR3aWNlIGFzIGxvbmcgYXMKICAgICAgICAgIHRoZSBkZWZhdWx0IFNMUiBtZXRob2QuICBIb3dldmVyLCBMQUxSKDEpIGFsbG93cyB5b3UgdG8gaGFuZGxlCiAgICAgICAgICBtb3JlIGNvbXBsZXggZ3JhbW1hcnMuICBGb3IgZXhhbXBsZSwgdGhlIEFOU0kgQyBncmFtbWFyCiAgICAgICAgICAoaW4gZXhhbXBsZS9hbnNpYykgaGFzIDEzIHNoaWZ0LXJlZHVjZSBjb25mbGljdHMgd2l0aCBTTFIsIGJ1dAogICAgICAgICAgb25seSBoYXMgMSBzaGlmdC1yZWR1Y2UgY29uZmxpY3Qgd2l0aCBMQUxSKDEpLgoKMDUvMjAvMDQ6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgX19sZW5fXyBtZXRob2QgdG8gcGFyc2VyIHByb2R1Y3Rpb24gbGlzdHMuICBDYW4KICAgICAgICAgIGJlIHVzZWQgaW4gcGFyc2VyIHJ1bGVzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICBkZWYgcF9zb21lcnVsZShwKToKICAgICAgICAgICAgICAgICAiIiJhIDogQiBDIEQKICAgICAgICAgICAgICAgICAgICAgIHwgRSBGIgogICAgICAgICAgICAgICAgIGlmIChsZW4ocCkgPT0gMyk6CiAgICAgICAgICAgICAgICAgICAgICMgTXVzdCBoYXZlIGJlZW4gZmlyc3QgcnVsZQogICAgICAgICAgICAgICAgIGVsaWYgKGxlbihwKSA9PSAyKToKICAgICAgICAgICAgICAgICAgICAgIyBNdXN0IGJlIHNlY29uZCBydWxlCgogICAgICAgICAgU3VnZ2VzdGVkIGJ5IEpvc2h1YSBHZXJ0aCBhbmQgb3RoZXJzLgoKVmVyc2lvbiAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA0LzIzLzA0OiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgYSB2YXJpZXR5IG9mIHBhdGNoZXMgY29udHJpYnV0ZWQgYnkgRXJpYyBSYXltb25kLgogICAgICAgICAgVGhlc2UgaW5jbHVkZToKCiAgICAgICAgICAgMC4gQ2xlYW5zIHVwIHNvbWUgY29tbWVudHMgc28gdGhleSBkb24ndCB3cmFwIG9uIGFuIDgwLWNvbHVtbiBkaXNwbGF5LgogICAgICAgICAgIDEuIERpcmVjdHMgY29tcGlsZXIgZXJyb3JzIHRvIHN0ZGVyciB3aGVyZSB0aGV5IGJlbG9uZy4KICAgICAgICAgICAyLiBJbXBsZW1lbnRzIGFuZCBkb2N1bWVudHMgYXV0b21hdGljIGxpbmUgY291bnRpbmcgd2hlbiBcbiBpcyBpZ25vcmVkLgogICAgICAgICAgIDMuIENoYW5nZXMgdGhlIHdheSBwcm9ncmVzcyBtZXNzYWdlcyBhcmUgZHVtcGVkIHdoZW4gZGVidWdnaW5nIGlzIG9uLiAKICAgICAgICAgICAgICBUaGUgbmV3IGZvcm1hdCBpcyBib3RoIGxlc3MgdmVyYm9zZSBhbmQgY29udmV5cyBtb3JlIGluZm9ybWF0aW9uIHRoYW4KICAgICAgICAgICAgICB0aGUgb2xkLCBpbmNsdWRpbmcgc2hpZnQgYW5kIHJlZHVjZSBhY3Rpb25zLgoKMDQvMjMvMDQ6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgUHl0aG9uIHNldHVwLnB5IGZpbGUgdG8gc2ltcGx5IGluc3RhbGxhdGlvbi4gIENvbnRyaWJ1dGVkCiAgICAgICAgICBieSBBZGFtIEtlcnJpc29uLgoKMDQvMjMvMDQ6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHBhdGNoZXMgY29udHJpYnV0ZWQgYnkgQWRhbSBLZXJyaXNvbi4KIAogICAgICAgICAgLSAgIFNvbWUgb3V0cHV0IGlzIG5vdyBvbmx5IHNob3duIHdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQuICBUaGlzCiAgICAgICAgICAgICAgbWVhbnMgdGhhdCBQTFkgd2lsbCBiZSBjb21wbGV0ZWx5IHNpbGVudCB3aGVuIG5vdCBpbiBkZWJ1Z2dpbmcgbW9kZS4KICAgICAgICAgIAogICAgICAgICAgLSAgIEFuIG9wdGlvbmFsIHBhcmFtZXRlciAid3JpdGVfdGFibGVzIiBjYW4gYmUgcGFzc2VkIHRvIHlhY2MoKSB0bwogICAgICAgICAgICAgIGNvbnRyb2wgd2hldGhlciBvciBub3QgcGFyc2luZyB0YWJsZXMgYXJlIHdyaXR0ZW4uICAgQnkgZGVmYXVsdCwKICAgICAgICAgICAgICBpdCBpcyB0cnVlLCBidXQgaXQgY2FuIGJlIHR1cm5lZCBvZmYgaWYgeW91IGRvbid0IHdhbnQgdGhlIHlhY2MKICAgICAgICAgICAgICB0YWJsZSBmaWxlLiBOb3RlOiBkaXNhYmxpbmcgdGhpcyB3aWxsIGNhdXNlIHlhY2MoKSB0byByZWdlbmVyYXRlCiAgICAgICAgICAgICAgdGhlIHBhcnNpbmcgdGFibGUgZWFjaCB0aW1lLgoKMDQvMjMvMDQ6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHBhdGNoZXMgY29udHJpYnV0ZWQgYnkgRGF2aWQgTWNOYWIuICBUaGlzIHBhdGNoIGFkZGVzIHR3bwogICAgICAgICAgZmVhdHVyZXM6CgogICAgICAgICAgLSAgIFRoZSBwYXJzZXIgY2FuIGJlIHN1cHBsaWVkIGFzIGEgY2xhc3MgaW5zdGVhZCBvZiBhIG1vZHVsZS4KICAgICAgICAgICAgICBGb3IgYW4gZXhhbXBsZSBvZiB0aGlzLCBzZWUgdGhlIGV4YW1wbGUvY2xhc3NjYWxjIGRpcmVjdG9yeS4KCiAgICAgICAgICAtICAgRGVidWdnaW5nIG91dHB1dCBjYW4gYmUgZGlyZWN0ZWQgdG8gYSBmaWxlbmFtZSBvZiB0aGUgdXNlcidzCiAgICAgICAgICAgICAgY2hvaWNlLiAgVXNlCgogICAgICAgICAgICAgICAgIHlhY2MoZGVidWdmaWxlPSJzb21lZmlsZS5vdXQiKQoKICAgICAgICAgIApWZXJzaW9uIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMTIvMTAvMDI6IGptZHljawogICAgICAgICAgVmFyaW91cyBtaW5vciBhZGp1c3RtZW50cyB0byB0aGUgY29kZSB0aGF0IERhdmUgY2hlY2tlZCBpbiB0b2RheS4KICAgICAgICAgIFVwZGF0ZWQgdGVzdC95YWNjX3tpbmYsdW51c2VkfS5leHAgdG8gcmVmbGVjdCB0b2RheSdzIGNoYW5nZXMuCgoxMi8xMC8wMjogYmVhemxleQogICAgICAgICAgSW5jb3Jwb3JhdGVkIGEgdmFyaWV0eSBvZiBtaW5vciBidWcgZml4ZXMgdG8gZW1wdHkgcHJvZHVjdGlvbgogICAgICAgICAgaGFuZGxpbmcgYW5kIGluZmluaXRlIHJlY3Vyc2lvbiBjaGVja2luZy4gIENvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICBNaWNoYWVsIER5Y2suCgoxMi8xMC8wMjogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCBib2d1cyByZWNvdmVyKCkgbWV0aG9kIGNhbGwgaW4geWFjYy5yZXN0YXJ0KCkKClZlcnNpb24gMS4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoxMS8yNy8wMjogYmVhemxleQogICAgICAgICAgTGV4ZXIgYW5kIHBhcnNlciBvYmplY3RzIGFyZSBub3cgYXZhaWxhYmxlIGFzIGFuIGF0dHJpYnV0ZQogICAgICAgICAgb2YgdG9rZW5zIGFuZCBzbGljZXMgcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgZGVmIHRfTlVNQkVSKHQpOgogICAgICAgICAgICAgICAgIHInXGQrJwogICAgICAgICAgICAgICAgIHByaW50IHQubGV4ZXIKCiAgICAgICAgICAgICBkZWYgcF9leHByX3BsdXModCk6CiAgICAgICAgICAgICAgICAgJ2V4cHI6IGV4cHIgUExVUyBleHByJwogICAgICAgICAgICAgICAgIHByaW50IHQubGV4ZXIKICAgICAgICAgICAgICAgICBwcmludCB0LnBhcnNlcgoKICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHN0YXRlIG1hbmFnZW1lbnQgKGlmIG5lZWRlZCkuCiAKMTAvMzEvMDI6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHlhY2MucHkgdG8gd29yayB3aXRoIFB5dGhvbiBvcHRpbWl6ZSBtb2RlLiAgVG8gbWFrZQogICAgICAgICAgdGhpcyB3b3JrLCB5b3UgbmVlZCB0byB1c2UKCiAgICAgICAgICAgICAgeWFjYy55YWNjKG9wdGltaXplPTEpCgogICAgICAgICAgRnVydGhlcm1vcmUsIHlvdSBuZWVkIHRvIGZpcnN0IHJ1biBQeXRob24gaW4gbm9ybWFsIG1vZGUKICAgICAgICAgIHRvIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkgcGFyc2V0YWIucHkgZmlsZXMuICBBZnRlciB0aGF0LAogICAgICAgICAgeW91IGNhbiB1c2UgcHl0aG9uIC1PIG9yIHB5dGhvbiAtT08uICAKCiAgICAgICAgICBOb3RlOiBvcHRpbWl6ZWQgbW9kZSB0dXJucyBvZmYgYSBsb3Qgb2YgZXJyb3IgY2hlY2tpbmcuCiAgICAgICAgICBPbmx5IHVzZSB3aGVuIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgZ3JhbW1hciBpcyB3b3JraW5nLgogICAgICAgICAgTWFrZSBzdXJlIHBhcnNldGFiLnB5IGlzIHVwIHRvIGRhdGUhCgoxMC8zMC8wMjogYmVhemxleQogICAgICAgICAgQWRkZWQgY2xvbmluZyBvZiBMZXhlciBvYmplY3RzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBpbXBvcnQgY29weQogICAgICAgICAgICAgIGwgPSBsZXgubGV4KCkKICAgICAgICAgICAgICBsYyA9IGNvcHkuY29weShsKQoKICAgICAgICAgICAgICBsLmlucHV0KCJTb21lIHRleHQiKQogICAgICAgICAgICAgIGxjLmlucHV0KCJTb21lIG90aGVyIHRleHQiKQogICAgICAgICAgICAgIC4uLgoKICAgICAgICAgIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIHRoZSBzYW1lICJsZXhlciIgaXMgbWVhbnQgdG8KICAgICAgICAgIGJlIHVzZWQgaW4gZGlmZmVyZW50IGNvbnRleHRzLS0tb3IgaWYgbXVsdGlwbGUgbGV4ZXJzCiAgICAgICAgICBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCiAgICAgICAgICAgICAgICAKMTAvMzAvMDI6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgd2l0aCBmaXJzdCBzZXQgY29tcHV0YXRpb24gYW5kIGVtcHR5IHByb2R1Y3Rpb25zLgogICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IE1pY2hhZWwgRHljay4KCjEwLzMwLzAyOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBlcnJvciBtZXNzYWdlcyB0byB1c2UgImZpbGVuYW1lOmxpbmU6IG1lc3NhZ2UiIGluc3RlYWQKICAgICAgICAgIG9mICJmaWxlbmFtZTpsaW5lLiBtZXNzYWdlIi4gIFRoaXMgbWFrZXMgZXJyb3IgcmVwb3J0aW5nIG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIGVtYWNzLiBQYXRjaCBzdWJtaXR0ZWQgYnkgRnJhbudvaXMgUGluYXJkLgoKMTAvMzAvMDI6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVtZW50cyB0byBwYXJzZXIub3V0IGZpbGUuICBUZXJtaW5hbHMgYW5kIG5vbnRlcm1pbmFscwogICAgICAgICAgYXJlIHNvcnRlZCBpbnN0ZWFkIG9mIGJlaW5nIHByaW50ZWQgaW4gcmFuZG9tIG9yZGVyLgogICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEZyYW7nb2lzIFBpbmFyZC4KCjEwLzMwLzAyOiBiZWF6bGV5CiAgICAgICAgICBJbXByb3ZlbWVudHMgdG8gcGFyc2VyLm91dCBmaWxlIG91dHB1dC4gIFJ1bGVzIGFyZSBub3cgcHJpbnRlZAogICAgICAgICAgaW4gYSB3YXkgdGhhdCdzIGVhc2llciB0byB1bmRlcnN0YW5kLiAgQ29udHJpYnV0ZWQgYnkgUnVzcyBDb3guCgoxMC8zMC8wMjogYmVhemxleQogICAgICAgICAgQWRkZWQgJ25vbmFzc29jJyBhc3NvY2lhdGl2aXR5IHN1cHBvcnQuICAgIFRoaXMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGRpc2FibGUgdGhlIGNoYWluaW5nIG9mIG9wZXJhdG9ycyBsaWtlIGEgPCBiIDwgYy4KICAgICAgICAgIFRvIHVzZSwgc2ltcGx5IHNwZWNpZnkgJ25vbmFzc29jJyBpbiB0aGUgcHJlY2VkZW5jZSB0YWJsZQoKICAgICAgICAgIHByZWNlZGVuY2UgPSAoCiAgICAgICAgICAgICgnbm9uYXNzb2MnLCAnTEVTU1RIQU4nLCAnR1JFQVRFUlRIQU4nKSwgICMgTm9uYXNzb2NpYXRpdmUgb3BlcmF0b3JzCiAgICAgICAgICAgICgnbGVmdCcsICdQTFVTJywgJ01JTlVTJyksCiAgICAgICAgICAgICgnbGVmdCcsICdUSU1FUycsICdESVZJREUnKSwKICAgICAgICAgICAgKCdyaWdodCcsICdVTUlOVVMnKSwgICAgICAgICAgICAjIFVuYXJ5IG1pbnVzIG9wZXJhdG9yCiAgICAgICAgICApCgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUnVzcyBDb3guCgoxMC8zMC8wMjogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIGxleGVyIHRvIHByb3ZpZGUgb3B0aW9uYWwgc3VwcG9ydCBmb3IgUHl0aG9uIC1PIGFuZCAtT08KICAgICAgICAgIG1vZGVzLiAgVG8gbWFrZSB0aGlzIHdvcmssIFB5dGhvbiAqZmlyc3QqIG5lZWRzIHRvIGJlIHJ1biBpbgogICAgICAgICAgdW5vcHRpbWl6ZWQgbW9kZS4gIFRoaXMgcmVhZHMgdGhlIGxleGluZyBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlcyBhCiAgICAgICAgICBmaWxlICJsZXh0YWIucHkiLiAgVGhlbiwgcnVuIGxleCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgIyBtb2R1bGUgZm9vLnB5CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgbGV4LmxleChvcHRpbWl6ZT0xKQoKICAgICAgICAgIE9uY2UgdGhlIGxleHRhYiBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQsIHN1YnNlcXVlbnQgY2FsbHMgdG8KICAgICAgICAgIGxleC5sZXgoKSB3aWxsIHJlYWQgZGF0YSBmcm9tIHRoZSBsZXh0YWIgZmlsZSBpbnN0ZWFkIG9mIHVzaW5nIAogICAgICAgICAgaW50cm9zcGVjdGlvbi4gICBJbiBvcHRpbWl6ZWQgbW9kZSAoLU8sIC1PTykgZXZlcnl0aGluZyBzaG91bGQKICAgICAgICAgIHdvcmsgbm9ybWFsbHkgZGVzcGl0ZSB0aGUgbG9zcyBvZiBkb2Mgc3RyaW5ncy4KCiAgICAgICAgICBUbyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGZpbGUgJ2xleHRhYi5weScgdXNlIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgICBsZXgubGV4KGxleHRhYj0iZm9vdGFiIikKCiAgICAgICAgICAodGhpcyBjcmVhdGVzIGEgZmlsZSBmb290YWIucHkpCiAgICAgICAgIAoKVmVyc2lvbiAxLjEgICBPY3RvYmVyIDI1LCAyMDAxCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMTAvMjUvMDE6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0YWJsZSBnZW5lcmF0b3IgdG8gcHJvZHVjZSBtdWNoIG1vcmUgY29tcGFjdCBkYXRhLgogICAgICAgICAgVGhpcyBzaG91bGQgZ3JlYXRseSByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHBhcnNldGFiLnB5W2NdIGZpbGUuCiAgICAgICAgICBDYXZlYXQ6IHRoZSB0YWJsZXMgc3RpbGwgbmVlZCB0byBiZSBjb25zdHJ1Y3RlZCBzbyBhIGxpdHRsZSBtb3JlCiAgICAgICAgICB3b3JrIGlzIGRvbmUgaW4gcGFyc2V0YWIgb24gaW1wb3J0LiAKCjEwLzI1LzAxOiBiZWF6bGV5CiAgICAgICAgICBUaGVyZSBtYXkgYmUgYSBwb3NzaWJsZSBidWcgaW4gdGhlIGN5Y2xlIGRldGVjdG9yIHRoYXQgcmVwb3J0cyBlcnJvcnMKICAgICAgICAgIGFib3V0IGluZmluaXRlIHJlY3Vyc2lvbi4gICBJJ20gaGF2aW5nIGEgbGl0dGxlIHRyb3VibGUgdHJhY2tpbmcgaXQKICAgICAgICAgIGRvd24sIGJ1dCBpZiB5b3UgZ2V0IHRoaXMgcHJvYmxlbSwgeW91IGNhbiBkaXNhYmxlIHRoZSBjeWNsZQogICAgICAgICAgZGV0ZWN0b3IgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgeWFjYy55YWNjKGNoZWNrX3JlY3Vyc2lvbiA9IDApCgoxMC8yNS8wMTogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBidWcgaW4gbGV4LnB5IHRoYXQgc29tZXRpbWVzIGNhdXNlZCBpbGxlZ2FsIGNoYXJhY3RlcnMgdG8gYmUKICAgICAgICAgIHJlcG9ydGVkIGluY29ycmVjdGx5LiAgUmVwb3J0ZWQgYnkgU3ZlcnJlIEr4cmdlbnNlbi4KCjcvOC8wMSAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBsZXhlciBvYmplY3Qgd2hlbiB0b2tlbnMgYXJlIGhhbmRsZWQgYnkKICAgICAgICAgIGZ1bmN0aW9ucy4gICBUaGUgbGV4ZXIgaXMgYXZhaWxhYmxlIGFzIHRoZSAnbGV4ZXInIGF0dHJpYnV0ZS4gICBUaGlzCiAgICAgICAgICB3YXMgYWRkZWQgdG8gcHJvdmlkZSBiZXR0ZXIgbGV4aW5nIHN1cHBvcnQgZm9yIGxhbmd1YWdlcyBzdWNoIGFzIEZvcnRyYW4KICAgICAgICAgIHdoZXJlIGNlcnRhaW4gdHlwZXMgb2YgdG9rZW5zIGNhbid0IGJlIGNvbnZlbmllbnRseSBleHByZXNzZWQgYXMgcmVndWxhciAKICAgICAgICAgIGV4cHJlc3Npb25zIChhbmQgd2hlcmUgdGhlIHRva2VuaXppbmcgZnVuY3Rpb24gbWF5IHdhbnQgdG8gcGVyZm9ybSBhIAogICAgICAgICAgbGl0dGxlIGJhY2t0cmFja2luZykuICBTdWdnZXN0ZWQgYnkgUGVhcnUgUGV0ZXJzb24uCgo2LzIwLzAxIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgeWFjYygpIGZ1bmN0aW9uIHNvIHRoYXQgYW4gb3B0aW9uYWwgc3RhcnRpbmcgc3ltYm9sIGNhbiBiZSBzcGVjaWZpZWQuCiAgICAgICAgICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgeWFjYy55YWNjKHN0YXJ0PSJzdGF0ZW1lbnQiKQoKICAgICAgICAgIE5vcm1hbGx5IHlhY2MgYWx3YXlzIHRyZWF0cyB0aGUgZmlyc3QgcHJvZHVjdGlvbiBydWxlIGFzIHRoZSBzdGFydGluZyBzeW1ib2wuCiAgICAgICAgICBIb3dldmVyLCBpZiB5b3UgYXJlIGRlYnVnZ2luZyB5b3VyIGdyYW1tYXIgaXQgbWF5IGJlIHVzZWZ1bCB0byBzcGVjaWZ5CiAgICAgICAgICBhbiBhbHRlcm5hdGl2ZSBzdGFydGluZyBzeW1ib2wuICBJZGVhIHN1Z2dlc3RlZCBieSBSaWNoIFNhbHouCiAgICAgICAgICAgICAgICAgICAgICAKVmVyc2lvbiAxLjAgIEp1bmUgMTgsIDIwMDEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSW5pdGlhbCBwdWJsaWMgb2ZmZXJpbmcKCg==