Q3ZzIGNvZGUgLQotIEdlbmVyYWwKCS0gTmV3IGdsb2JhbCB2YXJpYWJsZXMgY3VycnNob3J0Y3V0IGFuZCBjdXJyc2xlbiB0byBzdXBwb3J0IHVzaW5nCgkgIHRoZSBtb3VzZSB3aXRoIHRoZSBzaG9ydGN1dHMuICBBbHNvIHN1cHBvcnRzIGNsaWNraW5nIG9uIGZpbGVzCgkgIGluIGJyb3dzZXIuICBBZGRlZCAjaWZkZWYgRElTQUJMRV9NT1VTRSBhcm91bmQgdGhpcyBjb2RlIGFsc28uCgktIENoYW5nZWQgbW91c2UgZGlzYWJsaW5nIGNvZGUgZnJvbSBkZXBlbmRpbmcgb24gLS1lbmFibGUtdGlueQoJICB0byBpdHMgb3duIGZsYWcsIC0tZGlzYWJsZS1tb3VzZS4gIFRoZSAtLXRpbnkgb3B0aW9uIGRlZmluZXMKCSAgdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgbm93IGp1c3QgbW91c2Ugc3VwcG9ydCBjYW4gYmUgZGlzYWJsZWQKCSAgaWYgZGVzaXJlZC4KCS0gRmlsZSBCcm93c2VyIHN1cHBvcnRzIHRoZSAiR290byBEaXJlY3RvcnkiCgktIEFkZGVkIHJjZmlsZS5jIHNvdXJjZSBmaWxlLiAgT25seSBpbmNsdWRlcyBtdWNoIG9mIGFueXRoaW5nIHdoZW4KCSAgLS1lbmFibGUtbmFub3JjIGlzIHVzZWQuICBUb25zIG9mIG5ldyBmdW5jcywgbW9zdCBub3RhYmx5CgkgIGRvX3JjZmlsZSgpIGNhbGxlZCBmcm9tIG5hbm8uYzptYWluKCkuICBBZGRlZCBtdWNoIG5lZWRlZCAKCSAgZnVuY3Rpb24gbmNhbGxvYygpLCB3aWxsIGhhdmUgdG8gZ28gdGhyb3VnaCBzb3VyY2UgY29kZSBsYXRlciAKCSAgYW5kIGNoYW5nZSB0aGUgYXByb3Byb2F0ZSBjYWxscyB3aGljaCB1c2VkIG5tYWxsb2MgZm9yIGxhY2sgb2YKCSAgYW4gYXByb3ByaWF0ZSBjYWxsb2MgZnVuY3Rpb24gKioqIEZJWE1FICoqKgoJLSBBZnRlciAiQWx0ZXJuYXRlIiBzcGVsbCBjaGVja2VyIGlzIGNhbGxlZCwgY3Vyc29yIGlzIHJlcG9zaXRpb25lZCBvbgoJICB0aGUgc2FtZSBsaW5lIGFzIGJlZm9yZSBeVCB3YXMgcHJlc3NlZC4gCgktIE1vdmVkIGNvbmZpZy5oIHVwIGluIGFsbCAuYyBmaWxlcyAjaW5jbHVkZSBsaXN0IChBbGJlcnQgQ2hpbikuCgktIEFkZGVkIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1YiB0byBkaXN0cmlidXRpb24gYmVjYXVzZSwKCSAgYXBwYXJlbnRseSwgbmV3ZXIgYXV0b2NvbmYvYXV0b21ha2VzIGNhbid0IGxpdmUgd2l0aG91dCB0aGVtLgoJLSBWYXJpb3VzIHNwZWxsaW5nIHVwZGF0ZXMgYnkgRGF2aWQgTGF3cmVuY2UgUmFtc2V5LgoJLSBDaGFuZ2VkIGFsbCBzdHJpbmcgYWxsb2NhdGlvbnMgdG8gY2hhcmFsbG9jKCksIG5ldyBmdW5jdGlvbgoJICBkZXNpZ25lZCB0byB0YWtlIG5tYWxsb2MgYXJndW1lbnQgYnV0IGNhbGwgY2FsbG9jIGJhc2VkIG9uIAoJICAoY2hhciAqKSBzaXplLgoJLSBOZXcgbWFjcm8gRElTQUJMRV9XUkFQSlVTVElGWSB0byBlYXNpbHkgY2hlY2sgZm9yIGJvdGggd3JhcHBpbmcKCSAgYW5kIGp1c3RpZnkgYmVpbmcgZGlzYWJsZWQuICBUaGlzIGFsbG93cyB1cyB0byBjb21waWxlIG91dCB0aGUgCgkgIC1yIGZsYWcgaWYgbmVpdGhlciBhcmUgc2V0LCBhbmQgd2lsbCBhbHNvIGFsbG93IHVzIHRvIGNvbW1lbnQKCSAgb3V0IC1XIHdoZW4gaXQgaXMgd3JpdHRlbi4KCS0gQWxsb3cgZmlsbCB0byB0YWtlIGEgbmVnYXRpdmUgdmFsdWUgb3Qgc2lnbmlmeSBhICJmcm9tIHJpZ2h0IHNpZGUiCgkgIHZhbHVlLiAgVGhpcyBhbGxvd3MgdGhlIHZhbHVlIHRvIHZhcnkgd2l0aCB0aGUgc2NyZWVuIHNpemUgeWV0CgkgIHN0aWxsIGJlIGNvcnJlY3QuICBOZXcgc3RhdGljIHZhbHVlIHdyYXBfYXQgdG8gbWluaW1pemUgY29kZQoJICBpbnBhY3QuICBVcGRhdGVkIG1hbiBwYWdlIGFuZCBpbmZvIGZpbGUuCgktIEFsbG93IGZpbGUgYXBwZW5kaW5nLiAgTmV3IHNob3J0Y3V0IGxpc3QgbmFub19pbnNlcnRmaWxlX2xpc3QgKHNpbmNlCgkgIGluc2VydCBhbmQgd3JpdGUgcm91dGluZXMgY2FuJ3Qgc2hhcmUgc2hvcnRjdXQgbGlzdHMgYW55bW9yZSksIAoJICBuZXcgYXJncyB0byBkb193cml0ZW91dCBhbmQgd3JpdGVfZmlsZSBjYWxsZWQgYXBwZW5kLCBhbmQgb2Ygc291cmNlCgkgIGNvZGUgY2hhbmdlcyB0byB0aG9zZSBmdW5jdGlvbnMuCgktIEFsbG93IGJhY2t3YXJkcyBzZWFyY2hpbmcuICBEcmFzdGljIHJld3JpdGUgb2YgdGhlIHNlYXJjaCBwcm9tcHQKCSAgc3RyaW5nIGJ5IENocmlzLiAgQWxsIG90aGVyIGNvZGUgYnkgS2VuIFR5bGVyLiAgTmV3IGdsb2JhbHMKCSAgbmFub19yZXZlcnNlX21zZywgbmV3IGZ1bmN0aW9ucyByZXZzdHJzdHIgYW5kIHJldnN0cmNhc2VzdHIsCgkgIG1hbnkgY2hhbmdlcyB0byBzZWFyY2ggZnVuY3Rpb25zLiAgTm90IHRvbyBiaWcgYSBjb2RlIHNpemUKCSAgaW5jcmVhc2UhCgktIE1vdmVkIGV4dGVuc2lvbiBmdW5jdGlvbnMgKENhc2UgU2Vuc2l0aXZlLCBSZWdleHAsIGFuZCBCYWNrd2FyZHMKCSAgU2VhcmNoLCBBcHBlbmQga2V5IGluIHdyaXRlIGZpbGUgZnVuY3Rpb24pIHRvIE1ldGEga2V5cywgYXMKCSAgcGVvcGxlIGFyZSBjb21wbGFpbmluZyBsb3VkbHkgYWJvdXQgbmFubyBub3QgYmVpbmcgY29udHJvbC1rZXkKCSAgY29tcGF0aWJsZSB3aXRoIFBpY28sIHdoaWNoIGlzIGEgQmFnIFRoaW5nIChUTSkuICBDaGFuZ2VzIHRvCgkgIHNob3J0Y3V0X2luaXQsIHRvZ2dsZV9pbml0LCBuZXcgdG9nZ2xlcyBmb3IgYmFja3dhcmRzIGFuZCByZWdleHAKCSAgKGFuZCB5b3UgY2FuIG5vdyB0b2dnbGUgYWxsIHNlYXJjaCBvcHRpb25zIGluY2x1ZGluZyByZWdleHAgYXQKCSAgdGhlIFNlYXJjaDogcHJvbXB0ISkgIENoYW5nZXMgdG8gbmFub2dldHN0ciB0byBlbmFibGUgTWV0YQoJICBrZXlzIHRvIGJlIGdyYWJiZWQsIGNoYW5nZXMgdG8gb25la2V5IHRvIHByaW50IE0tc3R5bGUgc2hvcnRjdXRzLiAKCS0gTmV3IG1hY3JvIFRPR0dMRSB3aGljaCBqdXN0IHRvZ2dsZXMsIG5vIG1vcmUgc2lsbHkgY2hlY2tpbmcKCSAgSVNTRVQgYW5kIHRoZW4gdXNpbmcgU0VUIG9yIFVOU0VUIHdoZW4gd2Ugd2FudCBhIHNpbXBsZSB0b2dnbGUKCSAgZm9yIGEgZmxhZy4KLSBNYWtlZmlsZS5hbToKCS0gSW5jbHVkZSBBQk9VVC1OTFMgYW5kIHRoZSBuZXcgVEhBTktTIGZpbGVzIHRvIHRoZSBkaXN0cmlidXRlZCBsaXN0LgotIFRIQU5LUzoKCS0gSW5pdGlhbCwgaW5jb21wbGV0ZSBsaXN0IG9mIHBlb3BsZSB0byB0aGFuay4KLSBjb25maWd1cmUuaW46CgktIE5ldyBvcHRpb24sIC0tZW5hYmxlLW5hbm9yYywgd2hpY2ggYWxsb3dzIHBlb3BsZSB0byBoYXZlIGEgLm5hbm9yYwoJICBpbml0aWFsaXphdGlvbiBmaWxlIGFuZCBzZXQgb3B0aW9ucyBub3JtYWxseSB1c2VkIG9uIHRoZSBjb21tYW5kCgkgIGxpbmUsIGFuZCBjb2xvciBsYXRlciBvbi4KCS0gQWRkZWQgLS1lbmFibGUtY29sb3Igb3B0aW9uIHRvIGFsbG93IGNvbG9yIGFuZCBzeW50YXggaGlnaGxpZ2h0aW5nCgkgIChzdHViIGFzIG9mIG5vdykuCi0gY3V0LmM6CiAgYWRkX3RvX2N1dGJ1ZmZlcigpCgktIFJlbW92ZSB1c2VsZXNzIHN0YXRlbWVudHMgKFJvY2NvKS4KICBjdXRfbWFya2VkX3NlZ21lbnQoKQoJLSBBZGQgYml6YXJyZSBjb3B5IG9mIGJvdCBub2RlLCBlbHNlICpCU0QgZ29lcyBiYWxsaXN0aWMgKGZpeGVzCiAgICAgICAgICBCVUcgIzYwKS4KCS0gQWRkZWQgJ2Rlc3RydWN0aXZlJyBhcmd1bWVudC4gIEFsbG93cyB0aGUgc2VsZWN0ZWQgdGV4dCB0byBiZQoJICBhZGRlZCB0byB0aGUgY3V0YnVmZmVyIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSAKCSAgZmlsZS4gIFRoaXMgYWxsb3dzIHdyaXRpbmcgc2VsZWN0aW9uIHRvIHNlcGFyYXRlIGZpbGVzLgogIGRvX2N1dF90ZXh0KCkKCS0gSWYgdGhlIGxpbmUgaXMgZW1wdHkgd2hlbiB1c2luZyAtayBhbmQgd2Fzbid0IGFscmVhZHkgYWRkZWQsCgkgIGNyZWF0ZSBhIGR1bW15IGxpbmUgYW5kIGFkZCBpdCB0byB0aGUgY3V0YnVmZmVyIChmaXhlcyBidWcgIzYxKQoJLSBSZXNldCBtYXJrZWRfY3V0IGlmIHdlIGJsb3cgYXdheSB0aGUgY3V0YnVmZmVyLgoJLSBNb3ZlZCB0aGUgY2FzZSBvZiBjdXJyZW50ID09IG1hcmtfYmVnaW5idWYgaW50byBjdXRfbWFya2VkCgkgIHNlZ21lbnQsIHNvIGRvX3dyaXRlb3V0IGNvdWxkIGNhbGwgaXQgd2hlbiB3cml0aW5nIHNlbGVjdGlvbiB0bwoJICBmaWxlLgogIGRvX3VuY3V0X3RleHQoKQoJLSBSZXNldCBjdXRidWZmZXIgZXZlbiBpZiB3ZSdyZSB1bmN1dHRpbmcgbWFya2VkIG9yIGN1dCB0byBlbmQgdGV4dCEKLSBmYXEuaHRtbDoKCS0gQnJvdWdodCB0aGUgRkFRIHVwIHRvIGRhdGUsIG1hbnkgbGl0dGxlIGNoYW5nZXMgKEpvcmRpKS4KLSBmaWxlcy5jOgogIGRvX2Jyb3dzZXIoKQoJLSBNaW5vciBmaXhlcyB0byB0aGUgcHJvY2Vzc2luZyBvZiBTRUxFQ1QgZnVuY3Rpb24gKFJvY2NvKQoJLSBBZGRlZCB0aGUgIkdvdG8gRGlyZWN0b3J5IiBjb2RlIChSb2NjbykKCS0gRG9uJ3Qgc2hpZnQgdGhlIHNpemUgb2YgdGhlIGZpbGUgaXMgaXQncyBsZXNzIHRoYW4gMUsuIEZpeGVkCgkgIGZpbGVzIGxlc3MgdGhhbiAxSyBiZWluZyBkaXNwbGF5ZWQgYXMgMEIgKFJvY2NvKS4KICBkb193cml0ZW91dCgpCgktIE5ldyBjb2RlIHRvIGFsbG93IHdyaXRpbmcgc2VsZWN0ZWQgdGV4dCB0byBhIHNlcGFyYXRlIGZpbGUuCgkgIFdoZW4gdGhpcyBpcyBkb25lLCB0aGUgY3VycmVudCBzdGF0ZSBpcyBwcnNlcnZlZC4KICB3cml0ZV9maWxlKCkKCS0gTmV3IGFyZywgbm9uYW1lY2hhbmdlLCBtZWFucyB3aGV0aGVyIG9yIG5vdCB0byB1cGRhdGUgdGhlCgkgIGN1cnJlbnQgZmlsZW5hbWUgYWZ0ZXIgd3JpdGluZyB0aGUgZmlsZSBvdXQuCi0gZ2xvYmFsLmM6CgktIFVwZGF0ZWQgc29tZSBvZiB0aGUgbGlzdHMgZm9yIHRoZSAiR290byBEaXJlY3RvcnkiIGNvZGUgKFJvY2NvKQotIG1vdmUuYzoKICBwYWdlX3VwKCkKCS0gUmV3cml0dGVuIHdpdGggYSBsb29wIHRvIG1ha2Ugc2NyZWVuIHVwZGF0ZXMgd29yayB3aGVuCgkgIG1hcmsgaXMgc2V0IChmaXhlcyBidWcgIzU5KS4KICBkb19ob21lKCksIGRvX2VuZCgpCgktIERvbid0IGtlZXAgY3V0YnVmZmVyLgotIG5hbm8uMToKCS0gQWRkZWQgdGhlIG1pc3NpbmcgLXIgZmxhZyAoSm9yZGkpLgotIG5hbm8uYzoKICBkb19hbHRfc3BlbGxlcigpCgktIFJlcG9zaXRpb24gY3Vyc29yIG9uIHNhbWUgbGluZSBhcyBiZWZvcmUgXlQgd2FzIGNhbGxlZCAoUm9jY28pCiAgQUJDRCgpLCBtYWluKCkgCgktIEFkZCBBbHQtd2hhdGV2ZXItW2EtZF0gc3VwcG9ydCBhcyB3ZWxsIGFzIEFsdC13aGF0ZXZlci1bQS1EXS4KICBtYWluKCkKCS0gQ29kZSB0byBzaWxlbnRseSBwcm9jZXNzICItZyIgYW5kICItaiIgKFJvY2NvKQogIHNpZ25hbF9pbml0KCkKCS0gUmVvcmRlciBzaWdhY3Rpb24gY2FsbHMsIHVzZSBzaWdmaWxsc2V0KCkgdG8gc3RvcCBTSUdUU1RQIGFuZAoJICBTSUdDT05UIGZyb20gYmVpbmcgaW50ZXJydXB0ZWQsIGFsbG93cyBzdXNwZW5kaW5nIG5hbm8KCSAgdG8gd29yayBtb3JlIHJlbGlhYmx5LCBlc3AuIHdpdGggbXV0dCwgZXRjLiAKICBkb19zdXNwZW5kKCkKCS0gRG9uJ3QgdHJ5IHRvIHBsYXkgd2l0aCB0aGUgaGFuZGxlciBpbnNpZGUgdGhlIGhhbmRsZXIuICBKdXN0CgkgIHJhaXNlIGEgU0lHU1RPUC4gIFdlIGFsc28gbm93IHdyaXRlIHRoZSAidXNlICJmZyIiIG1lc3NhZ2UgdG8KCSAgc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLgogIGRvX2NvbnQoKQoJLSBOb3cganVzdCBkb2VzIGEgcmVmcmVzaCBjYWxsIGluc3RlYWQgb2YgcGxheWluZyB3aXRoIHRoZSBTSUdUU1RQCgkgIGhhbmRsZXIuCi0gbmFuby5oOgoJLSBVcGRhdGVkIHRoZSBCUk9XU0VSX0xJU1RfTEVOIGZvciB0aGUgIkdvdG8gRGlyZWN0b3J5IiBjb2RlIChSb2NjbykKLSBwcm90by5oOgoJLSBOZXcgc2hvcnRjdXQgbGlzdCBhZGRlZDogZ290b2Rpcl9saXN0IChSb2NjbykuCi0gc2VhcmNoLmM6CiAgZG9fZ290b2xpbmUoKQoJLSBPcHRpbWl6YXRpb25zLCByZW1vdmUgIiQiIGdvZXMtdG8tbGFzdC1saW5lLCBsZXNzIG1lc3NhZ2VzIChSb2NjbykKICBkb19yZXBsYWNlKCkKCS0gSWYgd2UgbWFuYWdlIHRvIG1ha2UgaXQgaW4gc29tZWhvdyB3aXRoIFZJRVdfTU9ERSBvbiwgYWJvcnQKCSAgbmljZWx5IChmaXhlcyBCVUcgIzU5KS4KLSB1dGlscy5jCiAgc3RyY2FzZXN0cigpCgktIFJlcGxhY2VkIGJ5IG11dHQncyBtdXR0X3N0cmlzdHIgZnVuY3Rpb24sIGJlY2F1c2UgdGhlIHRob3VnaHQKCSAgb2YgZHluYW1pY2FsbHkgYWxsb2NhdGluZyBtZW1vcnkgYW5kIGNvcHlpbmcgZWFjaCBsaW5lIGluIGEgZmlsZQoJICB0byBkbyBhIHNlYXJjaCBvciByZXBsYWNlIHdhcyBjYXVzaW5nIG1lIHRvIGxvc2Ugc2xlZXAuCi0gd2luaW8uYzoKICBhY3R1YWxfeCgpCgktIFJlbW92ZSBpbmxpbmUgZnJvbSBmdW5jdGlvbiBkZWNsIChBbGJlcnQgQ2hpbikuCi0gcG8vUE9URklMRVMuaW46CgktIEFkZGVkIHV0aWxzLmMgdG8gdGhlIGxpc3QuCi0gcG8vZXMucG8sIHBvL2NhLnBvOgoJLSBVcGRhdGVkIChKb3JkaSkuCi0gcG8vZ2wucG86CgktIEdhbGljaWFuIHRyYW5zbGF0aW9uIGJ5IEphY29ibyBUYXJy7W8uCi0gcG8vdWsucG8sIHBvL3J1LnBvOgoJLSBOZXcgVWtyYWluaWFuIGFuZCBSdXNzaWFuIHRyYW5zbGF0aW9ucyBieSBTZXJnZXkgQS4gUmliYWxjaGVua28KCSAgPGZpc2hlckBvYnUuY2sudWE+LCB0aGFua3MhCi0gcG8vaWQucG86CgktIFVwZGF0ZWQgSW5kb25lc2lhbiB0cmFuc2xhdGlvbiBieSBUZWRpIEhlcml5YW50by4KLSBwby9pdC5wbwoJLSBVcGRhdGVkIEl0YWxpYW4gdHJhbnNsYXRpb24gYnkgTWFyY28gQ29sb21iby4KCm5hbm8gMS4xIHRyZWUgZm9ya2VkIGhlcmUgMDQvMDcvMjAwMQoKbmFubyAxLjAuMSAtIDA0LzA2LzIwMDEKLSBHZW5lcmFsOgoJLSBhZGRlZCBjb25maWd1cmUgb3B0aW9uIC0tZGlzYWJsZS13cmFwcGluZy4gIERvZXMgd2hhdCBpdCBzYXlzLAoJICBubyB3cmFwcGluZyBvciBjaGVja3MgYXJlIGRvbmUuICBTZXBhcmF0ZSBmcm9tIC0tZW5hYmxlLXRpbnksCgkgIHNvbWUgbWF5IHdhbnQgYSBiYXJlLWJvbmVzIFBpY28gY2xvbmUgdGhhdCBkb2VzIHdyYXAgdGV4dC4KCSAgQWZmZWN0cyBjb25maWd1cmUsIG5hbm8uYzpkb19jaGFyKCkgYW5kIGNoZWNrX3dyYXAoKSBvYnZpb3VzbHksCgkgIHZlcnNpb24oKSwgYW5kIGRvX2NoYXIoKS4KLSBhY2xvY2FsLm00OgoJLSBNaW5vciBwYXRjaCBmb3IgaW50bCBjaGVjayAocmVhbGx5IHRoaXMgdGltZSkgKEFsYmVydCBDaGluKQotIGZhcS5odG1sOgoJLSBGaXhlZCB0eXBvIGluIHNlY3Rpb24gNi4xIChkaXNjb3ZlcmVkIGJ5IEJvYiBGYXJtZXIpLgotIGZpbGVzLmM6CgktIGZpeCB0d28gdHlwb3MgaW4gY29tbWVudHMsIG9uZSBpbiBDaGFuZ2VMb2cgKE1hdHRoaWFzIEFuZHJlZSkKICBkaXJhbHBoYXNvcnQoKQoJLSBTdG9wIGFib3J0IG9uIHN5bWxpbmtzIChNYXR0aGlhcyBBbmRyZWUpCgktIHVzZSBzdHJjYXNlY21wIHRvIHNvcnQgZGlyZWN0b3J5IGlmIGF2YWlsYWJsZSwgcGlsb3QgZG9lcyB0aGF0CgkgIGFzIHdlbGwgKE1hdHRoaWFzIEFuZHJlZSkKICBmaWxlc3RhdCgpLCBkb19icm93c2UoKQoJLSBDaGFuZ2VkIGxzdGF0IGNhbGxzIHRvIHN0YXQsIHdoaWNoIGZpeGVzIHRoZSBicm93c2VyIG5vdAoJICBmb2xsb3dpbmcgbGlua3MgdG8gZGlyZWN0b3JpZXMuICBXZSBvbmx5IHVzZSBsc3RhdCgpIHdoZW4KCSAgcHJpbnRpbmcgdGhlIGRldGFpbHMgb2YgdGhlIGZpbGUsIGFuZCBpZiBpdCBpcyBhIGxpbmssIHRoZW4KCSAgY2hlY2sgdmlhIGxzdGF0KCkgZm9yIGxpbmsgdG8gYSBkaXJlY3RvcnkuICBJZiBpdCBpcyAKCSAgYSBkaXJlY3RvcnksIGRpc3BsYXkgKGRpciksIGVsc2UgdXNlIHRoZSBub3JtYWwgIi0tIi4KICBkb19icm93c2VyKCkKCS0gRml4IGJyb2tlbiBzaXplIHN1ZmZpeCBvZmYtYnktb25lIGVycm9ycyAoTWF0dGhpYXMgQW5kcmVlKQogIGN3ZF90YWJfY29tcGxldGlvbigpLCBkb19icm93c2VfZnJvbSgpCgktIFVzZSBQQVRIX01BWCBpbnN0ZWFkIG9mIDAgYXJnIHRvIGdldGN3ZCAoTWF0dGhpYXMgQW5kcmVlKS4KCS0gQ2hhbmdlZCBhYm92ZSB0byB1c2UgUEFUSF9NQVggb25seSB3aGVuIGRlZmluZWQgb24gdGhlCgkgIHN5c3RlbSwgYXMgdGhlIEhVUkQgZS5nLiBkb2VzIG5vdCBzdXBwb3J0IGl0LgotIGludGwvTWFrZWZpbGUuaW46CiAgZGlzdGNsZWFuCiAgCS0gYWRkZWQgaW50bC9saWJpbnRsLmggdG8gdGhlIHJtIC1mIHJ1bGUsIHNob3VsZCBmaXggdGhlIHVucmVzb2x2ZWQKCSAgZ2V0dGV4dCBzeW1ib2xzIHByb2JsZW0gKEpvcmRpKS4KCm5hbm8tMS4wLjAgLSAwMy8yMi8yMDAxCi0gR2VuZXJhbAoJLSBBZGRlZCB2b2lkIHRvIGZ1bmN0aW9ucyBkZWNsYXJlZCBhcyAoKSBhcmdzLCBuYW5vLmM6ZG9fbWFyaygpCgkgIGFuZCBzZWFyY2guYzpyZWdleHBfY2xlYW51cCgpLiAoQ2hyaXN0aWFuIFdlaXNnZXJiZXIpLgoJLSBDaGFuZ2VkIGludGVybmFsIHZhcmlhYmxlcyBjYWxsZWQgIm5ldyIgdG8gIm5ld25vZGUiIHRvIGF2b2lkCgkgIHRoZSAibmV3IiBDKysgcmVzZXJ2ZWQgd29yZCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbGlrZWx5IG5vIHdheQoJICBuYW5vIHdpbGwgRVZFUiBiZSBjb21waWxhYmxlIHdpdGggYSBDKysgY29tcGlsZXIuIChzdWdnZXN0ZWQgYnkKCSAgUm9jY28gQ29yc2kpLgotIGNhLnBvLCBlcy5wbzoKCS0gRmluYWwgdHdlYWtzIGZvciBOYW5vIDEuMC4KLSBjcy5wbzoKCS0gQ3plY2ggdHJhbnNsYXRpb24gZnJvbSBWYWNsYXYgSGFpc21hbi4KLSBuYW5vLmluZm86CgktIEFkZGVkIGRpciBlbnRyeSAoQWxiZXJ0IENoaW4pLgotIHdpbmlvLmM6CiAgc3RhdHVzcSgpCgktIEFkZGVkIE5BTk9fQkFDS19LRVkgYW5kIE5BTk9fRk9SV0FSRF9LRVkgY2FzZXMgZm9yIGxlZnQgYW5kIHJpZ2h0LgoKMS4wLXRlc3QgcHJlcmVsZWFzZSAtIDAzLzE3LzIwMDEKLSBuYW5vLmM6CiAgZG9fd3JhcCgpCgktIEFkZGVkIGNhc2UgZm9yIGF1dG9pbmRlbnRpbmcgdGV4dCBjYXVzaW5nIG5ldyBsaW5lIChBZGFtKS4KCS0gQWRkZWQgU0FNRUxJTkUgY2FzZSB0byBhYm92ZS4gIEFkZGVkIGNoZWNrcyB0byBjYXNlcyAxYiBhbmQKCSAgMmIgZm9yIHBsYWNlbWVudCBvZiBjdXJzb3IuCi0gbW92ZS5jOgogIHBhZ2VfZG93bigpCgktIENoZWNrIGZvciB0b3RsaW5lcyA8IGVkaXR3aW5yb3dzIGluIGNoZWNrIGZvciBzdXBlcmZsdW91cyAKCSAgZWRpdCB1cGRhdGUgKGZpeGVkIEJVRyAjNTcpLgotIHNlYXJjaC5jOgogIHByaW50X3JlcGxhY2VkKCkKCS0gcy9vY2N1cmVuY2Uvb2NjdXJyZW5jZSB0eXBvcyAoSm9yZGkpLgogIHNlYXJjaF9pbml0KCkKCS0gSWYgdXNpbmcgUGljbyBtb2RlIGFuZCByZWdleCBhbmQgc2FtZSBhbnN3ZXIgaXMgZW50ZXJlZCwgdXNlCgkgIGxhc3Rfc2VhcmNoIHN0cmluZyBpbnN0ZWFkIG9mIGFuc3dlciAoZml4ZXMgQlVHICM1NikuCi0gbmFuby50ZXhpOgoJLSBNZXRhLVogY29ycmVjdGlvbiBhbmQgZ3JhbW1hciBpbiAtLWVuYWJsZS10aW55IGRlc2MgKE5laWwgUGFya3MpLgoKbmFuby0wLjkuOTlwcmUzIC0gMDIvMTkvMjAwMQotIEdlbmVyYWwKICBHTlUgY29tcGxpYW5jZSBpc3N1ZXM6CgktIFJld29ya2VkIHNob3J0Y3V0IGxpc3QsIHB1dCAiR2V0IEhlbHAiIGludG8gZGVmYXVsdCBsaXN0LCAKCSAgcmVtb3ZlZCAiR290byBMaW5lIiwgYWxpZ25lZCAiUmVhZCBGaWxlIiB3aXRoICJXcml0ZSBPdXQiIGFuZCAKCSAgIlJlcGxhY2UiIHdpdGggIldoZXJlIGlzIiBmb3IgY29uc2lzdGVuY3kuCgktIEFkZGVkIHRleGluZm8gbWFudWFsIG5hbm8udGV4aS4gIEFkZGVkIHRleGkgb3B0aW9ucyB0byAKCSAgTWFrZWZpbGUuYW0uCQotIGNvbmZpZ3VyZS5pbjoKCS0gQXV0b2NvbmYgY29tcGF0aWJpbGl0eSBmaXhlcyAoUGF2ZWwgUm9za2luKQoJLSBBZGRlZCBzZXBhcmF0ZSBjaGVjayBmb3IgcmVzaXpldGVybSgpLgoJLSBBTExfTElOR1VBUzogYWRkZWQgaHUgYW5kIGNhLgotIGN1dC5jOgogIGRvX2N1dF90ZXh0KCkKCS0gbWFya2VkIHRleHQgY3V0IGZpeGVzIChSb2NjbykgKEZpeGVzIGJ1ZyAjNTQpLgotIG5hbm8uYzoKICBkb19kZWxldGUoKQoJLSBBZGRlZCBjaGVjayBmb3IgY3VycmVudC0+bmV4dCA9PSBmaWxlcHRyLCBhcyB3ZSBoYXZlIGEgbWFnaWMKCSAgbGluZSBjb2RlIGFnYWluLCBmaXhlcyBzaWxsaW5lc3MgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBsaW5lCgkgIGJlZm9yZSB0aGUgbWFnaWMgbGluZSAocmVwb3J0ZWQgYnkgSi5BLiBOZWl0emVsKS4KICBkb19qdXN0aWZ5KCkKCS0gSWYgdGhlIGtleXN0cm9rZSBhZnRlciB0aGUganVzdGlmeSBpcyBub3QgdGhlIHVuanVzdGlmeSBrZXksCgkgIGJsYW5rIHRoZSBzdGF0dXNiYXIgKGJ1ZyByZXBvcnRlZCBieSBOZWlsIFBhcmtzKS4KICBtYWluKCkKCS0gQWRkZWQgRU5BQkxFX05MUyBjaGVjayBhcm91bmQgZ2V0dGV4dCBzdHVmZi4KLSB3aW5pby5jOgogIGRvX3llc25vKCkKCS0gQWRkZWQgbG9jYWxpemVkIHllcywgbm8gYW5kIGFsbCBzdHJpbmdzIHRvIGZ1bmN0aW9uIGFuZCByZXdyb3RlCgkgIGhhbmRsZXIgZm9yIHRoZSBuZXcgZm9ybWF0LgotIGRlLnBvOgoJLSBUcmFuc2xhdGlvbiB1cGRhdGVzIGJ5IEZsb3JpYW4gS/ZuaWcuCi0gZmkucG86CgktIFRyYW5zbGF0aW9uIHVwZGF0ZXMgYnkgUGF1bGkgVmlydGFuZW4uCi0gaHUucG86CgktIEh1bmdhcmlhbiB0cmFuc2xhdGlvbiBieSBIb3J2YXRoIFN6YWJvbGNzLgotIGlkLnBvOiAKCS0gVHJhbnNsYXRpb24gdXBkYXRlcyBieSBUZWRpIEhlcml5YW50by4KLSBlcy5wbzoKCS0gVHJhbnNsYXRpb24gdXBkYXRlcyBhbmQgZ3JhbW1hdGljYWwvdHlwbyBmaXhlcyAoSm9yZGkpLgotIGNhLnBvOgoJLSBDYXRhbGFuIHRyYW5zbGF0aW9uIGJ5IEpvcmRpIE1hbGxhY2ggOikKCS0gTWlxdWVsIFZpZGFsIDxtaXF1ZWxAc2luZG9taW5pby5uZXQ+IHdlbnQgb3ZlciBpdCBhbmQgY29ycmVjdGVkCgkgIG1hbnkgdHlwb3MgYW5kIGNvbXBsZXRlZCBiaXRzIHRoYXQgcmVtYWluZWQgdW50cmFuc2xhdGVkIGJ5IGVycm9yLgoKbmFuby0wLjkuOTlwcmUyIC0gMDEvMzEvMjAwMQpHZW5lcmFsCgktIFJlbW92ZWQgY2VudGVyX3ggYW5kIGNlbnRlcl95IGdsb2JhbHMuICBjZW50ZXJfeSB3YXMKCSAgY29tcGxldGVseSB1bnVzZWQgYW5kIGNlbnRlcl94IHdhcyBvbmx5IHVzZWQgYSBmZXcgcGxhY2VzLAoJICBlYXNpbHkgcmVwbGFjZWQgd2l0aCBDT0xTIC8gMiAob29wcywgbm90IGN1cnJlbnRfeCAmIHkgKFJvYikpLgoJLSBEZWxldGVkIGZyZWVfbm9kZSwgZHVwbGljYXRlIG9mIGRlbGV0ZV9ub2RlLCBhbmQgY2hhbmdlZCBhbGwKCSAgZnJlZV9ub2RlIGNhbGxzIHRvIGRlbGV0ZV9ub2RlLgoJLSBGaXggZm9yIHJlc2l6aW5nIHRoZSB3aW5kb3cgaW4gbW9kZXMgb3RoZXIgdGhhbiBub3JtYWwgZWRpdCBtb2RlIAoJICBDaGFuZ2VzIHRvIGhhbmRsZV9zaWd3aW5jaCgpLCBtYWluKCkuICBGaXhlcyBidWcgIzUyIChSb2NjbykuCi0gZmlsZXMuYzoKICB3cml0ZV9maWxlKCkKCS0gRG9uJ3QgZnJlZSgpIHJlYWxuYW1lIG9uIGVycm9yLCBpZiBpdCBuZWVkcyB0byBiZSBmcmVlKClkIGxhdGVyCgkgIGl0IHdpbGwgYmUgKGZpeGVzIGNyYXNoIG9uIHN1Y2Nlc3NmdWwgd3JpdGUgYWZ0ZXIgZmFpbGVkIHdyaXRlLAoJICBkaXNjb3ZlcmVkIGJ5IERhdmlkIFNvYm9uKS4KICB1c2VybmFtZV90YWJfY29tcGxldGlvbigpCgktIE9wdGltaXphdGlvbiBhbmQgcmVtb3ZhbCBvZiB1c2VsZXNzIHZhcnMgKFJvY2NvKS4KCS0gUmV3cml0dGVuIHVzaW5nIGdldHB3ZW50IChzdWdnZXN0ZWQgYnkgUm9jY28pLgoJLSBSZW1vdmVkIHJlZHVuZGFudCBjb25kaXRpb25hbCAoUm9jY28pLgogIHJlYWxfZGlyX2Zyb21fdGlsZGUoKQoJLSBSZXdyaXR0ZW4gdXNpbmcgZ2V0cHdlbnQgKHN1Z2dlc3RlZCBieSBBZGFtLCBtdWNoIG9wdGltaXplZCBieQoJICBSb2NjbykuCi0gZ2xvYmFsLmM6CgktIERvbid0IGRlZmluZSB0b2dnbGVzIGdsb2JhbCBvciB0b2dnbGVfaW5pdF9vbmUgaWYgdXNpbmcgLS10aW55LgotIG5hbm8uYzoKICBkb19qdXN0aWZ5KCkKCS0gQWRkZWQgcmVzdG9yYXRpb24gb2YgdG90c2l6ZSBhZnRlciB1bmp1c3RpZnkgY29tbWFuZC4KICB1c2FnZSgpCgktIEFkZCBhcmcgdG8gLVQgaGVscCAoUm9jY28pLgogIGdsb2JhbF9pbml0KCksIGhhbmRsZV9zaWd3aW5jaCgpCgktIE1lc3N5IGxvb3BzIHJlcGxhY2VkIHdpdGggbWVtc2V0IGNhbGxzIChSb2NjbykuCiAgZG9fYWx0X3NwZWxsZXIoKQoJLSBBZGRlZCBjb2RlIHRvIHBhcnNlIG11bHRpLXdvcmQgYWx0X3NwZWxsZXIgc3RyaW5ncy4KCS0gRml4IGluaXRpYWxpemF0aW9uIGJlZm9yZSBmb3JrKCkgIChSb2NjbykuCi0gcHJvdG8uaDoKCS0gRml4IGRvX2NyZWRpdHMoKSBwcm90byAob29wcyEpCi0gd2luaW8uYzoKICBuYW5vZ2V0c3RyKCkKCS0gU2FuaXR5IGNoZWNrIGZvciB4IG92ZXJydW5uaW5nIHRoZSBzdHJpbmcgYnVmZmVyIGxlbi4KCm5hbm8gMC45Ljk5cHJlMSAtIDAxLzE3LzIwMDEKR2VuZXJhbAoJLSBDaGFuZ2VkICNpZmRlZnMgdG8gY2hlY2sgZm9yIGJvdGggRElTQUJMRV9UQUJDT01QIGFuZAoJICBOQU5PX1NNQUxMLCBtYWtlcyB0aW55IG9wdGlvbiBsZWF2ZSBvdXQgdGFiIGNvbXBsZXRpb24sIHdoaWNoCgkgIHNob3VsZCBiZSBsZWZ0IG91dCBpbiB0aGF0IGNpcmN1bXN0YW5jZS4gIFNhdmVzIGF0IGxlYXN0IDVrLgoJLSBQcmV2aW91cyBjaGFuZ2UgdG8gI2lmZGVmcyBESVNBQkxFX1RBQkNPTVAgYW5kIE5BTk9fU01BTEwgcm9sbGVkCgkgIGJhY2suIChSb2NjbykKCS0gVmFyaW91cyAjaWZkZWYgJiAjaWZuZGVmIGNsZWFudXBzLiAoUm9jY28pCgktIEFkZGVkIG1lc3NhZ2UgZm9yIHdoZW4ga2V5cGFkIGdvZXMgYXdyeS4gIEFkZGVkIGNvZGUgaW4gbWFpbiBhbmQKCSAgZnVuY3Rpb24gcHJpbnRfbnVtbG9ja193YXJuaW5nKCkgdG8gbm90aWZ5IHVzZXIsIGFuZCBhZGRlZCBhbgoJICBhcHByb3ByaWF0ZSBzZWN0aW9uIGluIHRoZSBmYXEgdG8gcmVmZXIgdG8gdGhpcyBicm9rZW5uZXNzLgoJLSBBZGRlZCBtYWNyb3MgaW4gbmFuby5oIGZvciBtYWdpYyB2YWx1ZXMgdGhhdCBtaWdodCBiZSB1bmNsZWFyIGluCgkgIG5hbm8uYzpnbG9iYWxfaW5pdCgpLiAoUm9jY28pCi0gY29uZmlndXJlLmluOgoJLSBGaXggZm9yIF91c2Vfa2V5cGFkIGNoZWNrIGJyZWFraW5nIHNsYW5nIHN1cHBvcnQgKENocmlzdGlhbgoJICBXZWlzZ2VyYmVyKS4KCS0gQ2hhbmdlZCB0byBhdXRvbWF0aWNhbGx5IGRlZmluZSB0aGUgNSBESVNBQkxFIHZhcmlhYmxlcyB3aGVuCgkgIE5BTk9fU01BTEwgKGVuYWJsZS10aW55KSBpcyByZXF1ZXN0ZWQgYXQgY29uZmlndXJlLgotIGZhcS5odG1sOgoJLSBBZGRlZCBzb21lIGluZm8gb24gbWFraW5nIHRoZSBiaW5hcnkgc21hbGxlciB3aXRoIHRoZSBjb25maWd1cmUKCSAgc2NyaXB0LgoJLSBBZGRlZCBzZWN0aW9uIG9uIGtleXBhZCBidWdnaW5lc3MuCi0gZmlsZXMuYzoKICByZWFsX2Rpcl9mcm9tX3RpbGRlKCkKCS0gT29wcywgZml4IGNhc2Ugd2hlcmUgYnVmID0ifiIsIHNpbGx5IGNyYXNoIChidWcgZGlzY292ZXJlZCBieQoJICBOZWlsIFBhcmtzKS4KICBkb19icm93c2VyKCkKCS0gQWRkZWQgc3BhY2UgYW5kIC0ga2V5cyB0byBkbyBwYWdlIHVwIGFuZCBkb3duLgogIGN3ZF90YWJfY29tcGxldGlvbigpLCBpbnB1dF90YWIoKQoJLSBDaGFuZ2VkIGJhcmUgbWFsbG9jL2NhbGxvYyBjYWxscyB0byBubWFsbG9jIChmb3VuZCBieSBSb2NjbykuCgktIEFkZGVkIG1lbXNldCgpIHRvIG1hdGNoQnVmIHRvIGVuc3VyZSBzYW5pdHkgKFJvY2NvLCBBZGFtKS4KLSBuYW5vLmM6CiAgQUJDRCgpCgktIE5ldyBmdW5jdGlvbiwgZmlndXJlcyBvdXQgd2hhdCBrYmlucHV0IHRvIHJldHVybiBnaXZlbgoJICBpbnB1dCBjb21tb24gdG8gc2V2ZXJhbCBzd2l0Y2ggc3RhdGVtZW50cywgYWxsb3dzIHVzIHRvIAoJICBzdXBwb3J0IHRoZSBkZWZhdWx0IEtvbnNvbGUga2V5IHNldHRpbmdzLgogIG1haW4oKQoJLSBBbHRlcm5hdGUgc3BlbGxlciBvcHRpb24gbm8gbG9uZ2VyIHZhbGlkIGlmIERJU0FCTEVfU1BFTExFUiBpcwoJICBhY3RpdmUuIChSb2NjbykKCS0gUmVtb3ZlZCBkaXJlY3QgY2FsbHMgdG8gdXNhZ2UoKSAoI2Vsc2UpIGZvciAtayAoY3V0KSBvciAtcyAoc3BlbGxlcikKCSAgb3B0aW9ucyB3aGVuIHRoZXNlIGhhdmUgYmVlbiBkaXNhYmxlZC4gKFJvY2NvKQoJLSBJbml0aWFsaXplZCBrYmlucHV0IHRvIGdldCBhcm91bmQgc3R1cGlkIGNvbXBpbGVyIHdhcm5pbmcuCiAgbmFub19zbWFsbF9tc2coKQoJLSBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQuICBBbGwgcmVmZXJlbmNlcyBub3cgY2FsbAoJICBuYW5vX2Rpc2FibGVkX21zZy4gKFJvY2NvKQogIHZlcnNpb24oKQoJLSBXaGVuIE5BTk9fU01BTEwgKGVuYWJsZS10aW55KSBpcyBkZWZpbmVkLCB0aGUgNSBtYWluIERJU0FCTEUKCSAgdmFyaWFibGVzIChTUEVMTEVSLCBIRUxQLCBKVVNUSUZZLCBCUk9XU0VSLCBUQUJDT01QKSBhcmUgbm90CgkgIHJlcG9ydGVkIGFzIGVuYWJsZWQgd2hlbiBOYW5vIGlzIGNhbGxlZCB3aXRoIC1WICgtLXZlcnNpb24pCgkgIGNvbW1hbmQgbGluZSBvcHRpb24uIChSb2NjbykKICB1c2FnZSgpCgktIEFsdGVybmF0ZSBzcGVsbGVyIG9wdGlvbiBubyBsb25nZXIgdmFsaWQgaWYgRElTQUJMRV9TUEVMTEVSIGlzCgkgIGFjdGl2ZS4gKFJvY2NvKQogIHdpbmRvd19pbml0KCksIGhhbmRsZV9zaWd3aW5jaCgpCgktIEFkZGVkIGNoZWNrIGZvciBub3QgaGF2aW5nIGVub3VnaCBMSU5FUyB0byBkbyBhbnl0aGluZyB1c2VmdWwsCgkgIGlmIHNvIGRpZSB3aXRoIGFuIGVycm9yLiAoUm9jY28pCiAgZGllX3Rvb19zbWFsbCgpCgktIEZ1bmN0aW9uIHRvIHByaW50IHRoZSB3aW5kb3cgdG9vIHNtYWxsIGVycm9yIG1lc3NhZ2UsIGF2b2lkcwoJICByZXBlYXRlZCBzdHJpbmcgZGVmcyBhbmQgZ2xvYmFscy4KICBkb19qdXN0aWZ5KCkKCS0gU21hbGwgZml4IGZvciB0b3RzaXplIGNhbGN1bGF0aW9uIChSb2IpCgotIGZpLnBvOgoJLSBVcGRhdGUgYnkgUGF1bGkgVmlydGFuZW4uCgpuYW5vIDAuOS4yNSAtIDAxLzA3LzIwMDEKR2VuZXJhbCAtIAoJLSBOZXcgZmlsZSBicm93c2VyIGNvZGUuICBOZXcgZnVuY3Rpb25zIGluIGZpbGVzLmM6ZG9fYnJvd3NlcigpLAoJICBoZWxwZXIgZnVuY3Rpb25zIGJyb3dzZXJfaW5pdCgpLCB0YWlsKCksIHN0cmlwb25lZGlyKCksCgkgIGZpbGVzdGF0KCkuICBOZXcgc2hvcnRjdXQgbGlzdCBicm93c2VyX2xpc3QuICBTb21lIG5ldwoJICBzdHJpbmdzIHRvIHRyYW5zbGF0ZS4gIEFkZGVkIGZ1bmN0aW9uIGRvX2Jyb3dzZV9mcm9tKCkuCgktIEtleXBhZCBjb2RlIGhhcyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBOb3cgY2hlY2tzIGZvcgoJICBfdXNlX2tleXBhZCBmbGFnIGluIHdpbmRvdyB0byBzZWUgd2hldGhlciBvciBub3QgdG8gdHVybiAKCSAgdGhlIGtleXBhZCgpIGJhY2sgb2ZmIHdoZW4gZmluaXNoZWQgKHRha2VuIGZyb20gYXVtaXgpLiAgTW92ZWQKCSAgdG8gd2luaW8uYyB3aGVyZSBpdCBzaG91bGQgcHJvYmFibHkgYmUgYW55d2F5LiAgTmV3IGNvbmZpZ3VyZQoJICBjaGVjayBmb3IgX3VzZV9rZXlwYWQgaW4gd2luZG93IHN0cnVjdC4gIFRoaXMgd2lsbCBoYXZlIHRvIGRvCgkgIGZvciBub3cuCgktIE1vdmVkIGtleXBhZCgpIGNhbGxzIGZvciBQRENVUlNFUyBmcm9tIG1haW4oKSB0byB3aW5kb3dfaW5pdCgpCgkgIHNvIHRoZSBrZXlwYWQgY29udGludWVzIHRvIHdvcmsgYWZ0ZXIgYSBNZXRhLVgsIGZvciBleGFtcGxlLgoJICBGaXhlZCBidWcgIzUxLgotIGZhcS5odG1sOgoJLSBGaXggdHlwb3MgYW5kIHNtYWxsIG1pc3Rha2VzIChKb3JkaSkuCi0gZmlsZXMuYzoKICB1c2VybmFtZV90YWJfY29tcGxldGlvbigpCgktIEFkZGVkIHRoZSAoY2hhciAqKSBzaXplb2Ygd2hlbiBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlIGZpbGVuYW1lCgkgIGFycmF5IChSb2NjbykuCiAgY3dkX3RhYl9jb21wbGV0aW9uKCkKCS0gcmVtb3ZlZCBza2lwcGluZyAuIGFuZCAuLiB3aGVuIHRhYnVsYXRpbmcgbWF0Y2hlcy4KCS0gQWRkZWQgdGhlIChjaGFyICopIHNpemVvZiB3aGVuIGFsbG9jYXRpbmcgbWVtb3J5IGZvciB0aGUgZmlsZW5hbWUKCSAgYXJyYXkgKFJvY2NvKS4KICBkb193cml0ZW91dCgpCgktIE5vdyB0YWtlcyBhbiBhcmd1bWVudCBzbyB0aGUgc3RyaW5nIHR5cGVkIGluIGNhbiBiZSByZXRhaW5lZAoJICB3aGVuIGNhbGxpbmcgdGhlIGJyb3dzZXIuCiAgZG9fYnJvd3NlcigpCgktIERvbid0IGRlY3JlbWVudCBsb25nZXN0IGJ5IHRoZSBsZW5ndGggb2YgcGF0aC4gIEZpeGVzIGNyYXNoZXMKCSAgb24gZW50ZXJpbmcgdmFyaW91cyBkaXJzICAoUm9jY28pLgoJLSBEb24ndCB1bmdldGNoKCkgdGhlIGV4aXQga2V5LCB1bm5lZWRlZCwgZml4ZXMgaW5zZXJ0aW5nIGEgZmlsZQoJICBjYXVzZXMgZXhpdCBjb2RlLgotIG1vdmUuYzoKICBwYWdlX2Rvd24oKQoJLSBEb24ndCBkbyBhbiBlZGl0X3VwZGF0ZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIHBhZ2Ugb2YgdGV4dAoJICAoZmlsZWFnZSA9PSBlZGl0dG9wICYmIGZpbGVib3QgPT0gZWRpdGJvdCkuICBGaXhlcyBCdWcgIzUwLgotIG5hbm8uYzoKICBtYWluKCkKCS0gUmVvcmRlciB0aGUgZ2V0b3B0IG9wdGlvbnMgdG8gYmUgbW9yZSBvciBsZXNzIGFscGhhYmV0aWNhbAoJICAoc3VnZ2VzdGVkIGJ5IFN2ZW4gR3Vja2VzKS4KLSB3aW5pby5jOgogIGRvX2N1cnNvcnBvcygpCgktIE9wdGltaXphdGlvbnMgYW5kIGNsZWFudXBzIGJ5IFJvY2NvIENvcnNpLgogIGRvX2NyZWRpdHMoKQoJLSBTcGVsbCBFcmlrIEFuZGVyc2VuJ3MgbmFtZSByaWdodC4KICB0aXRsZWJhcigpCgktIE5vdyB0YWtlcyBhbiBhcmcsIG5lZWRlZCBmb3IgYnJvd3NlciBmdW5jdGlvbi4KICBkb19oZWxwKCkKCS0gQ2hhbmdlZCB3YXkgb2YgdGVtcG9yYXJpbHkgYnJpbmdpbmcgdXAgc2hvcnRjdXRzIGF0IHRoZQoJICBib3R0b20gaW4gdGhlIGhlbHAgc2NyZWVuIChhY3R1YWxseSB3b3JrcykuCi0gdXRpbHMuYzoKICBtYWxsb2NzdHJjcHkoKQoJLSBUYWtlcyBjaGFyIHBvaW50ZXJzIG5vdyBpbnN0ZWFkIG9mIHZvaWQgKG1ha2VzIGRlYnVnZ2luZyBhCgkgIGhlbGx1dmEgbG90IGVhc2llcikKCS0gRHVoLCBkb24ndCBkbyBhbnl0aGluZyBpZiBzcmMgPT0gZGVzdCEKLSBlcy5wbzoKCS0gVXBkYXRlcyBmb3IgZmlsZSBicm93c2VyIChKb3JkaSkuCgpuYW5vIDAuOS4yNCAtIDEyLzE4LzIwMDAKR2VuZXJhbAoJLSBBZGRlZCAtLWRpc2FibGUtaGVscCBvcHRpb24sIGFmZmVjdHMgYWNjb25maWcuaCwgY29uZmlndXJlKC5pbiksCgkgIHdpbmlvLmM6ZG9faGVscCwgbmFuby5jOmhlbHBfaW5pdCxoZWxwX3RleHRfaW5pdCx2ZXJzaW9uLgoJLSBDaGFuZ2VkIGZpbGVuYW1lIHRvIG5vIGxvbmdlciB1c2UgUEFUSF9NQVgsIHNvIGl0IGNhbiB3b3JrIG9uIHRoZQoJICBIVVJELiAgQ2hhbmdlcyBpbiBmaWxlcy5jOndyaXRlX2ZpbGUoKSwgbmV3IGZ1bmN0aW9uCgkgIG5hbm8uYzpjbGVhcl9maWxlbmFtZSgpLCBtYW55IGNoYW5nZWQgaW4gbWFpbigpLCBhIGZldyBvdGhlcgoJICBwbGFjZXMuICBQbGVhc2UgdGVzdCB0aGlzIQoJLSBBZGRlZCAtYiwgLWUsIGFuZCAtZiBmbGFncywgd2hpY2ggd2UgaWdub3JlIGFzIG5hbm8gcHJvdmlkZXMgCgkgIHRoZWlyIGZ1bmN0aW9uYWxpdHkgYWxyZWFkeS4KLSBjdXQuYzoKICBkb191bmN1dF90ZXh0KCkKCS0gRml4IHJlbnVtYmVyaW5nIGJ1ZyB3aGVuIHVuY3V0dGluZyBtYXJrZWQgdGV4dCBhdCBmaWxlYm90LgoJLSBGaXggc2NyZWVuIG5vdCBiZWluZyBkaXNwbGF5ZWQgd2hlbiB3ZSBhcmUgdW5jdXR0aW5nIG1hcmtlZAoJICB0ZXh0IGF0IGVkaXRib3QgKEJ1ZyBkaXNjb3ZlcmVkIGJ5IEtlbiBUeWxlcikuCgktIEZpeCBtYWdpYyBsaW5lIG5vdCBnZXR0aW5nIGNyZWF0ZWQgd2hlbiAoeW91IGd1ZXNzZWQgaXQpCgkgIHVuY3V0dGluZyBtYXJrZWQgdGV4dCBhdCBmaWxlYm90IChSeWFuIEtyZWJzKS4KLSBmaWxlcy5jOgogIHJlYWRfZmlsZSgpCgktIElmIHdlIGVuY291bnRlciBhbiBlcnJvciBhbmQgaW5zZXJ0IGlzIG5vdCBzZXQsIHJ1biBuZXdfZmlsZSgpLgoJICAoYnVnIGRpc2NvdmVyZWQgYnkgQmVuIFJvYmVydHMpLgogIHdyaXRlX2ZpbGUoKQoJLSBDaGFuZ2Ugb3BlbiBjYWxsIGZsYWdzLCBiYXNpY2FsbHkgY29weSBqb2UncyB3YXkgb2YgZG9pbmcgaXQgc28KCSAgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIHdpbGwgYWN0dWFsbHkgYmUgaW5jbHVkZWQgaW4gKHVuKXN0YWJsZS4KCS0gUmVtb3ZlIHVzZWxlc3MgZnN0YXQgY2FsbC4KICBvcGVuX2ZpbGUoKQoJLSBBZGRlZCBjaGVjayBmb3IgU19JU0JMSyBhbmQgU19JU0NIUiwgZG9uJ3Qgb3BlbiBkZXZpY2UgZmlsZXMhCi0gbmFuby5jOgogIHJlbnVtYmVyKCkKCS0gRG9uJ3Qgc3R1cGlkbHkgYXNzaWduIHRoZSB2YWx1ZSBvZiBwcmV2LT5saW5lbm8gaWYgcHJldiA9PSBOVUxMIQogIG1haW4oKQoJLSBBZGRlZCBjb2RlIHRvIGNoZWNrIGZvciBBbHQtQWx0ICgyNy0yNykga2V5c3Ryb2tlcyBhbmQgc2V0IHRoZQoJICBuZXh0IGtleXN0cm9rZSBhcyBhIGNvbnRyb2wgc2VxdWVuY2UuICBOZXcgdmFyaWFibGUgCgkgIG1vZGlmeV9jb250cm9sX2tleS4gIFJlbW92ZWQgI2lmZGVmIF9QT1NJWF9WRElTQUJMRSBjaGVjawoJICBhcm91bmQgQ29udHJvbC1TLFEsWiBoYW5kbGVycyBiZWNhdXNlIHdlIG5lZWQgaXQgbm93IGZvcgoJICB0aGUgQWx0LUFsdC14IGNvZGUuCgktIEFkZGVkIC0tdmlldyBvcHRpb24gdG8gZ2V0b3B0X2xvbmcoKWNhbGwgLiAgQnVnIGRpc2NvdmVyZWQgCgkgIGJ5IFJvY2NvIENvcnNpLgogIGhlbHBfaW5pdCgpCgktIEZpeCBvZmYgYnkgb25lIGVycm9yIHRoYXQgd2FzIG1ha2luZyBeRyBoZWxwIGluIG5vcm1hbCBtb2RlIGFuZAoJICBeXyBpbiBwaWNvIG1vZGUgbm90IGJlIGRpc3BsYXllZCBpbiB0aGUgaGVscCAoYnVnIGRpc2NvdmVyZWQgYnkKCSAgUm9jY28gQ29yc2kpLgogIGRvX3RvZ2dsZSgpCgktIEFkZGVkIGZpeF9lZGl0Ym90KCkgY2FsbCB0byBmaXggaW1wcm9wZXIgcmVkaXNwbGF5IG9mIGVkaXQKCSAgd2luZG93IHdoZW4gdXNpbmcgbm9oZWxwIHRvZ2dsZSAoYnVnIGRpc2NvdmVyZWQgYnkgUm9jY28gQ29yc2kpLgotIG5hbm8uMSwgbmFuby4xLmh0bWw6CgktIFVwZGF0ZWQgbWFuIHBhZ2UgZm9yIC1iLCAtZSwgLWYgYW5kIGV4cGFuZGVkIGV4cGxhbmF0aW9uIGZvciAtcC4KLSB3aW5pby5jCiAgZG9faGVscCgpCgktIEZvcmNlIGtleXBhZCBvbiBzbyBGLWtleXMgYW5kIFBhZ2VVcC9Eb3duIHdpbGwgd29yayBwcm9wZXJseS4KCSAgQWRkZWQgY2hlY2sgZm9yIE5BTk9fRVhJVF9GS0VZIHRvIGxvb3AuCi0gdXRpbHMuYzoKICBuZXdfbWFnaWNsaW5lKCkKCS0gSW5jcmVtZW50IHRvdHNpemUhISAgV2UgZGVjcmVtZW50IGl0IHdoZW4gd2UndmUgcmVhZCBhIGZpbGUsIAoJICBldmVyeXdoZXJlIGVsc2UgaXQgc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgaW5jcmVtZW50ZWQKCm5hbm8gMC45LjIzIC0gMTIvMDgvMjAwMApHZW5lcmFsCgktIENoYW5nZWQgLS1kaXNhYmxlLXNwZWxsIHRvIC0tZGlzYWJsZSBzcGVsbGVyLiAgVGhlIHRlcm0gaXMKCSAgInNwZWxsZXIiIGZvciAtcywgc28gaXQgc2hvdWxkIGJlIC0tZGlzYWJsZS1zcGVsbGVyLgotIGZpbGVzLmM6CiAgd3JpdGVfZmlsZSgpCgktIEFkZGVkIHRtcCBjaGVjayB0byBUTVBfT1BUIHNlY3Rpb24gKGhvdyBhcHByb3ByaWF0ZSkuCgktIEFkZGVkIG5ldyBjb25zaXN0ZW5jeSBjaGVja2luZyBjb2RlIGZyb20gc2VjdXJpdHlmb2N1cyAKCSAgYXJ0aWNsZSBieSBPbGl2ZXIgRnJpZWRyaWNocywgYW5kIHVzZSBPX0VYQ0wgaWYgdG1wID09IDEuCgktIFdlIG5vdyBydW4gY2hlY2sgb24gcmVzdWx0IG9mIGxzdGF0KCksIG5vdCBzdGF0KCksIHRvIGJlCgkgIHNhZmVyLiAgTmV3IHZhcmlhYmxlIGFueWV4aXN0cywgd2UgdXNlIHN0aWxsIHVzZSByZWFsZXhpc3RzCgkgIGxhdGVyIGluIHRoZSBwcm9ncmFtLgoJLSBPT1BTLCBsaW5lIHVwIGxpbmsvdW5saW5rL3JlbmFtZSBjaGVjayBpZiBjb25kaXRpb25hbCB3aXRoIAoJICB0b3AgaWYgY29uZGl0aW9uYWwuICBPcHRpb24gLWwgaGFzIGJlZW4gYnJva2VuIGZvciA5IHZlcnNpb25zLAoJICBubyBvbmUgbm90aWNlZD8hCgktIEFkZGVkIHNhdmluZyBwZXJtcyBhdCBlbmQgb2YgbGluayBzbyB3ZSBjYW4gYXBwbHkgdGhlbSB0byB0aGUKCSAgbmV3IGZpbGUgaWYgLS1ub2ZvbGxvdyBpcyB1c2VkLgotIHdpbmlvLmM6CiAgZWRpdF9hZGQoKQoJLSBPZmYgYnkgb25lIGRpc3BsYXkgZXJyb3IgKGZpeCBieSBSb2NjbyBDb3JzaSkuCiAgZG9fcmVwbGFjZV9oaWdobGlnaHQoKQoJLSBOZXcgY29kZSB0byBoYW5kbGUgYmVpbmcgcGFzdCBDT0xTIChSb2NjbyBDb3JzaSkuCgktIE1vdmVkIGZyb20gc2VhcmNoLmMsIGFzIGl0J3MgZGVmaW5pdGVseSBhIHdpbmlvIGZ1bmN0aW9uIG5vdyA9KQogIHVwZGF0ZV9saW5lKCkKCS0gTW9yZSAnJCcgZGlzcGxheSBmaXhlcyAoUm9jY28gQ29yc2kpLgoKbmFubyAwLjkuMjIgLSAxMi8wMi8yMDAwCi0gR2VuZXJhbAoJLSBVc2VybmFtZSB0YWIgY29tcGxldGlvbiBjb2RlLCBhbmQgY2xlYW5lZCB1cCBleGlzdGluZyB0YWJjb21wCgkgIGNvZGUuIE5ldyBmdW5jdGlvbnMgcmVhbF9kaXJfZnJvbV90aWRlKCksIGFwcGVuZF9zbGFzaF9pZl9kaXIoKSwKCSAgdXNlcm5hbWVfdGFiX2NvbXBsZXRpb24gaXMgbW9yZSB0aGFuIGEgc3R1YiBub3cgPS0pLgoJLSBJZ25vcmUga2V5IHNlcXVlbmNlIDU0MyAmIDU0NSwgcmlnaHQgY29udHJvbCBhbmQgYWx0IGtleXMgaW4KCSAgd2luZG93cy4gQWZmZWN0cyBtYWluKCkgYW5kIHdpbmlvLmM6bmFub2dldHN0cigpLgoJLSBUb29rIG91dCBoZWxwIGZyb20gc3BlbGxfbGlzdCBhbmQgY2hhbmdlZCBTUEVMTF9MSVNUX0xFTiB0byAxLgoJICBJcyB1c2luZyBhIHNwZWxsIGNoZWNrZXIgVEhBVCBkaWZmaWN1bHQ/ID0tKQoJLSBOZXcgZnVuY3Rpb24gbmFub19kaXNhYmxlZF9tc2coKSwgdG8gYWxlcnQgdGhhdCBjZXJ0YWluCgkgIGZ1bmN0aW9ucyBoYXZlIGJlZW4gZGlzYWJsZWQsIHNpbWlsYXIgdG8gbmFub190aW55IGZlYXR1cmUuCi0gTmV3IGNvbmZpZ3VyZSBvcHRpb25zOgoJLSBBZGRlZCBjb25maWd1cmUgYXJndW1lbnQgLS1kaXNhYmxlLXRhYmNvbXAuICBBZmZlY3RzCgkgIGJvdHRvbSBvZiBmaWxlcy5jIGFuZCB3cml0ZV9maWxlLCB1dGlscy5jOmNoZWNrX3dpbGRjYXJkX21hdGNoKCkKCSAgYW5kIHdpbmlvLmM6bmFub2dldHN0cigpLgoJLSBOZXcgb3B0aW9ucyAtLWVuYWJsZS1leHRyYS4gIE5ldyBjb2RlIGluIG5hbm8uYzp2ZXJzaW9uKCkgdG8gCgkgIHByaW50IG91dCB2YXJpb3VzIG9wdGlvbnMgZnJvbSAuL2NvbmZpZ3VyZSwgZnVuY3Rpb24gZG9fY3JlZGl0cygpLgoJLSBBZGRlZCAtLWRpc2FibGUtc3BlbGwgb3B0aW9uIGZvciB0aG9zZSB3aG8gd2FudCB0byBqdXN0IGRpc2FibGUKCSAgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUuICBBZmZlY3RzIHRoZSBzcGVsbGluZyBmdW5jdGlvbnMKCSAgZG9fc3BlbGwsIGRvX2ludF9zcGVsbGVyIGFuZCBkb19hbHRfc3BlbGxlci4KCS0gQWRkZWQgLS1kaXNhYmxlLWp1c3RpZnkgdG8gZ2V0IHJpZCBvZiB0aGUganVzdGlmeSBmdW5jdGlvbi4KCSAgQWZmZWN0cyBkb19qdXN0aWZ5KCkgKG5vdCBzdXJwcmlzaW5nbHkpLgotIGZpbGVzLmM6CiAgd3JpdGVfZmlsZSgpCgktIFVuc2V0dGluZyBtb2RpZmllZCBvbiB0ZW1wIGZpbGVzIGJ1ZyBmaXhlZCAoUm9jY28gQ29yc2kpLgoJLSBPa2F5LCBpZiB0bXAgPT0gMSBhbmQgdGhlIGZpbGUgZXhpc3RzLCB3ZSBhYm9ydC4KICBkb19pbnNlcnRmaWxlKCkKCS0gQWRkZWQgY2FsbCB0byByZWFsX25hbWVfZnJvbSB0aWxkZSwgb29wcy4gIEFkZGVkIGNoZWNrIGZvcgoJICBESVNBQkxFX1RBQkNPTVAuCiAgcmVhZF9maWxlKCkKCS0gQWRkZWQgY2hlY2sgZm9yIGZpbGVwdHIgPT0gTlVMTC4KLSBnbG9iYWwuYzoKICBzaG9ydGN1dF9pbml0KCkKCS0gTm93IHRha2VzIGFuIGFyZ3VtZW50IGFzIHRvIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgdW5qdXN0aWZ5CgkgIHNob3J0Y3V0IG9yIHRoZSBub3JtYWwgdW5jdXQgdGV4dCBvbmUuICBOZWVkZWQgdG8gYWNjb21tb2RhdGUKCSAgdGhlIGtsdWRnZXkgdW5qdXN0aWZ5IGNvZGUuCi0gbmFuby4xLCBuYW5vLjEuaHRtbDoKCS0gVXBkYXRlZCBkYXRlIG9uIHBhZ2VzIGJlY2F1c2Ugb2YgLXAgY2hhbmdlcy4KCS0gQWRkZWQgIk5PVEVTIiBzZWN0aW9uLCB3aGVyZSBJIGV4cGxhaW4gd2hhdCBuYW5vLnNhdmUgJiBmcmllbmRzCgkgIGFyZS4KCS0gQWRkZWQgYSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgbWFucGFnZSwgdW5kZXIgdGhlIEdQTC4KCS0gT3RoZXIgbWlub3IgY2hhbmdlcy4KLSBuYW5vLmM6CiAgZG9fanVzdGlmeSgpCgktIFdyb3RlIHVuanVzdGlmeSBjb2RlLiAgQm9ycm93cyBjdXRidWZmZXIgYW5kIHN0b3JlcyB0aGUgdW5qdXN0aWZpZWQgCgkgIHRleHQgdGhlcmUsIHRoZW4gZ3JhYnMgdGhlIG5leHQga2V5c3Ryb2tlIGFuZCwgaWYgdGhlIHVuanVzdGlmeQoJICBrZXksIGdldHMgcmlkIG9mIHRoZSBqdXN0aWZpZWQgdGV4dCBhbmQgY2FsbHMgZG9fdW5jdXRfdGV4dC4KCSAgQWRkZWQgbWFjcm8gTkFOT19VTkpVU1RJRllfS0VZLgogIGRvX2ludF9zcGVsbCoKCS0gVmFyaW91cyBmaXhlcyAoUm9jY28gQ29yc2kpLgoJLSBDaGFuZ2VkIGFib3J0IG9mIHByb2dyYW0gdG8gYWJvcnRpbmcgYmFzZWQgb24gdmFsdWUgb2YgImVkaXQgYQoJICByZXBsYWNlbWVudCIgcXVlc3Rpb24sIGFuZCBub3QgY2FyaW5nIGFib3V0IHRoZSByZXBsYWNlIGxvb3AKCSAgcmV0dXJuIHZhbHVlLiAgVGhhdCB3YXkgdGhlIHVzZXIgY2FuIGdldCBvdXQgb2YgdGhlIHJlcGxhY2UgbG9vcAoJICBhbmQgY29udGludWUgc3BlbGwgY2hlY2tpbmcgKHZlcnkgaW1wb3J0YW50IHRvIG1lIGFueXdheSkuCiAgdmVyc2lvbigpCgktIFRvb2sgb3V0IGh1Z2UgY2hlY2sgZm9yIHRoZSB2YXJpb3VzIC0tZGlzYWJsZWQgbWFjcm9zLAoJICBldmVudHVhbGx5IHRoZXJlIHdpbGwgYmUgdG9vIG1hbnkgdG8gcmVhc29uYWJseSBjaGVjayBmb3IuICAKICBuYW5vX3NtYWxsX21zZygpLCBuYW5vX2Rpc2FibGVkX21zZygpCgktIEFkZGVkIGNoZWNrcyBmb3IgZGlzYWJsZWQgZnVuY3Rpb25zIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB0bwoJICBkZWNsYXJlIHRoZW0uCiAgZG9fbmV4dF93b3JkKCkKCS0gVXBkYXRlIHRoZSBwcmV2aW91cyBsaW5lIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgb25lIGluIGNhc2Ugd2UKCSAgaGF2ZSBtb3ZlZCBiZXlvbmQgQ09MUyBvciBiYWNrIGZyb20gQ09MUywgcGF0Y2ggc3VibWl0dGVkCgkgIGJ5IFJ5YW4gS3JlYnMuCiAgZGllKCkKCS0gTm93IGNyZWF0ZXMgLnNhdmUgZmlsZSB1c2luZyB2YXJpYWJsZS1sZW5ndGggc3RyaW5ncy4gIEFsc28KCSAgY2FsbHMgd3JpdGVfZmlsZSB3aXRoIHRtcCA9PSAxLCB3aGljaCBoYXBwZW5zIHRvIGRvIGV4YWN0bHkgd2hhdAoJICB3ZSB3YW50IChhYm9ydCBvbiBzYXZlIGZpbGUgZXhpc3RzIGFuZCB1c2UgbW9kZSAwNjAwKS4KICBoYW5kbGVfc2lnaHVwKCkKCS0gTm93IGNhbGxzIGRpZSBpbnN0ZWFkIG9mIHdyaXRpbmcgb24gaXRzIG93biBhbmQgZXhpdGluZyBub3JtYWxseS4KLSBzZWFyY2guYzoKICBkb19yZXBsYWNlX2hpZ2hsaWdodCgpCgktIE5ldyBmdW5jdGlvbiwgZGlzcGxheXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB3b3JkIGFzIGhpZ2hsaWdodGVkCgkgIGluIHRoZSBzcGVsbCBjaGVjay4gIENhbGxlZCBmcm9tIGRvX3JlcGxhY2VfbG9vcCAoUm9jY28gQ29yc2kpLgoJLSBBZGRlZCBjYWxscyB0byBjdXJzX3NldCgwKSBhbmQgKDEpIHRvIGRpc2FibGUgdGhlIGN1cnNvciB3aGVuCgkgIGhpZ2hsaWdodGluZywgbG9va3MgbXVjaCBiZXR0ZXIuCi0gZXMucG86IAoJLSBUcmFkaXRpb25hbCBTcGFuaXNoIHN0cmluZ3MgdXBkYXRlcy4KCm5hbm8gMC45LjIxIC0gMTEvMjMvMjAwMAotIEFVVEhPUlMKCS0gQWRkZWQgUm9jY28gQ29yc2kuCi0gbmFuby5jOgogIG1haW4oKQoJLSBDaGFuZ2VkIGNoZWNrIGZvciBhcmdjID09IDEgdG8gYXJndltvcHRpbmRdID09IE5VTEwgdG8gZGVjaWRlCgkgIHdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgIk5ldyBGaWxlIiBpbiB0aGUgc3RhdHVzYmFyLgotIHNlYXJjaC5jOgogIGZpbmRuZXh0c3RyKCkKCS0gRml4IGN1cnJlbnRfeCBpbmNyZW1lbnQgYnVnIGJ5IHVzaW5nIGFub3RoZXIgdmFyaWFibGUgKFJvY2NvIENvcnNpKS4KICBzZWFyY2hfaW5pdCgpCgktIFNpbGx5IHR5cG8gaW4gb3VyICJvbmUgc2ltcGxlIGNhbGwiIG9mIHN0YXR1c3EuICBTdG9wcGVkCgkgIHByZXZpb3VzIHNlYXJjaCBzdHJpbmcgZnJvbSBiZWluZyBkaXNwbGF5ZWQuCiAgZG9fcmVwbGFjZSgpCgktIENvcHkgYmFjayB0aGUgcHJldmlvdXMgdmFsdWUgb2YgbGFzdF9yZXBsYWNlIGludG8gYW5zd2VyIGlmCgkgIHVzaW5nIFBJQ09fTU9ERSBhbmQgYW5zd2VyID09ICIiCi0gd2luaW8uYzoKICBkb191cCgpCgktIERlbGV0ZWQgZmlyc3QgdXBkYXRlX2xpbmUoKSBjYWxsLCBzY3Jld3MgdXAgZGlzcGxheSB3aGVuIG1hcmtlciBpcwoJICBzZXQuCi0gbmFuby4xLCBuYW5vLjEuaHRtbAoJLSBVcGRhdGVkIG1hbiBwYWdlIGZvciBuZXcgLXAgZGVmaW5pdGlvbi4KCm5hbm8gMC45LjIwIC0gMTEvMTgvMjAwMAotIEdlbmVyYWwKCS0gUmFuIHNvdXJjZSB0aHJvdWdoIGluZGVudCAta3IgYWdhaW4uICBNYWtlIGV2ZXJ5dGhpbmcgcHJldHR5LgoJLSBDaGFuZ2VkIGJlaGF2aW9yIG9mICJzZWFyY2giIGFuZCAicmVwbGFjZSIgcHJvbXB0cyB0byBtYWtlIGFsbAogIAkgIHByZXZpb3VzIHZhbHVlcyBlZGl0YWJsZS4gIFRoaXMgY2hhbmdlIHdhcyBtYWRlIHNvIHRoYXQgeW91IGNhbiAKCSAgcmVwbGFjZSB3aXRoIHRoZSBudWxsIHN0cmluZyB3aXRob3V0IG5lZWRpbmcgYSBzcGVjaWFsIGtleSBmb3IgaXQuICAKCSAgY2hhbmdlZCBjb2RlIGluIHNlYXJjaF9pbml0KCksIGRvX3JlcGxhY2UoKSwgbmFub2dldHN0ciAoc2VlCgkgIGJlbG93KS4KCS0gQWRkZWQgc29tZSBtaXNzaW5nIGdldHRleHQgY2FsbHMgaGVyZSBhbmQgdGhlcmUgKEpvcmRpKS4KCS0gUmV2YW1wZWQgbmFub2dldHN0cigpIGFuZCBjYWxscyB0byBpdCB0byB1c2UgdmFyaWFibGUgbGVuZ3RoCgkgIHN0cmluZ3MuCgkgIE1BTlkgY2hhbmdlcyBpbiBuYW5vZ2V0c3RyKCksIG1hbnkgY2hhbmNlcyBpbiBzZWFyY2guYywgbmV3CgkgIGZ1bmN0aW9uIG1hbGxvY3N0cmNweSB3aGljaCBpcyBzdXJlIHRvIGJlIGEgcHJvZ3JhbW1hdGljCgkgIG5pZ2h0bWFyZSwgY2hhbmdlZCBsYXN0X3NlYXJjaCwgbGFzdF9yZXBsYWNlLCBhbnN3ZXIgdG8KCSAgcG9pbnRlcnMuICBOZXcgZnVuY3Rpb24gbm90X2ZvdW5kX21zZyBpbiBzZWFyY2guYyBmb3IgZGlzcGxheWluZwoJICB0cnVuY2F0ZWQgc3RyaW5ncyBpbiBzdGF0dXNiYXIgd2hlbiB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZAoJICAoLXBlZGFudGljIGZpeGVzIGJ5IFJvY2NvIENvcnNpKS4gV2UgZGlzYWJsZSB0aGlzIGZlYXR1cmUgd2hlbgoJICB1c2luZyBQSUNPX01PREUgKC1wKS4KCS0gTmV3IHNwZWxsaW5nIGNvZGUgYnkgUm9jY28gQ29yc2kuICBOZXcgZnVuY3Rpb25zCgkgIGRvX2ludF9zcGVsbGVyLCBkb19hbHRfc3BlbGxlciwgY2hhbmdlcyB0byBkb19zcGVsbCBpbiBuYW5vLmMsCgkgIE5ldyBmdW5jdGlvbnMgc2VhcmNoX2luaXRfZ2xvYmFscyBhbmQgZG9fcmVwbGFjZV9sb29wLCBjaGFuZ2VzCgkgIHRvIHNlYXJjaF9pbml0KCksIGRvX3JlcGxhY2UsIGZpbmRuZXh0c3RyLCBtb3ZlZCBsYXN0X3NlYXJjaCBhbmQKCSAgbGFzdF9yZXBsYWNlIGJhY2sgdG8gbmFuby5jICgqc2hydWcqKS4KCS0gTmV3IHRhYiBjb21wbGV0aW9uIGNvZGUuICBVc2VkIGNoZWNrX3dpbGRjYXJkX21hdGNoLCBpbnB1dF90YWIsIAoJICBjd2RfdGFiX2NvbXBsZXRpb24sIHVzZXJuYW1lX3RhYl9jb21wbGV0aW9uIGZyb20gYnVzeWJveCwgCgkgIGhhY2tlZCB0aGVtIGEgbG90LCBjaGFuZ2VzIHRvIG5hbm9nZXRzdHIoKS4gIG5hbm9nZXRzdHIoKSBhbmQKCSAgc3RhdHVzcSgpIG5vdyB0YWtlIGFuIGFyZyBmb3Igd2hldGhlciBvciBub3QgdG8gYWxsb3cgdGFiCgkgIGNvbXBsZXRpb24uCgktIEZpeGVkIHZhbHVlIGJlaW5nIGlucHV0IGluIHN0YXR1c2JhciBkdXJpbmcgYSBzZWFyY2ggb3IgcmVwbGFjZQoJICBhbmQgQ0FTRV9TRU5TSVRJVkUgb3IgdGhlIG90aGVyIHNlYXJjaCBpcyBjYWxsZWQgYW5kIHRoZQoJICBzdHJpbmcgYmVpbmcgdHlwZWQgaW4gaXMgYmxvd24gYXdheS4gIFJlcG9ydGVkIGJ5IEtlbiBUeWxlci4KCS0gQ2hhbmdlZCBQSUNPX01TR1MgZmxhZyB0byBQSUNPX01PREUsIGNoYW5nZWQgaGVscCBzdHJpbmdzCgkgIGFjY29yZGluZ2x5LgotIGZpbGVzLmM6CiAgZG9fd3JpdGVvdXQoKQoJLSBDaGFuZ2Ugc3RyY3B5IHRvIGFuc3dlciB0byBtYWxsb2NzdHJjcHkuCi0gZ2xvYmFsLmMKCS0gTmV3IGdsb2JhbCByZXBsYWNlX2xpc3RfMiwgZm9yIDJuZCBoYWxmIG9mIHRoZSByZXBsYWNlIGRpYWxvZwoJICAoIlJlcGxhY2Ugd2l0aDoiKSwgaGFzIGZld2VyIG9wdGlvbnMgdGhhbiBmaXJzdCBoYWxmIGJlY2F1c2UKCSAgdGhleSB3ZXJlIGluYXBwcm9wcmlhdGUuICAKICB0b2dnbGVfaW5pdCgpCgktIEFkZGVkICNpZmRlZiBhcm91bmQgdG9nZ2xlX3JlZ2V4X21zZyB0byBnZXQgcmlkIG9mIGNvbXBpbGVyIAoJICB3YXJuaW5nLgoKLSBuYW5vLmM6CiAga2V5cGFkX29uKCkKCS0gTmV3IGZ1bmN0aW9uLCB0b2dnbGVzIHR1cm5pbmcgdGhlIGtleXBhZCBvbiBhbmQgb2ZmIGluIGVkaXQgYW5kCgkgIGJvdHRvbXdpbigpLiAgQWRkZWQgY2FsbCB0byB0aGlzIGluIGZpbmlzaCgpLCBmaXhlcyBidWcgIzQ1LgotIHNlYXJjaC5jCiAgZmluZG5leHRzdHIoKQoJLSBOZXcgYXJnIGZvciBiZWdpbl94IHZhcmlhYmxlLCBiYXNpY2FsbHkgYSByZXdyaXRlIHRoYXQKCSAgbWFrZXMgYSBsaXR0bGUgbW9yZSBzZW5zZSBhbmQgaXNuJ3QgcXVpdGUgYXMgbWVzc3kgKFJvY2NvIENvcnNpKS4KCS0gVXBkYXRlIHRoZSBsaW5lIHdlJ3JlIGNoZWNraW5nIGlmIG5vdCB0aGUgd2hvbGUgc2NyZWVuLCBiZWNhdXNlCgkgIGl0J3MgcXVpdGUgcG9zc2libGUgdGhlIHNlYXJjaCB0ZWFtIGNvdWxkIGV4aXN0IHNvbWV3aGVyZSB3YXkKCSAgdG8gdGhlIHJpZ2h0IG9uIHRoZSBzYW1lIGxpbmUsIGZvciBleGFtcGxlLgogIHJlcGxhY2VfYWJvcnQoKQoJLSBBZGQgcmVzZXQgb2YgcGxhY2V3ZXdhbnQsIHN0b3BzIGN1cnNvciBmcm9tIGp1bXBpbmcgd2hlbiBtb3ZpbmcKCSAgY3Vyc29yIGFmdGVyIGEgcmVwbGFjZS4KICBkb19yZXBsYWNlKCkKCS0gQWRkZWQgY29kZSBmb3IgR290b2xpbmUga2V5IGFmdGVyIGVudGVyaW5nIHRoZSBzZWFyY2ggdGVybS4KCSAgRml4ZXMgYnVnICM0Ni4KCS0gUmVtb3ZlZCByZWR1bmRhbnQgY29kZSBpbnZvbHZpbmcgcHJvY2Vzc2luZyByZXBsYWNlbWVudCBzdHJpbmcuCgkgIENvbnZlcnRlZCBpZiBzdGF0ZW1lbnRzIHRvIHN3aXRjaCBzdGF0ZW1lbnRzLgoJLSBPcHRpbWl6YXRpb25zIGJ5IFJvY2NvIENvcnNpLgoJLSBSZW1vdmVkIGNvZGUgZm9yIGRlbGV0ZWQgc2hvcnRjdXRzIGZyb20gaW4gcmVwbGFjZV9saXN0XzIuCiAgZG9fc2VhcmNoKCkKCS0gQ29udmVydGVkIGlmIHN0YXRlbWVudHMgdG8gb25lIHN3aXRjaCBzdGF0ZW1lbnQuCi0gd2luaW8uYwogIG5hbm9nZXRzdHIoKQoJLSBBZGRlZCBjaGVjayBmb3IgMzQzIGluIHdoaWxlIGxvb3AgdG8gZ2V0IHJpZCBvZiBnZXR0aW5nICJsb2NrZWQiCgkgIGludG8gc3RhdHVzYmFyIiBidWcgaW4gb2RkICRURVJNcyBsaWtlIGlyaXMtYW5zaS4KCS0gQ2hhbmdlZCBjaGVjayB0byByZXR1cm4gLTIgb24gImVudGVyIiBmcm9tIGFuc3dlciA9PSAiIgoJICB0byBhbnN3ZXIgPT0gZGVmLgoJLSBGaXhlZCBmYWxsdGhyb3VnaCBjb2RlIGJlY2F1c2UgdGhlcmUgd2FzIG5vIGJyZWFrLiAgTWFrZSBtdWNoCgkgIG1vcmUgc2Vuc2Ugbm93LgoJLSBBZGRlZCBjaGVjayBmb3IgQVNDSUkgNTRbMTI0XSB3aGVuIHVzaW5nIFBEQ1VSU0VTLCBpZ25vcmUgdGhlbQoJICBpZiBub3RpY2VkLgogIG5hbm9nZXRfcmVwYWludCgpCgktIE5ldyBmdW5jdGlvbiwgcmVtb3ZlcyBhYm91dCAzMCBsaW5lcyBvZiBkdXBsaWNhdGUgY29kZSBpbiAKCSAgbmFub2dldHN0cigpLgoJLSBCbGFjayBtYWdpYyBjb2RlIHRvIG1ha2UgJCBhcHBlYXIgaW4gcHJvbXB0IGlmIHdlJ3JlIHBhc3QKCSAgQ09MUy4KICBibGFua19lZGl0KCkKCS0gUmVtb3ZlZCB3cmVmcmVzaCgpIGNhbGwsIG11Y2ggbGVzcyBjaG9wcHkgbm93LiAgSWYgdGhlcmUncyBhIG5lZWQKCSAgZm9yIGEgd3JlZnJlc2ggYWZ0ZXIgYSBzcGVjaWZpYyBjYWxsLCBsZXQgbWUga25vdy4KLSBlcy5wbzoKCS0gVXBkYXRlZCB0cmFuc2xhdGlvbiBmb3IgMC45LjIwIChKb3JkaSkuCiAgCm5hbm8gMC45LjE5IC0gMTAvMDIvMjAwMAotIEdlbmVyYWwKCS0gQWRkZWQgUERDdXJzZXMgc3VwcG9ydCB1bmRlciBjeWd3aW4sIHdoaWNoIGFsbG93cyBidWlsZGluZwoJICBhIG5pY2Ugc3RhbmQtYWxvbmUgbmFuby5leGUgZm9yIHRob3NlIHBvb3IgV2luZG93cyB1c2Vycy4KCSAgRXh0cmEgY2hlY2sgaW4gY29uZmlndXJlLmluIGZvciBpbml0c2NyKCkgaW4gLWxjdXJzZXMgKGFzCgkgIFBEY3Vyc2VzIGhhcyBubyB0Z2V0ZW50KSwgc29tZSAjaWZkZWYgUERDVVJTRVMgc3RhdGVtZW50cwoJICBpbiBtYWluKCkuCgktIENoYW5nZWQgd2ViIHNpdGUgYW5kIGVtYWlsIHRvIG5ldyBuYW5vLWVkaXRvci5vcmcgZG9tYWluLgotIG5hbm8uYwoJLSBBZGRlZCAoaW50KSBjYXN0cyB0byByZW1vdmUgY29tcGlsZSB3YXJuaW5ncyB3aXRoIC1XYWxsLgogIG1haW4oKQoJLSBBZGRlZCBjaGVjayBmb3IgX1BPU0lYX1ZESVNBQkxFIGFyb3VuZCB0ZXJtIHZhcmlhYmxlIGRlZmluaXRpb24uCi0gc2VhcmNoLmMKCS0gQWRkZWQgaW5pdGlhbGl6YXRpb25zIGZvciBsYXN0X3NlYXJjaCBhbmQgbGFzdF9yZXBsYWNlIChSb2NjbyBDb3JzaSkKCm5hbm8gMC45LjE4IC0gMDkvMTgvMjAwMAotIEdlbmVyYWwKCS0gQ2hhbmdlZCBfUE9TSVhfVkVSU0lPTiBjaGVja3MgaW4gcmVnZXggY29kZSB0byBIQVZFX1JFR0VYX0gsIAoJICBhZGRlZCBjaGVjayBmb3IgcmVnZXguaCBpbiBjb25maWd1cmUuaW4uCi0gY29uZmlndXJlLmluOgoJLSBBZGRlZCBkZWZhdWx0IGNhc2UgZm9yIGNyb3NzLWNvbXBpbGluZyB0byBnZXQgcmlkIG9mIGFubm95aW5nCgkgIEFDX1RSWV9SVU4gd2FybmluZy4KLSBjdXQuYzoKICBkb19jdXRfdGV4dCgpCgktIERvbid0IGltbWVkaWF0ZWx5IGFib3J0IGlmIHdlJ3JlIG9uIGZpbGVib3QgYW5kIHRoZSBtYXJrZXIgaXMKCSAgc2V0IChmaXhlcyBidWcgIzQyKS4KLSBmaWxlcy5jOgogIG9wZW5fZmlsZSgpCgktIEZpeCBmb3IgYnVnICM0NCAoUm9jY28gQ29yc2kpLgotIGdsb2JhbC5jOgogIHNob3J0Y3V0X2luaXQoKQoJLSBBZGRlZCBpbiBGS0VZcyB0aGF0IGZvciBzb21lIHJlYXNvbiB3ZXJlIGxlZnQgb3V0LiAgKmJvZ2dsZSoKLSBuYW5vLmM6CiAgbWFpbigpCgktIEFkZGVkIGNoZWNrIGZvciBfUE9TSVhfVkRJU0FCTEUgYW5kIHVzZSByYXcgbW9kZSBpZiBub3QKCSAgYXZhaWxhYmxlLCBhbGxvd3MgbmFubyB0byB3b3JrIHdpdGggY3lnd2luLgoJLSBBZGRlZCBnZXR0ZXh0IGNhbGxzIHRvIGVuYWJsZS9kaXNhYmxlIHN0cmluZ3MgKEpvcmRpKS4KCS0gUmV2YW1wZWQgYSBncmVhdCBkZWFsIG9mIHRoZSBGLWtleSBhbmQga2V5cGFkIGtleSBoYW5kbGluZywKCSAgYmVjYXVzZSB3ZSBub3QgbG9uZ2VyIHVzZSBrZXlwYWQoKSAoc2VlIGJlbG93KS4KCS0gUmVtb3ZlZCBrZXlwYWQoKSBjYWxsIGJlY2F1c2UgbmFubyB3YXMgbm90IHdvcmtpbmcgd2l0aCB0aGUKCSAga2V5cGFkIGluIG1hbnkgdGVybXMsIHdoaWNoIGlzIHZlcnkgYmFkLgoJLSBNYWRlIGluc2VydCBrZXkgY2FsbCBkb19pbnNlcnRmaWxlKCkuCiAgZG9fdG9nZ2xlKCkKCS0gUmV3cm90ZSBmdW5jdGlvbiB0byBhbGxvdyBOT0hFTFAgdG9nZ2xlIHRvIHdvcmsgb24gc3lzdGVtcwoJICB3aXRob3V0IGEgd29ya2luZyByZXNpemV3aW4oKS4gIE5ldyBmdW5jdGlvbiB3aW5kb3dfaW5pdCgpLgogIG1vdXNlX2luaXQoKQoJLSBBZGQga2V5cGFkIG9ubHkgaWYgbW91c2Ugc3VwcG9ydCBpcyBvbiwgb3RoZXJ3aXNlIG1vdXNlIGRvZXNuJ3QKCSAgd29yay4gIEkgZ3Vlc3MgeW91IGhhdmUgdG8gY2hvb3NlIGJldHdlZW4gaGF2aW5nIHRoZSBtb3VzZSBhbmQKCSAgaGF2aW5nIGEgd29ya2luZyBrZXlwYWQgZm9yIHRoZSB0aW1lIGJlaW5nICh0aGFuayBnb2QgZm9yIE1ldGEtTSkuCi0gd2luaW8uYzoKICB0b3RhbF9yZWZyZXNoKCkKCS0gQWRkZWQgdGl0bGViYXIoKSBjYWxsLgogIG9uZWtleSgpCgktIE9mZiBieSBvbmUgZXJyb3IgZml4IGZpeCA7LSkgKFJvY2NvIENvcnNpKS4KCi0gc2VhcmNoLmM6CiAgZmluZG5leHRzdHIoKQoJLSBSZXNldCBzdGFydGluZyBhdCBjdXJyZW50IGZvciBzZWFyY2ggaW5zdGVhZCBvZiBiZWdpbi4KLSBlcy5wbzoKCS0gVHJhbnNsYXRlZCBuZXcgc3RyaW5ncyBhbmQgbWlub3IgdXBkYXRlcyAoSm9yZGkpLgotIGRlLnBvIAoJLSBSZXZpc2VkIHRyYW5zbGF0aW9ucyBieSBmbG9raUBiaWdmb290LmNvbQoKbmFuby0wLjkuMTcgLSAwOS8wNC8yMDAwCi0gR2VuZXJhbAoJLSBOZXcgc2hvcnRjdXRzIHRvIHRvZ2dsZSBjZXJ0YWluIG9wdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgb25seQoJICBmbGFncyB2aWEgQWx0L01ldGEuICBTZWUgQWx0LUMsRSxJLEssTSxQLFgsWi4gIE5ldyBzdHJ1Y3QgY2FsbGVkCgkgIHRvZ2dsZXMgaW4gbmFuby5oLCB0b2dnbGVfaW5pdCgpLCB0b2dnbGVfaW5pdF9vbmUoKSBpbiBnbG9iYWwuYwoJICBjYWxsZWQgZnJvbSBzaG9ydGN1dF9pbml0KCksIGFuZCBkb190b2dnbGUgaW4gbmFuby5jLiAgQWxzbyAKCSAgbW92ZWQgdGhlIHNpZ25hbCBjb2RlIGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbiBuYW5vLmMgY2FsbGVkCgkgIHNpZ25hbF9pbml0KCkuICBNb3ZlZCAic3RydWN0IHNpZ2FjdGlvbiBhY3QiaW50byBhIHN0YXRpYyBpbgoJICBuYW5vLmMuCgktIENoYW5nZWQgZnJvbSBBbHQta2V5IHN5bWJvbCAoQCkgd2hpY2ggaXMgY29tcGxldGVseSBub25zdGFuZGFyZAoJICB0byB0aGUgKm5peCAiTWV0YSIgc3ltYm9sIChNLSkuICBDaGFuZ2VkIGhlbHBfaW5pdCB0byBzaG93CgkgIHRoZSBNLWtleSB1c2FnZSBhbmQgdGhlIGhlbHAgdGV4dCB0byBleHBsYWluIGtleXMgd2hpY2ggZ2VuZXJhdGUKCSAgTWV0YS4gIE1vdmVkIHRoZSB0b2dnbGUgTWV0YSBrZXlzdHJva2VzIHRvIHRoZSBmaXJzdCBjb2x1bW4KCSAgaW5zdGVhZCBvZiB0aGUgdGhpcmQgYXMgdGhleSBhcmUgdGhlIHByaW1hcnkga2V5c3Ryb2tlcyBmb3IgdGhlCgkgIGZ1bmN0aW9ucy4gIFRoYW5rcyBNaW5pIGVkaXRvciB0ZWFtIDotPgoJLSBDaGFuZ2VkIGxhc3Rfc2VhcmNoIGFuZCBsYXN0X3JlcGxhY2UgdmFycyB0byBzdGF0aWNhbGx5IAoJICBhbGxvY2F0ZWQgKGhlbmNlIG51bGxlZCkgYW5kIG1vdmVkIHRvIHNlYXJjaC5jIChNYXR0IEtyYWFpKS4KLSBnbG9iYWwuYzoKICB0b2dnbGVfaW5pdCgpCgktIENoYW5nZWQgIk5vIGF1dG8gd3JhcCIgYW5kICJObyBoZWxwIG1vZGUiIHRvICJBdXRvIHdyYXAiIGFuZCAKCSAgIkhlbHAgbW9kZSIuIFNlZSB0aGUgY2hhbmdlIHRvIGRvX3RvZ2dsZSgpIGJlbG93LgotIG5hbm8uYzoKICBkb19tb3VzZSgpCgktIFBhdGNoIGZvciBoYW5kbGluZyBsaW5lcyB3L3RhYnMgYW5kIG1vdXNlIGJldHRlciAoQmVuIFJvYmVydHMpLgogIGRvX3dyYXAoKQoJLSBNYWRlIHdyYXBwaW5nIGNvZGUgbGVzcyBhbWJpdGlvdXMuCiAgZG9fdG9nZ2xlKCkKCS0gQWRkZWQgY2hlY2tzIGZvciBubyBoZWxwIGFuZCBubyB3cmFwIG1vZGUsIGFuZCBwcmludCBvcHBvc2l0ZQoJICBlbmFibGUvZGlzYWJsZSBtZXNzYWdlLgogIGRvX3N1c3BlbmQoKSwgZG9fY29udCgpOgoJLSBOZXcgZnVuY3Rpb25zLCBoYW5kbGUgc3VzcGVuZCBzaWduYWwgaW4gYSBQaWNvLWxpa2UgbWFubmVyIGFuZAoJICB3b3JrIHdpdGggTWV0YS1aLgotIHdpbmlvLmM6CiAgdG90YWxfcmVmcmVzaCgpCgktIEFkZGVkIGVkaXRfcmVmcmVzaCgpIGNhbGwgdG8gYWN0dWFsbHkgdXBkYXRlIHRoZSBzY3JlZW4gaWYgbWVzc3kuCiAgZWRpdF9yZWZyZXNoX2NsZWFyb2soKQoJLSBOZXcgZnVuY3Rpb24sIGRvZXMgYSB0b3RhbCB1cGRhdGUgZm9yIGVkaXQgcmVmcmVzaCwgbmVlZGVkIHRvIGZpeAoJICBsYWNrIG9mIHJldmVyc2VkIHRleHQgb24gc2VhcmNoaW5nIHdpdGggTUFSS19JU1NFVC4KICBvbmVrZXkoKQoJLSBPZmYgYnkgb25lIGVycm9yIGZpeCAoUm9jY28gQ29yc2kpLgoKICB1cGRhdGVfbGluZSgpCgktIEFkZGVkIGNoZWNrIGZvciBiaW5hcnkgZGF0YSA+PSAxIGFuZCA8PSAyNiwgYW5kIHVzZSBeK2xldHRlcgoJICB0byBkaXNwbGF5IGl0LiAgIFNob3VsZCBmaXggZWRpdGluZyB0ZXh0IGZpbGVzIHdpdGggYmluYXJ5CgkgIGRhdGEgaW4gdGhlbS4gIFBsYWNpbmcgb2YgdGhlIGN1cnNvciBzZWVtcyB0byBiZSBhIGJpdCBzY3Jld2VkCgkgIHRob3VnaC4uLgotIHNlYXJjaC5jOgogIHNlYXJjaF9hYm9ydCgpCgktIE5vdyBjYWxscyBlZGl0X3JlZnJlc2hfY2xlYXJvayB3aGVuIE1BUktfSVNTRVQgdG8gaGFuZGxlIHNjcmVlbgoJICB1Z2xpbmVzcyBidWcgKHJlcG9ydGVkIGJ5IEtlbiBUeWxlcikuCiAgZmluZG5leHRzdHIoKToKCS0gQWRkZWQgcmVzZXQgZm9yIHBsYWNld2V3YW50IChCZW4gUm9iZXJ0cykuCgktIEZpeGVkIGNoZWNrIGZvciBzdHJpbmcgdGhhdCBvbmx5IG9jY3VycyBvbiB0aGUgc2FtZSBsaW5lIGZhaWxpbmcKCSAgKGRpc2NvdmVyZWQgYnkgS2VuIFR5bGVyKS4KCm5hbm8tMC45LjE2IC0gMDgvMDkvMjAwMAotIGN1dC5jOgogIGRvX2N1dF90ZXh0KCkKCS0gRml4ZWQgZ2V0dGluZyBsb2NrZWQgaW50byBjdXRidWZmZXIgb24gY3V0dGluZyBmaXJzdCBsaW5lIG9mIGZpbGUuCgktIEFkZGVkIGNoZWNrX3N0YXRibGFuaygpLgoJLSBDaGVjayBmb3IgZmlsZXB0ciA9PSBmaWxlYm90LCBpZiBzbyByZXR1cm4sIHdlIHNob3VsZG4ndCBib3RoZXIKCSAgY3V0dGluZyB0aGUgbWFnaWMgbGluZS4KICBkb191bmN1dF90ZXh0KCkKCS0gQWRkZWQgY2hlY2tfc3RhdGJsYW5rKCkuCi0gbmFuby5jOgogIG1haW4oKQoJLSBDaGFuZ2VkIHRhYnNpemUgbG9uZyBhcmcgdG8gYWN0dWFsbHkgYWNjZXB0IGFuIGFyZ3VtZW50ICpzaWdoKi4KLSBwby9NYWtlZmlsZS5pbi5pbjoKCS0gUGF0Y2ggdG8gaGFuZGxlICRERVNURElSIChvcmlnIGJ5IERhbiBIYXJuZXR0IGNvbnRyaWJ1dGVkIGJ5CgkgIENocmlzdGlhbiBXZWlzZ2VyYmVyKQotIGNvbmZpZ3VyZS5pbjoKCS0gTmV3IChhbmQgc2V2ZXJhbGx5IHJldmlzZWQgPSkgc2xhbmcgdGVzdCBjb2RlIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQoKbmFuby0wLjkuMTUgLSAwOC8wMy8yMDAwCi0gQ2hhbmdlZCBlZGl0X3VwZGF0ZSBjYWxsIHRvIHRha2UgYXJndW1lbnRzIFRPUCwgQ0VOVEVSIG9yIEJPVFRPTS4KICBBZmZlY3RzIG1hbnkgbWFueSBmdW5jdGlvbnMuICBSZW1vdmVkIGZ1bmN0aW9ucyBlZGl0X3VwZGF0ZV90b3AgYW5kCiAgZWRpdF91cGRhdGVfYm90LgotIEFkZGVkIGdsb2JhbCB2YXJpYWJsZSB0YWJzaXplLCB3ZSBubyBsb25nZXIgc2NyZXcgd2l0aCB0aGUgY3Vyc2VzCiAgbGlicmFyeSBpbiBvcmRlciB0byBpbXBsZW1lbnQgLVQgKHN1Z2dlc3RlZCBieSBDaHJpc3RpYW4gV2Vpc2dlcmJlcikuCi0gY29uZmlndXJlLmluOgoJLSBGaW5hbGx5IGZpeGVkIGNoZWNrIGZvciBzbGFuZyB0byByZXBvcnQgIm5vIiBpZiBub3QgY2FsbGVkCgkgIHdpdGggLS13aXRoLXNsYW5nIG9yIC0td2l0aG91dC1zbGFuZwotIG5hbm8uYzoKICBzcGxpY2Vfbm9kZSgpCgktIE5ldyBmdW5jdGlvbiwgYWJzdHJhY3RzIGxpbmtpbmcgaW4gbm9kZXMuICAgRml4ZXMgYnVnICMzNi4KICBudWxsX2F0KCkKCS0gTmV3IGZ1bmN0aW9uLCBudWxscyBhIHN0cmluZyBhdCBhIGdpdmVuIGluZGV4IGFuZCByZWFsaWducyBpdC4KICBkZWxldGVfYnVmZmVyKCkKCS0gUmVtb3ZlZCwgc2FtZSBhcyBmcmVlX2ZpbGVzdHJ1Y3QoKS4KICBkb19iYWNrc3BhY2UoKQoJLSBOb3cgY2FsbHMgcGFnZV91cF9jZW50ZXIgaW5zdGVhZCBvZiBwYWdlX3VwIChhcyBpdCBzaG91bGQ/KQogIGRvX2VudGVyKCkKCS0gRml4ZWQgdHlwbyAoPykgaW4gY2hlY2sgZm9yIGlucHRyLT5uZXh0LiAgQ2F1c2VkIGxvdHMgb2YKCSAgZ3JpZWYgZm9yIGVkaXRpbmcgbGluZXMgYXQgZmlsZWJvdC4KICBtYWluKCkKCS0gUmVtb3ZlZCBub3cgdXNlbGVzcyB1c2VydGFic2l6ZSB2YXJpYWJsZSAoQ2hyaXN0aWFuIFdlaXNnZXJiZXIpLgotIHNlYXJjaC5jOgogIHJlcGxhY2VfYWJvcnQoKQoJLSByZWR1bmRhbnQsIG5vdyBqdXN0IGNhbGxzIHNlYXJjaCBhYm9ydCB1bnRpbCBpdCBkb2VzIHNvbWV0aGluZwoJICBkaWZmZXJlbnQuICAKLSB3aW5pby5jOgogIGVkaXRfcmVmcmVzaCgpCgktIEFkZGVkIGNoZWNrIGZvciBjdXJyZW50IGxpbmUgInJ1bm5pbmciIG9mZiB0aGUgc2NyZWVuLgoJICBIb3BlZnVsbHkgdGhpcyB3aWxsIG5vdCBjYXVzZSBhbnkgcmVjdXJzaXZlIGxvY2t1cHMuCgkgIChXaG8gYW0gSSBraWRkaW5nLCBvZiBjb3Vyc2UgaXQgd2lsbCEpCgktIEFkZGVkIGNoZWNrIHRvIHN0b3AgaW5maW5pdGUgbG9vcCBjYWxsaW5nIGVkaXRfdXBkYXRlLgogIGVkaXRfdXBkYXRlKCkKCS0gUmV3cml0dGVuLCBob3BlZnVsbHkgdGhpcyB3aWxsIHJlbW92ZSBhIGxvdCBvZiB0aGUKCSAgc2Nyb2xsaW5nIHRoZSBjdXJzb3IgYmFjayBhbmQgZm9ydGggbmVlZGxlc3NseS4KLSBtb3ZlLmM6CiAgcGFnZV9kb3duKCkKCS0gZG8gYW4gZWRpdF91cGRhdGUoKSBhdCBsYXN0IGNhc2UuICBNYWRlIGZ1bmN0aW9uIG1vcmUgbGlrZQoJICBQaWNvJ3MgdmVyc2lvbiwgb25seSBtb3ZlIGRvd24gdG8gdHdvIGxpbmVzIGJlZm9yZSBlZGl0Ym90LgogIHBhZ2VfdXAoKQoJLSBNYWRlIGZ1bmN0aW9uIG1vcmUgbGlrZSBQaWNvJ3MgdmVyc2lvbiwgb25seSBtb3ZlIGRvd24gdG8gdHdvCgkgIGxpbmVzIGFmdGVyIGVkaXR0b3AuCgpuYW5vLTAuOS4xNCAtIDA3LzI3LzIwMDAKLSBuYW5vLmg6CgktIFNldCBDVVRfVE9fRU5EIHRvIGEgZGlmZmVyZW50IGJpdCB0aGFuIFRFTVBfT1BULiAgRml4ZXMgYnVnICMzMi4KLSBjdXQuYzoKICBkb19jdXRfdGV4dCgpCgktIEFkZGVkIGNoZWNrIGZvciBNQVJLX0lTU0VUIHdoZW4gdXNpbmcgQ1VUX1RPX0VORC4gIEZpeGVzIGJ1ZyAjMzEuCgktIFNpbXBsaWZpZWQgY2hlY2sgZm9yIGZyZWVpbmcgY3V0YnVmZmVyLiAgQWRkZWQgY2hlY2tzIGZvciBkb2luZwoJICBtdWx0aXBsZSBjdXRzIHdpdGggLWssIG5vdyBzZXRzIG1hcmtlZF9jdXQgdG8gMiBmb3IgbGF0ZXIKCSAgcHJvY2Vzc2luZyBieSBkb191bmN1dF90ZXh0KCkuCiAgZG9fdW5jdXRfdGV4dCgpCgktIEFkZGVkIGhhbmRsZXIgZm9yIHVuY3V0dGluZyB3aXRoIC1rIGN1dHMuCi0gZmlsZXMuYzoKICB3cml0ZV9maWxlKCkKCS0gUmVtb3ZlZCAocmVkdW5kYW50KSBjaGVjayBmb3Igd3JpdGluZyBvdXQgZmlsZXMgd2l0aCAtdC4KICBkb193cml0ZW91dCgpCgktIENoYW5nZWQgY2hlY2sgZm9yIGZpbGVuYW1lIHRvIGZpbGVuYW1lWzBdLiAgQWRkZWQgc29tZSBjb2RlLCAKCSAgb3ZlcmFsbCBmaXhlcyBidWcgIzMwID0tKQotIG5hbm8uYzoKICBkb19qdXN0aWZ5KCkgJiBkb193cmFwKCk6CgktIHRvdHNpemUtcmVsYXRlZCBmaXhlcyAoUm9iKQotIGRlLnBvIAoJLSBSZXZpc2VkIHRyYW5zbGF0aW9ucyBieSBmbG9raUBiaWdmb290LmNvbQoKbmFuby0wLjkuMTMgLSAwNy8yMy8yMDAwCi0gSW1wbGVtZW50ZWQgUGljbydzIC1rIG1vZGUuICBOZXcgZmxhZyBDVVRfVE9fRU5ELCBvcHRpb24gKC1rLCAtLWN1dCksIAogIGFmZmVjdHMgZG9fY3V0X3RleHQgaW4gY3V0LmMuICBOb3QgYXZhaWxhYmxlIHdpdGggU01BTExfTkFOTyBiZWNhdXNlIGl0CiAgZGVwZW5kcyBvbiB0aGUgbWFya2VyIGNvZGUgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSB3aXRoIHRoYXQgc2V0dGluZy4KLSBDaGFuZ2VkIHN0YXRpYyB0ZW1wX29wdCB0byBmbGFnIFRFTVBfT1BULiAgRml4ZWQgYnVnICMyOSAodXNpbmcKICAtdCB3aXRoIGFuIHVud3JpdGFibGUgZmlsZSBjYXVzZXMgdXNlcnMgdG8gZ2V0IGxvY2tlZCBpbnRvIGVkaXRvcikuCi0gbW92ZS5jCiAgcGFnZV9kb3duKCkKCS0gRG9uJ3QgZWRpdF9yZWZyZXNoKCkgaWYgdGhlIGJvdHRvbSBvZiB0aGUgZmlsZSBpcyBpbiB0aGUgZWRpdAoJICBidWZmZXIuIChBZGFtKQotIG5hbm8uYzoKICBtYWluKCk6CgktIFRBQlNJWkUgbm93IHNldCBiZWZvcmUgZmlyc3QgY2FsbCB0byBlZGl0X3JlZnJlc2ggKEJpbGwgU291ZGFuKQoJLSBEaWZmZXJlbnQgXkMga2lsbCBjb2RlIChwYXRjaCBieSBDaHJpc3RpYW4gV2Vpc2dlcmJlcikuCiAgZGllKCk6CgktIE1vcmUgaW50ZWxsaWdlbnQgZW1lcmdlbmN5LXNhdmUgZmlsZW5hbWUgc2VsZWN0aW9uIChSb2IpCiAgZG9fc3BlbGwoKToKCS0gQ2hhbmdlZCBleGl0IHNlbWFudGljcyBhIGJpdCBzbyB0aGF0IGFzcGVsbCB3b3VsZG4ndCBnZXQKCSAgYWxsIHNjcmV3eSAoYnVnIGRpc2NvdmVyZWQgYnkgSm9zaHVhIEplbnNlbi4KLSBmaWxlcy5jOgogIHJlYWRfZmlsZSgpOgoJLSBBZGRlZCBpbml0IG9mIGJ1ZiB2YXJpYWJsZSwgaG9wZWZ1bGx5IHRoaXMgd2lsbCBzdG9wIHRoZSAKCSAgImJsZWVkaW5nIiBvZiB0ZXh0IHNlZW4gd2l0aCBtdXR0IGFuZCB1c2luZyBpMThuLgogIHdyaXRlX2ZpbGUoKToKCS0gQWRkZWQgY29kZSB0byBjaGVjayB0byBzZWUgaWYgdXNpbmcgLWwgYW5kIHRoZSBmaWxlIGlzIG5vdAoJICBpbiBmYWN0IGEgbGluay4gIFRoaXMgc2hvdWxkIGZpeCB0aGUgYmVoYXZpb3Igd2hlcmUgYSBmaWxlCgkgIHRoYXQgZG9lcyBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIGJ1dCBjb3VsZCBiZSByZW1vdmVkIGFuZAoJICByZXdyaXR0ZW4gaXMgc2F2ZWQgd2l0aG91dCBlcnJvci4gIFBsZWFzZSB0ZXN0IHRoaXMgZmVhdHVyZQoJICBhbmQgZ2l2ZSBmZWVkYmFjay4KLSBzZWFyY2guYzoKICBzZWFyY2hfaW5pdCgpOgoJLSBBZGRlZCAiICh0byByZXBsYWNlKSIgc3RhdGVtZW50IHRvIGVuZCBvZiBzZWFyY2ggc3RyaW5nIGlmIAoJICB3ZSBhcmUgZG9pbmcgYSByZXBsYWNlLiAgTWFudWFsbHkgY29udmVydGVkIGFsbCB0aGUgdHJhbnNsYXRpb25zCgkgIGZyb20gJyVzJyB0byAnJXMlcycgdG8gZW5zdXJlIHRoZXkgc3RpbGwgd29yayB3aXRoIHRoZSBuZXcgY29kZS4KCSAgQWxzbyBwdXQgaW4gdGhlIHRyYW5zbGF0aW9uIGZvciAiIChyZXBsYWNlKSIgaW4gdGhlIC5wbydzLiAgSG9wZQoJICBJIGRpZG4ndCBzdGVwIG9uIHlvdXIgdG9lcyBkb2luZyB0aGlzIEpvcmRpLiAoQ2hyaXMpCiAgZG9fc2VhcmNoKCksIGRvX3JlcGxhY2UoKToKCS0gUmVtb3ZlZCBjYWxsIHRvIHNlYXJjaF9hYm9ydCgpL3JlcGxhY2VfYWJvcnQoKSBiZWZvcmUgY2FsbCB0bwoJICB0aGUgb3Bwb3NpdGUgZnVuY3Rpb24uCgktIEZpeGVkIGJ1ZyAjMjguCiAgZmluZG5leHRzdHIoKQoJLSBkbyBub3QgY2VudGVyIHN0cmluZyBmb3VuZCBpZiBpdCBpcyBjdXJyZW50bHkgdmlzaWJsZS4gKEFkYW0pCi0gZnIucG86CgktIEZyZW5jaCB1cGRhdGUgYnkgQ2xlbWVudCBMYWZvcmV0IDxjbGVtX2xhZkB3YW5hZG9vLmZyPi4KLSBlcy5wbzoKCS0gVXBkYXRlZCBzdHJpbmdzIHRvIDAuOS4xMyAoSm9yZGkpLgoKbmFuby0wLjkuMTIgLSAwNy8wNy8yMDAwCi0gYWxsOgoJLSBOZXcgcmVnZXhwIHNlYXJjaCBmZWF0dXJlIGJ5IEJpbGwgU291ZGFuLiAgTmV3IGZsYWdzIFVTRV9SRUdFWFAKCSAgYW5kIFJFR0VYUF9DT01QSUxFRCwgbmV3IGZ1bmN0aW9ucyByZWdleHBfaW5pdCwgcmVnZXhwX2NsZWFudXAKCSAgcmVwbGFjZV9saW5lLCByZXBsYWNlX3JlZ2V4cCBpbiBzZWFyY2guYywgY2hhbmdlcyB0bwoJICBzZWFyY2hfaW5pdCgpIGFuZCBkb19yZXBsYWNlKCkgYW5kIHN0cnN0cndyYXBwZXIoKS4gCgktIEFkZGVkIF9QT1NJWF9WRVJTSU9OIGNoZWNrIHRvIHJlZ2V4cCBjb2RlLiAgQmV0dGVyIHRoYW4gbm90aGluZwoJICBmb3Igbm9uLVBPU0lYIHN5c3RlbXMuLi4KCS0gTWFkZSBzZWFyY2ggZnVuY3Rpb25zICYga2V5cyBtb3JlIGxpa2UgUGljby4gIEFkZGVkIGdvdG8gbGluZSBmcm9tICAKCSAgc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9uLCBjaGFuZ2VkIHdvcmRpbmcgdG8gIk5vIFJlcGxhY2UiIGluc3RlYWQKCSAgb2YgIlRvIFNlYXJjaCIsICJUbyBSZXBsYWNlIiB0byBzaW1wbHkgIlJlcGxhY2UiLCBhbmQgY2hhbmdlZCB0bwoJICBQaWNvJ3Mga2V5c3Ryb2tlIGJ5IGRlZmF1bHQsIF5SLiBBZmZlY3RzIHNlYXJjaF9pbml0KCksCgkgIGRvX3NlYXJjaCgpIGluIHNlYXJjaC5jLCBnbG9iYWxzIGluIG5hbm8uaCBhbmQKCSAgc2hvcnRjdXRfaW5pdCgpIGluIGdsb2JhbC5jLgoJLSBjaGFuZ2VkICdzcHJpbnRmJyBjYWxscyB0byBzYWZlciAnc25wcmludGYnIChSb2IpCi0gY3V0LmMKCS0gZnVydGhlciB0b3RzaXplIHVwZGF0ZSBjb3JyZWN0aW9ucwotIGZpbGVzLmM6CgktIGNoYW5nZWQgZG9faW5zZXJ0ZmlsZSB0byBjYWxsIGZpeF9lZGl0Ym90IChSb2IpCgktIE1hZ2ljIExpbmUgY29kZSBpbiByZWFkX2ZpbGUgKFJvYikKLSBuYW5vLmM6CgktIFJlbW92ZWQgZHVhbCBhbHRfc3BlbGxlciB2YXJpYWJsZXMsIG9vcHMhIChSb2NjbyBDb3JzaSkKCS0gUmVtb3ZlZCB1bm5lY2Vzc2FyeSBkb19vbGRzcGVsbCBmdW5jdGlvbiAoUm9jY28gQ29yc2kpLiAgQWRkZWQKCSAgU01BTExfTkFOTyAjaWZkZWYgYXJvdW5kIGFjdHVhbCBzcGVsbCBmdW5jdGlvbi4KCS0gTW92ZWQgcGFnZV91cCgpIHRvIG1vdmUuYyB3aGVyZSBpcyBiZWxvbmdzLgoJLSBDb3JyZWN0ZWQgRklYTUUgaW4gZG9fZW50ZXIgd2l0aCBleHBsYW5hdGlvbi4gKFJvYikKCS0gRml4ZWQgRklYTUUgaW4gZG9fanVzdGlmeSwgcmVzdWx0ZWQgaW4gY3JlYXRpb24gb2YKCSAgZml4X2VkaXRib3QgW2Fsc28gZml4ZWQgaW4gZG9fZW50ZXJdICh3aW5pby5jKSAoUm9iKQogIGhlbHBfaW5pdCgpOgoJLSBNb3ZlZCBuZXdsaW5lIG91dCBvZiBpZiBzdGF0ZW1lbnQgKFJvY2NvIENvcnNpKQogIGRvX2NoYXIoKToKCS0gTWFnaWMgTGluZSByZWxhdGVkIGNvZGUgaW4gZG9fY2hhciAoUm9iKQogIGRvX2JhY2tzcGFjZSgpLCBkb19kZWxldGUoKToKCS0gQWRkZWQgbWFnaWMgbGluZSBjb2RlIGhlcmUgdG9vLgoKLSBkZS5wbzoKCS0gUmV2aXNlZCB0cmFuc2xhdGlvbnMgYnkgZmxva2lAYmlnZm9vdC5jb20uCi0gZmkucG86CgktIEZpbm5pc2ggdHJhbnNsYXRpb24gYnkgcGF1bGkudmlydGFuZW5Ac2F1bmFsYWh0aS5maS4KLSB1dGlscy5jOgoJLSBBZGRlZCBuZXdfbWFnaWNsaW5lKCkKLSB3aW5pby5jOgoJLSBBZGRlZCBzdGRsaWIuaCB0byBpbmNsdWRlcywgZm91bmQgYnkgT3BlbkJTRCBnY2MuCgktIGxvdHMgb2YgbmV3IGNvbW1lbnRpbmcgYXJvdW5kIGRpc3BsYXkgZnVuY3Rpb25zCiAgZG9feWVzbm8oKSwgbmFub2dldHN0cigpOgoJLSBSZW1vdmVkIG5vdyB1bm5lY2Vzc2FyeSByYXcvY2JyZWFrIGNvbWJvcy4KCS0gUmVtb3ZlZCBnZXR0ZXh0IGNhbGxzIGZyb20gIlkoZXMpIiwgIk4obykiLCAiQShsbCkiIGFuZCAiXkMiLCB0aWxsCgkgIHdlIGRlY2lkZSBpZiB0aG9zZSBrZXliaW5kaW5ncyBzaG91bGQgYmUgdHJhbnNsYXRlZC4gKEpvcmRpKQogIGNsZWFyX2JvdHRvbXdpbigpOgoJLSBSZW1vdmVkIHdyZWZyZXNoKGVkaXQpIGNhbGwuCiAgZWRpdF91cGRhdGVfdG9wKCk6CgktIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIG5hbm8gdG8gbm90IHVwZGF0ZSB3aGVuCgkgIGN1cnJlbnQtPm5leHQgPT0gTlVMTCAoZS5nLiBwYWdpbmcgZG93biB0byB0aGUgdmVyeSBib3R0b20gb2YgCgkgIEFCT1VUIE5MUyB3b3VsZG4ndCB3b3JrKS4KICBmaXhfZWRpdGJvdDoKCS0gQWRkZWQgKHNob3VsZCByZWJ1aWxkIGVkaXRib3QgZnJvbSBhIHZhbGlkIGVkaXR0b3ApIChSb2IpCiAgZWRpdF9hZGQ6CgktIHJlbW92YWwgb2YgcmVkdW5kYW50IGNhbGwgdG8gbXZ3YWRkbnN0cgoKbmFuby0wLjkuMTEgLSAwNi8yMC8yMDAwCi0gTmV3IGZsYWcgIi1UIiBvciAiLS10YWJzaXplIiB0byBzcGVjaWZ5IGhvdyB0byBkaXNwbGF5IHRhYiB3aWR0aHMuCiAgQWZmZWN0cyBtYWluKCkgaW4gbmFuby5jLCBzdHJsZW5wdCgpLCB4cHQoKSBhbmQgYWN0dWFsX3goKSAoZXQgYWwpIGluIAogIHdpbmlvLmMsIGFuZCBuYW5vLmguICBNYW55IGhhcmRjb2RlZCAiOCJzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIHRoZSAKICBUQUJTSVpFIGludC4gIEFkZGVkIGNoYW5nZXMgdG8gbmFuby4xIGFuZCBuYW5vLjEuaHRtbC4KLSBpZC5wbzoKCS0gSW5kb25lc2lhbiB0cmFuc2xhdGlvbiBieSBUZWRpIEhlcml5YW50by4KLSBlcy5wbzoKCS0gVXBkYXRlZCB0cmFuc2xhdGlvbiAoSm9yZGkgTWFsbGFjaCkuCi0gd2luaW8uYwoJLSBSZXdyaXRlIG9mIGRpc3BsYXkgZnVuY3Rpb25zIHRvIGNvcnJlY3QgdGhlIGRpc3BsYXkgcHJvYmxlbXMgCgkgIHdlIGhhZCBiZWVuIHNlZWluZy4gQWZmZWN0czogYWRkX21hcmtlZF9zYW1lbGluZSwgZWRpdF9hZGQsCgkgIGFuZCBtYW55IG90aGVycy4gKFJvYiBTaWVtYm9yc2tpKQoJLSB0b3RzaXplIGZpeGVzIChSb2IgU2llbWJvcnNraSkKICB0b3RhbF9yZWZyZXNoKCk6CgktIEN1dCBkaXNwbGF5X21haW5fbGlzdCBjYWxsLCBhcyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9zZWQgdG8KCSAgcmVmcmVzaCB3aGF0J3MgYWxyZWFkeSBvbiB0aGUgc2NyZWVuLCBub3QgZ28gdGhyb3VnaCB0aGUgcHJvY2VzcwoJICBvZiBhZGRpbmcgdGhlIHRleHQgYWdhaW4uCi0gY3V0LmM6CgktIHRvdHNpemUgZml4ZXMgKFJvYiBTaWVtYm9yc2tpKQotIG5hbm8uYzoKCS0gZXhwZXJpbWVudGFsIGRvX3dyYXAgYW5kIGNoZWNrX3dyYXAgKEFkYW0gUm9nb3lza2kpCgktIFJlbW92ZWQgZWRpdHdpbmVvYiwgYXMgaXQgd2FzIHJlZHVuZGFudCBmb3IgKGVkaXR3aW5yb3dzIC0gMSkuCgkgIENoYW5nZWQgYWxsIGNhbGxzIHRvIGVkaXR3aW5yb3dzIC0gMSBpbiBuYW5vLmMgYW5kIG1vdmUuYy4KCS0gUmVtb3ZlZCBhbGwgZnVuY3Rpb25zIHRoYXQgd2VyZSBzcGxpdCBpbnRvIG90aGVyIGZpbGVzLgoJICBBZmZlY3RzIExPVFMgb2YgZnVuY3MuCiAgZG9fZW50ZXIoKToKCS0gQWRkZWQgcmVzZXQgb2YgcGxhY2V3ZXdhbnQgdG8gZW5kLgogIGRvX2luc2VydGZpbGUoKToKCS0gRml4IGRpc3BsYXkgcHJvYmxlbSB3aGVuIHVzaW5nIGN0cmwtciB0byBsb2FkIGEgZmlsZQoJICBpbnRvIHRoZSBidWZmZXIgKFJvYiBTaWVtYm9yc2tpKQogIGhhbmRsZV9zaWd3aW5jaCgpOgoJLSBBZGRlZCB0aXRsZWJhcigpLCBlZGl0X3JlZnJlc2goKSBhbmQgZGlzcGxheV9tYWluX2xpc3QoKSBjYWxscwoJICBiZWNhdXNlIGEgcmVzaXplIHdhc24ndCBwaWNraW5nIHVwIG9uIHBvc3NpYmxlIGRpZmZlcmVudCB3aWR0aAoJICBjb3JyZWN0bHkuCi0gdXRpbHMuYzoKCS0gTW92ZWQgbm1hbGxvYygpIGFuZCBucmVhbGxvYygpIGhlcmUuCi0gbW92ZS5jOgoJLSBOZXcgZmlsZSwgY29udGFpbnMgbW92ZW1lbnQgZnVuY3Rpb25zIChsaWtlIGRvX2hvbWUoKSwgZG9fdXAoKSwKCSAgZG9fZG93bigpLCBwYWdlX3VwKCksIGV0Yy4uLikuCi0gZmlsZXMuYzoKCS0gQ29udGFpbnMgZnVuY3Rpb25zIGZvciBmaWxlcyAocmVhZF9maWxlLCBpbnNlcnRfZmlsZSwKCSAgZG9fd3JpdGVvdXQoKSwgZXRjKS4KLSBzZWFyY2guYzoKCS0gQ29udGFpbnMgYWxsIG91ciBzZWFyY2hpbmcgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCAoZG9fc2VhcmNoKCksCgkgIGZpbmRuZXh0c3RyKCksIGRvX3JlcGxhY2UoKSwgZG9fZ290b2xpbmUoKSkuCgpuYW5vLTAuOS4xMCAtIDA2LzA0LzIwMDAKLSBlcy5wbzoKCS0gVHJhbnNsYXRpb24gdXBkYXRlcyAoSm9yZGkpLgotIEFVVEhPUlMsIG5hbm8uMS5odG1sLCBUT0RPLCBSRUFETUU6CgktIERvY3VtZW50YXRpb24gYW5kIGVtYWlsIGFkZHJlc3MgdXBkYXRlcyAoSm9yZGkpLgotIG5hbm8uYzoKICBtYWluKCk6CgktIE1vdmVkIEFkYW0ncyB0ZXJtaW8gY29kZSBkb3duIHRvIGFmdGVyIGdldG9wdCgpIGFuZCBiZWZvcmUgaW5pdHNjcigpCgkgIHRvIHN0b3AgcGVvcGxlIGxvc2luZyB0aGVpciBTSUdJTlQgY2hhcmFjdGVyIHdoZW4gdXNpbmcgYXJncyB0aGF0CgkgIGV4aXQgbmFubyBiZWZvcmUgaXQgcnVucyAoLS12ZXJzaW9uLCAtLWhlbHAsIGV0YykuCgpuYW5vLTAuOS45IC0gMDUvMzEvMjAwMAotIE1ha2VmaWxlLmFtOgoJLSBBZGRlZCBwcm9wZXIgbGluZXMgZm9yIGRlZmluaW5nIExPQ0FMRURJUi4KLSBjb25maWd1cmUuaW46CgktIFNwZWxsaW5nIGZpeGVzIChKb3JkaSBNYWxsYWNoKQoJLSBSZW1vdmVkIENGTEFHUyBjaGFuZ2VzIGZvciBnY2MsIHJlZHVjZXMgcG9ydGFiaWxpdHkgYWNjb3JkaW5nIHRvCgkgIHNvbWUsIGFuZCBpdCBjZXJ0YWlubHkgZG9lc24ndCBzZWVtIHRvIGRlY3JlYXNlIGV4ZSBzaXplLgotIGVzLnBvOgoJLSBTcGFuaXNoIHRyYW5zbGF0aW9uIHVwZGF0ZXMgKEpvcmRpIE1hbGxhY2gpCi0gUE9URklMRVMuaW46CgktIEFkZGVkIGdsb2JhbC5jIGZpbGUsIHdhcyBzY3Jld2luZyB1cCB0cmFuc2xhdGlvbnMgKGkuZS4gdGhleQoJICB3ZXJlbid0IGdldHRpbmcgZG9uZSkuCi0gY3V0LmM6CiAgYWRkX3RvX2N1dGJ1ZmZlcigpOgoJLSBBZGRlZCB0b3RzaXplIGluY3JlbWVudC4KCS0gQ3V0IGZpeGVzIGFuZCBvcHRpbWl6YXRpb25zIChSb2IgU2llbWJvcnNraSkuCiAgZG9fdW5jdXRfdGV4dCgpOgoJLSBBZGRlZCB0b3RzaXplIGluY3JlbWVudCBpbiBzZXZlcmFsIHBsYWNlcy4KLSBuYW5vLmM6CiAgaGVhZGVyczoKCS0gUmVtb3ZlZCBMT0NBTEVESVIgZGVmaW5lLgogIGRvX2p1c3RpZnkoKToKCS0gQWRkZWQgZWRpdF9yZWZyZXNoKCkgY2FsbCAoYnVnIGRpc2NvdmVyZWQgYnkgQWRhbSkuCiAgcGFnZV9kb3duX2NlbnRlcigpOgoJLSBBZGRlZCBjYWxsIHRvIGVkaXRfdXBkYXRlKGN1cnJlbnQpIGZvciBsYXN0IGNhc2UuICBSZW1vdmVkIAoJICBpbmNyZW1lbnQgb2YgY3VycmVudF95IHNpbmNlIGl0J3Mgbm93IGp1c3Qgd2FzdGVmdWwuCiAgZG9fZW50ZXIoKToKCS0gQWRkZWQgdG90c2l6ZSBpbmNyZW1lbnQuCiAgcmVudW1iZXIoKSwgcmVudW1iZXJfYWxsKCk6CgktIFJlbW92ZWQgdG90c2l6ZS0tIGFuZCB0b3RzaXplIGluaXQgaW4gcmVudW1iZXJfYWxsLgogIGRvX21vdXNlKCk6CgktIEFkZGVkIGVkaXRfcmVmcmVzaCgpIGNhbGwgdG8gc2hvdyBoaWdobGlnaHQgdXBkYXRlcy4gIFJlbW92ZWQKCSAgdW5uZWNlc3Nhcnkgd3JlZnJlc2goZWRpdCkuCiAgbWFpbigpOgoJLSBNb3ZlZCB1cCBsb2NhbGUgY2FsbHMgc28gdGhhdCB0cmFuc2xhdGVkIC0taGVscCBtZXNzYWdlcyB3b3VsZAoJICBhY3R1YWxseSBnZXQgdHJhbnNsYXRlZC4KICBkb19iYWNrc3BhY2UoKSwgZG9fZGVsZXRlKCk6CgktIEFkZGVkIGRlY3JlbWVudCBvZiB0b3RzaXplLgogIGluaXRfaGVscF9tc2coKToKCS0gTmV3IGZ1bmN0aW9uLCBpbml0aWFsaXplcyBoZWxwIHRleHQgaWYgTkFOT19TTUFMTCBpc24ndCBzZXQgKGZpeGVzCgkgIGJyb2tlbiBpMThuKS4KICByZWFkX2ZpbGUoKToKCS0gbWFsbG9jIGNhbGwgY2hhbmdlZCB0byBubWFsbG9jIChSb2IgU2llbWJvcnNraSkuCi0gd2luaW8uYzoKICB0b3RhbF9yZWZyZXNoKCk6CgktIENvbXBsZXRlbHkgcmV3cm90ZSBmdW5jdGlvbiwgbm90IHF1aXRlIHNvIGJyYWluLWRhbWFnZWQgbm93LgoKbmFuby0wLjkuOCAtIDA1LzE4LzIwMDAKLSBuYW5vLmM6CiAgbWFpbigpOgoJLSBBZGRlZCBhd2Vzb21lIGNvZGUgdGhhdCBkaXNhYmxlcyB0aGUgQ0lOVFIgYW5kIENRVUlUIAoJICBjaGFyYWN0ZXIgKEFkYW0gUm9nb3lza2kpLiAgUmVtb3ZlZCByYXcoKS9ub3JhdygpIGNhbGxzIHNvIHRoYXQKCSAgbmFubyBnZXRzIGlucHV0IGluICdub3JtYWwnIG1vZGUsIHdoaWNoIGlzIHRoZSBSaWdodCBXYXkodG0pIHRvCgkgIGRvIGl0LiBeUywgXlogYW5kIF5RIG5vdyB3b3JrIHByb3Blcmx5IGFzIGEgcmVzdWx0LCBhcyB3ZWxsIGFzCgkgIF5DLiAgTmV3IHZhcmlhYmxlIHRlcm0sIGdsb2JhbCB2YXJpYWJsZSBvbGR0ZXJtIHRvIHNhdmUgcHJldmlvdXMKCSAgdGVybSBzZXR0aW5ncywgYW5kIGNoYW5nZXMgdG8gZmluaXNoKCkgYW5kIGRpZSgpLgoJLSBBZGRlZCBleHRyYSAjaWZkZWZzIGluIGdldG9wdCBjb2RlLCBzbyB0aGF0IGFib3ZlIGNvZGUgYW5kCgkgIGZsYWcgaW5pdCBpcyBydW4gZXZlbiBpZiBHRVRPUFRfTE9ORyBpcyBub3QgI2RlZmluZWQuCgktIEFkZGVkIG1lbXNldCBsaW5lIGJlZm9yZSBzaWdhY3Rpb25zLiAoQWRhbSBSb2dveXNraSkKICBkb19zdXNwZW5kKCk6CgkgIFJlbW92ZWQgZnVuY3Rpb24sIHNlZSBhYm92ZSBmb3Igd2h5LgotIHdpbmlvLmM6CiAgdXBkYXRlX2xpbmUoKSwgY2VudGVyX2N1cnNvcigpOgoJLSBSZW1vdmVkIHdyZWZyZXNoKGVkaXQpIGZyb20gYm90dG9tIG9mIGZ1bmN0aW9ucy4gIHdyZWZyZXNoCgkgIHNob3VsZCBub3cgb25seSBiZSBjYWxsZWQgb25jZSwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbWFpbigpCgkgIGxvb3AuCi0gZ2xvYmFsLmM6CiAgIHNob3J0Y3V0X2luaXQoKToKCS0gUmVtb3ZlZCBzdXNwZW5kIHNjX2luaXQgY2FsbCBhbmQgc3VzcGVuZCBtZXNzYWdlIGJlY2F1c2Ugc3VzcGVuZAoJICBpcyBubyBsb25nZXIgbmVlZGVkIGluIHRoZSBzaG9ydGN1dCBsaXN0IHRvIHdvcmsgcHJvcGVybHkuCiAgICAKbmFuby0wLjkuNyAtIDA1LzE0LzIwMDAKLSBuYW5vLmM6CiAgZG9faG9tZSgpLCBkb19lbmQoKTogCgktIEFkZGVkIGNhbGxzIHRvIHVwZGF0ZV9saW5lIGZvciB0aGUgY3VycmVudCBsaW5lLCBmaXhlcwoJICBsYWNrIG9mIHVwZGF0ZSAoYnVnIGRpc2NvdmVyZWQgYnkgQWxiZXJ0byBHYXJj7WEpLgogIG1haW4oKToKCS0gQWRkZWQgU0VUKEZPTExPV19TWU1MSU5LUykgYmVmb3JlIGdldG9wdCBjYWxsLCBmaXhlcyBub3QgCgkgIGZvbGxvd2luZyBzeW1saW5rcyBldmVuIHdoZW4gLWwgaXNuJ3Qgc2V0LCBhbmQgIm5vIGNoYW5nZXMiCgkgIGVycm9yIHdoZW4gbmFubyBpcyBjYWxsZWQgZnJvbSBjcm9udGFiIC1lIChBZGFtIFJvZ295c2tpKS4KLSBjdXQuYzoKICBkb19jdXRfdGV4dCgpOgoJLSBBZGRlZCBlZGl0X3VwZGF0ZV90b3AgdG8gY3V0IHdoZW4gbWFyayBpcyBzZXQsIGZpeGVzIGxhY2sgb2YKCSAgZGlzcGxheSB1cGRhdGUgKGJ1ZyBkaXNjb3ZlcmVkIGJ5IEtlbiBUeWxlcikuCgpuYW5vLTAuOS42IC0gMDUvMDgvMjAwMAotIE5ldyBJdGFsaWFuIHRyYW5zbGF0aW9uIChpdC5wbyksIGJ5IERhbmllbGUgTWVkcmkuCi0gbmFuby5jOgogIHBhZ2VfdXAoKSwgcGFnZV9kb3duKCk6CgktIEFkZGVkIHJlc2V0IG9mIHBsYWNld2V3YW50IHRvIDAsIGFzIGl0IHNob3VsZCBiZS4KICBkb191cCgpLCBkb19kb3duKCk6CgktIEFkZGVkIGNhbGwgdG8gdXBkYXRlX2xpbmUoKSBmb3IgbGluZSB3ZSBtb3ZlIGZyb20gYW5kIGxpbmUgd2UKCSAgbW92ZSB0bywgaW4gb3JkZXIgdG8ga2VlcCB0aGUgaGlnaGxpZ2h0aW5nIGNvcnJlY3QuCiAgZG9fd3JhcCgpOgoJLSBBZGRlZCB2YXIgY2hvcCwgbmV3IGNvZGUgdG8gd3JhcCBsaW5lcyBtb3JlIGxpa2UgUGljbywgbW9zdGx5LgoJICBUSElTIFNUSUxMIERFRklOSVRFTFkgTkVFRFMgVE8gQkUgUkVXUklUVEVOIQotIHdpbmlvLmM6CiAgZG9faGVscCgpOgoJLSBBZGRlZCBlZGl0X3JlZnJlc2goKSBiZWZvcmUgZXhpdC4KICB1cGRhdGVfY3Vyc29yKCk6CgktIFJlbW92ZWQgY3Vyc29yIHVwZGF0aW5nIHdoaWNoIHJlYWxseSB3YXNuJ3QgbmVlZGVkIGFueXdheS4KICBlZGl0X3VwZGF0ZSgpOgoJLSBSZW1vdmVkIHl1Y2t5IGNvZGUgdGhhdCBkaWRuJ3Qgd29yaywgdGhpcyBmdW5jdGlvbiBub3cganVzdAoJICBjb21wdXRlcyBlZGl0dG9wIGFuZCBlZGl0Ym90IGFuZCBjYWxscyBlZGl0X3JlZnJlc2goKSB0byBkbyB0aGUKCSAgcmVzdCwgd2hpY2ggcmVtb3ZlcyBhIGxvdCBvZiBkdXBsaWNhdGUgY29kZS4uICAKICAKbmFuby0wLjkuNSAtIDA1LzAxLzIwMDAKLSBSZW1vdmVkIGJ5dGVzIGZyb20gZmlsZSBzdHJ1Y3QgYmVjYXVzZSBpdCB3YXMgY29tcHV0YXRpb25hbGx5IHdhc3RlZnVsLgotIGN1dC5jOgogIGRvX3VuY3V0X3RleHQoKToKCS0gQWRkZWQgY2FsbCB0byBlZGl0X3JlZnJlc2goKS4KLSBuYW5vLmM6CiAgZG9fYmFja3NwYWNlKCk6CgktIEFkZGVkIHJlc2V0IG9mIGVkaXRib3Qgd2hlbiBkZWxldGluZyB0aGUgbGFzdCBsaW5lIG9mIHRoZSBmaWxlCgkgIChidWcgZGlzY292ZXJlZCBieSBBZGFtKS4KICBkb19jaGFyKCk6CgktIFJlbW92ZWQgY2FsbCB0byByZXNldF9jdXJzb3IoKS4KICBkb19kZWxldGUoKToKCS0gQWRkZWQgc2ltaWxhciBjaGVjayBhcyB0byBkb19iYWNrc3BhY2UoKS4KICBkb19lbnRlcigpOgoJLSBBZGRlZCBjYWxsIHRvIGVkaXRfcmVmcmVzaCgpLgogIGRvX2xlZnQoKSwgcmlnaHQoKToKCS0gQWRkZWQgY2FsbCB0byB1cGRhdGVfbGluZSgpLCBzdGlsbCByZWR1bmRhbnQgYnV0IGJldHRlci4uLgogIGRvX3VwKCksIGRvX2Rvd24oKToKCS0gQWRkZWQgcmVmcmVzaCBjYWxscyBib3RoIGZvciBjdXJyZW50IGxpbmUgYW5kIGxpbmUgdG8gd2hpY2gKCSAgd2UgYXJlIG1vdmluZy4KICBtYWluKCk6CgktIFJlbW92ZWQgaW5lZmZpY2llbnQgY2FsbCB0byBlZGl0X3JlZnJlc2goKSBhZnRlciBldmVyeSBrZXlzdHJva2UuCgkgIEl0IGlzIG5vdyB1cCBlYWNoIGZ1bmN0aW9uIHRvIGxlYXZlIHRoZSBzY3JlZW4gaW4gYSBnb29kIHN0YXRlLgotIHdpbmlvLmM6CiAgZG9fY3Vyc29ycG9zKCkKCS0gUmV3cml0dGVuIHRvIG5vdCB1c2UgYnl0ZXMgZnJvbSBmaWxlc3RydWN0IGJ5IGFuIGluY3JlbWVudGFsIHN1bS4KICB1cGRhdGVfbGluZSgpLCByZXNldF9jdXJzb3IoKToKCS0gT3B0aW1pemVkIGNhbGxzIHRvIHhwbHVzdGFicygpIHRocm91Z2ggYSBzaW5nbGUgdmFyaWFibGUuCgktIHVwZGF0ZV9saW5lKCkgbm93IHRha2VzIGEgbmV3IGFyZywgYW4gaW5kZXggaW50byB0aGUgc3RyaW5nCgkgIGZvciB3aGVyZSB0byB1cGRhdGUgdGhlIGxpbmUgZnJvbS4gIE5lZWRlZCBmb3IgbmV3IHVwZGF0ZQoJICBjb2RlLgotIGNvbmZpZ3VyZS5pbjoKCS0gQmV0dGVyIGNoZWNrcyBmb3Igc2xhbmcsIGFsbG93cyBhcmd1bWVudCB0byAtLXdpdGgtc2xhbmcuCgkgIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQoJLSBSZW1vdmVkIC1JaW50bCBmcm9tIENGTEFHUyBpbiBnY2MgY2hlY2suCi0gTWFrZWZpbGUuYW06CgktIEFkZGl0aW9uIG9mIC1JaW50bCBmb3IgZ2V0dGV4dCAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKCm5hbm8tMC45LjQgLSAwNC8yNS8yMDAwCiAtIEZpeGVkIGNhbGxzIHRvIG5vX2hlbHAgYW5kIGNoYW5nZWQgdGhlbSB0byB0aGUgbW9yZSBjb25zaXN0ZW50CiAgIElTU0VUKE5PX0hFTFApLiAgRml4ZWQgcmV0dXJuIHZhbCBvZiBub19oZWxwIHRvIGJlIHdoYXQgaXQgc2hvdWxkICgyLAogICBub3QgMS4gIENvZGUgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSBOT19IRUxQIHdoZW4gaW4gdGhlCiAgIGhlbHAgc3lzdGVtLiAoQWRhbSBSb2dveXNraSkKLSBjdXQuYzoKICBkb19tYXJrZWRfY3V0KCksIGRvX2N1dCgpLCBkb191bmN1dCgpOgoJLSBDb21tZW50ZWQgb3V0IHVubmVjZXNzYXJ5IGJpdHMgd2hlbiBOQU5PX1NNQUxMIGlzIGJlaW5nIHVzZWQuCi0gd2luaW8uYzoKICB4cHQoKSwgc3RybGVucHQoKSwgYWN0dWFsX3goKToKCS0gQWRkZWQgY2hlY2sgZm9yIHZhbHVlIG9mIGRhdGFbaV0gJiAweDgwLCBpZiBzbyBkbyBub3QgbWFrZQoJICBjaGFyYWN0ZXIgMiBjaGFycyB3aWRlIChvcmlnLiBieSBDaHJpcywgMHg4MCBjaGVjayBieSBBZGFtKS4KICBlZGl0X3JlZnJlc2goKToKCS0gTmV3IGNoZWNrIGZvciB0ZW1wID09IE5VTEwgKGJhZCB0aGluZyksIGlmIHNvIGdvIGJhY2sgdG8gdGhlCgkgIHByZXZpb3VzIGxpbmUuICBOZXcgZmlsZXN0cnVjdCB2YXIgaG9sZCBwb2ludHMgdG8gcHJldiBsaW5lLgoJICBGaXhlcyBzZWdmYXVsdCB3aGVuIHBhZ2luZyBkb3duIHRvIHRoZSBlbmQgb2YgYSBmaWxlLgotIG5hbm8uYzoKICB3cml0ZV9maWxlKCk6CgktIEFkZGVkIGNoZWNrIGZvciBpZiBmaWxlIGV4aXN0cyBhbmQgaXMgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50CgkgIGZpbGVuYW1lLCBwcm9tcHQgZm9yIG92ZXJ3cml0ZSAoQWRhbSBSb2dveXNraSkuCiAgZG9fZG93bigpOgoJLSBSZW1vdmVkIGNoZWNrIGZvciBjdXJyZW50LT5uZXh0ID09IE5VTEwsIG5vdyBjaGVja3MgcmV0dXJuIHZhbHVlCgkgIG9mIGRvX2Rvd24gYmVmb3JlIHNldHRpbmcgY3VycmVudF94ID0gMCAoZGlzY292ZXJlZCBieSBBZGFtKS4KICBkb19qdXN0aWZ5KCk6CgktIEZpeGVkIHNlZ2ZhdWx0IHdoZW4gcmVhY2hpbmcgdGhlIGxhc3QgbGluZSAodHJpZWQgdG8gYXNzaWduCgkgIGN1cnJlbnQtPm5leHQtPmRhdGEgd2hlbiBjdXJyZW50LT5uZXh0ID09IE5VTEwpIChkaXNjb3ZlcmVkCgkgIGJ5IEFkYW0pLgotIHV0aWxzLmM6CgktIFJlbW92ZWQgZXh0cmEgbWFjcm8gZGVmcyB0aGF0IGFyZSBub3cgaW4gbmFuby5oLgotIG5hbm8uaDoKCS0gQ2hhbmdlZCBtYWNybyBTRVQoKSB0byB1c2UgfD0gaW5zdGVhZCBvZiBePS4gIEZpeGVzIGJ1ZyBpbgoJICBjdXQgY29kZSB3aGVuIGN1dHRpbmcgbW9yZSB0aGFuIG9uZSBsaW5lLCBhbmQgY3V0YnVmZmVyIGdldHMKCSAgYmxvd24gYXdheSB3aGVuIGl0IHNob3VsZG4ndC4gIAoKbmFuby0wLjkuMyAtIDA0LzI5LzIwMDAKLSBjdXQuYzoKICBkb19tYXJrZWRfY3V0KCk6CgktIEZpeGVkIG9mZiBieSBvbmUgZXJyb3IgaW4gY3V0IGNvZGUgZm9yIG1hcmtlZCB0ZXh0LgogIGRvX2N1dF90ZXh0KCk6CgktIFJlbW92ZWQgY2hlY2sgZm9yIGJlaW5nIG9uIHRoZSBsYXN0IGxpbmUsIHBhcnQgb2YKCSAgbWFnaWMgbGluZSBjb2RlLgogIGFkZF90b19jdXRidWZmZXIoKToKCS0gTW92ZWQgdG1wLT5wcmV2ID0gaW5wdHIgbGluZSB0byBwYXJ0IHdoZXJlIGN1dGJ1ZmZlciAhPSBOVUxMLgoJLSBBZGRlZCBpbnB0ci0+cHJldiA9IE5VTEwgZm9yIGNhc2Ugd2hlcmUgY3V0YnVmZmVyID09IE5VTEwuCi0gbmFuby5jOgogIGRvX2JhY2tzcGFjZSgpLCBkb19jaGFyKCk6ICAKCS0gUmVtb3ZlZCAibWFnaWMgbGluZSIgY29kZS4gIEl0IHdhcyBiYXNpY2FsbHkgY2F1c2luZyBtb3JlIGJ1Z3MKCSAgdGhhbiBpdCB3YXMgaGVscGluZyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eS4gIFRoaXMgZml4ZXMKCSAgYXQgbGVhc3Qgb25lIGtub3duIHNlZ2ZhdWx0IGNvbmRpdGlvbi4KICBkb19lbnRlcigpOgoJLSBBZGRlZCBzZXR0aW5nIGVkaXRib3QgdG8gbmV3IG5vZGUgaWYgdGhlIG5ldyBub2RlIGlzIHRoZSBsYXN0CgkgIG5vZGUgaW4gdGhlIGZpbGUuCiAgd3JpdGVfZmlsZSgpOgoJLSBDaGFuZ2VkIHdyaXRpbmcgZmlsZSBiZWhhdmlvci4gIE5vdywgaWYgbGFzdCBsaW5lIG9mIHRoZSBmaWxlCgkgIGhhcyBhbnkgZGF0YSBvbiBpdCwgd2Ugd3JpdGUgYSBuZXdsaW5lIG9uIGl0LCBlbHNlIHdlIGRvbid0LgotIHdpbmlvLmM6CiAgYWRkX21hcmtlZF9zYW1lbGluZSgpOgoJLSBOZXcgY29kZSB0aGF0IGNoZWNrcyBmb3Igd2hldGhlciB0aGUgYmVnaW4gYW5kIGVuZCBvZiB0aGUgbWFya2VyCgkgIGFyZSBvbiBkaWZmZXJlbnQgbGluZXMuICBNaXNzaW5nIHByZXZpb3VzbHkuCiAgZWRpdF9hZGQoKToKCS0gYWRkZWQgc29tZSBtb3JlIGNoZWNrcyBmb3IgdGV4dCBsZW5ndGguICBDbGVhbmVkIHVwIHNvbWUKCSAgbXZ3YWRkbnN0cnMgdGhhdCBjb3VsZCBiZSB3cml0dGVuIG1vcmUgc2ltcGx5IGFzIHdhZGRuc3Rycy4KICBlZGl0X3JlZnJlc2goKToKCS0gUmVtb3ZlZCBjaGVjayBmb3IgdGVtcCA9PSBmaWxlYm90LCBpdCBpcyBub3cgdHJlYXRlZCBsaWtlIGFueSBvdGhlcgoJICBsaW5lLiAgRml4ZXMgYSBidWcgd2hlcmUgc2VsZWN0ZWQgdGV4dCBvbiB0aGUgbGFzdCBsaW5lIHNob3dzCgkgIG5vcm1hbGx5LgogIHhwdCgpOgoJLSBSZW1vdmVkIGFuIGV4dHJhIGNvbXB1dGF0aW9uIGZvciB0YWJzIHZhcmlhYmxlIHRoYXQgd2FzIGluY29ycmVjdC4KICB4cGx1c3RhYnMoKToKCS0gU2luY2UgeHB0IG5vdyBhY3R1YWxseSB3b3JrcywgdGhpcyBmdW5jIGlzIG5vdyBqdXN0IGEgd3JhcHBlciBmb3IKCSAgeHB0KGN1cnJlbnQsIGN1cnJlbnRfeCkKLSBuYW5vLjEsIG5hbm8uMS5odG1sOgoJLSBBZGRlZCAtbCBvcHRpb24gdG8gbWFuIHBhZ2VzLgotIGNvbmZpZ3VyZS5pbjoKCS0gTmV3IG9wdGlvbiAtLWVuYWJsZS10aW55LCAjZGVmaW5lcyBOQU5PX1NNQUxMIGluIGNvbmZpZy5oLiAgCgkgIERpc2FibGVzIGNhbGwgdG8gZ2V0dGV4dCBpbiBmdW5jdGlvbnMgYW5kIG90aGVyIGkxOG4gc3R1ZmYgaW4gCgkgIG5hbm8uYywgdGhlIGRldGFpbGVkIGhlbHAgbW9kZSwgdGhlIHJlc2l6ZSBmdW5jdGlvbnMsIGFuZCB0aGUgCgkgIGp1c3RpZnkgY29kZSB3aGljaCBubyBvbmUgZXZlciB1c2VzLgoJLSBOZXcgb3B0aW9uIC0td2l0aC1zbGFuZy4gIEVuYWJsZXMgc2xhbmcgbGlicmFyaWVzIGluc3RlYWQgb2YKCSAgbmN1cnNlcywgcmVxdWlyZXMgc2xjdXJzZXMuaCBmb3Igd3JhcHBlciBmdW5jdGlvbnMuIChCYXNlZAoJICBvbiBwYXRjaGVzIGZvciAwLjguNyBieSBHbGVubiBNY0dyYXRoKS4KCm5hbm8tMC45LjIgLSAwNC8xNS8yMDAwCi0gVGhpcyByZWxlYXNlIGp1c3QgZml4ZXMgdGhlIHNlcmlvdXMgc2VnZmF1bHQgcHJvYmxlbSBpZiBuYW5vIGlzIAogIGludm9rZWQgYW55IHdheSBvdGhlciB0aGFuIHVzaW5nIHRoZSBhYnNvbHV0ZSBwYXRoLiAgVGhlIGJ1ZyB3YXMKICBpbiB0aGUgbmV3IGNvZGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgbmFubyBpcyBpbnZva2VkIGFzIHBpY28uCgpuYW5vLTAuOS4xIC0gMDQvMTQvMjAwMAotIEFkZGVkIHBpY28gY29tcGF0aWJpbGl0eSBmb3IgXlQgd2hlbiBpbiBzZWFyY2ggb3Igc3dpdGNoIHRvIHN3aXRjaAogIHRvIHRoZSBvcHBvc2l0ZSBmdW5jdGlvbi4gIEFkZGVkIG9uZSB0byBSRVBMQUNFX0xJU1RfTEVOIGFuZCAKICBXSEVSRUlTX0xJU1RfTEVOIGluIG5hbm8uaCwgbmV3IGFyZ3MgdG8gc2NfaW5pdF9vbmUgaW4gZ2xvYmFsLmMgYW5kCiAgbmV3IHN0cmluZ3MgdGhhdCB3aWxsIGhhdmUgdG8gYmUgZ2V0dGV4dCgpZWQuICBOZXcgYXJndW1lbnQgJ3JlcGxhY2luZycKICB0byBzZWFyY2hfaW5pdCgpLiAgSGFuZGxlcnMgaW4gZG9fcmVwbGFjZSBhbmQgZG9fc2VhcmNoKCkuCi0gTmV3IHdyaXRlIGNvZGUsIG5vdyBmb2xsb3dzIHN5bWJvbGljIGxpbmtzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0KICB3aXRoIHRoZSBuZXcgZmlsZS4gIE5ldyBvcHRpb24gKC1sLCAtLW5vZm9sbG93KSB0byBlbmFibGUgdGhlIG9sZAogIChpbmNvcnJlY3QsIGJ1dCBzZWN1cmUpIGJlaGF2aW9yIChBZGFtIFJvZ295c2tpKS4KLSBuYW5vLmM6CiAgZG9fd3JhcCgpOgkKCS0gRml4ZWQgYW5vdGhlciBidWcgcmVsYXRpbmcgdG8gd3JhcHBpbmcsIGFuZCB3aGljaCB3b3VsZCBjYXVzZQoJICBhIHNlZ2ZhdWx0ICpzaWdoKi4KICBkb19yZXBsYWNlKCk6IAoJLSBJbmNyZW1lbnRlZCBjdXJyZW50X3ggYnkgdGhlIGxlbmd0aCBvZiB0aGUgcmVwbGFjZW1lbnQKCSAgdGV4dCBpbnNpZGUgdGhlIG1haW4gcmVwbGFjZSBsb29wLiAgRml4ZXMgYnVnICMxNS4KICBhZGRfbWFya2VkX3NhbWVsaW5lKCk6CgktIE5ldyBmdW5jdGlvbiwgaGFuZGxlcyBtYXJrZWQgdGV4dCB3aGVuIHN0YXJ0ICYgZW5kIG9mIG1hcmtlciBpcwoJICBvbiBvbmUgbGluZSwgYWxzbyBzdXBwb3J0cyBtb3N0IG1hcmtlZCB0ZXh0IHdoZW4gY3Vyc29yID4gQ09MUy4KICBtYWluKCk6CgktIENvZGUgdG8gY2hlY2sgaWYgbmFubyBpcyBpbnZva2VkIGFzICdwaWNvJywgYW5kIGlmIHNvCgkgIGF1dG9tYXRpY2FsbHkgc2V0IHBpY29fbXNncyAoUm9iZXJ0IEpvbmVzKS4KCm5hbm8tMC45LjAgLSAwNC8wNy8yMDAwCi0gbmFuby4xLCBuYW5vLjEuaHRtbDogCVVwZGF0ZWQgbWFuIHBhZ2Ugd2l0aCBteSBlbWFpbCBhZGRyZXNzIGFuZCBob21lcGFnZS4KLSB3aW5pby5jOgogIHJlc2V0X2N1cnNvcigpLCB1cGRhdGVfbGluZSgpOgkKCS0gQ2hhbmdlZCB1cGRhdGUgYWxnb3JpdGhtIGZvciB4IHZhbHVlIHRvIChDT0xTIC0gNykgbXVsdGlwbGUgd2hlbiB4CgkgIHZhbHVlID4gKENPTFMgLSAyKS4KLSBlZGl0X3JlZnJlc2goKToKCS0gUmVtb3ZlZCBpbm5lciBsb29wIGNvZGUsIG5vdyBjYWxscyB1cGRhdGVfbGluZSgpIGZvciBlYWNoIGxpbmUKCSAgaW4gcXVlc3Rpb24sIE1VQ0ggbmljZXIuCi0geHBsdXN0YWJzKCksIHhwdCgpOgoJLSBSZW1vdmVkIHJlZHVuZGFudCBpbmNyZW1lbnQgb2YgdGFicyB3aGVuIGNvbHVtbiBubyAlIDggPT0gMC4KCS0gQWRkZWQgY2hlY2sgZm9yIGRhdGFbaV0gPCAzMiwgbW9zdCBvZiBzdWNoIGJpdHMgYXJlIDIgY2hhcnMgd2lkZS4KLSB1cGRhdGVfbGluZSgpOgoJLSBGaXhlZCBhIHN0dXBpZCBjYWxsIHRvIHN0cmxlbnB0IHdpdGggY29sIHdoZW4gd2Ugc2hvdWxkIGhhdmUKCSAgYmVlbiB1c2luZyBhY3R1YWxfY29sLiAgVWdoLgoKbmFuby0wLjguOSAtIDAzLzIyLzIwMDAKLSBuYW5vLmM6CiAgZW1wdHlfbGluZSgpLCBub19zcGFjZXMoKSwganVzdGlmeV9mb3JtYXQoKSwgZG9fanVzdGlmeSgpOgoJCUFjdHVhbGx5IGFkZGVkIHRoZXNlIChzY3Jld3VwIGFwcGx5aW5nIHBhdGNoKS4KICBkb19qdXN0aWZ5KCk6CUFkZGVkIGNhbGwgdG8gc2V0X21vZGlmaWVkKCkuCgpuYW5vLTAuOC44IC0gMDMvMTIvMjAwMAotIFByZWxpbWluYXJ5IGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQuICBNYW55IG1hbnkgZnVuY3Rpb25zIG1vZGlmaWVkCiAgdG8gdXNlIGdldHRleHQgKHZpYSBfKCkgbWFjcm8pLiAgZXMucG8gZmlsZSBpbmNsdWRlZC4gKEpvcmRpIE1hbGxhY2gpCiAgTmV3IGRpcnMgcG8vIGFuZCBpbnRsLywgY2hhbmdlcyB0byBjb25maWd1cmUuaW4gYW5kIEF1dG9tYWtlLmFtIHRvCiAgc3VwcG9ydCBpMThuLgotIG5hbm8uYzoKICBpbmNsdWRlczoJQWRkZWQgc3lzL3BhcmFtLmggYW5kIGxpbWl0cy5oLiAoQWRhbSBSb2dveXNraSkuCiAgc3RhdGljczogCUNoYW5nZWQgc29tZSB0aGluZ3MgdGhhdCB3ZXJlIG5vdCBuZWNlc3NhcmlseSBzdGF0aWMgCgkJKEFkYW0gUm9nb3lza2kpLgogIG5yZWFsbG9jKCk6CU5ldyBmdW5jdGlvbiwgc2ltaWxhciB0byBubWFsbG9jKCkuICBDaGFuZ2VkIGNhbGxzIGZyb20KCQlyZWFsbG9jKCkgdG8gbnJlYWxsb2MgKEFkYW0gUm9nb3lza2kpLgogIGVtcHR5X2xpbmUoKSwgbm9fc3BhY2VzKCksIGp1c3RpZnlfZm9ybWF0KCksIGRvX2p1c3RpZnkoKToKCQlOZXcgZnVuY3Rpb25zIGZvciBqdXN0aWZ5IGZ1bmN0aW9uIChBZGFtIFJvZ295c2tpKS4KLSB3aW5pby5jOgogIGJsYW5rX2VkaXQoKToJQWRkZWQgd3JlZnJlc2ggY2FsbCB0byBlZGl0IHNvIHRoYXQgc2NyZWVuIHVwZGF0ZXMgKGxpa2UKCQlvbiBeTCkgYWN0dWFsbHkgd29yay4KICB4cGx1c3RhYnMoKSwgeHB0KCksIHN0cmxlbnB0KCk6IEZpeGVkIG9mZi1ieS1vbmUgYnVnbGV0cyAoQWRhbSBSb2dveXNraSkuCgpuYW5vLTAuOC43IC0gMDMvMDEvMjAwMAotIG1haW4uYzoKICBkb193cmFwKCk6CUJldHRlciBmaXggZm9yIHNlZ2ZhdWx0cywgYW5kIGZpeCBmb3IgbGluZXMgYmVpbmcgd3JhcHBlZCAKCQl0byBhIHNpbmdsZSBjaGFyYWN0ZXIgb24gb25lIGxpbmUgd2hlbiBubyBnb29kIHBsYWNlIHRvIAoJCWJyZWFrIHRoZSBsaW5lIGV4aXN0cywgYW5kIGZvciB3cmFwcGluZyBsaW5lcyBsb25nZXIgdGhhbgoJCUNPTFMuCi0gbmFuby4xLmh0bWw6CgkJSHRtbCB2ZXJzaW9uIG9mIG1hbiBwYWdlLCBub3cgaW5jbHVkZWQgaW4gZGlzdC4gIEZvcgoJCXRoZSBiZW5lZml0IG9mIG5hbm8gcGFja2FnZXMgaW4gTGludXggZGlzdHJpYnV0aW9ucy4KCm5hbm8tMC44LjYgLSAwMi8yNC8yMDAwCi0gZ2xvYmFsLmM6CiAgc2hvcnRjdXRfaW5pdCgpOgoJCUFkZGVkIHNob3J0Y3V0cyBmb3IgZ290b19saW5lIGFuZCBkb19yZXBsYWNlIHdoZW4gdXNpbmcKCQlwaWNvX21zZ3MuICBPb3BzLgotIG5hbm8uYzoKICBzdGF0aWNzOglDaGFuZ2VkIGZpbGwgYmFjayB0byAwIGZyb20gNzEgYnkgZGVmYXVsdCAoQWRhbSBSb2dveXNraSkuCiAgZG9fd3JhcCgpOglBZGRlZCBjaGVjayBmb3IgYmFja2luZyB1cCBwYXN0IHRhYnMsIHdoaWNoIHdlIHNob3VsZG4ndCBkby4KCQlSZW1vdmVkIGNoZWNrIGZvciBiYWNraW5nIHVwIHBhc3Qgc3BhY2VzIGZpcnN0LgogIG1haW4oKToJQWRkZWQgZm9yIGxvb3AgdG8gY2hlY2sgZm9yIGFsdCBrZXlzIGluc3RlYWQgb2YgaGFyZCBsaXN0LgogIGRvX2VudGVyKCk6CUZpeCBmb3IgYnVnICMxNCwgYWRkZWQgY2FsbCB0byByZXNldF9jdXJzb3IgYW5kIG1lc3NlZAoJCXVwIGRvX2NoYXIgcXVpdGUgYSBiaXQuCiAgdmVyc2lvbigpOglBZGRlZCB0aW1lIGFuZCBkYXRlIHN0YW1wIGZvciBjb21waWxlIG9uIHZlcnNpb24gbWVzc2FnZS4KCQlBZGRlZCBtYWlsIGFuZCB3ZWIgcGFnZSBpbmZvLgotIFJFQURNRToJVXBkYXRlZCBtYWlsaW5nIGxpc3QgaW5mby4KCm5hbm8tMC44LjUgLSAwMi8xOC8yMDAwCi0gbmFuby5jOgogIG1haW4oKToJRmluYWxseSBmaXhlZCB0aWxkZSBiZWluZyBpbnB1dCBvbiBwYWdlIHVwL2Rvd24ga2V5cyBpbgoJCWNlcnRhaW4gdGVybWluYWwgdHlwZXMuICBGaXggd2FzIGlucHV0IDI2LT45MS0+NVszNF0gY2hlY2sKCQlmb3IgMTI2LCBpZiBzbyBtYWtlIHRoZSBrYmlucHV0IFBBR0UgVVAvRE9XTiwgZWxzZSB1bmdldAoJCXRoZSBrZXlzdHJva2UgYW5kIGNvbnRpbnVlLiAgQWRkZWQgI2luY2x1ZGUgPGlvY3RsLmg+IGZvcgoJCWlvY3RsIGNhbGwuCiAgaGFuZGxlX2h1cCgpOgoJCUhhbmRsZXIgZm9yIGhhbmd1cCBzaWduYWwuICBCZWxhdGVkIGluY2x1ZGUgb2YgcGF0Y2ggZnJvbQoJCVRpbSBTaGVyd29vZC4KLSB3aW5pby5jOgogIGVkaXRfcmVmcmVzaCgpOgoJCVRlbXBvcmFyeSBmaXggZm9yIHNlbGVjdGluZyB0ZXh0IHdoZW4gdGVtcCA9PSBjdXJyZW50LgoJCWVkaXRfcmVmcmVzaCgpIGlzIG5vdyB1bm1hbmFnZWFibHkgY29tcGxleCwgYW5kIG11c3QgYmUKCQlyZXZhbXBlZC4KICBjaGVja19zdGF0YmxhbmsoKToKCQlBZGRlZCBjaGVjayBmb3IgY29uc3R1cGRhdGUsIG1ha2VzIHRoaW5ncyBsZXNzIGNob3BweQoJCShBZGFtIFJvZ295c2tpKQoKbmFuby0wLjguNCAtIDAyLzExLzIwMDAKLSBNb3ZlZCBnbG9iYWwgdmFyaWFibGVzIHRoYXQgd2VyZSBvbmx5IChvciBtb3N0bHkpIHVzZWQgaW4gb25lIGZpbGUgaW50bwogIGl0cyBwcm9wZXIgZmlsZSBhcyBhIHN0YXRpYy4gIEFmZmVjdHMgY3V0LmMsIG5hbm8uYywgZ2xvYmFsLmMgKEFuZHkgS2FobikuCi0gZ2xvYmFsLmM6CQogIHNob3J0Y3V0X2luaXQoKToKCQlSZW1vdmVkIHJlZHVuZGFudCBOQU5PX0NPTlRST0xfSCBmcm9tIGJhY2tzcGFjZSBzaG9ydGN1dCwKCQlhZGRlZCBjaGFyIDEyNyB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHRoZXJlLgotIG5hbm8uYzoKICBtYWluKCk6CUZpeCBmb3IgbG9vcHMgbG9vcGluZyB1bnRpbCBNQUlOX0xFTiwgYWRkZWQgLTEgdG8gc3RvcAoJCXNlZ2ZhdWx0cyAoQWRhbSBSb2dveXNraSkuCi0gTWFrZWZpbGUuYW06CUFkZGVkIGFsbCBzb3VyY2UgZmlsZW5hbWVzIChBZGFtIFJvZ295c2tpKS4KLSBuYW5vLjE6CUZpeGVkIG1haWwgYWRkcmVzc2VkIGFuZCBhZGRlZCBtYWlsaW5nIGxpc3QgYWRkcmVzcy4KLSBSRUFETUU6CVVwZGF0ZWQgbXkgZW1haWwgYWRkcmVzcyBhbmQgdGhlIG5hbm8gd2ViIHBhZ2UuCgpuYW5vLTAuOC4zIC0gMDIvMDgvMjAwMAotIE5ldyBwaWNvIG1vZGUgKC1wLCAtLXBpY28pLCB0b2dnbGVzIChtb3JlKSBjb21wYXRpYmlsaXR5IHdpdGggdGhlCiAgUGljbyBtZXNzYWdlcyBkaXNwbGF5ZWQgaW4gdGhlIHNob3J0Y3V0IGxpc3QuICBOb3RlIHRoYXQgdGhlcmUgYXJlIHN0aWxsCiAgc21hbGwgZGlmZmVyZW5jZXMgaW4gdGhpcyBtb2RlLgotIG5hbm8uaDoJTmV3IHNob3J0Y3V0IHN0cnVjdCBmb3JtYXQsIGZvciB0aGUgYmVuZWZpdCBvZiBpMThuIGFuZAoJCW91ciBoZWxwIG1lbnUuICBSZW1vdmVkIHNob3J0Y3V0IG1lc3NhZ2UgbWFjcm9zLCB0aGV5IGFyZQoJCW5vdyBhbGwgaW4gc2hvcnRjdXRfaW5pdCBpbiBnbG9iYWwuYy4KLSBuYW5vLmM6CiAgZG9fd3JhcCgpOglSZW1vdmVkIHJlc2V0dGluZyBvZiBjdXJyZW50X3ggd2hlbiB3ZSBhcmUgaW4gZmFjdAoJCXdyYXBwaW5nIHRvIHRoZSBuZXh0IGxpbmUsIGZpeGVzIGEgYnVnIGluIC1pIG1vZGUuCiAgZG9fZW50ZXIoKToKCQlSZXdyb3RlIHRoZSBhdXRvaW5kZW50IG1vZGUgY29kZSB0byBiZSBhIGxvdCBsZXNzIHByZXR0eSwKCQlidXQgYSBsb3QgbW9yZSBtYWdpY2FsLgogIG1haW4oKToKCQlSZW1vdmVkIGNhc2UgZm9yIGlnbm9yaW5nIGNoYXIgMTI2ICh+KS4gIFRoYXQncyBraW5kIG9mCgkJaW1wb3J0YW50LCB3ZSdsbCBoYXZlIHRvIGZpeCBoYW5kbGluZyB0aGF0IHNlcXVlbmNlIHdoZW4KCQlwYWdpbmcgdXAvZG93biBvbiBhIHRlcm1pbmFsIHNvbWUgb3RoZXIgd2F5Li4uIFJldmFtcGVkCgkJbWFpbiBzd2l0Y2ggbG9vcCBpbiBtdWNoIHNuYXp6aWVyIGZhc2hpb24gYmFzZWQgb24gdGhlCgkJc2hvcnRjdXQgbGlzdC4KLSB3aW5pby5jOgoJCU5ldyBmdW5jdGlvbiBkaXNwbGF5X21haW5fbGlzdC4gIEFmZmVjdHMgYWxsIGZ1bmN0aW9ucwoJCXRoYXQgdXNlZCB0byBjYWxsIGJvdHRvbWJhcnMoKSB3aXRoIG1haW5fbGlzdC4gIEFkZGVkCgkJYmVjYXVzZSB3ZSBub3cgb25seSBjYWxsIGJvdHRvbWJhcnMgd2l0aCB0aGUgbWFjcm8KCQlNQUlOX1ZJU0lCTEUgaW5zdGVhZCBvZiBNQUlOX0xJU1RfTEVOLCBiZWNhdXNlIG9mIHRoZQoJCWNoYW5nZXMgdG8gdGhlIG1haW5fbGlzdCBzaG9ydGN1dCBsaXN0IChzZWUgZ2xvYmFsLmMgYmVsb3cpLgoJCU5ldyBmdW5jdGlvbiBkb19oZWxwLCBvdXIgcHJlbGltaW5hcnkgZHluYW1pYyBoZWxwIHN5c3RlbS4KLSBNYW55IG1hbnkgZnVuY3M6CgkJQ2hhbmdlZCBmcm9tIGludCB0byB2b2lkIHRvIGFsbG93IG9uZSB1bmlmb3JtIHR5cGUgdG8gY2FsbAoJCWZyb20gdGhlIHNob3J0Y3V0IHN0cnVjdC4gIEFsc28gYSBmZXcgZnVuY3Rpb25zIHRoYXQgZG8KCQlub3Qgc2ltcGxlIGhhdmUgdm9pZCBhcmd1bWVudCBoYXZlIG5ldyBmdW5jdGlvbnMgY2FsbGVkCgkJZnVuY25hbWVfdm9pZCh2b2lkKSB0byBiZSBjYWxsZWQgZnJvbSB0aGUgc2hvcnRjdXQgbGlzdC4KCQlkb19jdXRfdGV4dCBhbmQgZG9fdW5jdXRfdGV4dCB3ZXJlIGNoYW5nZWQgdG8gdm9pZAoJCWFyZ3VtZW50cyBiZWNhdXNlIHRoZXkgd2VyZSBuZXZlciBjYWxsZWQgd2l0aCBhIGZpbGVzdHJ1Y3QKCQlvdGhlciB0aGFuICpjdXJyZW50IGFueXdheS4KLSBnbG9iYWwuYzoKCQlTaG9ydGN1dCBsaXN0IG1haW5fbGlzdCB3YXMgZXhwYW5kZWQgdG8gY292ZXIgYWxsCgkJc2hvcnRjdXRzIHRoYXQgY291bGQgYmUgY2F1Z2h0IGluIHRoZSBtYWluIGxvb3AuCgkJQ29uc2VxdWVudGx5IHRoZXJlIGlzIGEgbmV3IG1hY3JvIE1BSU5fVklTSUJMRSB3aGljaCB0ZWxscwoJCWhvdyBtYW55IGl0ZW1zIGluIHRoZSBtYWluIGxpc3QgdG8gYWN0dWFsbHkgc2hvdy4KCm5hbm8tMC44LjIgLSAwMi8wMi8yMDAwCi0gQWRkZWQgaW5pdGlhbCBtb3VzZSAoLW0sIC0tbW91c2UpIHN1cHBvcnQuICBOZXcgZ2xvYmFsIHZhcmlhYmxlCiAgdXNlX21vdXNlLiAoQWRhbSBSb2dveXNraSkKCi0gbmFuby5jOglTZXQgaW5pdGlhbCB2YWx1ZSBvZiBmaWxsIHRvIENPTFMgLSA4IHJhdGhlciB0aGFuIGp1c3QgNzIKCQlyZWdhcmRsZXNzLiAoQWRhbSBSb2dveXNraSkuCiAgZG9fZGVsZXRlKCk6CQoJCURlbGV0ZWQgY2FsbCB0byBkb19iYWNrc3BhY2UoKSB3aGVuIG9uIHRoZSBlbmQgb2YgYSBsaW5lLAoJCWJlY2F1c2UgaXQgd29uJ3QgdXBkYXRlIHRoZSBsaW5lIHByb3Blcmx5LgogIGRvX2JhY2tzcGFjZSgpOgoJCVJlbW92ZWQgdW5uZWNlc3NhcnkgcG9pbnRlciBtYW5pcHVsYXRpb24gdGhhdCB3YXMgYmVpbmcKCQloYW5kbGVkIGJ5IHVubGlua19ub2RlKCkuCiAgb3Blbl9maWxlKCk6CgkJQWRkZWQgY2hlY2sgZm9yIHRyeWluZyB0byBvcGVuIGEgZGlyZWN0b3J5IChjdXJyZW50bHkgd2UKCQlzZWdmYXVsdCBvbiB0aGlzKS4gIEJ1ZyBwb2ludGVkIG91dCBieSBDaGFkIFppY2NhcmRpLgoKbmFuby0wLjguMSAtIDAxLzI4LzIwMDAKLSBJbXBsZW1lbnRlZCBQaWNvJ3MgLXIgKGZpbGwpIG1vZGUsIGNvbW1hbmQgbGluZSBmbGFnIC1yIG9yIC0tZmlsbC4gIE5ldwogIGdsb2JhbCB2YXJpYWJsZSBmaWxsLCBhZmZlY3RzIGNoZWNrX3dyYXAoKSwgZG9fd3JhcCgpLCBtYWluKCksIHVzYWdlKCksCiAgZ2xvYmFsLmMgYW5kIHByb3RvLmguCi0gbmFuby5jOgp3cml0ZV9maWxlKCk6CQlBZGRlZCAoaW5jcmVkaWJseSkgbmVjZXNzYXJ5IGNoZWNrIGZvciBFUEVSTSB3aGVuCgkJCWxpbmsoKSBmYWlscy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IHNhdmUKCQkJZmlsZXMgdmlhIHJlbmFtZSgpIG9uIGZpbGVzeXN0ZW1zIHRoYXQgZG9udAoJCQlzdXBwb3J0IGhhcmQgbGlua3MgKEFJRUVFRUVFKS4KZG9fZ290bygpOgoJCQlGaXhlZCBhIHN0dXBpZCBtaXN0YWtlIHdoZXJlIHdlIHdlcmUgY2FsbGluZwoJCQlib3R0b21iYXJzKCkgd2l0aCByZXBsYWNlX2xpc3QgaW5zdGVhZCBvZiBnb3RvX2xpc3QuCi0gbmFuby5oOgoJCQlOZXcgY2hhciAqaGVscCBpbiBzaG9ydGN1dCBzdHJ1Y3R1cmUgZm9yIGhlbHAKCQkJZmVhdHVyZS4gQWRkZWQgTkFOT18qX01TRyBhbmQgTkFOT18qX0hFTFAgI2RlZmluZXMKCQkJZm9yIGhlbHAgZnVuY3Rpb24gYW5kIGkxOG4uCi0gZ2xvYmFsLmM6CgkJCU5ldyBmdW5jdGlvbnMgc2hvcnRjdXRfaW5pdCAoY2FsbGVkIGluIG5hbm8uYykgYW5kCgkJCXNjX2luaXRfb25lKCkgdG8gaW5pdGlhbGl6ZSB0aGUgc2hvcnRjdXRzIHdpdGhvdXQKCQkJdXNpbmcge31zIChmb3IgaTE4bikuCgpuYW5vLTAuOC4wIC0gMDEvMjUvMjAwMAotIFZpZXcgZmxhZyAoLXYsIC0tdmlldykgaW1wbGVtZW50ZWQuICBHbG9iYWwgdmFyaWFibGUgdmlld19tb2RlLCBhZmZlY3RzCiAgbWFpbiBsb29wIG9mIG5hbm8uYyBhbmQgbmV3X2ZpbGUoKS4gKG1lKQotIG5hbm8uYzoKCQkJc3BsaXQgY2hlY2tzIGZvciBURVJNSU9TX0ggYW5kIFRFUk1JT19IIHVwIHNvIHdlCgkJCWNhbiAodGhlb3JldGljYWxseSkgaW5jbHVkZSB0aGVtIGJvdGgsIHdoaWNoIGlzIGdvb2QuCmhhbmRsZV9zaWd3aW5jaCgpOgoJCQlBZGRlZCBjaGVjayBmb3IgbmN1cnNlcy5oLiAgKEFuZHkgS2FobikKZG9fc3BlbGwoKToKCQkJV2Ugbm93IG9ubHkgdHJ5IGlzcGVsbCBiZWNhdXNlIHdlIGRvbid0IGFzIG9mIHlldAoJCQloYW5kbGUgdGhlICdzcGVsbCcgcHJvZ3JhbSB0aGUgcmlnaHQgd2F5LCBub3cgdGhhdAoJCQlJIGZpbmFsbHkga25vdyB3aGF0IHRoZSByaWdodCB3YXkgaXMgPS0pLiAgQWRkZWQKCQkJY2FsbCB0byBlZGl0X3VwZGF0ZShmaWxlYWdlKSB0byBzdG9wIHNlZ2ZhdWx0cy4KZ2xvYmFsX2luaXQoKToKCQkJQWRkZWQgaW5pdGlhbGl6YXRpb24gb2YgZWRpdCogZmlsZXN0cnVjdCBwb2ludGVycwoJCQl0byBzdG9wIHNlZ2ZhdWx0cyBvbiBzcGVsbCBjaGVjay4KdXNhZ2UoKToKCQkJQ2hlY2sgZm9yIGdldG9wdF9sb25nLCBhbmQgaWYgbm8gbGVhdmUgb3V0IHRoZQoJCQlHTlUgb3B0aW9ucyBldmVyeW9uZSBzZWVtcyB0byBsb3ZlIHNvIG11Y2ggKEFuZHkgS2FobikKbWFpbigpOgoJCQlBZGRlZCBjaGVja3MgZm9yIGdldG9wdF9sb25nIChBbmR5IEthaG4pCgkJCVdlIGlnbm9yZSBjaGFyYWN0ZXIgMTI2IGJlY2F1c2UgaXQgZ2V0cyBwdXQgaW50bwoJCQl0aGUgYnVmZmVyIHdoZW4gd2UgcGFnZSB1cC9kb3duIG9uIGEgdnQgdGVybWluYWwuCndyaXRlX2ZpbGUoKToKCQkJRml4ZXMgZm9yIHVtYXNrIChBZGFtIFJvZ295c2tpKS4gIFJlbmFtZWQgdG1wZmlsZQoJCQl2YXJpYWJsZSB0byB0bXAuICBEb2N1bWVudGVkIHRoZSB0bXAgb3B0aW9uCgkJCWJldHRlciBpbiB0aGUgZnVuY3Rpb24gY29tbWVudHMuICBGaXhlZCBteSAKCQkJc3R1cGlkbHkgY29tbWVudGVkIG91dCBjaGVjayBmb3IgdG1wIG9uIHNldHRpbmcKCQkJdW1hc2sgd2hpY2ggSSByZWFsbHkgbGlrZSA9PgotIG5hbm8uaDoKCQkJTWFkZSBkZXNjIHZhcmlhYmxlIGluIHNob3J0Y3V0IHN0cnVjdCBhIHBvaW50ZXIKCQkJaW5zdGVhZCBvZiBhIGZpeGVkLWxlbmd0aCBzdHJpbmcuCi0gdXRpbHMuYzoKCQkJRml4ZWQgY2hlY2sgZm9yIGNvbmZpZy5oIGJlZm9yZSBuYW5vLmguCi0gY29uZmlndXJlLmluOgoJCQlOZXcgY2hlY2tzIGZvciBnZXRvcHRfbG9uZywgZ2V0b3B0LmgsIHJlbW92ZWQKCQkJQ0ZMQUdTIGFuZCBMREZMQUdTIGNoYW5nZXMuICBHb25uYSBoYXZlIHRvIHJ1bgoJCQlzdHJpcCBtYW51YWxseSBub3cgPS0pIChBbmR5IEthaG4pCgkJCUFkZGVkIGNoZWNrIGZvciBIQVZFX1dSRVNJWkUsIG5ldyBmaWxlIGFjY29uZmlnLmgKCQkJKG1lKS4KCm5hbm8tMC43LjkgLSAwMS8yNC8yMDAwCi0gTmV3IGF1dG9pbmRlbnQgZmVhdHVyZS4gIENvbW1hbmQgZmxhZyAnaScgb3IgJy0tYXV0b2luZGVudCcuICBOZXcKICBmdW5jdGlvbiBkb19jaGFyKCkgdG8gY2xlYW4gdXAgY2hhcmFjdGVyIG91dHB1dCwgZ2xvYmFsCiAgdmFyaWFibGUgYXV0b2luZGVudCBpbiBnbG9iYWwuYy4gKEdyYWhhbSBNYWlud2FyaW5nKQotIE5ldyBmbGFnICd0JyBvciAnLS10ZW1wZmlsZScsIGxpa2UgUGljbydzIC10IG1vZGUsIGF1dG9tYXRpY2FsbHkgc2F2ZXMKICBmaWxlcyBvbiBleGl0IHdpdGhvdXQgcHJvbXB0aW5nLiAgQWZmZWN0cyBkb193cml0ZW91dCgpLiAgQWxzbwogIGRvX3dyaXRlb3V0KCkgbm93IHRha2VzIGEgcGFyYW1ldGVyIGZvciBpZiBleGl0aW5nLgogIEdsb2JhbCB2YXJpYWJsZSB0ZW1wX29wdCBpbiBnbG9iYWwuYyAoR3JhaGFtIE1haW53YXJpbmcpCi0gUHJlbGltaW5hcnkgc3BlbGwgcHJvZ3JhbSBzdXBwb3J0LiAgQWRkZWQgY29tbWFuZCBmbGFnICctcycgb3IKICAnLS1zcGVsbGVyJyBmb3IgYWx0ZXJuYXRpdmUgc3BlbGxlciBjb21tYW5kLiAgQWRkZWQgZnVuY3Rpb24gZG9fc3BlbGwoKQogIGFuZCBleGl0X3NwZWxsKCkgdG8gbmFuby5jLiAgTmV3IGdsb2JhbCB2YXJpYWJsZSBhbHRfc3BlbGxlci4KLSBuYW5vLmM6CiAgbWFpbigpOglXZSBub3cgaWdub3JlIGlucHV0IG9mIGRlY2ltYWwgNDEwIGJlY2F1c2UgdGhlc2UgZ2V0IGVudGVyZWQgCgkJd2hlbiB3ZSByZXNpemUgdGhlIHNjcmVlbi4gIFNvcnRlZCBvcHRpb25zIGluIGdldG9wdCgpCgkJc3dpdGNoIHN0YXRlbWVudC4KICB1c2FnZSgpOglTb3J0ZWQgb3B0aW9ucyBhbmQgY2hhbmdlZCB0YWJzIHRvIG1ha2Ugcm9vbSBmb3IgLXMgb3B0aW9uLgogIHdyaXRlX2ZpbGUoKToJTm93IHRha2VzIGEgc2Vjb25kIHBhcmFtZXRlciAndG1wZmlsZScsIHVzZXMgbWFzayAwNjAwIGFuZAoJCWRvZXNuJ3QgcHJpbnQgdGhlIG51bWJlciBvZiBsaW5lcyB3cml0dGVuIG9uIHRoZSBzdGF0dXNiYXIuCiAgZ2xvYmFsX2luaXQoKToKCQlBZGRlZCBtb3JlIGluaXRpYWxpemF0aW9ucyB0byBnbG9iYWxzIHRvIHN1cHBvcnQgZG9fc3BlbGwoKS4KCm5hbm8tMC43LjggLSAwMS8yMy8yMDAwCi0gU3R1YmJlZCBqdXN0aWZ5IGZ1bmN0aW9uLiAgQWZmZWN0cyBtYWluKCkgaW4gbmFuby5jIGFuZCBuYW5vLmggZGVmaW5lcy4KLSBBZGRlZCBGa2V5IGVxdWl2YWxlbnRzIGZvciBQaWNvIGNvbXBhdGliaWxpdHkuICBBZmZlY3RzIG5hbm8uaCBkZWZpbmVzCiAgYW5kIG1haW4oKSBpbiBuYW5vLmMKLSBSZW1vdmVkIHJlZHVuZGFudCByZXNldF9jdXJzb3IoKSBjYWxscyBmcm9tIHRoZSBibGFuaygpIHJvdXRpbmVzLgotIG5hbm8uYzoKICBtYWluKCk6CUZpeGVkIHR5cG8gaW4gbWFpbiB3aGlsZSBsb29wIGZvciBOQU5PX0FMVF9SRVBMQUNFX0tFWS4KCQlSZW1vdmVkIGNoZWNrIGZvciBpc3ByaW50KCkgY2hhcmFjdGVycyBpbiBtYWluIHdoaWxlIGxvb3AKCQlmb3IgcGVvcGxlIHdpdGggb2RkIGNoYXJhY3RlciBzZXRzICpzaHJ1ZyouICBBZGRlZCBzb21lIFgKCQl3aW5kb3cgRi1rZXkgY29tYm9zLgogIHJlYWRfbGluZSgpOglOZXcgZnVuY3Rpb24sIGNvbnNvbGlkYXRlcyBvZiBtb3N0IG9mIHRoZSBzcGVjaWFsCgkJc2VjdGlvbnMgb2YgdGhlIGZpbGUgcmVhZGluZyBjb2RlLiAoUm9iIFNpZW1ib3Jza2kpCiAgZG9fcmVwbGFjZSgpOiBNYW55IHNjYXR0ZXJlZCBmaXhlcy4gKFJvYiBTaWVtYm9yc2tpKQogIHdyaXRlX2ZpbGUoKToJQWRkZWQgY2hlY2sgZm9yIGVtcHR5IGZpbGVuYW1lLgotIHdpbmlvLmM6CiAgbmFub2dldHN0cigpOglGaXhlcyBmb3IgZGVsZXRpbmcgYXQgcGxhY2VzIG90aGVyIHRoYW4gdGhlIGVuZCBvZiB0aGUKCQlidWZmZXIsIGN1dCBzdXBwb3J0LiAoQWRhbSBSb2dveXNraSkKICBibGFua19lZGl0KCk6CU5ldyBmdW5jdGlvbiwgYmxhbmtzIGVkaXQgYnVmZmVyLiAgQWRkZWQgY2FsbCB0byBpdCBpbiAKCQl0b3RhbF9yZWZyZXNoKCkuCi0gY29uZmlndXJlOglDaGVja3MgZm9yIGdsaWIgaWYgc25wcmludGYgb2YgdnNucHJpbnRmIGFyZW4ndCBhdmFpbGFibGUKCQkoQW5keSBLYWhuKS4gQ2hhbmdlZCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBubyB0ZXJtY2FwIGxpYgoJCWlzIGZvdW5kLgoKbmFuby0wLjcuNyAtIDAxLzE5LzIwMDAKLSBPcHRpb24gJy12JyBmb3IgdmVyc2lvbiBtb3ZlZCB0byAnLVYnLCBiZWNhdXNlIC12IGlzIFBpY28ncyAicmVhZCBvbmx5IgogIG1vZGUgKGFmZmVjdHMgZ2V0b3B0KCkgaW4gbWFpbigpIGFuZCB1c2FnZSgpIGZ1bmN0aW9uIGluIG5hbm8uYwotIE5ldyBmbGFnIC1jLCBhbHdheXMgc2hvdyBjdXJzb3IgcG9zaXRpb24uICBBZmZlY3RzIG1haW4oKSBpbiBuYW5vLmMgYW5kCiAgc3RhdHVzYmFyKCkgaW4gd2luaW8uYwotIE9wdGlvbiAnLXgnIGRvZXNuJ3Qgc2hvdyBoZWxwIHdpbmRvdyBhdCB0aGUgYm90dG9tIG9mIHRoZSBlZGl0b3IuCiAgTmV3IHZhcmlhYmxlIG5vX2hlbHAgaW4gbmFuby5oIGFuZCBwcm90by5oLCBhZmZlY3RzIG1haW4oKSwgdXNhZ2UoKSwKICBhbmQgZ2xvYmFsX2luaXQoKSBpbiBuYW5vLmMsIGJsYW5rX2JvdHRvbWJhcnMoKSwgY2xlYXJfYm90dG9td2luKCksCiAgYm90dG9tYmFycygpLCBhbmQgZG9feWVzbm8oKSAgaW4gd2luaW8uYyAgKEkgaGFkIHRvIGFwcGx5IHRoaXMgcGF0Y2ggYnkKICBoYW5kID1QKSAoQWRhbSBSb2dveXNraSkKLSBuYW5vLmM6CiAgaGFuZGxlX3NpZ3dpbmNoKCk6CU5ldyBmdW5jdGlvbiAoQWRhbSBSb2dveXNraSksIGhhbmRsZXMgcmVzaXppbmcuCiAgcGFnZV91cCgpLCBwYWdlX2Rvd24oKToJCgktIE5ldyBmdW5jdGlvbnMuICBXZSBub3cgc2V0IHRoZSBjdXJzb3IgYXQgdGhlIHRvcCByaWdodCBjb3JuZXIsCgkgIG5vdCBhdCB0aGUgY2VudGVyIGxpbmUsIGFuZCBwYWdlIHVwIGFuZCBkb3duIGEgZnVsbCBzY3JlZW4KCSAgcmF0aGVyIHRoYW4gYSBoYWxmIHNjcmVlbi4gT3JpZ2luYWwgZnVuY3Rpb25zIHJlbmFtZWQgdG8KCSAgcGFnZV91cF9jZW50ZXIoKSBhbmQgcGFnZV9kb3duX2NlbnRlcigpLgogIG1haW4oKTogCgktIEFkZGVkIGNoZWNrIGZvciBrZXlzdHJva2Uga2V5IHNlcXVlbmNlIDQwNyBvciBOQU5PX0NPTlRST0xfWgoJICBpbiBtYWluIHdoaWxlIGxvb3AgYmVjYXVzZSBzdXNwZW5kIG1vZGUgd2FzIGJyb2tlbi4gIFRoaXMgc2hvdWxkCgkgIGZpeCBpdCwgYXQgbGVhc3QgZm9yIG5vdy4KCS0gQWRkZWQgbG9uZyBvcHRpb24gc3VwcG9ydCAoQnkgcG9wdWxhciBoYXJhc3NtZW50IDstKSAtIEFkZGVkCgkgICNpbmNsdWRlIGZvciBnZXRvcHQuaCwgY2hhbmdlZCBnZXRvcHQoKSB0byBnZXRvcHRfbG9uZygpLgoJICBPcHRpb25zIGFkZGVkIHNvIGZhcjogLS12ZXJzaW9uICgtViksIC0tbm93cmFwICgtdyksIC0tc3VzcGVuZAoJICAoLXopLCAtLWhlbHAgKC1oKSwgLS1ub2hlbHAgKC14KS4KCS0gUmV3cm90ZSBzaWduYWwgc3RhdGVtZW50cyAoQWRhbSBSb2dveXNraSkKCm5hbm8gMC43LjYgLSAwMS8xNS8yMDAwCi0gTmV3IENoYW5nZUxvZyBmb3JtYXQKLSBuYW5vLmM6IAogIG1haW4oKTogCUJvdW5kIENPTlRST0xfSCB0byBiYWNrc3BhY2UgKG9vcHMpCgkJQWRkZWQgbW9yZSBBbHQtWy1rZXkgY29tYmluYXRpb25zLCBmb3IgcGFnZSB1cCAmIGRvd24uCiAgcmVhZF9ieXRlcygpOglOZXcgZnVuY3Rpb24gKEFkYW0gUm9nb3lza2kpCiAgcmVhZF9maWxlKCk6CU9wdGltaXphdGlvbnMgLSBtYWxsb2MoKXMgKmJ1ZiBhIGxpdHRsZSBhdCBhIHRpbWUgcmF0aGVyCgkJdGhhbiBvbmUgaHVnZSBidWZmZXIsIGFuZCByZXBsYWNlZCB0aGUgc3RyY2F0IGF0IHRoZSBlbmQKCQl3aXRoIGFuIGluZGV4IHZhcmlhYmxlLiAgQWRkZWQgY2FsbCB0byByZWFkX2J5dGVzKCkuCiAgZG9fbmV4dF93b3JkKCk6IE5ldyBmdW5jdGlvbiwgYmluZGluZyBpcyBjb250cm9sLXNwYWNlICgwKSAobWUpCgotIHdpbmlvLmM6IAogIGJvdHRvbWJhcnMoKToJRml4ZWQgbm9uLWV4cGFuZGluZyBzaG9ydGN1dCBrZXlzIGF0IGJvdHRvbSBvZiBzY3JlZW4uCgkJKGZvcm11bGEgaXMgZXh0cmEgc3BhY2UgbmVlZGVkID0gQ09MUyAvIDYgLSAxMykuCiAgYWN0dWFsX3goKSAmIHN0cmxlbnB0KCk6CQoJCUFkZGVkIGJ1ZyM5IGZpeCAtIHdoZW4gdGFicyAlIDggPT0gMCwgd2Ugc2hvdWxkIG9ubHkKCQlpbmNyZW1lbnQgdGFicyBieSAxLgogIHRpdGxlYmFyKCk6CUZpeGVkIG92ZXJydW4gaW4gdGl0bGViYXIgb24gdmVyeSBsb25nIGZpbGVuYW1lcy4KCjAuNy41CVBpY28gJ2xhc3QgbGluZScgZmVhdHVyZSBhZGRlZCAoUm9iIFNpZW1ib3Jza2kgJiBtZSkuICBFbGltaW5hdGVkCgl3cml0aW5nIGEgbmV3bGluZSBhdCBFT0YuIGRvX2N1cnNvcnBvcyBhbmQgZG9fcmVwbGFjZSBhcmUgbm93IG5vdAoJZGlyZWN0bHkgYm91bmQgdG8gc2lnbmFscyBidXQgcGlja2VkIHVwIGFzIHRoZWlyIGNvbnRyb2wgc2VxdWVuY2VzCglpbiByYXcgbW9kZS4gQnVnIGZpeCBpbiBkb19iYWNrc3BhY2UuIEZpeGVkIGJ1ZyAjOSAod29vaG9vISkKMC43LjQJT3B0aW1pemVkIChvYmZ1c2NhdGVkPykgZWRpdF9yZWZyZXNoLiBNYWxsb2MoKSBjYWxscyBjaGVja2VkIGZvcgoJYXZhaWxhYmxlIG1lbW9yeSwgYWxpZ24gYnVnIGZpeGVkIChCaWcgR2F1dGUpLgoKLS0tIEFzIG9mIHZlcnNpb24gMC43LjQgVElQIGlzIHJlbmFtZWQgdG8gbmFuby4KCjAuNy4zCUZpeGVkIGEgZG91YmxlIGJsYW5rX3N0YXR1c2JhcigpIHdoZW4ganVtcGluZyB0byBmaXJzdCBhbmQgbGFzdAoJbGluZXMuICBUb29rIG91dCB1bm5lY2Vzc2FyeSB1cGRhdGVzIGluIGxvYWRfZmlsZS4gQnVnIGZpeCBpbgoJZG9fbGVmdC4gTWlzc2luZyB1cGRhdGVzIHRvIHRvdGxpbmVzLCBmaXhlZCBidWcgIzcgKGxhc3QgbGluZSBub3QKCWhhdmluZyBhIG5ld2xpbmUgYXQgdGhlIGVuZCBkb2Vzbid0IGdldCByZWFkLCBidWdmaXggaW4gZG9fcmVwbGFjZQoJd2l0aCByZXBsYWNlIGFsbCwgbW9yZS9iZXR0ZXIgY29tbWVudHMgKFJvYmVydCBTaWVtYm9yc2tpKQowLjcuMglPdXIgZmlyc3QgcGF0Y2ggYWNjZXB0ZWQgaW50byB0aGUgc291cmNlISBjb25maWd1cmUgZml4ZXMgCglhbmQgb3B0aW1pemF0aW9ucyAoRXJpayBBbmRlcnNvbikuICBBZGRlZCBtaXNzaW5nIHN0ZGFyZy5oIHRvIHdpbmlvLmMuIAoJQnVnIGZpeCBpbiB1cGRhdGVfbGluZSBmb3IgZWRpdGluZyBsb25nIGxpbmVzLiBGaXhlZCBhcmd1bWVudHMKCWJlaW5nIHB1dCBpbnRvIHRoZSBmaWxlbmFtZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkLiBQcmVsaW1pbmFyeQoJK2xpbmUgY29tbWFuZCBhcmd1bWVudCBmdW5jdGlvbi4KMC43LjEJY29uZmlndXJlIHR3ZWFrIGZvciBiZXR0ZXIgRnJlZUJTRCBzdXBwb3J0LiBSZW1vdmVkIHJlZnJlc2goKSBmcm9tCgllZGl0X3JlZnJlc2ggdG8gc3RvcCBjdXJzb3IgImp1bXBpbmciIGR1cmluZyBzY3JlZW4gdXBkYXRlcy4gIFRoaXMKCXdpbGwgcHJvYmFibHkgY2F1c2UgYSBidWcgb3IgdHdvLiBSZXBsYWNlIGlzIG5vdyBBbHQtUiAoQFIpIGFuZCAKCUdvdG8gbGluZSBpcyBBbHQtRyAoQEcpLCBidXQgdGhleSBoYXZlIGNvbnRyb2wga2V5IGFsaWFzZXMgb2YgXlwgYW5kIAoJXl8gcmVzcGVjdGl2ZWx5LiAgTWFkZSBDb250cm9sLUYsQixOLFAgd29yayBsaWtlIHRoZXkgZG8gaW4gUGljby4KCUNvbnRyb2wtRyB3aWxsIGJlY29tZSB0aGUgSGVscCBrZXksIGJ1dCBmb3Igbm93IGlzIHN0dWJiZWQgb3V0LgowLjcuMAlGaXhlZCBtaXNzaW5nIHN0ZGxpYi5oIGZyb20gY3V0LmMuIEZpeGVkIGEgZmV3IG1lc3NhZ2UgYnVncyBpbgoJZmluZG5leHRzdHIuIEJvdW5kIENvbnRyb2wtRCB0byBEZWxldGUuIFJlZml4ZWQgc2VnZmF1bHQgb24gemVybwoJbGVuZ3RoIGZpbGUuIEFkZGVkIEVzYy1bLUEsQixDLEQgY3Vyc29yIGtleSBzZXF1ZW5jZXMuCjAuNi45CVByZWxpbWluYXJ5IGN1cnNvciBwb3NpdGlvbiBmdW5jdGlvbi4gU3BsaXQgdXAgdGlwLmMgbW9yZSwgbWFkZQoJbmV3IGZpbGVzIGN1dC5jIGFuZCB3aW5pby5jLiBGaXhlZCBhIGJ1ZyBpbiBjdXRfbWFya2VkX3NlZ21lbnQKCXRoYXQgd2FzIGxlYXZpbmcgb3V0IGEgY2hhcmFjdGVyLgowLjYuOAlCeSByZXF1ZXN0LCBvcHRjaHIgaW4gbWFpbigpIGlzIG5vdyBhbiBpbnQuICBSZW1vdmVkIHVubmVlZGVkCglnbG9iYWxzLiBCb3VuZCBmdW5jdGlvbnMgZm9yIG5leHQvcHJldiBwYWdlLCBhbmQgd3JvdGUgZnVuY3Rpb25zCglkb19ob21lIGFuZCBkb19lbmQuCjAuNi43CUJ1Z2ZpeCBpbiBkb191bmN1dF90ZXh0IGZvciB0b3RsaW5lcy4gQnJva2UgdXAgb3Blbl9maWxlIGFuZAoJY3JlYXRlZCByZWFkX2ZpbGUuICBJbXBsZW1lbnRlZCBJbnNlcnQgRmlsZS4gRml4ZXMgaW4gdGlwZ2V0c3RyCglmb3IgZXJyb25lb3VzIGtleXN0cm9rZXMuIEFkZGVkIGxlYXZlX2N1cnNvciBhcmcgdG8gZG9feWVzbm8oKS4KMC42LjYJRml4ZXMgaW4gZG9fc2VhcmNoKCksIGRvX3JlcGxhY2UoKSwgZG9fd3JpdGVvdXQsIGFuZCBkb19leGl0KCkgZm9yIAoJYWJvcnRlZCBzZWFyY2hlcyBhbmQgbW9yZSBQaWNvLWNvbXBhdGlibGUgbWVzc2FnZXMuIHN0YXR1c3EoKSBub3cKCXJldHVybnMgLTIgb24gYSBibGFuayBlbnRyeSBpbnN0ZWFkIG9mIC0xLiBCdWcgZml4IGluIGFjdHVhbF94KCkuCjAuNi41CU1vcmUgQlNEIGNvbXBhdGliaWxpdHkuICBGaXhlZCB0d28gYnVncyBpbiBkb191bmN1dF90ZXh0CglyZWdhcmRpbmcgYnVmZmVycyB3aXRoIGZpbGVib3QgaW4gdGhlbS4gIEZpeGlucyBpbiBkb19iYWNrc3BhY2UKCWFuZCBkb19lbnRlci4gUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLiBSZW1vdmVkIHN0cmlwX25ld2xpbmUuCjAuNi40CVRvb2sgb3V0IHRoZSBhd2Z1bCBuZXdsaW5lcyBmcm9tIGVhY2ggc3RyaW5nIGJ1ZmZlcnMuICBUaGlzIHdpbGwKCWNlcnRhaW5seSBjYXVzZSBtb3JlIGJ1Z3MuIEZpeGVzIGluIGRvX2V4aXQoKS4gQmV0dGVyIGVtcHR5IGZpbGUKCWhhbmRsaW5nIChJIGhvcGUpLgowLjYuMwlJbXBsZW1lbnRlZCBeRS4gIFJlbW92ZWQgbm93IHVubmVlZGVkIHdyYXBsaW5lIGZyb20gZmlsZXN0cnVjdC4KCWRvX2VudGVyKCkgcmV3cml0dGVuLgowLjYuMglCZXR0ZXIgZGVmYXVsdCBmaWxlIHBlcm1pc3Npb25zLiBDb21wbGV0ZSByZXdyaXRlIG9mIGRvX3dyYXAoKS4KCUJldHRlciBoYW5kbGluZyBvZiBlZGl0aW5nIHdpdGggY3Vyc29yIG5lYXIgQ09MUyAtIDEuCjAuNi4xCVN0YXJ0aW5nIHRvIGltcGxlbWVudCB3cmFwcGluZyB0b2dnbGUuIEZpeCBmb3IgdW5oYW5kbGVkIGNvbnRyb2wKCWNvZGVzIGJlaW5nIGVudGVyZWQgaW50byB0aGUgYnVmZmVyLiBCdWcgZml4IGluIGFjdHVhbF94OyBtb3JlCgk+IENPTFMgLSAxIGZ1bmN0aW9uYWxpdHksIGVzcGVjaWFsbHkgb24gbGluZXMgd2l0aCBUQUJzLiAgRml4ZWQgYmVpbmcgCglsb2NrZWQgaW50byBjdXRidWZmZXIgd2hlbiBjdXR0aW5nIG1vcmUgdGhhbiBvbmUgbWFya2VkIHNjcmVlbiBvZgoJdGV4dC4KMC42LjAJV2UgaGF2ZSBUQUJzISEhICBUbyBkbyB0aGlzLCBwbGFjZXdld2FudCBpcyBub3cgc2V0IHRvIHRoZSBhY3R1YWwKCXdpZHRoIG9uIHRoZSBzY3JlZW4gd2Ugd2FudCB0byBiZSwgbm90IGFuIGluZGV4IG9mIGN1cnJlbnQtPmRhdGEuCglOZXcgZnVuY3Rpb25zIHhwbHVzdGFicyBhbmQgYWN0dWFsX3ggY29udmVydCB0aGUgYWN0dWFsIHBsYWNlCgl0aGUgY3Vyc29yIHNob3VsZCBiZSBvbiB0aGUgc2NyZWVuIHRvIGFuZCBmcm9tIHRoZSBwbGFjZSBpbiB0aGUKCXN0cmluZy4KMC41LjUJQ2hhbmdlZCBkb19yaWdodCB0byB0ZXN0IGRvX2Rvd24gYmVmb3JlIHNldHRpbmcgY3VycmVudF94IHRvIDAsCgllbGltaW5hdGluZyB0aGUgImxvb3BpbmciIG9uIHRoZSBsYXN0IGxpbmUgd2hlbiBob2xkaW5nIHRoZSByaWdodAoJYXJyb3cuICBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBsb25nZXIgdGhhbiBDT0xTIC0gMSBsaW5lcy4KCVdyb3RlIGRvX2RlbGV0ZS4KMC41LjQJRml4ZWQgYSBidWcgaW4gdG90YWxfdXBkYXRlIHRoYXQgd2Fzbid0IHJlcGFpbnRpbmcgdGhlIHNjcmVlbgoJcHJvcGVybHkuICB0aXBnZXRzdHIgaXMgbXVjaCBtb3JlIG1lc3N5IGJ1dCB0ZXh0IGlzIG5vdyBtb3JlCgllZGl0YWJsZSA7KSAgRml4ZWQgY3Jhc2ggb24gZW50ZXJpbmcgYSBuZXcgZmlsZSwgaG9wZWZ1bGx5LiAgQXdmdWwKCXN0dWIgZm9yIHRhYiBoYW5kbGluZywgb25seSBpbiBkb19yaWdodCgpIHRvIHNhdmUgbWUgc29tZSBzYW5pdHkuCjAuNS4zCUFkZGVkIGNoZWNrIGZvciBtYWxsb2MuaC4gIEltcGxlbWVudGluZyB1bmN1dCBmcm9tIG1hcmtlciBzbG93bHkuCglGaXhlZCBhIGZldyBidWdzIGluIGRvX3VuY3V0IHdoZW4gbm90IHVuY3V0dGluZyBmcm9tIG1hcmtlZCB0ZXh0LgoJSSB3b3VsZCBub3QgdHJ1c3QgeW91ciBkYXRhIHdpdGggdGhlIG1hcmsgY29kZSByaWdodCBub3csIGJ1dCB0aGVuCgl3ZSdyZSBub3QgYXQgdmVyc2lvbiAxLjAgeWV0IHNvIGRvbnQgdHJ1c3QgYW55dGhpbmcgOykKMC41LjIJQWRkZWQgcmVzZXRfY3Vyc29yKCkgYmVmb3JlIGVuZCBvZiB1cGRhdGVfbGluZSBzbyBjdXJzb3IgZG9lc24ndAoJanVtcCBhZnRlciBlYWNoIGtleXN0cm9rZSBlbnRlcmVkLiBTZWxlY3QgdGV4dCBzdHViYmVkLiBGaXhlZAoJYSBidWcgaW4gdG90YWxfcmVmcmVzaCgpLiAgU2V0dGluZyBhIG1hcmsgd2lsbCBoaWdobGlnaHQgcHJvcGVybHksCglidXQgZG9lcyBub3QgYWN0dWFsbHkgYWZmZWN0IHdoYXQgZ2V0cyBwdXQgaW4gdGhlIGN1dGJ1ZmZlciAoeWV0KS4KMC41LjEJV3JpdGluZyBhIGZpbGUgb3V0IGNhdXNlcyBtb2RpZmllZCB0byBiZSBzZXQgYmFjayB0byAwLiAgR29vZC4KCVNldF9tb2RpZmllZCBmdW5jdGlvbiB3cml0dGVuLiAgQ3V0IGFuZCB1bmN1dCB0ZXh0IG5vdyBzZXQKCW1vZGlmaWVkIHdoZW4gY2FsbGVkLgowLjUuMAlIYWxmIHdheSB0aGVyZSEgIEltcGxlbWVudGVkIHdyaXRlIG91dCwgc2F2ZSBmdW5jdGlvbiBzZWVtcwoJc3RhYmxlLiAgQ2hhbmdlZCBzdGF0dXNiYXIgYmxhbmsgcm91dGluZyB0byBub3QgcmVmcmVzaCwgYSBzZXBhcmF0ZQoJcHJvZ3JhbSBjYWxscyBpdCBhbmQgdGhlbiByZWZyZXNoZXMuICBNYWRlIHRoZSBwcm9ncmFtIG5vdCBjbGVhcgoJdGhlIHNjcmVlbiBvbiBleGl0LCBqdXN0IHRoZSBib3R0b20gdHdvIGxpbmVzIChsaWtlIFBpY28pLgowLjQuMglJbXBsZW1lbnRlZCByZXBsYWNlIGFsbCBpbiByZXBsYWNlIGZ1bmN0aW9uLiAgQ3J1ZGUgZXhpdCBmdW5jdGlvbgoJKGFza3MgeWVzIG9yIG5vIGlmIG1vZGlmaWVkIGJ1dCBkb2VzIG5vdCB3cml0ZSB0byBmaWxlKS4KMC40LjEJSW1wbGVtZW50aW5nIHNlYXJjaCAmIHJlcGxhY2UuICBGaXhlZCBjcmFzaCBvbiBkZWxldGluZyBhdCB0b3Agb2YKCWVkaXQgYnVmZmVyLiAgSW1wbGVtZW50ZWQgInRpbWVvdXQiIG9mIHN0YXR1c2JhciBtZXNzYWdlcy4KCUltcGxlbWVudGVkIF5BIGFuZCBeRSAoYmVnaW5uaW5nIGFuZCBlbmQgb2YgbGluZSkuCjAuNC4wCVNwbGl0IGNvZGUgaW50byBnbG9iYWwuYyBhbmQgcHJvdG8uaCB0byBhbGxvdyBmb3IgYmV0dGVyIG11bHRpcGxlCglmaWxlIGhhbmRsaW5nLiAgQWRkZWQgI2RlZmluZXMgZm9yIHRoZSBtYWpvcml0eSBvZiB0aGUgc2hvcnRjdXQKCWtleXMgaW4gdGlwLmggZm9yIGVhc3kgbW9kaWZpY2F0aW9uLiAKMC4zLjEJV3JpdGUgZWRpdF9yZWZyZXNoIHdoaWNoIGRvZXNuJ3QgbW92ZSB0aGUgc2NyZWVuIGFyb3VuZCwganVzdAoJdXBkYXRlcyB3aGF0J3MgdGhlcmUgYWxyZWFkeS4gIGRvX3dyYXAoKSBhbmQgZG9fZW50ZXIoKSBhZGRlZC4KMC4zLjAJUHJlbGltaW5hcnkgY3V0YnVmZmVyIChjdXQgYW5kIHVuY3V0KSBzdXBwb3J0LgowLjIuNyAgIENoZWNrIGZvciBNb2RpZmljYXRpb24gYWRkZWQuICBkb19zZWFyY2goKSB3b3Jrcy4KMC4yLjUJUmV3cml0ZSBvZiBmaWxlIGRhdGEgc3RydWN0LgowLjIJUmVhZCBpbiBkYXRhIHRvIGJ1ZmZlciwgYm91bmQga2V5c3Ryb2tlcyB0byBzdHViIGZ1bmN0aW9ucywgCglpbml0aWFsIGN1cnNvciBtb3ZlbWVudCBvbiBzY3JlZW4uICBJbml0aWFsIGF1dG9jb25mIHN1cHBvcnQuCjAuMQlJbml0aWFsIHByb2dyYW0gc2V0dXAgdy9uY3Vyc2VzCgokSWQkCg==