ClZlcnNpb24gMy4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjAzLzI0LzA5OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBhbiBleHRyYSBjaGVjayB0byBub3QgcHJpbnQgZHVwbGljYXRlZCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICBhYm91dCByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cy4KCjAzLzI0LzA5OiBiZWF6bGV5CiAgICAgICAgICBTd2l0Y2hlZCBQTFkgb3ZlciB0byBhIEJTRC1saWNlbnNlLgoKMDMvMjMvMDk6IGJlYXpsZXkKICAgICAgICAgIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIERpc2NvdmVyZWQgYSBmZXcgcGxhY2VzIHRvIG1ha2UKICAgICAgICAgIHNwZWVkdXBzIGluIExSIHRhYmxlIGdlbmVyYXRpb24uCgowMy8yMy8wOTogYmVhemxleQogICAgICAgICAgTmV3IHdhcm5pbmcgbWVzc2FnZS4gIFBMWSBub3cgd2FybnMgYWJvdXQgcnVsZXMgbmV2ZXIgCiAgICAgICAgICByZWR1Y2VkIGR1ZSB0byByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cy4gIFN1Z2dlc3RlZCBieQogICAgICAgICAgQnJ1Y2UgRnJlZGVyaWtzZW4uCgowMy8yMy8wOTogYmVhemxleQogICAgICAgICAgU29tZSBjbGVhbi11cCBvZiB3YXJuaW5nIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gcmVkdWNlL3JlZHVjZSBlcnJvcnMuCgowMy8yMy8wOTogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBuZXcgcGlja2xlZmlsZSBvcHRpb24gdG8geWFjYygpIHRvIHdyaXRlIHRoZSBwYXJzaW5nCiAgICAgICAgICB0YWJsZXMgdG8gYSBmaWxlbmFtZSB1c2luZyB0aGUgcGlja2xlIG1vZHVsZS4gICBIZXJlIGlzIGhvdwogICAgICAgICAgaXQgd29ya3M6CgogICAgICAgICAgICAgIHlhY2MocGlja2xlZmlsZT0icGFyc2V0YWIucCIpCgogICAgICAgICAgVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgaWYgdGhlIG5vcm1hbCBwYXJzZXRhYi5weSBmaWxlIGlzCiAgICAgICAgICBleHRyZW1lbHkgbGFyZ2UuICBGb3IgZXhhbXBsZSwgb24ganl0aG9uLCBpdCBpcyBpbXBvc3NpYmxlCiAgICAgICAgICB0byByZWFkIHBhcnNpbmcgdGFibGVzIGlmIHRoZSBwYXJzZXRhYi5weSBleGNlZWRzIGEgY2VydGFpbgogICAgICAgICAgdGhyZXNob2xkLgoKICAgICAgICAgIFRoZSBmaWxlbmFtZSBzdXBwbGllZCB0byB0aGUgcGlja2xlZmlsZSBvcHRpb24gaXMgb3BlbmVkCiAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgUHl0aG9uIAogICAgICAgICAgaW50ZXJwcmV0ZXIuICBJZiB5b3UgbmVlZCB0byByZWZlciB0byB0aGUgZmlsZSBlbHNld2hlcmUsCiAgICAgICAgICB5b3Ugd2lsbCBuZWVkIHRvIHN1cHBseSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoLgoKICAgICAgICAgIEZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCB0aGUgcGlja2xlIGZpbGUgaXMgd3JpdHRlbgogICAgICAgICAgdXNpbmcgcHJvdG9jb2wgMC4gCiAKMDMvMTMvMDk6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHBhcnNlci5vdXQgZ2VuZXJhdGlvbiB3aGVyZSB0aGUgcnVsZSBudW1iZXJzCiAgICAgICAgICB3aGVyZSBvZmYgYnkgb25lLgoKMDMvMTMvMDk6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgc3RyaW5nIGZvcm1hdHRpbmcgYnVnIHdpdGggb25lIG9mIHRoZSBlcnJvciBtZXNzYWdlcy4KICAgICAgICAgIFJlcG9ydGVkIGJ5IFJpY2hhcmQgUmVpdG1leWVyCgpWZXJzaW9uIDMuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQowMi8yOC8wOTogYmVhemxleQogICAgICAgICAgRml4ZWQgYnJva2VuIHN0YXJ0IGFyZ3VtZW50IHRvIHlhY2MoKS4gIFBMWS0zLjAgYnJva2UgdGhpcwogICAgICAgICAgZmVhdHVyZSBieSBhY2NpZGVudC4KCjAyLzI4LzA5OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBkZWJ1Z2dpbmcgb3V0cHV0LiB5YWNjKCkgbm8gbG9uZ2VyIHJlcG9ydHMgc2hpZnQvcmVkdWNlCiAgICAgICAgICBvciByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cyBpZiBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9mZi4gIFRoaXMKICAgICAgICAgIHJlc3RvcmVzIHNpbWlsYXIgYmVoYXZpb3IgaW4gUExZLTIuNS4gICBSZXBvcnRlZCBieSBBbmRyZXcgV2F0ZXJzLgoKVmVyc2lvbiAzLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDIvMDMvMDk6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1pc3NpbmcgbGV4ZXIgYXR0cmlidXRlIG9uIGNlcnRhaW4gdG9rZW5zIHdoZW4KICAgICAgICAgIGludm9raW5nIHRoZSBwYXJzZXIgcF9lcnJvcigpIGZ1bmN0aW9uLiAgUmVwb3J0ZWQgYnkgCiAgICAgICAgICBCYXJ0IFdoaXRlbGV5LgoKMDIvMDIvMDk6IGJlYXpsZXkKICAgICAgICAgIFRoZSBsZXgoKSBjb21tYW5kIG5vdyBkb2VzIGFsbCBlcnJvci1yZXBvcnRpbmcgYW5kIGRpYWdvbmlzdGljcwogICAgICAgICAgdXNpbmcgdGhlIGxvZ2dpbmcgbW9kdWxlIGludGVyZmFjZS4gICBQYXNzIGluIGEgTG9nZ2VyIG9iamVjdAogICAgICAgICAgdXNpbmcgdGhlIGVycm9ybG9nIHBhcmFtZXRlciB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGxvZ2dlci4KCjAyLzAyLzA5OiBiZWF6bGV5CiAgICAgICAgICBSZWZhY3RvcmVkIHBseS5sZXggdG8gdXNlIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgYW5kIG9yZ2FuaXplZAogICAgICAgICAgYXBwcm9hY2ggdG8gY29sbGVjdGluZyBsZXhlciBpbmZvcm1hdGlvbi4KCjAyLzAxLzA5OiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBub3dhcm4gb3B0aW9uIGZyb20gbGV4KCkuICBBbGwgb3V0cHV0IGlzIGNvbnRyb2xsZWQKICAgICAgICAgIGJ5IHBhc3NpbmcgaW4gYSBsb2dnZXIgb2JqZWN0LiAgIEp1c3QgcGFzcyBpbiBhIGxvZ2dlciB3aXRoIGEgaGlnaAogICAgICAgICAgbGV2ZWwgc2V0dGluZyB0byBzdXBwcmVzcyBvdXRwdXQuICAgVGhpcyBhcmd1bWVudCB3YXMgbmV2ZXIgCiAgICAgICAgICBkb2N1bWVudGVkIHRvIGJlZ2luIHdpdGggc28gaG9wZWZ1bGx5IG5vIG9uZSB3YXMgcmVseWluZyB1cG9uIGl0LgoKMDIvMDEvMDk6IGJlYXpsZXkKICAgICAgICAgIERpc2NvdmVyZWQgYW5kIHJlbW92ZWQgYSBkZWFkIGlmLXN0YXRlbWVudCBpbiB0aGUgbGV4ZXIuICBUaGlzCiAgICAgICAgICByZXN1bHRlZCBpbiBhIDYtNyUgc3BlZWR1cCBpbiBsZXhpbmcgd2hlbiBJIHRlc3RlZCBpdC4KCjAxLzEzLzA5OiBiZWF6bGV5CiAgICAgICAgICBNaW5vciBjaGFuZ2UgdG8gdGhlIHByb2NlZHVyZSBmb3Igc2lnbmFsbGluZyBhIHN5bnRheCBlcnJvciBpbiBhCiAgICAgICAgICBwcm9kdWN0aW9uIHJ1bGUuICBBIG5vcm1hbCBTeW50YXhFcnJvciBleGNlcHRpb24gc2hvdWxkIGJlIHJhaXNlZAogICAgICAgICAgaW5zdGVhZCBvZiB5YWNjLlN5bnRheEVycm9yLgoKMDEvMTMvMDk6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgbmV3IG1ldGhvZCBwLnNldF9saW5lbm8obixsaW5lbm8pIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZQogICAgICAgICAgbGluZSBudW1iZXIgb2Ygc3ltYm9sIG4gaW4gZ3JhbW1hciBydWxlcy4gICBUaGlzIHNpbXBsaWZpZXMgbWFudWFsCiAgICAgICAgICB0cmFja2luZyBvZiBsaW5lIG51bWJlcnMuCgowMS8xMS8wOTogYmVhemxleQogICAgICAgICAgVmFzdGx5IGltcHJvdmVkIGRlYnVnZ2luZyBzdXBwb3J0IGZvciB5YWNjLnBhcnNlKCkuICAgSW5zdGVhZCBvZiBwYXNzaW5nCiAgICAgICAgICBkZWJ1ZyBhcyBhbiBpbnRlZ2VyLCB5b3UgY2FuIHN1cHBseSBhIExvZ2dpbmcgb2JqZWN0IChzZWUgdGhlIGxvZ2dpbmcKICAgICAgICAgIG1vZHVsZSkuIE1lc3NhZ2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGF0IHRoZSBFUlJPUiwgSU5GTywgYW5kIERFQlVHCgkgIGxvZ2dpbmcgbGV2ZWxzLCBlYWNoIGxldmVsIHByb3ZpZGluZyBwcm9ncmVzc2l2ZWx5IG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICBUaGUgZGVidWdnaW5nIHRyYWNlIGFsc28gc2hvd3Mgc3RhdGVzLCBncmFtbWFyIHJ1bGUsIHZhbHVlcyBwYXNzZWQKICAgICAgICAgIGludG8gZ3JhbW1hciBydWxlcywgYW5kIHRoZSByZXN1bHQgb2YgZWFjaCByZWR1Y3Rpb24uCgowMS8wOS8wOTogYmVhemxleQogICAgICAgICAgVGhlIHlhY2MoKSBjb21tYW5kIG5vdyBkb2VzIGFsbCBlcnJvci1yZXBvcnRpbmcgYW5kIGRpYWdub3N0aWNzIHVzaW5nCiAgICAgICAgICB0aGUgaW50ZXJmYWNlIG9mIHRoZSBsb2dnaW5nIG1vZHVsZS4gIFVzZSB0aGUgZXJyb3Jsb2cgcGFyYW1ldGVyIHRvCiAgICAgICAgICBzcGVjaWZ5IGEgbG9nZ2luZyBvYmplY3QgZm9yIGVycm9yIG1lc3NhZ2VzLiAgVXNlIHRoZSBkZWJ1Z2xvZyBwYXJhbWV0ZXIKICAgICAgICAgIHRvIHNwZWNpZnkgYSBsb2dnaW5nIG9iamVjdCBmb3IgdGhlICdwYXJzZXIub3V0JyBvdXRwdXQuCgowMS8wOS8wOTogYmVhemxleQogICAgICAgICAgKkhVR0UqIHJlZmFjdG9yaW5nIG9mIHRoZSB0aGUgcGx5LnlhY2MoKSBpbXBsZW1lbnRhdGlvbi4gICBUaGUgaGlnaC1sZXZlbAoJICB1c2VyIGludGVyZmFjZSBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSwgYnV0IHRoZSBpbnRlcm5hbHMgYXJlIGNvbXBsZXRlbHkKICAgICAgICAgIHJlb3JnYW5pemVkIGludG8gY2xhc3Nlcy4gIE5vIG1vcmUgZ2xvYmFsIHZhcmlhYmxlcy4gICAgVGhlIGludGVybmFscwogICAgICAgICAgYXJlIGFsc28gbW9yZSBleHRlbnNpYmxlLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZSBjbGFzc2VzIHRvIAogICAgICAgICAgY29uc3RydWN0IGEgTEFMUigxKSBwYXJzZXIgaW4gYW4gZW50aXJlbHkgZGlmZmVyZW50IG1hbm5lciB0aGFuIAogICAgICAgICAgd2hhdCBpcyBjdXJyZW50bHkgdGhlIGNhc2UuICBEb2N1bWVudGF0aW9uIGlzIGZvcnRoY29taW5nLgoKMDEvMDcvMDk6IGJlYXpsZXkKICAgICAgICAgIFZhcmlvdXMgY2xlYW51cCBhbmQgcmVmYWN0b3Jpbmcgb2YgeWFjYyBpbnRlcm5hbHMuICAKCjAxLzA2LzA5OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHByZWNlZGVuY2UgYXNzaWdubWVudC4gIHlhY2Mgd2FzIGFzc2lnbmluZyB0aGUgcHJlY2VkZW5jZQogICAgICAgICAgZWFjaCBydWxlIGJhc2VkIG9uIHRoZSBsZWZ0LW1vc3QgdG9rZW4sIHdoZW4gaW4gZmFjdCwgaXQgc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgdXNpbmcgdGhlIHJpZ2h0LW1vc3QgdG9rZW4uICBSZXBvcnRlZCBieSBCcnVjZSBGcmVkZXJpa3Nlbi4KCjExLzI3LzA4OiBiZWF6bGV5CiAgICAgICAgICBOdW1lcm91cyBjaGFuZ2VzIHRvIHN1cHBvcnQgUHl0aG9uIDMuMCBpbmNsdWRpbmcgcmVtb3ZhbCBvZiBkZXByZWNhdGVkIAogICAgICAgICAgc3RhdGVtZW50cyAoZS5nLiwgaGFzX2tleSkgYW5kIHRoZSBhZGRpdGlvbmFsIG9mIGNvbXBhdGliaWxpdHkgY29kZQogICAgICAgICAgdG8gZW11bGF0ZSBmZWF0dXJlcyBmcm9tIFB5dGhvbiAyIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQsIGJ1dCB3aGljaAogICAgICAgICAgYXJlIG5lZWRlZC4gICBGaXhlZCB0aGUgdW5pdCB0ZXN0aW5nIHN1aXRlIHRvIHdvcmsgd2l0aCBQeXRob24gMy4wLgogICAgICAgICAgVGhlIGNvZGUgc2hvdWxkIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuCgoxMS8yNi8wODogYmVhemxleQogICAgICAgICAgTG9vc2VuZWQgdGhlIHJ1bGVzIG9uIHdoYXQga2luZCBvZiBvYmplY3RzIGNhbiBiZSBwYXNzZWQgaW4gYXMgdGhlCiAgICAgICAgICAibW9kdWxlIiBwYXJhbWV0ZXIgdG8gbGV4KCkgYW5kIHlhY2MoKS4gIFByZXZpb3VzbHksIHlvdSBjb3VsZCBvbmx5IHVzZQogICAgICAgICAgYSBtb2R1bGUgb3IgYW4gaW5zdGFuY2UuICBOb3csIFBMWSBqdXN0IHVzZXMgZGlyKCkgdG8gZ2V0IGEgbGlzdCBvZgogICAgICAgICAgc3ltYm9scyBvbiB3aGF0ZXZlciB0aGUgb2JqZWN0IGlzIHdpdGhvdXQgcmVnYXJkIGZvciBpdHMgdHlwZS4KCjExLzI2LzA4OiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIGFsbCBleGNlcHQ6IHN0YXRlbWVudHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFB5dGhvbjIueC8zLnggc3ludGF4LgoKMTEvMjYvMDg6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgYWxsIHJhaXNlIEV4Y2VwdGlvbiwgdmFsdWUgc3RhdGVtZW50cyB0byByYWlzZSBFeGNlcHRpb24odmFsdWUpIGZvcgogICAgICAgICAgZm9yd2FyZCBjb21wYXRpYmlsaXR5LgoKMTEvMjYvMDg6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgYWxsIHByaW50IHN0YXRlbWVudHMgZnJvbSBsZXggYW5kIHlhY2MsIHVzaW5nIHN5cy5zdGRvdXQgYW5kIHN5cy5zdGRlcnIKICAgICAgICAgIGRpcmVjdGx5LiAgUHJlcGFyYXRpb24gZm9yIFB5dGhvbiAzLjAgc3VwcG9ydC4KCjExLzA0LzA4OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHJlZmVycmluZyB0byBzeW1ib2xzIG9uIHRoZSB0aGUgcGFyc2luZyBzdGFjayB1c2luZyBuZWdhdGl2ZQogICAgICAgICAgaW5kaWNlcy4KCjA1LzI5LzA4OiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IHJldmFtcGVkIHRoZSB0ZXN0aW5nIHN5c3RlbSB0byB1c2UgdGhlIHVuaXR0ZXN0IG1vZHVsZSBmb3IgZXZlcnl0aGluZy4KICAgICAgICAgIEFkZGVkIGFkZGl0aW9uYWwgdGVzdHMgdG8gY292ZXIgbmV3IGVycm9ycy93YXJuaW5ncy4KClZlcnNpb24gMi41Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA1LzI4LzA4OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHdyaXRpbmcgbGV4LXRhYmxlcyBpbiBvcHRpbWl6ZWQgbW9kZSBhbmQgc3RhcnQgc3RhdGVzLgogICAgICAgICAgUmVwb3J0ZWQgYnkgS2V2aW4gSGVucnkuCgpWZXJzaW9uIDIuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQowNS8wNC8wODogYmVhemxleQogICAgICAgICAgQSB2ZXJzaW9uIG51bWJlciBpcyBub3cgZW1iZWRkZWQgaW4gdGhlIHRhYmxlIGZpbGUgc2lnbmF0dXJlIHNvIHRoYXQgCiAgICAgICAgICB5YWNjIGNhbiBtb3JlIGdyYWNlZnVsbHkgYWNjb21vZGF0ZSBjaGFuZ2VzIHRvIHRoZSBvdXRwdXQgZm9ybWF0CiAgICAgICAgICBpbiB0aGUgZnV0dXJlLgoKMDUvMDQvMDg6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdW5kb2N1bWVudGVkIC5wdXNoYmFjaygpIG1ldGhvZCBvbiBncmFtbWFyIHByb2R1Y3Rpb25zLiAgSSdtCiAgICAgICAgICBub3Qgc3VyZSB0aGlzIGV2ZXIgd29ya2VkIGFuZCBjYW4ndCByZWNhbGwgZXZlciB1c2luZyBpdC4gIE1pZ2h0IGhhdmUKICAgICAgICAgIGJlZW4gYW4gYWJhbmRvbmVkIGlkZWEgdGhhdCBuZXZlciByZWFsbHkgZ290IGZsZXNoZWQgb3V0LiAgVGhpcwogICAgICAgICAgZmVhdHVyZSB3YXMgbmV2ZXIgZGVzY3JpYmVkIG9yIHRlc3RlZCBzbyByZW1vdmluZyBpdCBpcyBob3BlZnVsbHkKICAgICAgICAgIGhhcm1sZXNzLgoKMDUvMDQvMDg6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGV4dHJhIGVycm9yIGNoZWNraW5nIHRvIHlhY2MoKSB0byBkZXRlY3QgcHJlY2VkZW5jZSBydWxlcyBkZWZpbmVkCiAgICAgICAgICBmb3IgdW5kZWZpbmVkIHRlcm1pbmFsIHN5bWJvbHMuICAgVGhpcyBhbGxvd3MgeWFjYygpIHRvIGRldGVjdCBhIHBvdGVudGlhbAogICAgICAgICAgcHJvYmxlbSB0aGF0IGNhbiBiZSByZWFsbHkgdHJpY2t5IHRvIGRlYnVnIGlmIG5vIHdhcm5pbmcgbWVzc2FnZSBvciBlcnJvcgogICAgICAgICAgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYWJvdXQgaXQuCgowNS8wNC8wODogYmVhemxleQogICAgICAgICAgbGV4KCkgbm93IGhhcyBhbiBvdXRwdXRkaXIgdGhhdCBjYW4gc3BlY2lmeSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IKICAgICAgICAgIHRhYmxlcyB3aGVuIHJ1bm5pbmcgaW4gb3B0aW1pemUgbW9kZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGxleGVyID0gbGV4LmxleChvcHRpbWl6ZT1UcnVlLCBsZXh0YWI9Imx0YWIiLCBvdXRwdXRkaXI9ImZvby9iYXIiKQogCiAgICAgICAgICBUaGUgYmVoYXZpb3Igb2Ygc3BlY2lmeWluZyBhIHRhYmxlIG1vZHVsZSBhbmQgb3V0cHV0IGRpcmVjdG9yeSBhcmUKICAgICAgICAgIG1vcmUgYWxpZ25lZCB3aXRoIHRoZSBiZWhhdmlvciBvZiB5YWNjKCkuCiAgICAgICAgICAKMDUvMDQvMDg6IGJlYXpsZXkKICAgICAgICAgIFtJc3N1ZSA5XQogICAgICAgICAgRml4ZWQgZmlsZW5hbWUgYnVnIGluIHdoZW4gc3BlY2lmeWluZyB0aGUgbW9kdWxlbmFtZSBpbiBsZXgoKSBhbmQgeWFjYygpLiAKICAgICAgICAgIElmIHlvdSBzcGVjaWZpZWQgb3B0aW9ucyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgcGFyc2VyID0geWFjYy55YWNjKHRhYm1vZHVsZT0iZm9vLmJhci5wYXJzZXRhYiIsb3V0cHV0ZGlyPSJmb28vYmFyIikKCiAgICAgICAgICB5YWNjIHdvdWxkIGNyZWF0ZSBhIGZpbGUgImZvby5iYXIucGFyc2V0YWIucHkiIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkuCiAgICAgICAgICBOb3csIGl0IHNpbXBseSBnZW5lcmF0ZXMgYSBmaWxlICJwYXJzZXRhYi5weSIgaW4gdGhhdCBkaXJlY3RvcnkuIAogICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IGNwdGJpbmhvLgoKMDUvMDQvMDg6IGJlYXpsZXkKICAgICAgICAgIFNsaWdodCBtb2RpZmljYXRpb24gdG8gbGV4KCkgYW5kIHlhY2MoKSB0byBhbGxvdyB0aGVpciB0YWJsZSBmaWxlcwoJICB0byBiZSBsb2FkZWQgZnJvbSBhIHByZXZpb3VzbHkgbG9hZGVkIG1vZHVsZS4gICBUaGlzIG1pZ2h0IG1ha2UKCSAgaXQgZWFzaWVyIHRvIGxvYWQgdGhlIHBhcnNpbmcgdGFibGVzIGZyb20gYSBjb21wbGljYXRlZCBwYWNrYWdlCiAgICAgICAgICBzdHJ1Y3R1cmUuICBGb3IgZXhhbXBsZToKCgkgICAgICAgaW1wb3J0IGZvby5iYXIuc3BhbS5wYXJzZXRhYiBhcyBwYXJzZXRhYgogICAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPXBhcnNldGFiKQoKICAgICAgICAgIE5vdGU6ICBsZXggYW5kIHlhY2Mgd2lsbCBuZXZlciByZWdlbmVyYXRlIHRoZSB0YWJsZSBmaWxlIGlmIHVzZWQKICAgICAgICAgIGluIHRoZSBmb3JtLS0teW91IHdpbGwgZ2V0IGEgd2FybmluZyBtZXNzYWdlIGluc3RlYWQuIAogICAgICAgICAgVGhpcyBpZGVhIHN1Z2dlc3RlZCBieSBCcmlhbiBDbGFwcGVyLgoKCjA0LzI4LzA4OiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJpZyB3aXRoIHBfZXJyb3IoKSBmdW5jdGlvbnMgYmVpbmcgcGlja2VkIHVwIGNvcnJlY3RseQogICAgICAgICAgd2hlbiBydW5uaW5nIGluIHlhY2Mob3B0aW1pemU9MSkgbW9kZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICBCYXJ0IFdoaXRlbGV5LgoKMDIvMjgvMDg6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggJ25vbmFzc29jJyBwcmVjZWRlbmNlIHJ1bGVzLiAgIEJhc2ljYWxseSB0aGUKICAgICAgICAgIG5vbi1wcmVjZWRlbmNlIHdhcyBiZWluZyBpZ25vcmVkIGFuZCBub3QgcHJvZHVjaW5nIHRoZSBjb3JyZWN0CiAgICAgICAgICBydW4tdGltZSBiZWhhdmlvciBpbiB0aGUgcGFyc2VyLgoKMDIvMTYvMDg6IGJlYXpsZXkKICAgICAgICAgIFNsaWdodCByZWxheGF0aW9uIG9mIHdoYXQgdGhlIGlucHV0KCkgbWV0aG9kIHRvIGEgbGV4ZXIgd2lsbAogICAgICAgICAgYWNjZXB0IGFzIGEgc3RyaW5nLiAgIEluc3RlYWQgb2YgdGVzdGluZyB0aGUgaW5wdXQgdG8gc2VlCiAgICAgICAgICBpZiB0aGUgaW5wdXQgaXMgYSBzdHJpbmcgb3IgdW5pY29kZSBzdHJpbmcsIGl0IGNoZWNrcyB0byBzZWUKICAgICAgICAgIGlmIHRoZSBpbnB1dCBvYmplY3QgbG9va3MgbGlrZSBpdCBjb250YWlucyBzdHJpbmcgZGF0YS4KICAgICAgICAgIFRoaXMgY2hhbmdlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHBhc3Mgc3RyaW5nLWxpa2Ugb2JqZWN0cwogICAgICAgICAgaW4gYXMgaW5wdXQuICBGb3IgZXhhbXBsZSwgdGhlIG9iamVjdCByZXR1cm5lZCBieSBtbWFwLgoKICAgICAgICAgICAgICBpbXBvcnQgbW1hcCwgb3MKICAgICAgICAgICAgICBkYXRhID0gbW1hcC5tbWFwKG9zLm9wZW4oZmlsZW5hbWUsb3MuT19SRE9OTFkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5nZXRzaXplKGZpbGVuYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQogICAgICAgICAgICAgIGxleGVyLmlucHV0KGRhdGEpCiAgICAgICAgICAgCgoxMS8yOS8wNzogYmVhemxleQogICAgICAgICAgTW9kaWZpY2F0aW9uIG9mIHBseS5sZXggdG8gYWxsb3cgdG9rZW4gZnVuY3Rpb25zIHRvIGFsaWFzZWQuCiAgICAgICAgICBUaGlzIGlzIHN1YnRsZSwgYnV0IGl0IG1ha2VzIGl0IGVhc2llciB0byBjcmVhdGUgbGlicmFyaWVzIGFuZAogICAgICAgICAgdG8gcmV1c2UgdG9rZW4gc3BlY2lmaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgZGVmaW5lZAogICAgICAgICAgYSBmdW5jdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBkZWYgbnVtYmVyKHQpOgogICAgICAgICAgICAgICAgICAgIHInXGQrJwogICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdAoKICAgICAgICAgIFRoaXMgY2hhbmdlIHdvdWxkIGFsbG93IHlvdSB0byBkZWZpbmUgYSB0b2tlbiBydWxlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgIHRfTlVNQkVSID0gbnVtYmVyCgogICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdG9rZW4gdHlwZSB3aWxsIGJlIHNldCB0byAnTlVNQkVSJyBhbmQgdXNlCiAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBudW1iZXIoKSBmdW5jdGlvbiB0byBwcm9jZXNzIHRva2Vucy4gICAKICAgICAgICAgICAKMTEvMjgvMDc6IGJlYXpsZXkKICAgICAgICAgIFNsaWdodCBtb2RpZmljYXRpb24gdG8gbGV4IGFuZCB5YWNjIHRvIGdyYWIgc3ltYm9scyBmcm9tIGJvdGgKICAgICAgICAgIHRoZSBsb2NhbCBhbmQgZ2xvYmFsIGRpY3Rpb25hcmllcyBvZiB0aGUgY2FsbGVyLiAgIFRoaXMKICAgICAgICAgIG1vZGlmaWNhdGlvbiBhbGxvd3MgbGV4ZXJzIGFuZCBwYXJzZXJzIHRvIGJlIGRlZmluZWQgdXNpbmcKICAgICAgICAgIGlubmVyIGZ1bmN0aW9ucyBhbmQgY2xvc3VyZXMuCgoxMS8yOC8wNzogYmVhemxleQogICAgICAgICAgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiAgVGhlIGxleGVyLmxleG1hdGNoIGFuZCB0LmxleGVyCiAgICAgICAgICBhdHRyaWJ1dGVzIGFyZSBubyBsb25nZXIgc2V0IGZvciBsZXhlciB0b2tlbnMgdGhhdCBhcmUgbm90CiAgICAgICAgICBkZWZpbmVkIGJ5IGZ1bmN0aW9ucy4gICBUaGUgb25seSBub3JtYWwgdXNlIG9mIHRoZXNlIGF0dHJpYnV0ZXMKICAgICAgICAgIHdvdWxkIGJlIGluIGxleGVyIHJ1bGVzIHRoYXQgbmVlZCB0byBwZXJmb3JtIHNvbWUga2luZCBvZiAKICAgICAgICAgIHNwZWNpYWwgcHJvY2Vzc2luZy4gIFRodXMsIGl0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgdG8gc2V0CiAgICAgICAgICB0aGVtIG9uIGV2ZXJ5IHRva2VuLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVGhpcyBtaWdodCBicmVhayBjb2RlCiAgICAgICAgICB0aGF0IGlzIG11Y2tpbmcgYXJvdW5kIHdpdGggaW50ZXJuYWwgbGV4ZXIgc3RhdGUgaW4gc29tZQogICAgICAgICAgc29ydCBvZiBtYWdpY2FsIHdheS4KCjExLzI3LzA3OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCB0aGUgYWJpbGl0eSB0byBwdXQgdGhlIHBhcnNlciBpbnRvIGVycm9yLWhhbmRsaW5nIG1vZGUKICAgICAgICAgIGZyb20gd2l0aGluIGEgbm9ybWFsIHByb2R1Y3Rpb24uICAgVG8gZG8gdGhpcywgc2ltcGx5IHJhaXNlCiAgICAgICAgICBhIHlhY2MuU3ludGF4RXJyb3IgZXhjZXB0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICBkZWYgcF9zb21lX3Byb2R1Y3Rpb24ocCk6CiAgICAgICAgICAgICAgJ3NvbWVfcHJvZHVjdGlvbiA6IHByb2QxIHByb2QyJwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHJhaXNlIHlhY2MuU3ludGF4RXJyb3IgICAgICAjIFNpZ25hbCBhbiBlcnJvcgoKICAgICAgICAgIEEgbnVtYmVyIG9mIHRoaW5ncyBoYXBwZW4gYWZ0ZXIgdGhpcyBvY2N1cnM6CgogICAgICAgICAgLSBUaGUgbGFzdCBzeW1ib2wgc2hpZnRlZCBvbnRvIHRoZSBzeW1ib2wgc3RhY2sgaXMgZGlzY2FyZGVkCiAgICAgICAgICAgIGFuZCBwYXJzZXIgc3RhdGUgYmFja2VkIHVwIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSB0aGUKICAgICAgICAgICAgdGhlIHJ1bGUgcmVkdWN0aW9uLgoKICAgICAgICAgIC0gVGhlIGN1cnJlbnQgbG9va2FoZWFkIHN5bWJvbCBpcyBzYXZlZCBhbmQgcmVwbGFjZWQgYnkKICAgICAgICAgICAgdGhlICdlcnJvcicgc3ltYm9sLgoKICAgICAgICAgIC0gVGhlIHBhcnNlciBlbnRlcnMgZXJyb3IgcmVjb3ZlcnkgbW9kZSB3aGVyZSBpdCB0cmllcwogICAgICAgICAgICB0byBlaXRoZXIgcmVkdWNlIHRoZSAnZXJyb3InIHJ1bGUgb3IgaXQgc3RhcnRzIAogICAgICAgICAgICBkaXNjYXJkaW5nIGl0ZW1zIG9mZiBvZiB0aGUgc3RhY2sgdW50aWwgdGhlIHBhcnNlcgogICAgICAgICAgICByZXNldHMuCgogICAgICAgICAgV2hlbiBhbiBlcnJvciBpcyBtYW51YWxseSBzZXQsIHRoZSBwYXJzZXIgZG9lcyAqbm90KiBjYWxsIAogICAgICAgICAgdGhlIHBfZXJyb3IoKSBmdW5jdGlvbiAoaWYgYW55IGlzIGRlZmluZWQpLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKiBTdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdAoKMTEvMjcvMDc6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHN0cnVjdHVyZSBidWcgaW4gZXhhbXBsZXMvYW5zaWMuICBSZXBvcnRlZCBieSBEaW9uIEJsYXpha2lzLgoKMTEvMjcvMDc6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSBsZXhlciByZWxhdGVkIHRvIHN0YXJ0IGNvbmRpdGlvbnMgYW5kIGlnbm9yZWQKICAgICAgICAgIHRva2VuIHJ1bGVzLiAgSWYgYSBydWxlIHdhcyBkZWZpbmVkIHRoYXQgY2hhbmdlZCBzdGF0ZSwgYnV0CiAgICAgICAgICByZXR1cm5lZCBubyB0b2tlbiwgdGhlIGxleGVyIGNvdWxkIGJlIGxlZnQgaW4gYW4gaW5jb25zaXN0ZW50CiAgICAgICAgICBzdGF0ZS4gIFJlcG9ydGVkIGJ5IAogICAgICAgICAgCjExLzI3LzA3OiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCBzZXR1cC5weSB0byBzdXBwb3J0IFB5dGhvbiBFZ2dzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICBTaW1vbiBDcm9zcy4KCjExLzA5LzA3OiBiZWF6ZWx5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiBlcnJvciBoYW5kbGluZyBpbiB5YWNjLiAgSWYgYSBzeW50YXggZXJyb3Igb2NjdXJyZWQgYW5kIHRoZQogICAgICAgICAgcGFyc2VyIHJvbGxlZCB0aGUgZW50aXJlIHBhcnNlIHN0YWNrIGJhY2ssIHRoZSBwYXJzZXIgd291bGQgYmUgbGVmdCBpbiBpbgogICAgICAgICAgaW5jb25zaXN0ZW50IHN0YXRlIHRoYXQgd291bGQgY2F1c2UgaXQgdG8gdHJpZ2dlciBpbmNvcnJlY3QgYWN0aW9ucyBvbgogICAgICAgICAgc3Vic2VxdWVudCBpbnB1dC4gIFJlcG9ydGVkIGJ5IFRvbiBCaWVnc3RyYWF0ZW4sIEp1c3RpbiBLaW5nLCBhbmQgb3RoZXJzLgoKMTEvMDkvMDc6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIHdoZW4gcGFzc2luZyBlbXB0eSBpbnB1dCBzdHJpbmdzIHRvIHlhY2MucGFyc2UoKS4gICBUaGlzIAogICAgICAgICAgd291bGQgcmVzdWx0IGluIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgIk5vIGlucHV0IGdpdmVuIi4gIFJlcG9ydGVkCiAgICAgICAgICBieSBBbmRyZXcgRGFsa2UuCgpWZXJzaW9uIDIuMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQowMi8yMC8wNzogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBjaGFyYWN0ZXIgbGl0ZXJhbHMgaWYgdGhlIGxpdGVyYWwgJy4nIGFwcGVhcmVkIGFzIHRoZQogICAgICAgICAgbGFzdCBzeW1ib2wgb2YgYSBncmFtbWFyIHJ1bGUuICBSZXBvcnRlZCBieSBBbGVzIFNtcmNrYS4KCjAyLzE5LzA3OiBiZWF6bGV5CiAgICAgICAgICBXYXJuaW5nIG1lc3NhZ2VzIGFyZSBub3cgcmVkaXJlY3RlZCB0byBzdGRlcnIgaW5zdGVhZCBvZiBiZWluZyBwcmludGVkCiAgICAgICAgICB0byBzdGFuZGFyZCBvdXRwdXQuCgowMi8xOS8wNzogYmVhemxleQogICAgICAgICAgQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gbGV4LnB5IGlmIGl0IGRldGVjdHMgYSBsaXRlcmFsIGJhY2tzbGFzaAogICAgICAgICAgY2hhcmFjdGVyIGluc2lkZSB0aGUgdF9pZ25vcmUgZGVjbGFyYXRpb24uICBUaGlzIGlzIHRvIGhlbHAKICAgICAgICAgIHByb2JsZW1zIHRoYXQgbWlnaHQgb2NjdXIgaWYgc29tZW9uZSBhY2NpZGVudGFsbHkgZGVmaW5lcyB0X2lnbm9yZQogICAgICAgICAgYXMgYSBQeXRob24gcmF3IHN0cmluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0X2lnbm9yZSA9IHInIFx0JwoKICAgICAgICAgIFRoZSBpZGVhIGZvciB0aGlzIGlzIGZyb20gYW4gZW1haWwgSSByZWNlaXZlZCBmcm9tIERhdmlkIENpbWltaSB3aG8KICAgICAgICAgIHJlcG9ydGVkIGJpemFycmUgYmVoYXZpb3IgaW4gbGV4aW5nIGFzIGEgcmVzdWx0IG9mIGRlZmluaW5nIHRfaWdub3JlCiAgICAgICAgICBhcyBhIHJhdyBzdHJpbmcgYnkgYWNjaWRlbnQuCgowMi8xOC8wNzogYmVhemxleQogICAgICAgICAgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLiAgTWFkZSBzb21lIGNoYW5nZXMgdG8gdGhlIGludGVybmFsCiAgICAgICAgICB0YWJsZSBvcmdhbml6YXRpb24gYW5kIExSIHBhcnNlciB0byBpbXByb3ZlIHBhcnNpbmcgcGVyZm9ybWFuY2UuCgowMi8xOC8wNzogYmVhemxleQogICAgICAgICAgQXV0b21hdGljIHRyYWNraW5nIG9mIGxpbmUgbnVtYmVyIGFuZCBwb3NpdGlvbiBpbmZvcm1hdGlvbiBtdXN0IG5vdyBiZSAKICAgICAgICAgIGVuYWJsZWQgYnkgYSBzcGVjaWFsIGZsYWcgdG8gcGFyc2UoKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB5YWNjLnBhcnNlKGRhdGEsdHJhY2tpbmc9VHJ1ZSkKCiAgICAgICAgICBJbiBtYW55IGFwcGxpY2F0aW9ucywgaXQncyBqdXN0IG5vdCB0aGF0IGltcG9ydGFudCB0byBoYXZlIHRoZQogICAgICAgICAgcGFyc2VyIGF1dG9tYXRpY2FsbHkgdHJhY2sgYWxsIGxpbmUgbnVtYmVycy4gIEJ5IG1ha2luZyB0aGlzIGFuIAogICAgICAgICAgb3B0aW9uYWwgZmVhdHVyZSwgaXQgYWxsb3dzIHRoZSBwYXJzZXIgdG8gcnVuIHNpZ25pZmljYW50bHkgZmFzdGVyCiAgICAgICAgICAobW9yZSB0aGFuIGEgMjAlIHNwZWVkIGluY3JlYXNlIGluIG1hbnkgY2FzZXMpLiAgICBOb3RlOiBwb3NpdGlvbmFsCiAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlIGZvciByYXcgdG9rZW5zLS0tdGhpcyBjaGFuZ2Ugb25seQogICAgICAgICAgYXBwbGllcyB0byBwb3NpdGlvbmFsIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBub250ZXJtaW5hbAogICAgICAgICAgZ3JhbW1hciBzeW1ib2xzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgIAowMi8xOC8wNzogYmVhemxleQogICAgICAgICAgWWFjYyBubyBsb25nZXIgc3VwcG9ydHMgZXh0ZW5kZWQgc2xpY2VzIG9mIGdyYW1tYXIgcHJvZHVjdGlvbnMuCiAgICAgICAgICBIb3dldmVyLCBpdCBkb2VzIHN1cHBvcnQgcmVndWxhciBzbGljZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICBkZWYgcF9mb28ocCk6CiAgICAgICAgICAgICAgJycnZm9vOiBhIGIgYyBkIGUnJycKICAgICAgICAgICAgICBwWzBdID0gcFsxOjNdCgogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB0byB0aGUgcGFyc2VyLS1pdCBzdHJlYW1saW5lcwogICAgICAgICAgbm9ybWFsIGFjY2VzcyB0byB0aGUgZ3JhbW1hciB2YWx1ZXMgc2luY2Ugc2xpY2VzIGFyZSBub3cgaGFuZGxlZCBpbgogICAgICAgICAgYSBfX2dldHNsaWNlX18oKSBtZXRob2QgYXMgb3Bwb3NlZCB0byBfX2dldGl0ZW1fXygpLgoKMDIvMTIvMDc6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSBoYW5kbGluZyBvZiB0b2tlbiBuYW1lcyB3aGVuIGNvbWJpbmVkIHdpdGgKICAgICAgICAgIHN0YXJ0IGNvbmRpdGlvbnMuICAgQnVnIHJlcG9ydGVkIGJ5IFRvZGQgTydCcnlhbi4KClZlcnNpb24gMi4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoxMS8wMS8wNjogYmVhemxleQogICAgICAgICAgQWRkZWQgbGV4cG9zKCkgYW5kIGxleHNwYW4oKSBtZXRob2RzIHRvIGdyYW1tYXIgc3ltYm9scy4gIFRoZXNlCiAgICAgICAgICBtaXJyb3IgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBvZiBsaW5lbm8oKSBhbmQgbGluZXNwYW4oKS4gIEZvcgogICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICBkZWYgcF9leHByKHApOgogICAgICAgICAgICAgICdleHByIDogZXhwciBQTFVTIGV4cHInCiAgICAgICAgICAgICAgIHAubGV4cG9zKDEpICAgICAjIExleGluZyBwb3NpdGlvbiBvZiBsZWZ0LWhhbmQtZXhwcmVzc2lvbgogICAgICAgICAgICAgICBwLmxleHBvcygxKSAgICAgIyBMZXhpbmcgcG9zaXRpb24gb2YgUExVUwogICAgICAgICAgICAgICBzdGFydCxlbmQgPSBwLmxleHNwYW4oMykgICMgTGV4aW5nIHJhbmdlIG9mIHJpZ2h0IGhhbmQgZXhwcmVzc2lvbgoKMTEvMDEvMDY6IGJlYXpsZXkKICAgICAgICAgIE1pbm9yIGNoYW5nZSB0byBlcnJvciBoYW5kbGluZy4gIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gc2tpcCBjaGFyYWN0ZXJzCiAgICAgICAgICBpbiB0aGUgaW5wdXQgaXMgdG8gdXNlIHQubGV4ZXIuc2tpcCgpIGFzIHNob3duIGhlcmU6CgogICAgICAgICAgICAgZGVmIHRfZXJyb3IodCk6CiAgICAgICAgICAgICAgICAgcHJpbnQgIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXQogICAgICAgICAgICAgICAgIHQubGV4ZXIuc2tpcCgxKQogICAgICAgICAgCiAgICAgICAgICBUaGUgb2xkIGFwcHJvYWNoIG9mIGp1c3QgdXNpbmcgdC5za2lwKDEpIHdpbGwgc3RpbGwgd29yaywgYnV0IHdvbid0CiAgICAgICAgICBiZSBkb2N1bWVudGVkLgoKMTAvMzEvMDY6IGJlYXpsZXkKICAgICAgICAgIERpc2NhcmRlZCB0b2tlbnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgYXMgc2ltcGxlIHN0cmluZ3MgaW5zdGVhZCBvZgogICAgICAgICAgZnVuY3Rpb25zLiAgVG8gZG8gdGhpcywgc2ltcGx5IGluY2x1ZGUgdGhlIHRleHQgImlnbm9yZV8iIGluIHRoZQogICAgICAgICAgdG9rZW4gZGVjbGFyYXRpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdF9pZ25vcmVfY3BwY29tbWVudCA9IHInLy8uKicKICAgICAgICAgIAogICAgICAgICAgUHJldmlvdXNseSwgdGhpcyBoYWQgdG8gYmUgZG9uZSB3aXRoIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZGVmIHRfaWdub3JlX2NwcGNvbW1lbnQodCk6CiAgICAgICAgICAgICAgICAgIHInLy8uKicKICAgICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgIElmIHN0YXJ0IGNvbmRpdGlvbnMvc3RhdGVzIGFyZSBiZWluZyB1c2VkLCBzdGF0ZSBuYW1lcyBzaG91bGQgYXBwZWFyCiAgICAgICAgICBiZWZvcmUgdGhlICJpZ25vcmVfIiB0ZXh0LgoKMTAvMTkvMDY6IGJlYXpsZXkKICAgICAgICAgIFRoZSBMZXggbW9kdWxlIG5vdyBwcm92aWRlcyBzdXBwb3J0IGZvciBmbGV4LXN0eWxlIHN0YXJ0IGNvbmRpdGlvbnMKICAgICAgICAgIGFzIGRlc2NyaWJlZCBhdCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZmxleC9tYW51YWwvaHRtbF9jaGFwdGVyL2ZsZXhfMTEuaHRtbC4KICAgICAgICAgIFBsZWFzZSByZWZlciB0byB0aGlzIGRvY3VtZW50IHRvIHVuZGVyc3RhbmQgdGhpcyBjaGFuZ2Ugbm90ZS4gIFJlZmVyIHRvCiAgICAgICAgICB0aGUgUExZIGRvY3VtZW50YXRpb24gZm9yIFBMWS1zcGVjaWZpYyBleHBsYW5hdGlvbiBvZiBob3cgdGhpcyB3b3Jrcy4KCiAgICAgICAgICBUbyB1c2Ugc3RhcnQgY29uZGl0aW9ucywgeW91IGZpcnN0IG5lZWQgdG8gZGVjbGFyZSBhIHNldCBvZiBzdGF0ZXMgaW4KICAgICAgICAgIHlvdXIgbGV4ZXIgZmlsZToKCiAgICAgICAgICBzdGF0ZXMgPSAoCiAgICAgICAgICAgICAgICAgICAgKCdmb28nLCdleGNsdXNpdmUnKSwKICAgICAgICAgICAgICAgICAgICAoJ2JhcicsJ2luY2x1c2l2ZScpCiAgICAgICAgICApCgogICAgICAgICAgVGhpcyBzZXJ2ZXMgdGhlIHNhbWUgcm9sZSBhcyB0aGUgJXMgYW5kICV4IHNwZWNpZmllcnMgaW4gZmxleC4KCiAgICAgICAgICBPbmUgYSBzdGF0ZSBoYXMgYmVlbiBkZWNsYXJlZCwgdG9rZW5zIGZvciB0aGF0IHN0YXRlIGNhbiBiZSAKICAgICAgICAgIGRlY2xhcmVkIGJ5IGRlZmluaW5nIHJ1bGVzIG9mIHRoZSBmb3JtIHRfc3RhdGVfVE9LLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICB0X1BMVVMgPSAnXCsnICAgICAgICAgICMgUnVsZSBkZWZpbmVkIGluIElOSVRJQUwgc3RhdGUKICAgICAgICAgICAgdF9mb29fTlVNID0gJ1xkKycgICAgICAjIFJ1bGUgZGVmaW5lZCBpbiBmb28gc3RhdGUKICAgICAgICAgICAgdF9iYXJfTlVNID0gJ1xkKycgICAgICAjIFJ1bGUgZGVmaW5lZCBpbiBiYXIgc3RhdGUKCiAgICAgICAgICAgIHRfZm9vX2Jhcl9OVU0gPSAnXGQrJyAgIyBSdWxlIGRlZmluZWQgaW4gYm90aCBmb28gYW5kIGJhcgogICAgICAgICAgICB0X0FOWV9OVU0gPSAnXGQrJyAgICAgICMgUnVsZSBkZWZpbmVkIGluIGFsbCBzdGF0ZXMKCiAgICAgICAgICBJbiBhZGRpdGlvbiB0byBkZWZpbmluZyB0b2tlbnMgZm9yIGVhY2ggc3RhdGUsIHRoZSB0X2lnbm9yZSBhbmQgdF9lcnJvcgogICAgICAgICAgc3BlY2lmaWNhdGlvbnMgY2FuIGJlIGN1c3RvbWl6ZWQgZm9yIHNwZWNpZmljIHN0YXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgdF9mb29faWdub3JlID0gIiAiICAgICAjIElnbm9yZWQgY2hhcmFjdGVycyBmb3IgZm9vIHN0YXRlCiAgICAgICAgICAgIGRlZiB0X2Jhcl9lcnJvcih0KTogICAKICAgICAgICAgICAgICAgICMgSGFuZGxlIGVycm9ycyBpbiBiYXIgc3RhdGUKCiAgICAgICAgICBXaXRoIHRva2VuIHJ1bGVzLCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHN0YXRlcwogICAgICAgICAgCiAgICAgICAgICAgIGRlZiB0X1RPS05BTUUodCk6CiAgICAgICAgICAgICAgICB0LmxleGVyLmJlZ2luKCdmb28nKSAgICAgICAgIyBCZWdpbiBzdGF0ZSAnZm9vJwogICAgICAgICAgICAgICAgdC5sZXhlci5wdXNoX3N0YXRlKCdmb28nKSAgICMgQmVnaW4gc3RhdGUgJ2ZvbycsIHB1c2ggb2xkIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbnRvIGEgc3RhY2sKICAgICAgICAgICAgICAgIHQubGV4ZXIucG9wX3N0YXRlKCkgICAgICAgICAjIFJlc3RvcmUgcHJldmlvdXMgc3RhdGUKICAgICAgICAgICAgICAgIHQubGV4ZXIuY3VycmVudF9zdGF0ZSgpICAgICAjIFJldHVybnMgbmFtZSBvZiBjdXJyZW50IHN0YXRlCgogICAgICAgICAgVGhlc2UgbWV0aG9kcyBtaXJyb3IgdGhlIEJFR0lOKCksIHl5X3B1c2hfc3RhdGUoKSwgeXlfcG9wX3N0YXRlKCksIGFuZAogICAgICAgICAgeXlfdG9wX3N0YXRlKCkgZnVuY3Rpb25zIGluIGZsZXguCgogICAgICAgICAgVGhlIHVzZSBvZiBzdGFydCBzdGF0ZXMgY2FuIGJlIHVzZWQgYXMgb25lIHdheSB0byB3cml0ZSBzdWItbGV4ZXJzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBsZXhlciBvciBwYXJzZXIgbWlnaHQgaW5zdHJ1Y3QgdGhlIGxleGVyIHRvIHN0YXJ0CiAgICAgICAgICBnZW5lcmF0aW5nIGEgZGlmZmVyZW50IHNldCBvZiB0b2tlbnMgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LgogICAgICAgICAgCiAgICAgICAgICBleGFtcGxlL3lwbHkveWxleC5weSBzaG93cyB0aGUgdXNlIG9mIHN0YXJ0IHN0YXRlcyB0byBncmFiIEMvQysrIAogICAgICAgICAgY29kZSBmcmFnbWVudHMgb3V0IG9mIHRyYWRpdGlvbmFsIHlhY2Mgc3BlY2lmaWNhdGlvbiBmaWxlcy4KCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqIFN1Z2dlc3RlZCBieSBEYW5pZWwgTGFycmF6IHdpdGggd2hvbSBJIGFsc28KICAgICAgICAgIGRpc2N1c3NlZCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIGRlc2lnbi4KCjEwLzE5LzA2OiBiZWF6bGV5CiAgICAgICAgICBNaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBpbiB3aGljaCB5YWNjLnB5IHdhcyByZXBvcnRpbmcgc2hpZnQvcmVkdWNlCiAgICAgICAgICBjb25mbGljdHMuICBBbHRob3VnaCB0aGUgdW5kZXJseWluZyBMQUxSKDEpIGFsZ29yaXRobSB3YXMgY29ycmVjdCwKICAgICAgICAgIFBMWSB3YXMgdW5kZXItcmVwb3J0aW5nIHRoZSBudW1iZXIgb2YgY29uZmxpY3RzIGNvbXBhcmVkIHRvIHlhY2MvYmlzb24KICAgICAgICAgIHdoZW4gcHJlY2VkZW5jZSBydWxlcyB3ZXJlIGluIGVmZmVjdC4gIFRoaXMgY2hhbmdlIHNob3VsZCBtYWtlIFBMWQogICAgICAgICAgcmVwb3J0IHRoZSBzYW1lIG51bWJlciBvZiBjb25mbGljdHMgYXMgeWFjYy4KCjEwLzE5LzA2OiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB5YWNjIHNvIHRoYXQgZ3JhbW1hciBydWxlcyBjb3VsZCBhbHNvIGluY2x1ZGUgdGhlICctJyAKICAgICAgICAgIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgZGVmIHBfZXhwcl9saXN0KHApOgogICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24tbGlzdCA6IGV4cHJlc3Npb24tbGlzdCBleHByZXNzaW9uJwoKICAgICAgICAgIFN1Z2dlc3RlZCBieSBPbGRyaWNoIEplZGxpY2thLgoKMTAvMTgvMDY6IGJlYXpsZXkKICAgICAgICAgIEF0dHJpYnV0ZSBsZXhlci5sZXhtYXRjaCBhZGRlZCBzbyB0aGF0IHRva2VuIHJ1bGVzIGNhbiBhY2Nlc3MgdGhlIHJlIAogICAgICAgICAgbWF0Y2ggb2JqZWN0IHRoYXQgd2FzIGdlbmVyYXRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgIGRlZiB0X0ZPTyh0KToKICAgICAgICAgICAgICByJ3NvbWUgcmVnZXgnCiAgICAgICAgICAgICAgbSA9IHQubGV4ZXIubGV4bWF0Y2gKICAgICAgICAgICAgICAjIERvIHNvbWV0aGluZyB3aXRoIG0KCgogICAgICAgICAgVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY2VzcyBuYW1lZCBncm91cHMgc3BlY2lmaWVkIHdpdGhpbgogICAgICAgICAgdGhlIHJlZ2V4IGZvciBhIHNwZWNpZmljIHRva2VuLiBTdWdnZXN0ZWQgYnkgT2xkcmljaCBKZWRsaWNrYS4KICAgICAgICAgIAoxMC8xNi8wNjogYmVhemxleQogICAgICAgICAgQ2hhbmdlZCB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IHJlc3VsdHMgaWYgYW4gaWxsZWdhbCBjaGFyYWN0ZXIKICAgICAgICAgIGlzIGVuY291bnRlcmVkIGFuZCBubyBkZWZhdWx0IGVycm9yIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gbGV4LgogICAgICAgICAgVGhlIGV4Y2VwdGlvbiBpcyBub3cgbW9yZSBpbmZvcm1hdGl2ZSBhYm91dCB0aGUgYWN0dWFsIGNhdXNlIG9mCiAgICAgICAgICB0aGUgZXJyb3IuCiAgICAgIApWZXJzaW9uIDIuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMTAvMDIvMDY6IGJlYXpsZXkKICAgICAgICAgIFRoZSBsYXN0IExleGVyIG9iamVjdCBidWlsdCBieSBsZXgoKSBjYW4gYmUgZm91bmQgaW4gbGV4LmxleGVyLgogICAgICAgICAgVGhlIGxhc3QgUGFyc2VyIG9iamVjdCBidWlsdCAgYnkgeWFjYygpIGNhbiBiZSBmb3VuZCBpbiB5YWNjLnBhcnNlci4KCjEwLzAyLzA2OiBiZWF6bGV5CiAgICAgICAgICBOZXcgZXhhbXBsZSBhZGRlZDogIGV4YW1wbGVzL3lwbHkKCiAgICAgICAgICBUaGlzIGV4YW1wbGUgdXNlcyBQTFkgdG8gY29udmVydCBVbml4LXlhY2Mgc3BlY2lmaWNhdGlvbiBmaWxlcyB0bwogICAgICAgICAgUExZIHByb2dyYW1zIHdpdGggdGhlIHNhbWUgZ3JhbW1hci4gICBUaGlzIG1heSBiZSB1c2VmdWwgaWYgeW91CiAgICAgICAgICB3YW50IHRvIGNvbnZlcnQgYSBncmFtbWFyIGZyb20gYmlzb24veWFjYyB0byB1c2Ugd2l0aCBQTFkuCiAgICAKMTAvMDIvMDY6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGEgc3RhcnQgc3ltYm9sIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgeWFjYwogICAgICAgICAgaW5wdXQgZmlsZSBpdHNlbGYuICBKdXN0IGRvIHRoaXM6CgogICAgICAgICAgICAgICBzdGFydCA9ICduYW1lJwoKICAgICAgICAgIHdoZXJlICduYW1lJyBtYXRjaGVzIHNvbWUgZ3JhbW1hciBydWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBkZWYgcF9uYW1lKHApOgogICAgICAgICAgICAgICAgICAgJ25hbWUgOiBBIEIgQycKICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgIFRoaXMgbWlycm9ycyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgeWFjYyAlc3RhcnQgc3BlY2lmaWVyLgoKMDkvMzAvMDY6IGJlYXpsZXkKICAgICAgICAgIFNvbWUgbmV3IGV4YW1wbGVzIGFkZGVkLjoKCiAgICAgICAgICBleGFtcGxlcy9HYXJkZW5TbmFrZSA6IEEgc2ltcGxlIGluZGVudGF0aW9uIGJhc2VkIGxhbmd1YWdlIHNpbWlsYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gUHl0aG9uLiAgU2hvd3MgaG93IHlvdSBtaWdodCBoYW5kbGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UuICBDb250cmlidXRlZCBieSBBbmRyZXcgRGFsa2UuCgogICAgICAgICAgZXhhbXBsZXMvQkFTSUMgICAgICAgOiBBbiBpbXBsZW1lbnRhdGlvbiBvZiAxOTY0IERhcnRtb3V0aCBCQVNJQy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgRGF2ZSBhZ2FpbnN0IGhpcyBiZXR0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVkZ2VtZW50LgoKMDkvMjgvMDY6IGJlYXpsZXkKICAgICAgICAgIE1pbm9yIHBhdGNoIHRvIGFsbG93IG5hbWVkIGdyb3VwcyB0byBiZSB1c2VkIGluIGxleCByZWd1bGFyCiAgICAgICAgICBleHByZXNzaW9uIHJ1bGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRfUVNUUklORyA9IHInJycoP1A8cXVvdGU+WyciXSkuKj8oP1A9cXVvdGUpJycnCgogICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEFkYW0gUmluZy4KIAowOS8yOC8wNjogYmVhemxleQogICAgICAgICAgTEFMUigxKSBpcyBub3cgdGhlIGRlZmF1bHQgcGFyc2luZyBtZXRob2QuICAgVG8gdXNlIFNMUiwgdXNlCiAgICAgICAgICB5YWNjLnlhY2MobWV0aG9kPSJTTFIiKS4gIE5vdGU6IHRoZXJlIGlzIG5vIHBlcmZvcm1hbmNlIGltcGFjdAogICAgICAgICAgb24gcGFyc2luZyB3aGVuIHVzaW5nIExBTFIoMSkgaW5zdGVhZCBvZiBTTFIuIEhvd2V2ZXIsIGNvbnN0cnVjdGluZwogICAgICAgICAgdGhlIHBhcnNpbmcgdGFibGVzIHdpbGwgdGFrZSBhIGxpdHRsZSBsb25nZXIuCgowOS8yNi8wNjogYmVhemxleQogICAgICAgICAgQ2hhbmdlIHRvIGxpbmUgbnVtYmVyIHRyYWNraW5nLiAgVG8gbW9kaWZ5IGxpbmUgbnVtYmVycywgbW9kaWZ5CiAgICAgICAgICB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGxleGVyIGl0c2VsZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgIGRlZiB0X05FV0xJTkUodCk6CiAgICAgICAgICAgICAgcidcbicKICAgICAgICAgICAgICB0LmxleGVyLmxpbmVubyArPSAxCgogICAgICAgICAgVGhpcyBtb2RpZmljYXRpb24gaXMgYm90aCBjbGVhbnVwIGFuZCBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4KICAgICAgICAgIEluIHBhc3QgdmVyc2lvbnMsIGxleCB3YXMgbW9uaXRvcmluZyBldmVyeSB0b2tlbiBmb3IgY2hhbmdlcyBpbgogICAgICAgICAgdGhlIGxpbmUgbnVtYmVyLiAgVGhpcyBleHRyYSBwcm9jZXNzaW5nIGlzIHVubmVjZXNzYXJ5IGZvciBhIHZhc3QKICAgICAgICAgIG1ham9yaXR5IG9mIHRva2Vucy4gVGh1cywgdGhpcyBuZXcgYXBwcm9hY2ggY2xlYW5zIGl0IHVwIGEgYml0LgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgWW91IHdpbGwgbmVlZCB0byBjaGFuZ2UgY29kZSBpbiB5b3VyIGxleGVyIHRoYXQgdXBkYXRlcyB0aGUgbGluZQogICAgICAgICAgbnVtYmVyLiBGb3IgZXhhbXBsZSwgInQubGluZW5vICs9IDEiIGJlY29tZXMgInQubGV4ZXIubGluZW5vICs9IDEiCiAgICAgICAgIAowOS8yNi8wNjogYmVhemxleQogICAgICAgICAgQWRkZWQgdGhlIGxleGluZyBwb3NpdGlvbiB0byB0b2tlbnMgYXMgYW4gYXR0cmlidXRlIGxleHBvcy4gVGhpcwogICAgICAgICAgaXMgdGhlIHJhdyBpbmRleCBpbnRvIHRoZSBpbnB1dCB0ZXh0IGF0IHdoaWNoIGEgdG9rZW4gYXBwZWFycy4KICAgICAgICAgIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSBjb2x1bW4gbnVtYmVycyBhbmQgb3RoZXIKICAgICAgICAgIGRldGFpbHMgKGUuZy4sIHNjYW4gYmFja3dhcmRzIGZyb20gbGV4cG9zIHRvIHRoZSBmaXJzdCBuZXdsaW5lCiAgICAgICAgICB0byBnZXQgYSBjb2x1bW4gcG9zaXRpb24pLgoKMDkvMjUvMDY6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIF9fY29weV9fKCkgbWV0aG9kIG9uIHRoZSBMZXhlciBjbGFzcwogICAgICAgICAgdG8gY2xvbmUoKS4gIFRoaXMgaXMgdXNlZCB0byBjbG9uZSBhIExleGVyIG9iamVjdCAoZS5nLiwgaWYKICAgICAgICAgIHlvdSdyZSBydW5uaW5nIGRpZmZlcmVudCBsZXhlcnMgYXQgdGhlIHNhbWUgdGltZSkuCgowOS8yMS8wNjogYmVhemxleQogICAgICAgICAgTGltaXRhdGlvbnMgcmVsYXRlZCB0byB0aGUgdXNlIG9mIHRoZSByZSBtb2R1bGUgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQuCiAgICAgICAgICBTZXZlcmFsIHVzZXJzIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggcmVndWxhciBleHByZXNzaW9ucyBleGNlZWRpbmcKICAgICAgICAgIG1vcmUgdGhhbiAxMDAgbmFtZWQgZ3JvdXBzLiBUbyBzb2x2ZSB0aGlzLCBsZXgucHkgaXMgbm93IGNhcGFibGUKICAgICAgICAgIG9mIGF1dG9tYXRpY2FsbHkgc3BsaXR0aW5nIGl0cyBtYXN0ZXIgcmVndWxhciByZWd1bGFyIGV4cHJlc3Npb24gaW50bwogICAgICAgICAgc21hbGxlciBleHByZXNzaW9ucyBhcyBuZWVkZWQuICAgVGhpcyBzaG91bGQsIGluIHRoZW9yeSwgbWFrZSBpdAogICAgICAgICAgcG9zc2libGUgdG8gc3BlY2lmeSBhbiBhcmJpdHJhcmlseSBsYXJnZSBudW1iZXIgb2YgdG9rZW5zLgoKMDkvMjEvMDY6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVkIGVycm9yIGNoZWNraW5nIGluIGxleC5weS4gIFJ1bGVzIHRoYXQgbWF0Y2ggdGhlIGVtcHR5IHN0cmluZwogICAgICAgICAgYXJlIG5vdyByZWplY3RlZCAob3RoZXJ3aXNlIHRoZXkgY2F1c2UgdGhlIGxleGVyIHRvIGVudGVyIGFuIGluZmluaXRlCiAgICAgICAgICBsb29wKS4gIEFuIGV4dHJhIGNoZWNrIGZvciBydWxlcyBjb250YWluaW5nICcjJyBoYXMgYWxzbyBiZWVuIGFkZGVkLgogICAgICAgICAgU2luY2UgbGV4IGNvbXBpbGVzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gdmVyYm9zZSBtb2RlLCAnIycgaXMgaW50ZXJwcmV0ZWQKICAgICAgICAgIGFzIGEgcmVnZXggY29tbWVudCwgaXQgaXMgY3JpdGljYWwgdG8gdXNlICdcIycgaW5zdGVhZC4gIAoKMDkvMTgvMDY6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgQFRPS0VOIGRlY29yYXRvciBmdW5jdGlvbiB0byBsZXgucHkgdGhhdCBjYW4gYmUgdXNlZCB0byAKICAgICAgICAgIGRlZmluZSB0b2tlbiBydWxlcyB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgbWlnaHQgYmUgY29tcHV0ZWQKICAgICAgICAgIGluIHNvbWUgd2F5LgogICAgICAgICAgCiAgICAgICAgICBkaWdpdCAgICAgICAgICAgID0gcicoWzAtOV0pJwogICAgICAgICAgbm9uZGlnaXQgICAgICAgICA9IHInKFtfQS1aYS16XSknCiAgICAgICAgICBpZGVudGlmaWVyICAgICAgID0gcicoJyArIG5vbmRpZ2l0ICsgcicoJyArIGRpZ2l0ICsgcid8JyArIG5vbmRpZ2l0ICsgcicpKiknICAgICAgICAKCiAgICAgICAgICBmcm9tIHBseS5sZXggaW1wb3J0IFRPS0VOCgogICAgICAgICAgQFRPS0VOKGlkZW50aWZpZXIpCiAgICAgICAgICBkZWYgdF9JRCh0KToKICAgICAgICAgICAgICAgIyBEbyB3aGF0ZXZlcgoKICAgICAgICAgIFRoZSBAVE9LRU4gZGVjb3JhdG9yIG1lcmVseSBzZXRzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUKICAgICAgICAgIGFzc29jaWF0ZWQgdG9rZW4gZnVuY3Rpb24gYXMgbmVlZGVkIGZvciBsZXggdG8gd29yay4gIAoKICAgICAgICAgIE5vdGU6IEFuIGFsdGVybmF0aXZlIHNvbHV0aW9uIGlzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgZGVmIHRfSUQodCk6CiAgICAgICAgICAgICAgIyBEbyB3aGF0ZXZlcgogICAKICAgICAgICAgIHRfSUQuX19kb2NfXyA9IGlkZW50aWZpZXIKCiAgICAgICAgICBOb3RlOiBEZWNvcmF0b3JzIHJlcXVpcmUgdGhlIHVzZSBvZiBQeXRob24gMi40IG9yIGxhdGVyLiAgSWYgY29tcGF0aWJpbGl0eQogICAgICAgICAgd2l0aCBvbGQgdmVyc2lvbnMgaXMgbmVlZGVkLCB1c2UgdGhlIGxhdHRlciBzb2x1dGlvbi4KCiAgICAgICAgICBUaGUgbmVlZCBmb3IgdGhpcyBmZWF0dXJlIHdhcyBzdWdnZXN0ZWQgYnkgQ2VtIEthcmFuLgoKMDkvMTQvMDY6IGJlYXpsZXkKICAgICAgICAgIFN1cHBvcnQgZm9yIHNpbmdsZS1jaGFyYWN0ZXIgbGl0ZXJhbCB0b2tlbnMgaGFzIGJlZW4gYWRkZWQgdG8geWFjYy4KICAgICAgICAgIFRoZXNlIGxpdGVyYWxzIG11c3QgYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgZGVmIHBfZXhwcihwKToKICAgICAgICAgICAgICAgImV4cHIgOiBleHByICcrJyBleHByIgogICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICBkZWYgcF9leHByKHApOgogICAgICAgICAgICAgICAnZXhwciA6IGV4cHIgIi0iIGV4cHInCiAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoaXMsIGl0IGlzIG5lY2Vzc2FyeSB0byB0ZWxsIHRoZSBsZXhlciBtb2R1bGUgYWJvdXQKICAgICAgICAgIGxpdGVyYWwgY2hhcmFjdGVycy4gICBUaGlzIGlzIGRvbmUgYnkgZGVmaW5pbmcgdGhlIHZhcmlhYmxlICdsaXRlcmFscycKICAgICAgICAgIGFzIGEgbGlzdCBvZiBjaGFyYWN0ZXJzLiAgVGhpcyBzaG91bGQgIGJlIGRlZmluZWQgaW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgICAgICBpbnZva2VzIHRoZSBsZXgubGV4KCkgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBsaXRlcmFscyA9IFsnKycsJy0nLCcqJywnLycsJygnLCcpJywnPSddCiAKICAgICAgICAgIG9yIHNpbXBseQoKICAgICAgICAgICAgIGxpdGVyYWxzID0gJys9Ki8oKT0nCgogICAgICAgICAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBsaXRlcmFscyBjYW4gb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAgICAgICAgICBXaGVuIHRoZSBsZXhlciBmYWlscyB0byBtYXRjaCBhIHRva2VuIHVzaW5nIGl0cyBub3JtYWwgcmVndWxhciBleHByZXNzaW9uCiAgICAgICAgICBydWxlcywgaXQgd2lsbCBjaGVjayB0aGUgY3VycmVudCBjaGFyYWN0ZXIgYWdhaW5zdCB0aGUgbGl0ZXJhbCBsaXN0LgogICAgICAgICAgSWYgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHRva2VuIHR5cGUgc2V0IHRvIG1hdGNoIHRoZSBsaXRlcmFsCiAgICAgICAgICBjaGFyYWN0ZXIuICBPdGhlcndpc2UsIGFuIGlsbGVnYWwgY2hhcmFjdGVyIHdpbGwgYmUgc2lnbmFsbGVkLgoKCjA5LzE0LzA2OiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCBQTFkgdG8gaW5zdGFsbCBpdHNlbGYgYXMgYSBwcm9wZXIgUHl0aG9uIHBhY2thZ2UgY2FsbGVkICdwbHknLgogICAgICAgICAgVGhpcyB3aWxsIG1ha2UgaXQgYSBsaXR0bGUgbW9yZSBmcmllbmRseSB0byBvdGhlciBtb2R1bGVzLiAgVGhpcwogICAgICAgICAgY2hhbmdlcyB0aGUgdXNhZ2Ugb2YgUExZIG9ubHkgc2xpZ2h0bHkuICBKdXN0IGRvIHRoaXMgdG8gaW1wb3J0IHRoZQogICAgICAgICAgbW9kdWxlcwoKICAgICAgICAgICAgICAgIGltcG9ydCBwbHkubGV4IGFzIGxleAogICAgICAgICAgICAgICAgaW1wb3J0IHBseS55YWNjIGFzIHlhY2MKCiAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvIHRoaXM6CgogICAgICAgICAgICAgICAgZnJvbSBwbHkgaW1wb3J0ICoKCiAgICAgICAgICBXaGljaCBpbXBvcnRzIGJvdGggdGhlIGxleCBhbmQgeWFjYyBtb2R1bGVzLgogICAgICAgICAgQ2hhbmdlIHN1Z2dlc3RlZCBieSBMZWUgSnVuZS4KCjA5LzEzLzA2OiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIHRoZSBoYW5kbGluZyBvZiBuZWdhdGl2ZSBpbmRpY2VzIHdoZW4gdXNlZCBpbiBwcm9kdWN0aW9uIHJ1bGVzLgogICAgICAgICAgQSBuZWdhdGl2ZSBwcm9kdWN0aW9uIGluZGV4IG5vdyBhY2Nlc3NlcyBhbHJlYWR5IHBhcnNlZCBzeW1ib2xzIG9uIHRoZQogICAgICAgICAgcGFyc2luZyBzdGFjay4gIEZvciBleGFtcGxlLCAKCiAgICAgICAgICAgICAgZGVmIHBfZm9vKHApOgogICAgICAgICAgICAgICAgICAgImZvbzogQSBCIEMgRCIKICAgICAgICAgICAgICAgICAgIHByaW50IHBbMV0gICAgICAgIyBWYWx1ZSBvZiAnQScgc3ltYm9sCiAgICAgICAgICAgICAgICAgICBwcmludCBwWzJdICAgICAgICMgVmFsdWUgb2YgJ0InIHN5bWJvbAogICAgICAgICAgICAgICAgICAgcHJpbnQgcFstMV0gICAgICAjIFZhbHVlIG9mIHdoYXRldmVyIHN5bWJvbCBhcHBlYXJzIGJlZm9yZSBBCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb24gdGhlIHBhcnNpbmcgc3RhY2suCgogICAgICAgICAgICAgICAgICAgcFswXSA9IHNvbWVfdmFsICAjIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAnZm9vJyBncmFtbWVyIHN5bWJvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIFRoaXMgYmVoYXZpb3IgbWFrZXMgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCBlbWJlZGRlZCBhY3Rpb25zIHdpdGhpbiB0aGUKICAgICAgICAgIHBhcnNpbmcgcnVsZXMuIEZvciBleGFtcGxlLCBpbiBDLXlhY2MsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGNvZGUgbGlrZQogICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgIGJhcjogICBBIHsgcHJpbnRmKCJzZWVuIGFuIEEgPSAlZFxuIiwgJDEpOyB9IEIgeyBkb19zdHVmZjsgfQoKICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIHByaW50ZigpIGNvZGUgZXhlY3V0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgQSBoYXMgYmVlbgogICAgICAgICAgcGFyc2VkLiAgV2l0aGluIHRoZSBlbWJlZGRlZCBhY3Rpb24gY29kZSwgJDEgcmVmZXJzIHRvIHRoZSBBIHN5bWJvbCBvbgogICAgICAgICAgdGhlIHN0YWNrLgoKICAgICAgICAgIFRvIHBlcmZvcm0gdGhpcyBlcXVpdmFsZW50IGFjdGlvbiBpbiBQTFksIHlvdSBuZWVkIHRvIHdyaXRlIGEgcGFpcgogICAgICAgICAgb2YgcnVsZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgZGVmIHBfYmFyKHApOgogICAgICAgICAgICAgICAgICAgICAiYmFyIDogQSBzZWVuX0EgQiIKICAgICAgICAgICAgICAgICAgICAgZG9fc3R1ZmYKCiAgICAgICAgICAgICAgIGRlZiBwX3NlZW5fQShwKToKICAgICAgICAgICAgICAgICAgICAgInNlZW5fQSA6IgogICAgICAgICAgICAgICAgICAgICBwcmludCAic2VlbiBhbiBBID0iLCBwWy0xXQoKICAgICAgICAgIFRoZSBzZWNvbmQgcnVsZSAic2Vlbl9BIiBpcyBtZXJlbHkgYSBlbXB0eSBwcm9kdWN0aW9uIHdoaWNoIHNob3VsZCBiZQogICAgICAgICAgcmVkdWNlZCBhcyBzb29uIGFzIEEgaXMgcGFyc2VkIGluIHRoZSAiYmFyIiBydWxlIGFib3ZlLiAgVGhlIHVzZSAKICAgICAgICAgIG9mIHRoZSBuZWdhdGl2ZSBpbmRleCBwWy0xXSBpcyB1c2VkIHRvIGFjY2VzcyB3aGF0ZXZlciBzeW1ib2wgYXBwZWFyZWQKICAgICAgICAgIGJlZm9yZSB0aGUgc2Vlbl9BIHN5bWJvbC4KCiAgICAgICAgICBUaGlzIGZlYXR1cmUgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdXBwb3J0IGluaGVyaXRlZCBhdHRyaWJ1dGVzLgogICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBkZWYgcF9kZWNsKHApOgogICAgICAgICAgICAgICAgICAgICAiZGVjbCA6IHNjb3BlIG5hbWUiCgogICAgICAgICAgICAgICBkZWYgcF9zY29wZShwKToKICAgICAgICAgICAgICAgICAgICAgIiIic2NvcGUgOiBHTE9CQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMT0NBTCIiIgogICAgICAgICAgICAgICAgICAgcFswXSA9IHBbMV0KCiAgICAgICAgICAgICAgIGRlZiBwX25hbWUocCk6CiAgICAgICAgICAgICAgICAgICAgICJuYW1lIDogSUQiCiAgICAgICAgICAgICAgICAgICAgIGlmIHBbLTFdID09ICJHTE9CQUwiOgogICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgcFstMV0gPT0gIkxPQ0FMIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAjLi4uCgogICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgbmFtZSBydWxlIGlzIGluaGVyaXRpbmcgYW4gYXR0cmlidXRlIGZyb20gdGhlCiAgICAgICAgICBzY29wZSBkZWNsYXJhdGlvbiB0aGF0IHByZWNlZGVzIGl0LgogICAgICAgCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIElmIHlvdSBhcmUgY3VycmVudGx5IHVzaW5nIG5lZ2F0aXZlIGluZGljZXMgd2l0aGluIGV4aXN0aW5nIGdyYW1tYXIgcnVsZXMsCiAgICAgICAgICB5b3VyIGNvZGUgd2lsbCBicmVhay4gIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIGlmIG5vbi1leGlzdGVudCBpbgogICAgICAgICAgbW9zdCBjYXNlcy4gIFRoZSBhcmd1bWVudCB0byB2YXJpb3VzIGdyYW1tYXIgcnVsZXMgaXMgbm90IHVzdWFsbHkgbm90CiAgICAgICAgICBwcm9jZXNzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGEgbGlzdCBvZiBpdGVtcy4KICAgICAgICAgIApWZXJzaW9uIDIuMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDkvMDcvMDY6IGJlYXpsZXkKICAgICAgICAgIE1ham9yIGNsZWFudXAgYW5kIHJlZmFjdG9yaW5nIG9mIHRoZSBMUiB0YWJsZSBnZW5lcmF0aW9uIGNvZGUuICBCb3RoIFNMUgogICAgICAgICAgYW5kIExBTFIoMSkgdGFibGUgZ2VuZXJhdGlvbiBpcyBub3cgcGVyZm9ybWVkIGJ5IHRoZSBzYW1lIGNvZGUgYmFzZSB3aXRoCiAgICAgICAgICBvbmx5IG1pbm9yIGV4dGVuc2lvbnMgZm9yIGV4dHJhIExBTFIoMSkgcHJvY2Vzc2luZy4KCjA5LzA3LzA2OiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IHJlaW1wbGVtZW50ZWQgdGhlIGVudGlyZSBMQUxSKDEpIHBhcnNpbmcgZW5naW5lIHRvIHVzZSB0aGUKICAgICAgICAgIERlUmVtZXIgYW5kIFBlbm5lbGxvIGFsZ29yaXRobSBmb3IgY2FsY3VsYXRpbmcgbG9va2FoZWFkIHNldHMuICBUaGlzCiAgICAgICAgICBzaWduaWZpY2FudGx5IGltcHJvdmVzIHRoZSBwZXJmb3JtYW5jZSBvZiBnZW5lcmF0aW5nIExBTFIoMSkgdGFibGVzCiAgICAgICAgICBhbmQgaGFzIHRoZSBhZGRlZCBmZWF0dXJlIG9mIGFjdHVhbGx5IHdvcmtpbmcgY29ycmVjdGx5ISAgSWYgeW91CiAgICAgICAgICBleHBlcmllbmNlZCB3ZWlyZCBiZWhhdmlvciB3aXRoIExBTFIoMSkgaW4gcHJpb3IgcmVsZWFzZXMsIHRoaXMgc2hvdWxkCiAgICAgICAgICBob3BlZnVsbHkgcmVzb2x2ZSBhbGwgb2YgdGhvc2UgcHJvYmxlbXMuICBNYW55IHRoYW5rcyB0byAKICAgICAgICAgIEFuZHJldyBXYXRlcnMgYW5kIE1hcmt1cyBTY2hvZXBmbGluIGZvciBzdWJtaXR0aW5nIGJ1ZyByZXBvcnRzCiAgICAgICAgICBhbmQgaGVscGluZyBtZSB0ZXN0IG91dCB0aGUgcmV2aXNlZCBMQUxSKDEpIHN1cHBvcnQuCgpWZXJzaW9uIDEuOAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDgvMDIvMDY6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBoYW5kbGluZyBvZiBkZWZhdWx0IGFjdGlvbnMgaW4gTEFMUigxKQogICAgICAgICAgcGFyc2luZy4gIElmIHlvdSBleHBlcmllbmNlZCBzdWJ0bGUgYW5kL29yIGJpemFycmUgYmVoYXZpb3Igd2hlbiB0cnlpbmcKICAgICAgICAgIHRvIHVzZSB0aGUgTEFMUigxKSBlbmdpbmUsIHRoaXMgbWF5IGNvcnJlY3QgdGhvc2UgcHJvYmxlbXMuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVzcyBDb3guICBOb3RlOiBUaGlzIHBhdGNoIGhhcyBiZWVuIHN1cGVyY2VkZWQgYnkgCiAgICAgICAgICByZXZpc2lvbnMgZm9yIExBTFIoMSkgcGFyc2luZyBpbiBQbHktMi4wLgoKMDgvMDIvMDY6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNsaWNpbmcgb2YgcHJvZHVjdGlvbnMgaW4geWFjYy4gIAogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUGF0cmljayBNZXphcmQuCgpWZXJzaW9uIDEuNwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDMvMDIvMDY6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGluZmluaXRlIHJlY3Vyc2lvbiBwcm9ibGVtIFJlZHVjZVRvVGVybWluYWxzKCkgZnVuY3Rpb24gdGhhdAogICAgICAgICAgd291bGQgc29tZXRpbWVzIGNvbWUgdXAgaW4gTEFMUigxKSB0YWJsZSBnZW5lcmF0aW9uLiAgUmVwb3J0ZWQgYnkgCiAgICAgICAgICBNYXJrdXMgU2Nob2VwZmxpbi4KCjAzLzAxLzA2OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAicmVmbGFncyIgYXJndW1lbnQgdG8gbGV4KCkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGxleC5sZXgocmVmbGFncz1yZS5VTklDT0RFKQoKICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvcHRpb25hbCBmbGFncyB0byB0aGUgcmUuY29tcGlsZSgpIGZ1bmN0aW9uCiAgICAgICAgICB1c2VkIGluc2lkZSB0aGUgbGV4ZXIuICAgVGhpcyBtYXkgYmUgbmVjZXNzYXJ5IGZvciBzcGVjaWFsIHNpdHVhdGlvbnMgc3VjaAogICAgICAgICAgYXMgcHJvY2Vzc2luZyBVbmljb2RlIChlLmcuLCBpZiB5b3Ugd2FudCBlc2NhcGVzIGxpa2UgXHcgYW5kIFxiIHRvIGNvbnN1bHQKICAgICAgICAgIHRoZSBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0eSBkYXRhYmFzZSkuICAgVGhlIG5lZWQgZm9yIHRoaXMgc3VnZ2VzdGVkIGJ5CiAgICAgICAgICBBbmRyZWFzIEp1bmcuCgowMy8wMS8wNjogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG9uIHJlcGVhdGVkIGluc3RhbnRpYXRpb25zIG9mIHBhcnNlcgogICAgICAgICAgb2JqZWN0cyB3aGVuIHRoZSB3cml0ZV90YWJsZXM9MCBhcmd1bWVudCB3YXMgdXNlZC4gICBSZXBvcnRlZCBieSBNaWNoYWVsIEJyb3duLgoKMDMvMDEvMDY6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIGxleC5weSB0byBhY2NlcHQgVW5pY29kZSBzdHJpbmdzIGJvdGggYXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yCiAgICAgICAgICB0b2tlbnMgYW5kIGFzIGlucHV0LiBIb3BlZnVsbHkgdGhpcyBpcyB0aGUgb25seSBjaGFuZ2UgbmVlZGVkIGZvciBVbmljb2RlIHN1cHBvcnQuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBKb2hhbiBEYWhsLgoKMDMvMDEvMDY6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBjbGFzcy1iYXNlZCBpbnRlcmZhY2UgdG8gd29yayB3aXRoIG5ldy1zdHlsZSBvciBvbGQtc3R5bGUgY2xhc3Nlcy4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgQnJvd24gKGFsdGhvdWdoIEkgdHdlYWtlZCBpdCBzbGlnaHRseSBzbyBpdCB3b3VsZCB3b3JrCiAgICAgICAgICB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbikuCgpWZXJzaW9uIDEuNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDUvMjcvMDU6IGJlYXpsZXkKICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaCBjb250cmlidXRlZCBieSBDaHJpc3RvcGhlciBTdGF3YXJ6IHRvIGZpeCBhbiBleHRyZW1lbHkKICAgICAgICAgIGRldmlvdXMgYnVnIGluIExBTFIoMSkgcGFyc2VyIGdlbmVyYXRpb24uICAgVGhpcyBwYXRjaCBzaG91bGQgZml4IHByb2JsZW1zCiAgICAgICAgICBudW1lcm91cyBwZW9wbGUgcmVwb3J0ZWQgd2l0aCBMQUxSIHBhcnNpbmcuCgowNS8yNy8wNTogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGxleC5weSBjb3B5IGNvbnN0cnVjdG9yLiAgUmVwb3J0ZWQgYnkgRGF2ZSBBaXRlbCwgQWFyb24gTGF2LAogICAgICAgICAgYW5kIFRoYWQgQXVzdGluLiAKCjA1LzI3LzA1OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBvdXRwdXRkaXIgb3B0aW9uIHRvIHlhY2MoKSAgdG8gY29udHJvbCBvdXRwdXQgZGlyZWN0b3J5LiBDb250cmlidXRlZAogICAgICAgICAgYnkgQ2hyaXN0b3BoZXIgU3Rhd2Fyei4KCjA1LzI3LzA1OiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBydW51bml0LnB5IHRlc3Qgc2NyaXB0IHRvIHJ1biB0ZXN0cyB1c2luZyB0aGUgUHl0aG9uIHVuaXR0ZXN0IG1vZHVsZS4KICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE1pa2kgVGViZWthLgoKVmVyc2lvbiAxLjUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjA1LzI2LzA0OiBiZWF6bGV5CiAgICAgICAgICBNYWpvciBlbmhhbmNlbWVudC4gTEFMUigxKSBwYXJzaW5nIHN1cHBvcnQgaXMgbm93IHdvcmtpbmcuCiAgICAgICAgICBUaGlzIGZlYXR1cmUgd2FzIGltcGxlbWVudGVkIGJ5IEVsaWFzIElvdXAgKGV6aW91cEBhbHVtbmkudWNoaWNhZ28uZWR1KQogICAgICAgICAgYW5kIG9wdGltaXplZCBieSBEYXZpZCBCZWF6bGV5LiBUbyB1c2UgTEFMUigxKSBwYXJzaW5nIGRvCiAgICAgICAgICB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgeWFjYy55YWNjKG1ldGhvZD0iTEFMUiIpCgogICAgICAgICAgQ29tcHV0aW5nIExBTFIoMSkgcGFyc2luZyB0YWJsZXMgdGFrZXMgYWJvdXQgdHdpY2UgYXMgbG9uZyBhcwogICAgICAgICAgdGhlIGRlZmF1bHQgU0xSIG1ldGhvZC4gIEhvd2V2ZXIsIExBTFIoMSkgYWxsb3dzIHlvdSB0byBoYW5kbGUKICAgICAgICAgIG1vcmUgY29tcGxleCBncmFtbWFycy4gIEZvciBleGFtcGxlLCB0aGUgQU5TSSBDIGdyYW1tYXIKICAgICAgICAgIChpbiBleGFtcGxlL2Fuc2ljKSBoYXMgMTMgc2hpZnQtcmVkdWNlIGNvbmZsaWN0cyB3aXRoIFNMUiwgYnV0CiAgICAgICAgICBvbmx5IGhhcyAxIHNoaWZ0LXJlZHVjZSBjb25mbGljdCB3aXRoIExBTFIoMSkuCgowNS8yMC8wNDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBfX2xlbl9fIG1ldGhvZCB0byBwYXJzZXIgcHJvZHVjdGlvbiBsaXN0cy4gIENhbgogICAgICAgICAgYmUgdXNlZCBpbiBwYXJzZXIgcnVsZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgIGRlZiBwX3NvbWVydWxlKHApOgogICAgICAgICAgICAgICAgICIiImEgOiBCIEMgRAogICAgICAgICAgICAgICAgICAgICAgfCBFIEYiCiAgICAgICAgICAgICAgICAgaWYgKGxlbihwKSA9PSAzKToKICAgICAgICAgICAgICAgICAgICAgIyBNdXN0IGhhdmUgYmVlbiBmaXJzdCBydWxlCiAgICAgICAgICAgICAgICAgZWxpZiAobGVuKHApID09IDIpOgogICAgICAgICAgICAgICAgICAgICAjIE11c3QgYmUgc2Vjb25kIHJ1bGUKCiAgICAgICAgICBTdWdnZXN0ZWQgYnkgSm9zaHVhIEdlcnRoIGFuZCBvdGhlcnMuCgpWZXJzaW9uIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMDQvMjMvMDQ6IGJlYXpsZXkKICAgICAgICAgIEluY29ycG9yYXRlZCBhIHZhcmlldHkgb2YgcGF0Y2hlcyBjb250cmlidXRlZCBieSBFcmljIFJheW1vbmQuCiAgICAgICAgICBUaGVzZSBpbmNsdWRlOgoKICAgICAgICAgICAwLiBDbGVhbnMgdXAgc29tZSBjb21tZW50cyBzbyB0aGV5IGRvbid0IHdyYXAgb24gYW4gODAtY29sdW1uIGRpc3BsYXkuCiAgICAgICAgICAgMS4gRGlyZWN0cyBjb21waWxlciBlcnJvcnMgdG8gc3RkZXJyIHdoZXJlIHRoZXkgYmVsb25nLgogICAgICAgICAgIDIuIEltcGxlbWVudHMgYW5kIGRvY3VtZW50cyBhdXRvbWF0aWMgbGluZSBjb3VudGluZyB3aGVuIFxuIGlzIGlnbm9yZWQuCiAgICAgICAgICAgMy4gQ2hhbmdlcyB0aGUgd2F5IHByb2dyZXNzIG1lc3NhZ2VzIGFyZSBkdW1wZWQgd2hlbiBkZWJ1Z2dpbmcgaXMgb24uIAogICAgICAgICAgICAgIFRoZSBuZXcgZm9ybWF0IGlzIGJvdGggbGVzcyB2ZXJib3NlIGFuZCBjb252ZXlzIG1vcmUgaW5mb3JtYXRpb24gdGhhbgogICAgICAgICAgICAgIHRoZSBvbGQsIGluY2x1ZGluZyBzaGlmdCBhbmQgcmVkdWNlIGFjdGlvbnMuCgowNC8yMy8wNDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBQeXRob24gc2V0dXAucHkgZmlsZSB0byBzaW1wbHkgaW5zdGFsbGF0aW9uLiAgQ29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEFkYW0gS2Vycmlzb24uCgowNC8yMy8wNDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2hlcyBjb250cmlidXRlZCBieSBBZGFtIEtlcnJpc29uLgogCiAgICAgICAgICAtICAgU29tZSBvdXRwdXQgaXMgbm93IG9ubHkgc2hvd24gd2hlbiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gIFRoaXMKICAgICAgICAgICAgICBtZWFucyB0aGF0IFBMWSB3aWxsIGJlIGNvbXBsZXRlbHkgc2lsZW50IHdoZW4gbm90IGluIGRlYnVnZ2luZyBtb2RlLgogICAgICAgICAgCiAgICAgICAgICAtICAgQW4gb3B0aW9uYWwgcGFyYW1ldGVyICJ3cml0ZV90YWJsZXMiIGNhbiBiZSBwYXNzZWQgdG8geWFjYygpIHRvCiAgICAgICAgICAgICAgY29udHJvbCB3aGV0aGVyIG9yIG5vdCBwYXJzaW5nIHRhYmxlcyBhcmUgd3JpdHRlbi4gICBCeSBkZWZhdWx0LAogICAgICAgICAgICAgIGl0IGlzIHRydWUsIGJ1dCBpdCBjYW4gYmUgdHVybmVkIG9mZiBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgeWFjYwogICAgICAgICAgICAgIHRhYmxlIGZpbGUuIE5vdGU6IGRpc2FibGluZyB0aGlzIHdpbGwgY2F1c2UgeWFjYygpIHRvIHJlZ2VuZXJhdGUKICAgICAgICAgICAgICB0aGUgcGFyc2luZyB0YWJsZSBlYWNoIHRpbWUuCgowNC8yMy8wNDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2hlcyBjb250cmlidXRlZCBieSBEYXZpZCBNY05hYi4gIFRoaXMgcGF0Y2ggYWRkZXMgdHdvCiAgICAgICAgICBmZWF0dXJlczoKCiAgICAgICAgICAtICAgVGhlIHBhcnNlciBjYW4gYmUgc3VwcGxpZWQgYXMgYSBjbGFzcyBpbnN0ZWFkIG9mIGEgbW9kdWxlLgogICAgICAgICAgICAgIEZvciBhbiBleGFtcGxlIG9mIHRoaXMsIHNlZSB0aGUgZXhhbXBsZS9jbGFzc2NhbGMgZGlyZWN0b3J5LgoKICAgICAgICAgIC0gICBEZWJ1Z2dpbmcgb3V0cHV0IGNhbiBiZSBkaXJlY3RlZCB0byBhIGZpbGVuYW1lIG9mIHRoZSB1c2VyJ3MKICAgICAgICAgICAgICBjaG9pY2UuICBVc2UKCiAgICAgICAgICAgICAgICAgeWFjYyhkZWJ1Z2ZpbGU9InNvbWVmaWxlLm91dCIpCgogICAgICAgICAgClZlcnNpb24gMS4zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoxMi8xMC8wMjogam1keWNrCiAgICAgICAgICBWYXJpb3VzIG1pbm9yIGFkanVzdG1lbnRzIHRvIHRoZSBjb2RlIHRoYXQgRGF2ZSBjaGVja2VkIGluIHRvZGF5LgogICAgICAgICAgVXBkYXRlZCB0ZXN0L3lhY2Nfe2luZix1bnVzZWR9LmV4cCB0byByZWZsZWN0IHRvZGF5J3MgY2hhbmdlcy4KCjEyLzEwLzAyOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgYSB2YXJpZXR5IG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byBlbXB0eSBwcm9kdWN0aW9uCiAgICAgICAgICBoYW5kbGluZyBhbmQgaW5maW5pdGUgcmVjdXJzaW9uIGNoZWNraW5nLiAgQ29udHJpYnV0ZWQgYnkKICAgICAgICAgIE1pY2hhZWwgRHljay4KCjEyLzEwLzAyOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIGJvZ3VzIHJlY292ZXIoKSBtZXRob2QgY2FsbCBpbiB5YWNjLnJlc3RhcnQoKQoKVmVyc2lvbiAxLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjExLzI3LzAyOiBiZWF6bGV5CiAgICAgICAgICBMZXhlciBhbmQgcGFyc2VyIG9iamVjdHMgYXJlIG5vdyBhdmFpbGFibGUgYXMgYW4gYXR0cmlidXRlCiAgICAgICAgICBvZiB0b2tlbnMgYW5kIHNsaWNlcyByZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICBkZWYgdF9OVU1CRVIodCk6CiAgICAgICAgICAgICAgICAgcidcZCsnCiAgICAgICAgICAgICAgICAgcHJpbnQgdC5sZXhlcgoKICAgICAgICAgICAgIGRlZiBwX2V4cHJfcGx1cyh0KToKICAgICAgICAgICAgICAgICAnZXhwcjogZXhwciBQTFVTIGV4cHInCiAgICAgICAgICAgICAgICAgcHJpbnQgdC5sZXhlcgogICAgICAgICAgICAgICAgIHByaW50IHQucGFyc2VyCgogICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBmb3Igc3RhdGUgbWFuYWdlbWVudCAoaWYgbmVlZGVkKS4KIAoxMC8zMS8wMjogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgeWFjYy5weSB0byB3b3JrIHdpdGggUHl0aG9uIG9wdGltaXplIG1vZGUuICBUbyBtYWtlCiAgICAgICAgICB0aGlzIHdvcmssIHlvdSBuZWVkIHRvIHVzZQoKICAgICAgICAgICAgICB5YWNjLnlhY2Mob3B0aW1pemU9MSkKCiAgICAgICAgICBGdXJ0aGVybW9yZSwgeW91IG5lZWQgdG8gZmlyc3QgcnVuIFB5dGhvbiBpbiBub3JtYWwgbW9kZQogICAgICAgICAgdG8gZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBwYXJzZXRhYi5weSBmaWxlcy4gIEFmdGVyIHRoYXQsCiAgICAgICAgICB5b3UgY2FuIHVzZSBweXRob24gLU8gb3IgcHl0aG9uIC1PTy4gIAoKICAgICAgICAgIE5vdGU6IG9wdGltaXplZCBtb2RlIHR1cm5zIG9mZiBhIGxvdCBvZiBlcnJvciBjaGVja2luZy4KICAgICAgICAgIE9ubHkgdXNlIHdoZW4geW91IGFyZSBzdXJlIHRoYXQgeW91ciBncmFtbWFyIGlzIHdvcmtpbmcuCiAgICAgICAgICBNYWtlIHN1cmUgcGFyc2V0YWIucHkgaXMgdXAgdG8gZGF0ZSEKCjEwLzMwLzAyOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBjbG9uaW5nIG9mIExleGVyIG9iamVjdHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGltcG9ydCBjb3B5CiAgICAgICAgICAgICAgbCA9IGxleC5sZXgoKQogICAgICAgICAgICAgIGxjID0gY29weS5jb3B5KGwpCgogICAgICAgICAgICAgIGwuaW5wdXQoIlNvbWUgdGV4dCIpCiAgICAgICAgICAgICAgbGMuaW5wdXQoIlNvbWUgb3RoZXIgdGV4dCIpCiAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgdGhlIHNhbWUgImxleGVyIiBpcyBtZWFudCB0bwogICAgICAgICAgYmUgdXNlZCBpbiBkaWZmZXJlbnQgY29udGV4dHMtLS1vciBpZiBtdWx0aXBsZSBsZXhlcnMKICAgICAgICAgIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KICAgICAgICAgICAgICAgIAoxMC8zMC8wMjogYmVhemxleQogICAgICAgICAgRml4ZWQgc3VidGxlIGJ1ZyB3aXRoIGZpcnN0IHNldCBjb21wdXRhdGlvbiBhbmQgZW1wdHkgcHJvZHVjdGlvbnMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBEeWNrLgoKMTAvMzAvMDI6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGVycm9yIG1lc3NhZ2VzIHRvIHVzZSAiZmlsZW5hbWU6bGluZTogbWVzc2FnZSIgaW5zdGVhZAogICAgICAgICAgb2YgImZpbGVuYW1lOmxpbmUuIG1lc3NhZ2UiLiAgVGhpcyBtYWtlcyBlcnJvciByZXBvcnRpbmcgbW9yZQogICAgICAgICAgZnJpZW5kbHkgdG8gZW1hY3MuIFBhdGNoIHN1Ym1pdHRlZCBieSBGcmFu529pcyBQaW5hcmQuCgoxMC8zMC8wMjogYmVhemxleQogICAgICAgICAgSW1wcm92ZW1lbnRzIHRvIHBhcnNlci5vdXQgZmlsZS4gIFRlcm1pbmFscyBhbmQgbm9udGVybWluYWxzCiAgICAgICAgICBhcmUgc29ydGVkIGluc3RlYWQgb2YgYmVpbmcgcHJpbnRlZCBpbiByYW5kb20gb3JkZXIuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgRnJhbudvaXMgUGluYXJkLgoKMTAvMzAvMDI6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVtZW50cyB0byBwYXJzZXIub3V0IGZpbGUgb3V0cHV0LiAgUnVsZXMgYXJlIG5vdyBwcmludGVkCiAgICAgICAgICBpbiBhIHdheSB0aGF0J3MgZWFzaWVyIHRvIHVuZGVyc3RhbmQuICBDb250cmlidXRlZCBieSBSdXNzIENveC4KCjEwLzMwLzAyOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAnbm9uYXNzb2MnIGFzc29jaWF0aXZpdHkgc3VwcG9ydC4gICAgVGhpcyBjYW4gYmUgdXNlZAogICAgICAgICAgdG8gZGlzYWJsZSB0aGUgY2hhaW5pbmcgb2Ygb3BlcmF0b3JzIGxpa2UgYSA8IGIgPCBjLgogICAgICAgICAgVG8gdXNlLCBzaW1wbHkgc3BlY2lmeSAnbm9uYXNzb2MnIGluIHRoZSBwcmVjZWRlbmNlIHRhYmxlCgogICAgICAgICAgcHJlY2VkZW5jZSA9ICgKICAgICAgICAgICAgKCdub25hc3NvYycsICdMRVNTVEhBTicsICdHUkVBVEVSVEhBTicpLCAgIyBOb25hc3NvY2lhdGl2ZSBvcGVyYXRvcnMKICAgICAgICAgICAgKCdsZWZ0JywgJ1BMVVMnLCAnTUlOVVMnKSwKICAgICAgICAgICAgKCdsZWZ0JywgJ1RJTUVTJywgJ0RJVklERScpLAogICAgICAgICAgICAoJ3JpZ2h0JywgJ1VNSU5VUycpLCAgICAgICAgICAgICMgVW5hcnkgbWludXMgb3BlcmF0b3IKICAgICAgICAgICkKCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBSdXNzIENveC4KCjEwLzMwLzAyOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgbGV4ZXIgdG8gcHJvdmlkZSBvcHRpb25hbCBzdXBwb3J0IGZvciBQeXRob24gLU8gYW5kIC1PTwogICAgICAgICAgbW9kZXMuICBUbyBtYWtlIHRoaXMgd29yaywgUHl0aG9uICpmaXJzdCogbmVlZHMgdG8gYmUgcnVuIGluCiAgICAgICAgICB1bm9wdGltaXplZCBtb2RlLiAgVGhpcyByZWFkcyB0aGUgbGV4aW5nIGluZm9ybWF0aW9uIGFuZCBjcmVhdGVzIGEKICAgICAgICAgIGZpbGUgImxleHRhYi5weSIuICBUaGVuLCBydW4gbGV4IGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAjIG1vZHVsZSBmb28ucHkKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBsZXgubGV4KG9wdGltaXplPTEpCgogICAgICAgICAgT25jZSB0aGUgbGV4dGFiIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCwgc3Vic2VxdWVudCBjYWxscyB0bwogICAgICAgICAgbGV4LmxleCgpIHdpbGwgcmVhZCBkYXRhIGZyb20gdGhlIGxleHRhYiBmaWxlIGluc3RlYWQgb2YgdXNpbmcgCiAgICAgICAgICBpbnRyb3NwZWN0aW9uLiAgIEluIG9wdGltaXplZCBtb2RlICgtTywgLU9PKSBldmVyeXRoaW5nIHNob3VsZAogICAgICAgICAgd29yayBub3JtYWxseSBkZXNwaXRlIHRoZSBsb3NzIG9mIGRvYyBzdHJpbmdzLgoKICAgICAgICAgIFRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSAnbGV4dGFiLnB5JyB1c2UgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgIGxleC5sZXgobGV4dGFiPSJmb290YWIiKQoKICAgICAgICAgICh0aGlzIGNyZWF0ZXMgYSBmaWxlIGZvb3RhYi5weSkKICAgICAgICAgCgpWZXJzaW9uIDEuMSAgIE9jdG9iZXIgMjUsIDIwMDEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxMC8yNS8wMTogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHRhYmxlIGdlbmVyYXRvciB0byBwcm9kdWNlIG11Y2ggbW9yZSBjb21wYWN0IGRhdGEuCiAgICAgICAgICBUaGlzIHNob3VsZCBncmVhdGx5IHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgcGFyc2V0YWIucHlbY10gZmlsZS4KICAgICAgICAgIENhdmVhdDogdGhlIHRhYmxlcyBzdGlsbCBuZWVkIHRvIGJlIGNvbnN0cnVjdGVkIHNvIGEgbGl0dGxlIG1vcmUKICAgICAgICAgIHdvcmsgaXMgZG9uZSBpbiBwYXJzZXRhYiBvbiBpbXBvcnQuIAoKMTAvMjUvMDE6IGJlYXpsZXkKICAgICAgICAgIFRoZXJlIG1heSBiZSBhIHBvc3NpYmxlIGJ1ZyBpbiB0aGUgY3ljbGUgZGV0ZWN0b3IgdGhhdCByZXBvcnRzIGVycm9ycwogICAgICAgICAgYWJvdXQgaW5maW5pdGUgcmVjdXJzaW9uLiAgIEknbSBoYXZpbmcgYSBsaXR0bGUgdHJvdWJsZSB0cmFja2luZyBpdAogICAgICAgICAgZG93biwgYnV0IGlmIHlvdSBnZXQgdGhpcyBwcm9ibGVtLCB5b3UgY2FuIGRpc2FibGUgdGhlIGN5Y2xlCiAgICAgICAgICBkZXRlY3RvciBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICB5YWNjLnlhY2MoY2hlY2tfcmVjdXJzaW9uID0gMCkKCjEwLzI1LzAxOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiBsZXgucHkgdGhhdCBzb21ldGltZXMgY2F1c2VkIGlsbGVnYWwgY2hhcmFjdGVycyB0byBiZQogICAgICAgICAgcmVwb3J0ZWQgaW5jb3JyZWN0bHkuICBSZXBvcnRlZCBieSBTdmVycmUgSvhyZ2Vuc2VuLgoKNy84LzAxICA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGxleGVyIG9iamVjdCB3aGVuIHRva2VucyBhcmUgaGFuZGxlZCBieQogICAgICAgICAgZnVuY3Rpb25zLiAgIFRoZSBsZXhlciBpcyBhdmFpbGFibGUgYXMgdGhlICdsZXhlcicgYXR0cmlidXRlLiAgIFRoaXMKICAgICAgICAgIHdhcyBhZGRlZCB0byBwcm92aWRlIGJldHRlciBsZXhpbmcgc3VwcG9ydCBmb3IgbGFuZ3VhZ2VzIHN1Y2ggYXMgRm9ydHJhbgogICAgICAgICAgd2hlcmUgY2VydGFpbiB0eXBlcyBvZiB0b2tlbnMgY2FuJ3QgYmUgY29udmVuaWVudGx5IGV4cHJlc3NlZCBhcyByZWd1bGFyIAogICAgICAgICAgZXhwcmVzc2lvbnMgKGFuZCB3aGVyZSB0aGUgdG9rZW5pemluZyBmdW5jdGlvbiBtYXkgd2FudCB0byBwZXJmb3JtIGEgCiAgICAgICAgICBsaXR0bGUgYmFja3RyYWNraW5nKS4gIFN1Z2dlc3RlZCBieSBQZWFydSBQZXRlcnNvbi4KCjYvMjAvMDEgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB5YWNjKCkgZnVuY3Rpb24gc28gdGhhdCBhbiBvcHRpb25hbCBzdGFydGluZyBzeW1ib2wgY2FuIGJlIHNwZWNpZmllZC4KICAgICAgICAgIEZvciBleGFtcGxlOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICB5YWNjLnlhY2Moc3RhcnQ9InN0YXRlbWVudCIpCgogICAgICAgICAgTm9ybWFsbHkgeWFjYyBhbHdheXMgdHJlYXRzIHRoZSBmaXJzdCBwcm9kdWN0aW9uIHJ1bGUgYXMgdGhlIHN0YXJ0aW5nIHN5bWJvbC4KICAgICAgICAgIEhvd2V2ZXIsIGlmIHlvdSBhcmUgZGVidWdnaW5nIHlvdXIgZ3JhbW1hciBpdCBtYXkgYmUgdXNlZnVsIHRvIHNwZWNpZnkKICAgICAgICAgIGFuIGFsdGVybmF0aXZlIHN0YXJ0aW5nIHN5bWJvbC4gIElkZWEgc3VnZ2VzdGVkIGJ5IFJpY2ggU2Fsei4KICAgICAgICAgICAgICAgICAgICAgIApWZXJzaW9uIDEuMCAgSnVuZSAxOCwgMjAwMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpJbml0aWFsIHB1YmxpYyBvZmZlcmluZwoK