ICBDaGFuZ2Vsb2cgZm9yIHRoZSBjLWFyZXMgcHJvamVjdAoKVmVyc2lvbiAxLjcuNSAoQXVndXN0IDE2LCAyMDExKQoKRml4ZWQ6CgogbyBkZXRlY3Rpb24gb2Ygc2VtaWNvbG9uIGNvbW1lbnRzIGluIHJlc29sdi5jb25mCiBvIGF2b2lkIHVzaW5nIHN5c3RlbSdzIGluZXRfbmV0X3B0b24gYWZmZWN0ZWQgYnkgdGhlIFdMQi0yMDA4MDgwMDY0IGFkdmlzb3J5CiBvIHJlcGxhY2VtZW50IGFyZXNfaW5ldF9uZXRfcHRvbiBhZmZlY3RlZCBieSB0aGUgV0xCLTIwMDgwODAwNjQgYWR2aXNvcnkKIG8gcmVwbGFjZW1lbnQgYXJlc19pbmV0X250b3AgYWZmZWN0ZWQgYnkgcG90ZW50aWFsIG91dCBvZiBib3VuZHMgd3JpdGUKIG8gYWRkZWQgaW5zdGFsbCB0YXJnZXQgdG8gTWFrZWZpbGUubXN2YwogbyBvbmx5IGZhbGwgYmFjayB0byBBRl9JTkVUIHNlYXJjaGVzIHdoZW4gbG9va2luZyBmb3IgQUZfVU5TUEVDIGFkZHJlc3NlcwogbyBmaXhlZCBhcmVzX3BhcnNlXypfcmVwbHkgbWVtb3J5IGxlYWtzCiBvIFVzZSBjb3JyZWN0IHNpemVvZiBpbiBhcmVzX2dldG5hbWVpbmZvKCkKIG8gSVB2Ni1vbi13aW5kb3dzOiBmaW5kIEROUyBzZXJ2ZXJzIGNvcnJlY3RseQogbyBtYW4gcGFnZXM6IGRvY3MgZm9yIHRoZSBjLWFyZXMgdXRpbGl0eSBwcm9ncmFtcwogbyBnZXRzZXJ2Ynlwb3J0IHJlcGxhY2VtZW50IGZvciBXaW4gQ0UKIG8gY29uZmlnX3NvcnRsaXN0OiAod2luMzIpIG1pc3NpbmcgZWxzZQogbyBhZHZhbmNlX3RjcF9zZW5kX3F1ZXVlOiBhdm9pZCBOVUxMIHB0ciBkZXJlZmVyZW5jZQogbyBjb25maWd1cmU6IGZpeCBhIGJhc2hpc20KIG8gYXJlc19leHBhbmRfbmFtZTogRml4IGVuY29kZWQgbGVuZ3RoIGZvciBpbmRpcmVjdCByb290CgpWZXJzaW9uIDEuNy40IChEZWNlbWJlciA5LCAyMDEwKQoKQ2hhbmdlZDoKCiBvIGxvY2FsLWJpbmQ6IFN1cHBvcnQgYmluZGluZyB0byBsb2NhbCBpbnRlcmZhY2UvSVBzLCBzZWUKICAgYXJlc19zZXRfbG9jYWxfaXA0LCBhcmVzX3NldF9sb2NhbF9pcDYsIGFyZXNfc2V0X2xvY2FsX2RldgoKRml4ZWQ6CgogbyBtZW1vcnkgbGVhayBpbiBhcmVzX2dldG5hbWVpbmZvCiBvIGFkZCBtaXNzaW5nIGJyZWFrIHRoYXQgY2F1c2VkIGdldF9hcmVzX3NlcnZlcnMgdG8gZmFpbAogbyBhcmVzX3BhcnNlX2FfcmVwbHk6IGZpeCBDTkFNRSByZXNwb25zZSBwYXJzaW5nCiBvIGluaXRfYnlfb3B0aW9uczogZG9uJ3QgY29weSBhbiBlbXB0eSBzb3J0bGlzdAogbyBSZXBsYWNlZCB1aW50MzJfdCB3aXRoIHVuc2lnbmVkIGludCB0byBmaXggYnJva2VuIGJ1aWxkcwogICBvbiBhIGNvdXBsZSBvZiBwbGF0Zm9ybXMKIG8gRml4IGxvb2t1cCB3aXRoIEhPU1RBTElBU0VTIHNldAogbyBhZGlnOiBmaXggTkFQVFIgcGFyc2luZwogbyBjb21waWxlciB3YXJuaW5nIGNsZWFudXBzCgpWZXJzaW9uIDEuNy4zIChKdW5lIDExLCAyMDEwKQoKRml4ZWQ6CgogbyBidWlsZHMgb24gQW5kcm9pZAogbyBub3cgaW5jbHVkZXMgYWxsIGZpbGVzIG5lY2Vzc2FyeSB0byBidWlsZCBpdCAoMS43LjIgbGFja2VkIGEgZmlsZSkKClZlcnNpb24gMS43LjIgKEp1bmUgMTAsIDIwMTApCgpDaGFuZ2VkOgoKIG8gQWRkZWQgYXJlc19wYXJzZV9teF9yZXBseSgpCgpGaXhlZDoKCiBvIGFyZXNfaW5pdDogTGFzdCwgbm90IGZpcnN0IGluc3RhbmNlIG9mIGRvbWFpbiBvciBzZWFyY2ggc2hvdWxkIHdpbgogbyBpbXByb3ZlIGFsdGVybmF0aXZlIGRlZmluaXRpb24gb2YgYm9vbAogbyBmaXggVlMyMDEwIGNvbXBpbGVyIHdhcm5pbmdzCgoKVmVyc2lvbiAxLjcuMSAoTWFyIDIzLCAyMDEwKQoKKiBNYXkgMzEsIDIwMTAgKEpha3ViIEhyb3playkKLSBVc2UgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgZG9tYWluL3NlYXJjaCwgbm90IHRoZSBmaXJzdCBvbmUKCiogTWFyY2ggMjMsIDIwMTAgKERhbmllbCBTdGVuYmVyZykKLSBXZSBzd2l0Y2hlZCBmcm9tIENWUyB0byBnaXQuIFNlZSBodHRwOi8vZ2l0aHViLmNvbS9iYWdkZXIvYy1hcmVzCgoqIE1hcmNoIDUsIDIwMTAgKERhbmllbCBTdGVuYmVyZykKLSBEYW5pZWwgSm9obnNvbiBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgd2l0aCB0aGUgY2xhbmcgY29tcGlsZXIuCgoqIE1hcmNoIDUsIDIwMTAgKFlhbmcgVHNlKQotIEFkZGVkIElQdjYgbmFtZSBzZXJ2ZXJzIHN1cHBvcnQuIEltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIGNvZGUsCiAgY29tbWVudHMgYW5kIGZlZWRiYWNrIHByb3ZpZGVkIE5vdmVtYmVyIGFuZCBEZWNlbWJlciBvZiAyMDA4IGJ5IERhbmllbAogIFN0ZW5iZXJnLCBHcmVnb3IgSmFzbnksIFBoaWwgQmx1bmRlbGwgYW5kIG15c2VsZiwgRGVjZW1iZXIgMjAwOSBieSBDZWRyaWMKICBCYWlsLCBhbmQgRmVicnVhcnkgMjAxMCBieSBKYWt1YiBIcm96ZWsgb24gdGhlIGMtYXJlcyBtYWlsaW5nIGxpc3QuIE9uCiAgTWFyY2ggSSByZXZpZXdlZCBhbGwgdGhhdCwgc2VsZWN0ZWQgdGhlIGJlc3Qgb2YgZWFjaCwgYW5kIGFkanVzdGVkIG9yCiAgZXh0ZW5kZWQgcGFydHMgb2YgaXQgdG8gbWFrZSB0aGUgYmVzdCBmaXQuCgogIFRoZSBleHRlcm5hbCBhbmQgdmlzaWJsZSByZXN1bHQgb2YgYWxsIHRoaXMgaXMgdGhhdCB0d28gbmV3IGZ1bmN0aW9ucyBhcmUKICBhZGRlZCB0byB0aGUgZXh0ZXJuYWwgQVBJLCBhcmVzX2dldF9zZXJ2ZXJzKCkgYW5kIGFyZXNfc2V0X3NlcnZlcnMoKSwgd2hpY2gKICBiZWNvbWVzIG5vdyB0aGUgcHJlZmVycmVkIHdheSBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIG5hbWUgc2VydmVycyBmb3IgYW55CiAgYXJlcyBjaGFubmVsIGFzIHRoZXNlIHN1cHBvcnQgYm90aCBJUHY0IGFuZCBJUHY2IG5hbWUgc2VydmVycy4KCiAgSW4gb3JkZXIgdG8gbm90IGJyZWFrIEFCSSBjb21wYXRpYmlsaXR5LCBhcmVzX2luaXRfb3B0aW9ucygpIHdpdGggb3B0aW9uCiAgbWFzayBBUkVTX09QVF9TRVJWRVJTIGFuZCBhcmVzX3NhdmVfb3B0aW9ucygpIG1heSBzdGlsbCBiZSB1c2VkIGluIGNvZGUKICB3aGljaCBpcyBpbnRlbmRlZCB0byBydW4gb24gSVB2NC1vbmx5IHN0YWNrcy4gQnV0IHJlbWVtYmVyIHRoYXQgdGhlc2UKICBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgSVB2NiBuYW1lIHNlcnZlcnMuIFRoaXMgaW1wbGllcyB0aGF0IGlmIHRoZSB1c2VyCiAgaXMgY2FwYWJsZSBvZiBkZWZpbmluZyBvciBwcm92aWRpbmcgYW4gSVB2NiBuYW1lIHNlcnZlciwgYW5kIHRoZSBhcHAgaXMKICB1c2luZyBhcmVzX2luaXRfb3B0aW9ucygpIG9yIGFyZXNfc2F2ZV9vcHRpb25zKCkgYXQgc29tZSBwb2ludCB0byBoYW5kbGUKICB0aGUgbmFtZSBzZXJ2ZXJzLCB0aGUgYXBwIHdpbGwgbGlrZWx5IGxvc2UgSVB2NiBuYW1lIHNlcnZlcnMuCgoqIEphbnVhcnkgMjgsIDIwMTAgKERhbmllbCBTdGVuYmVyZykKLSBUb21taWUgR2FubmVydCBwb2ludGVkIG91dCBhIHNpbGx5IGJ1ZyBpbiBhcmVzX3Byb2Nlc3NfZmQoKSBzaW5jZSBpdCBkaWRuJ3QKICBjaGVjayBmb3IgYnJva2VuIGNvbm5lY3Rpb25zIGxpa2UgYXJlc19wcm9jZXNzKCkgZGlkLiBCYXNlZCBvbiB0aGF0LCBJCiAgbWVyZ2VkIHRoZSB0d28gZnVuY3Rpb25zIGludG8gYSBzaW5nbGUgZ2VuZXJpYyBvbmUgd2l0aCB0d28gZnJvbnQtZW5kcy4KCiogRGVjZW1iZXIgMjksIDIwMDkgKFlhbmcgVHNlKQotIExhc3psbyBUYW1hcyBTemFibyBhZGp1c3RlZCBNYWtlZmlsZS5tc3ZjIGNvbXBpbGVyIG9wdGlvbnMgc28gdGhhdCB3aGVyZQogIHJ1bi10aW1lIGVycm9yIGNoZWNrcyBlbmFibGluZyBjb21waWxlciBvcHRpb24gL0daIHdhcyB1c2VkIGl0IGlzIHJlcGxhY2VkCiAgd2l0aCBlcXVpdmFsZW50IC9SVENzdSBmb3IgVmlzdWFsIFN0dWRpbyAyMDAzIGFuZCBuZXdlciB2ZXJzaW9ucy4gT3B0aW9uCiAgL0dYIGlzIHJlcGxhY2VkIHdpdGggZXF1aXZhbGVudCAvRUhzYyBmb3IgYWxsIHZlcnNpb25zLiBBbHNvIGZpeGVkIHNvY2tldAogIGRhdGEgdHlwZSBmb3IgaW50ZXJuYWwgY29uZmlndXJlX3NvY2tldCBmdW5jdGlvbi4KCiogRGVjZW1iZXIgMjEsIDIwMDkgKFlhbmcgVHNlKQotIEluZ21hciBSdW5nZSBub3RpY2VkIHRoYXQgV2luZG93cyBjb25maWctd2luMzIuaCBjb25maWd1cmF0aW9uIGZpbGUKICBkaWQgbm90IGluY2x1ZGUgYSBkZWZpbml0aW9uIGZvciBIQVZFX0NMT1NFU09DS0VUIHdoaWNoIHJlc3VsdGVkIGluCiAgZnVuY3Rpb24gY2xvc2UoKSBiZWluZyBpbmFwcHJvcHJpYXRlbHkgdXNlZCB0byBjbG9zZSBzb2NrZXRzLgoKVmVyc2lvbiAxLjcuMCAoTm92IDMwLCAyMDA5KQoKKiBOb3ZlbWJlciAyNiwgMjAwOSAoWWFuZyBUc2UpCi0gTGFycnkgTGFuc2luZyBmaXhlZCBhcmVzX3BhcnNlX3Nydl9yZXBseSB0byBwcm9wZXJseSBwYXJzZSByZXBsaWVzCiAgd2hpY2ggbWlnaHQgY29udGFpbiBub24tU1JWIGFuc3dlcnMsIHNraXBwaW5nIG92ZXIgcG90ZW50aWFsIG5vbi1TUlYKICBvbmVzIHN1Y2ggYXMgQ05BTUVzLgoKKiBOb3ZlbWJlciAyMywgMjAwOSAoWWFuZyBUc2UpCi0gQ2hhbmdlZCBuYW1pbmcgY29udmVudGlvbiBmb3IgYy1hcmVzIGxpYnJhcmllcyBidWlsdCB3aXRoIE1TVkMsIGRldGFpbHMKICBhbmQgYnVpbGQgaW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGluIFJFQURNRS5tc3ZjIGZpbGUuCgoqIE5vdmVtYmVyIDIyLCAyMDA5IChZYW5nIFRzZSkKLSBKYWt1YiBIcm96ZWsgZml4ZWQgbW9yZSBmdW5jdGlvbiBwcm90b3R5cGVzIGluIG1hbiBwYWdlcyB0byBzeW5jIHRoZW0KICB3aXRoIHRoZSBvbmVzIGRlY2xhcmVkIGluIGFyZXMuaAoKLSBKYWt1YiBIcm96ZWsgcmVuYW1lZCBhZGRydHRsIGFuZCBhZGRyNnR0bCBzdHJ1Y3RzIHRvIGFyZXNfYWRkcnR0bCBhbmQKICBhcmVzX2FkZHI2dHRsIGluIG9yZGVyIHRvIHByZXZlbnQgbmFtZSBzcGFjZSBwb2xsdXRpb24sIGFsb25nIHdpdGgKICBuZWNlc3NhcnkgY2hhbmdlcyB0byBjb2RlIGJhc2UgYW5kIG1hbiBwYWdlcy5UaGlzIGNoYW5nZSBkb2VzIG5vdCBicmVhawogIEFCSSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZWNvbXBpbGUgZXhpc3RpbmcgYXBwbGljYXRpb25zLiBCdXQgZXhpc3RpbmcKICBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlc2Ugc3RydWN0cyB3aXRoIHRoZSBvbGQgbmFtZSB3aWxsIG5lZWQgc291cmNlIGNvZGUKICBhZGp1c3RtZW50cyB3aGVuIHJlY29tcGlsZWQgdXNpbmcgYy1hcmVzIDEuNy4wLgoKKiBOb3ZlbWJlciAyMSwgMjAwOSAoWWFuZyBUc2UpCi0gQWRkZWQgbWFuaWZlc3Qgc3R1ZmYgdG8gTWFrZWZpbGUubXN2Yy4KCiogTm92ZW1iZXIgMjAsIDIwMDkgKFlhbmcgVHNlKQotIEZpeGVkIHNldmVyYWwgZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBtYW4gcGFnZXMgdGhhdCB3ZXJlIG91dCBvZiBzeW5jCiAgd2l0aCB0aGUgb25lcyBkZWNsYXJlZCBpbiBhcmVzLmguICBBZGRlZCBhcmVzX2ZyZWVfZGF0YSgpIGFsb25nIHdpdGgKICBtYW4gcGFnZS4gIFVwZGF0ZWQgYXJlc19wYXJzZV9zcnZfcmVwbHkoKSBhbmQgYXJlc19wYXJzZV90eHRfcmVwbHkoKQogIHdpdGggY2hhbmdlcyBmcm9tIEpha3ViIEhyb3playBtYWtpbmcgdGhlc2Ugbm93IHJldHVybiBsaW5rZWQgbGlzdHMKICBpbnN0ZWFkIG9mIGFycmF5cywgYW5kIG1lcmdpbmcgdGhlIGFyZXNfZnJlZV9kYXRhKCkgYWRqdXN0bWVudHMuCgoqIE5vdmVtYmVyIDEwLCAyMDA5IChZYW5nIFRzZSkKLSBVcGRhdGVkIE1TVkMgNi4wIHByb2plY3QgZmlsZXMgdG8gbWF0Y2ggc2V0dGluZ3MgZnJvbSBNYWtlZmlsZS5tc3ZjLgoKKiBOb3ZlbWJlciA5LCAyMDA5IChZYW5nIFRzZSkKLSBNYWtlZmlsZS5tc3ZjIGlzIG5vdyB0aGUgcmVmZXJlbmNlIG1ldGhvZCB0byBidWlsZCBjLWFyZXMgYW5kIHNhbXBsZQogIHByb2dyYW1zIHdpdGggYW55IE1TVkMgY29tcGlsZXIgb3IgTVMgVmlzdWFsIFN0dWRpbyB2ZXJzaW9uLiAgSWYgbm8KICBvcHRpb24gb3IgdGFyZ2V0IGFyZSBzcGVjaWZpZWQgaXQgYnVpbGRzIGR5bmFtaWMgYW5kIHN0YXRpYyBjLWFyZXMKICBsaWJyYXJpZXMgaW4gZGVidWcgYW5kIHJlbGVhc2UgZmxhdm91cnMgYW5kIGFsc28gYnVpbGRzIGFsbCBzYW1wbGUKICBwcm9ncmFtcyB1c2luZyBlYWNoIG9mIHRoZSBkaWZmZXJlbnQgYy1hcmVzIGxpYnJhcmllcy4KCiogTm92ZW1iZXIgMiwgMjAwOSAoWWFuZyBUc2UpCi0gUmVuYW1lZCBjLWFyZXMgc2V0dXAuaCB0byBhcmVzX3NldHVwLmgKCiogT2N0b2JlciAzMSwgMjAwOSAoWWFuZyBUc2UpCi0gU3ltYm9sIGhpZGluZyBjb25maWd1cmUgb3B0aW9ucyBhcmUgbmFtZWQgbm93IC0tZW5hYmxlLXN5bWJvbC1oaWRpbmcKICBhbmQgLS1kaXNhYmxlLXN5bWJvbC1oaWRpbmcgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZW0gbGVzcyBhbWJpZ3VvdXMuCgoqIE9jdG9iZXIgMzAsIDIwMDkgKFlhbmcgVHNlKQotIE1hbnkgZml4ZXMgZm9yIGFyZXNfcGFyc2VfdHh0X3JlcGx5KCkKCiogT2N0b2JlciAyOSwgMjAwOSAoRGFuaWVsIFN0ZW5iZXJnKQotIEpha3ViIEhyb3playBhZGRlZCBhcmVzX3BhcnNlX3R4dF9yZXBseSgpIGZvciBUWFQgcGFyc2luZwoKKiBPY3RvYmVyIDI5LCAyMDA5IChZYW5nIFRzZSkKLSBVcGRhdGVkIE1TVkMgNi4wIHdvcmtzcGFjZSBhbmQgcHJvamVjdCBmaWxlcyB0aGF0IGFsbG93cyBidWlsZGluZwogIGR5bmFtaWMgYW5kIHN0YXRpYyBjLWFyZXMgbGlicmFyaWVzIGluIGRlYnVnIGFuZCByZWxlYXNlIGZsYXZvdXJzLgogIEFkZGl0aW9uYWxseSBlYWNoIG9mIHRoZSB0aHJlZSBzYW1wbGUgcHJvZ3JhbXMgaXMgYnVpbHQgYWdhaW5zdAogIGVhY2ggb2YgdGhlIGZvdXIgcG9zc2libGUgYy1hcmVzIGxpYnJhcmllcywgZ2VuZXJhdGluZyBhbGwgdGhpcwogIGEgdG90YWwgbnVtYmVyIG9mIDEyIGV4ZWN1dGFibGVzIGFuZCA0IGxpYnJhcmllcy4KCiogT2N0b2JlciAyOCwgMjAwOSAoWWFuZyBUc2UpCi0gSW5pdGlhbCBzdGVwIHRvd2FyZHMgdGhlIGFiaWxpdHkgdG8gcmVkdWNlIGMtYXJlcyBleHBvcnRlZCBzeW1ib2xzCiAgd2hlbiBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5IGJhc2VkIG9uIHRoZSAndmlzaWJpbGl0eScgYXR0cmlidXRlCiAgZm9yIEdOVUMgYW5kIEludGVsIGNvbXBpbGVycyBhbmQgYmFzZWQgb24gX19nbG9iYWwgZm9yIFN1biBjb21waWxlcnMsCiAgdGFraW5nIGFsc28gaW4gYWNjb3VudCBfX2RlY2xzcGVjIGZ1bmN0aW9uIGRlY29yYXRpb24gZm9yIFdpbjMyIGFuZAogIFN5bWJpYW4gRExMJ3MuCgoqIE9jdG9iZXIgMjcsIDIwMDkgKFlhbmcgVHNlKQotIEZpeGVkIFBlbGxlcyBDIFdpbjMyIHRhcmdldCBjb21waWxhdGlvbiBpc3N1ZXMuCgoqIE9jdG9iZXIgMjMsIDIwMDkgKFlhbmcgVHNlKQotIEpvaG4gRW5nZWxoYXJ0IG5vdGljZWQgYW4gdW5yZWxlYXNlZCBwcm9ibGVtIHJlbGF0aXZlIHRvIGEgZHVwbGljYXRlCiAgQVJFU19FQ0FOQ0VMTEVEIGVycm9yIGNvZGUgdmFsdWUgYW5kIG1pc3NpbmcgZXJyb3IgY29kZSBkZXNjcmlwdGlvbi4KCiogT2N0b2JlciA3LCAyMDA5IChZYW5nIFRzZSkKLSBPdmVyaGF1bGVkIGFyZXNfX2dldF9ob3N0ZW50KCkgRml4aW5nIG91dCBvZiBib3VuZHMgbWVtb3J5IG92ZXJ3cml0ZQogIHRyaWdnZXJlZCB3aXRoIG1hbGZvcm1lZCAvZXRjL2hvc3RzIGZpbGUuIEltcHJvdmluZyBwYXJzaW5nIG9mIC9ldGMvaG9zdHMKICBmaWxlLiBWYWxpZGF0aW5nIHJlcXVlc3RlZCBhZGRyZXNzIGZhbWlseS4gRW5zdXJpbmcgdGhhdCBmYWlsdXJlcyBhbHdheXMKICByZXR1cm4gYSBOVUxMIHBvaW50ZXIuIEFkanVzdGluZyBoZWFkZXIgaW5jbHVzaW9ucy4KCiogT2N0b2JlciA2LCAyMDA5IChZYW5nIFRzZSkKLSBGaXggc3NpemVfdCByZWRlZmluaXRpb24gZXJyb3JzIG9uIFdJTjY0IHJlcG9ydGVkIGJ5IEFsZXhleSBTaW1hay4KCiogU2VwdGVtYmVyIDI5LCAyMDA5IChZYW5nIFRzZSkKLSBNYWtlIGNvbmZpZ3VyZSBzY3JpcHQgYWxzbyBjaGVjayBpZiBfUkVFTlRSQU5UIGRlZmluaXRpb24gaXMgcmVxdWlyZWQgdG8KICBtYWtlIGVycm5vIGF2YWlsYWJsZSBhcyBhIHByZXByb2Nlc3NvciBtYWNyby4KCiogU2VwdGVtYmVyIDcsIDIwMDkgKFlhbmcgVHNlKQotIEFkZCBUX1NSViBwb3J0YWJpbGl0eSBjaGVjayB0byBhcmVzX3BhcnNlX3Nydl9yZXBseS5jCgoqIDQgU2VwIDIwMDkgKERhbmllbCBTdGVuYmVyZykKLSBKYWt1YiBIcm96ZWsgYWRkZWQgYXJlc19wYXJzZV9zcnZfcmVwbHkoKSBmb3IgU1JWIHBhcnNpbmcKCiogMyBBdWcgMjAwOSAoRGFuaWVsIFN0ZW5iZXJnKQotIEpvc2h1YSBLd2FuIGZpeGVkIHRoZSBpbml0IHJvdXRpbmUgdG8gZmlsbCBpbiB0aGUgZGVmYXVsdHMgZm9yIHN0dWZmIHRoYXQKICBmYWlscyB0byBnZXQgaW5pdGVkIGJ5IG90aGVyIG1lYW5zLiBUaGlzIGZpeGVzIGEgY2FzZSBvZiB3aGVuIHRoZSBjLWFyZXMKICBpbml0IGZhaWxzIHdoZW4gaW50ZXJuZXQgYWNjZXNzIGlzIGZvbmUuCgotIFRpbW8gVGVyYXMgY2hhbmdlZCB0aGUgcmVhc29uIGNvZGUgdXNlZCBpbiB0aGUgcmVzb2x2ZSBjYWxsYmFjayBkb25lIHdoZW4KICBhcmVzX2NhbmNlbCgpIGlzIHVzZWQsIHRvIGJlIEFSRVNfRUNBTkNFTExFRCBpbnN0ZWFkIG9mIEFSRVNfRVRJTUVPVVQgdG8KICBiZXR0ZXIgYWxsb3cgdGhlIGNhbGxiYWNrIHRvIGtub3cgd2hhdCdzIGhhcHBlbmluZy4KCiogMTQgSnVsIDIwMDkgKEd1ZW50ZXIgS25hdWYpCi0gcmVuYW1lZCBnZW5lcmF0ZWQgY29uZmlnLmggdG8gYXJlc19jb25maWcuaCB0byBhdm9pZCBhbnkgZnV0dXJlIGNsYXNoZXMKICB3aXRoIGNvbmZpZy5oIGZyb20gb3RoZXIgcHJvamVjdHMuCgoqIEp1bmUgMjAgMjAwOSAoWWFuZyBUc2UpCi0gUmVmYWN0b3IgaG93IGxpYnJhcmllcyBhcmUgY2hlY2tlZCBmb3IgY29ubmVjdCgpIGZ1bmN0aW9uIGluIGNvbmZpZ3VyZQogIHNjcmlwdCBhbmQgY2hlY2sgZm9yIGNvbm5lY3QoKSBhcyBpdCBpcyBkb25lIGZvciBvdGhlciBmdW5jdGlvbnMuCgoqIEp1bmUgMTkgMjAwOSAoWWFuZyBUc2UpCi0gTWFrZSBzY2xvc2UoKSBmdW5jdGlvbi1saWtlIG1hY3JvIGRlZmluaXRpb24gdXNlZCB0byBjbG9zZSBhIHNvY2tldCwKICBub3cgc29sZWx5IGJhc2VkIG9uIEhBVkVfQ0xPU0VTT0NLRVQgYW5kIEhBVkVfQ0xPU0VTT0NLRVRfQ0FNRUwKICBjb25maWcgZmlsZSBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMKCiogSnVuZSAxOCAyMDA5IChZYW5nIFRzZSkKLSBBZGQgQ2xvc2VTb2NrZXQgY2FtZWwgY2FzZSBmdW5jdGlvbiBjaGVjayBmb3IgY29uZmlndXJlIHNjcmlwdC4KCiogSnVuZSAxNyAyMDA5IChZYW5nIFRzZSkKLSBDaGVjayBmb3Igc29ja2V0KCkgYW5kIGNsb3Nlc29ja2V0KCkgYXMgaXQgaXMgZG9uZSBmb3Igb3RoZXIgZnVuY3Rpb25zCiAgaW4gY29uZmlndXJlIHNjcmlwdC4KCiogSnVuZSAxMSAyMDA5IChZYW5nIFRzZSkKLSBNb2RpZmllZCBidWlsZGNvbmYgc28gdGhhdCB3aGVuIGF1dG9tYWtlIHJ1bnMgaXQgY29waWVzIG1pc3NpbmcgZmlsZXMKICBpbnN0ZWFkIG9mIHN5bWxpbmtpbmcgdGhlbS4KCiogSnVuZSA4IDIwMDkgKFlhbmcgVHNlKQotIFJlbW92ZWQgYnVpbGRjb25mLmJhdCBmcm9tIHJlbGVhc2UgYW5kIGRhaWx5IHNuYXBzaG90IGFyY2hpdmVzLiBUaGlzCiAgZmlsZSBpcyBvbmx5IGZvciBDVlMgdHJlZSBjaGVja291dCBidWlsZHMuCgoqIE1heSAyNiAyMDA5IChZYW5nIFRzZSkKLSBBZGRlZCAtLWVuYWJsZS1jdXJsZGVidWcgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgYW5kIGRpc2FibGUgYnVpbGRpbmcKICB3aXRoIHRoZSBsb3ctbGV2ZWwgY3VybCBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcgJ2ZlYXR1cmUnIHRvIGFsbG93IGRlY291cGxlZAogIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1ZywgYWxsb3dpbmcgYWdhaW4gdG8gYnVpbGQgYy1hcmVzIGluZGVwZW5kZW50bHkKICBvdXQgb2YgdGhlIENWUyB0cmVlLgoKICBGb3IgdGhlIGMtYXJlcyBsaWJyYXJ5IG9wdGlvbiAtLWVuYWJsZS1kZWJ1ZyBlbmFibGVzIGRlYnVnIGJ1aWxkIGZlYXR1cmVzCiAgd2hpY2ggYXJlIF9ub3RfIHJlbGF0ZWQgd2l0aCBtZW1vcnkgdHJhY2tpbmcuIEZvciB0aGUgYy1hcmVzIGxpYnJhcnkgd2hlbgogIC0tZW5hYmxlLWRlYnVnIGlzIGdpdmVuIGl0IGRvZXMgbm90IGVuYWJsZSB0aGUgbWVtb3J5IHRyYWNraW5nIGZlYXR1cmUuIElmCiAgeW91IHdpc2ggdG8gZW5hYmxlIHRoZSBjdXJsIGRlYnVnIG1lbW9yeSB0cmFja2luZyB5b3UgbXVzdCB1c2UgY29uZmlndXJlCiAgb3B0aW9uIC0tZW5hYmxlLWN1cmxkZWJ1ZyBleHBsaWNpdGlseSB0byBkbyBzby4KCiAgSW50ZXJuYWxseSwgZGVmaW5pdGlvbiBvZiBwcmVwcm9jZXNzb3Igc3ltYm9sIERFQlVHQlVJTEQgcmVzdHJpY3RzIGNvZGUKICB3aGljaCBpcyBvbmx5IGNvbXBpbGVkIGZvciBkZWJ1ZyBlbmFibGVkIGJ1aWxkcy4gQW5kIHN5bWJvbCBDVVJMREVCVUcgaXMKICB1c2VkIHRvIGRpZmZlcmVudGlhdGUgY29kZSB3aGljaCBpcyBfb25seV8gdXNlZCBmb3IgbWVtb3J5IHRyYWNraW5nLgoKICBNYWtlIGFyZXNfaW5pdCgpLCBhcmVzX2R1cCgpIGFuZCBhcmVzX2luaXRfb3B0aW9ucygpIGZhaWwgcmV0dXJuaW5nCiAgQVJFU19FTk9USU5JVElBTElaRUQgaWYgbGlicmFyeSBpbml0aWFsaXphdGlvbiBoYXMgbm90IGJlZW4gcGVyZm9ybWVkCiAgY2FsbGluZyBhcmVzX2xpYnJhcnlfaW5pdCgpLgoKKiBNYXkgMjAgMjAwOSAoWWFuZyBUc2UpCi0gQWRkZWQgYXJlc19saWJyYXJ5X2luaXQoKSBhbmQgYXJlc19saWJyYXJ5X2NsZWFudXAoKSBtYW4gcGFnZXMuCgoqIE1heSAxOSAyMDA5IChZYW5nIFRzZSkKLSBJbnRyb2R1Y2VkIGFyZXNfbGlicmFyeV9pbml0KCkgYW5kIGFyZXNfbGlicmFyeV9jbGVhbnVwKCkgZnVuY3Rpb25zLgoKICBUaGlzIGlzIGFuIEFQSSBhbmQgQUJJIGJyZWFrIGZvciBXaW4zMi82NCBzeXN0ZW1zLiBOb24tV2luMzIvNjQgYnVpbGQgdGFyZ2V0cwogIHVzaW5nIGMtYXJlcyAxLjcuMCBjYW4gc3RpbGwgc3Vydml2ZSB3aXRob3V0IGNhbGxpbmcgdGhlc2UgZnVuY3Rpb25zLiBSZWFkIGFsbAogIHRoZSBkZXRhaWxzIG9uIGFyZXNfbGlicmFyeV9pbml0KDMpIGFuZCBhcmVzX2xpYnJhcnlfY2xlYW51cCgzKSBtYW4gcGFnZXMgdGhhdAogIGFyZSBpbmNsdWRlZC4KCiAgY3VybC9saWJjdXJsIDcuMTkuNSBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggYy1hcmVzIDEuNy4wIG9uIGFsbCBzeXN0ZW1zLgoKICBJbiBvcmRlciB0byB1c2UgYy1hcmVzIDEuNy4wIHdpdGggY3VybC9saWJjdXJsIG9uIFdpbjMyLzY0IHN5c3RlbXMgaXQgaXMKICByZXF1aXJlZCB0aGF0IGN1cmwvbGliY3VybCBpcyA3LjE5LjUgb3IgbmV3ZXIuIEluIG90aGVyIHdvcmRzLCBpdCBpcyBub3QKICBwb3NzaWJsZSBvbiBXaW4zMi82NCB0byB1c2UgYy1hcmVzIDEuNy4wIHdpdGggYSBjdXJsL2xpYmN1cmwgdmVyc2lvbiBsZXNzCiAgdGhhbiA3LjE5LjUKCiogTWF5IDExIDIwMDkgKERhbmllbCBTdGVuYmVyZykKLSBHcmVnb3IgSmFzbnkgbWFkZSBjLWFyZXMgbGluayB3aXRoIGxpYnRvb2wgJ3MgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IG9wdGlvbiB0bwogIG9ubHkgZXhwb3NlIGZ1bmN0aW9ucyBzdGFydGluZyB3aXRoIGFyZXNfLgoKKiBNYXkgNyAyMDA5IChZYW5nIFRzZSkKLSBGaXggYW4gbTQgb3ZlcnF1b3RpbmcgdHJpZ2dlcmluZyBhIHNwdXJpb3VzICdBU19UUl9DUFAnIHN5bWJvbCBkZWZpbml0aW9uCiAgYXR0ZW1wdCBpbiBnZW5lcmF0ZWQgY29uZmlnLmgKCiogTWF5IDIgMjAwOSAoWWFuZyBUc2UpCi0gVXNlIGEgYnVpbGQtdGltZSBjb25maWd1cmVkIGFyZXNfc29ja2xlbl90IGRhdGEgdHlwZSBpbnN0ZWFkIG9mIHNvY2tsZW5fdC4KCiogQXByaWwgMjEgMjAwOSAoWWFuZyBUc2UpCi0gTW92ZWQgcG90ZW50aWFsIGluY2x1c2lvbiBvZiBzeXN0ZW0ncyBtYWxsb2MuaCBhbmQgbWVtb3J5LmggaGVhZGVyIGZpbGVzIHRvCiAgc2V0dXBfb25jZS5oLiAgSW5jbHVzaW9uIG9mIGVhY2ggaGVhZGVyIGZpbGUgaXMgYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2YKICBORUVEX01BTExPQ19IIGFuZCBORUVEX01FTU9SWV9IIHJlc3BlY3RpdmVseS4KCiogTWFyY2ggMTEgMjAwOSAoWWFuZyBUc2UpCi0gSmFwaGV0aCBDbGVhdmVyIGZpeGVkIGFjb3VudHJ5LmMgcmVwbGFjaW5nIHVfbG9uZyB3aXRoIHVuc2lnbmVkIGxvbmcuCgoqIEZlYnJ1YXJ5IDIwIDIwMDkgKFlhbmcgVHNlKQotIERvIG5vdCBoYWx0IGNvbXBpbGF0aW9uIHdoZW4gdXNpbmcgVlMyMDA4IHRvIGJ1aWxkIGEgV2luZG93cyAyMDAwIHRhcmdldC4KCiogRmVicnVhcnkgMyAyMDA5IChQaGlsIEJsdW5kZWxsKQotIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBnYXJiYWdlIG9yIG5vdGhpbmcgYXQgYWxsIGluIHJlc3BvbnNlIHRvIGFuIEFBQUEgcXVlcnksCiAgZ28gb24gYW5kIGFzayBmb3IgQSByZWNvcmRzIGFueXdheS4KCiogSmFudWFyeSAzMSAyMDA5IChEYW5pZWwgU3RlbmJlcmcpCi0gYXJlc19nZXRob3N0YnluYW1lKCkgbm93IGFjY2VwdHMgJ0FGX1VOU1BFQycgYXMgYSBmYW1pbHkgZm9yIHJlc29sdmluZwogIGVpdGhlciBBRl9JTkVUNiBvciBBRl9JTkVULiBJdCB3b3JrcyBieSBhY2NlcHRpbmcgYW55IG9mIHRoZSBsb29rc3VwcyBpbiB0aGUKICBob3N0cyBmaWxlLCBhbmQgaXQgcmVzb2x2ZXMgdGhlIEFBQUEgZmllbGQgd2l0aCBhIGZhbGxiYWNrIHRvIEEuCgoqIEphbnVhcnkgMTQgMjAwOSAoRGFuaWVsIFN0ZW5iZXJnKQotIGFyZXMuaCBubyBsb25nZXIgdXNlcyB0aGUgSEFWRV9TVFJVQ1RfSU42X0FERFIgZGVmaW5lIGNoZWNrLCBidXQgaW5zdGVhZCBpdAogIG5vdyBkZWNsYXJlcyB0aGUgcHJpdmF0ZSBzdHJ1Y3QgYXJlc19pbjZfYWRkciBmb3IgYWxsIHN5c3RlbXMgaW5zdGVhZCBvZgogIHJlbHlpbmcgb24gb25lIHBvc3NpYmx5IG5vdCBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCgoqIEphbnVhcnkgMTMgMjAwOSAoUGhpbCBCbHVuZGVsbCkKLSBhcmVzX19zZW5kX3F1ZXJ5KCkgbm93IHZhcmllcyB0aGUgcmV0cnkgdGltZW91dCBwc2V1ZG8tcmFuZG9tbHkgdG8gYXZvaWQKICBwYWNrZXQgc3Rvcm1zIHdoZW4gc2V2ZXJhbCBxdWVyaWVzIHdlcmUgc3RhcnRlZCBhdCB0aGUgc2FtZSB0aW1lLgoKKiBKYW51YXJ5IDExIDIwMDkgKERhbmllbCBTdGVuYmVyZykKLSBQaGlsIEJsdW5kZWxsIGFkZGVkIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBhcmVzX19leHBhbmRfbmFtZV9mb3JfcmVzcG9uc2UoKQogIHRoYXQgaXMgbm93IHVzZWQgYnkgdGhlIGFyZXNfcGFyc2VfKl9yZXBseSgpIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHRoZQogIGFyZXNfZXhwYW5kX25hbWUoKSBzaW1wbHkgdG8gZWFzaWVyIHJldHVybiBBUkVTX0VCQURSRVNQIGZvciB0aGUgY2FzZXMgd2hlcmUKICB0aGUgbmFtZSBleHBhbnNpb24gZmFpbHMgYXMgaW4gcmVzcG9uc2VzIHRoYXQgcmVhbGx5IGlzbid0IGV4cGVjdGVkLgoKVmVyc2lvbiAxLjYuMCAoRGVjIDksIDIwMDgpCgoqIERlY2VtYmVyIDkgMjAwOCAoR2lzbGUgVmFuZW0pCgogIEZpeGVzIGZvciBXaW4zMiB0YXJnZXRzIHVzaW5nIHRoZSBXYXR0LTMyIHRjcC9pcCBzdGFjay4KCiogRGVjIDQgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQoKICBHcmVnb3IgSmFzbnkgcHJvdmlkZWQgdGhlIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBhcmVzX3NldF9zb2NrZXRfY2FsbGJhY2soKSwKICBhbmQgSSBlZGl0ZWQgaXQgdG8gYWxzbyBnZXQgZHVwZWQgYnkgYXJlc19kdXAoKS4KCiogRGVjIDMgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQoKICBBUEkgY2hhbmdlczoKCiAgSSBtYWRlIHN1cmUgdGhlIHB1YmxpYyBhcmVzX2NvbmZpZyBzdHJ1Y3QgbG9va3MgbGlrZSBiZWZvcmUgYW5kIHlldCBpdAogIHN1cHBvcnRzIHRoZSBST1RBVEUgb3B0aW9uIHRoYW5rcyB0byBjLWFyZXMgbm93IHN0b3JpbmcgdGhlICJvcHRtYXNrIgogIGludGVybmFsbHkuIFRodXMgd2Ugc2hvdWxkIGJlIEFCSSBjb21wYXRpYmxlIHdpdGggdGhlIHBhc3QgcmVsZWFzZShzKQogIG5vdy4gTXkgZWZmb3J0cyBtZW50aW9uZWQgYmVsb3cgc2hvdWxkIG5vdCBicmVhayBiYWNrd2FyZHMgQUJJIGNvbXBsaWFuY2UuCgogIEhlcmUncyBob3cgSSBzdWdnZXN0IHdlIHByb2NlZWQgd2l0aCB0aGUgQVBJOgoKICBhcmVzX2luaXQoKSB3aWxsIGJlIHByaW1hcnkgImNoYW5uZWwgY3JlYXRvciIgZnVuY3Rpb24uCgogIGFyZXNfaW5pdF9vcHRpb25zKCkgd2lsbCBjb250aW51ZSB0byB3b3JrIGV4YWN0bHkgbGlrZSBub3cgYW5kIGJlZm9yZS4gRm9yCiAgc3RhcnRlcnMsIGl0IHdpbGwgYmUgdGhlIChvbmx5KSB3YXkgdG8gc2V0IHRoZSBleGlzdGluZyBvcHRpb25zLgoKICBhcmVzX3NhdmVfb3B0aW9ucygpIHdpbGwgY29udGludWUgdG8gd29yayBsaWtlIHRvZGF5LCBidXQgd2lsbCBPTkxZIHNhdmUKICBvcHRpb25zIHRoYXQgeW91IGNhbiBzZXQgdG9kYXkgKGluY2x1ZGluZyBBUkVTX09QVF9ST1RBVEUgYWN0dWFsbHkpIGJ1dCBuZXcKICBvcHRpb25zIHRoYXQgd2UgYWRkIG1heSBub3QgYmUgc2F2ZWQgd2l0aCB0aGlzLgoKICBJbnN0ZWFkIHdlIGludHJvZHVjZToKCiAgYXJlc19kdXAoKSB0aGF0IGluc3RlYWQgY2FuIG1ha2UgYSBuZXcgY2hhbm5lbCBhbmQgY2xvbmUgdGhlIGNvbmZpZyB1c2VkCiAgZnJvbSBhbiBleGlzdGluZyBjaGFubmVsLiBJdCB3aWxsIHRoZW4gY2xvbmUgYWxsIGNvbmZpZyBvcHRpb25zLCBpbmNsdWRpbmcKICBmdXR1cmUgbmV3IHRoaW5ncyB3ZSBhZGQuCgogIGFyZXNfc2V0XyooKSBzdHlsZSBmdW5jdGlvbnMgdGhhdCBzZXQgKG5ldykgY29uZmlnIG9wdGlvbnMuIEFzIGEgc3RhcnQgd2UKICBzaW1wbHkgYWRkIHRoZXNlIGZvciBuZXcgZnVuY3Rpb25hbGl0eSwgYnV0IG92ZXIgdGltZSB3ZSBjYW4gYWxzbyBpbnRyb2R1Y2UKICB0aGVtIGZvciBleGlzdGluZyAic3RydWN0IGFyZXNfb3B0aW9ucyIgc28gdGhhdCB3ZSBjYW4gZXZlbnR1YWxseSBkZXByZWNhdGUKICB0aGUgdHdvIGFyZXNfKl9vcHRpb25zKCkgZnVuY3Rpb25zLgoKICBhcmVzX2dldF8qKCkgc3R5bGUgZnVuY3Rpb25zIGZvciBleHRyYWN0aW5nIGluZm8gZnJvbSBhIGNoYW5uZWwgaGFuZGxlIHRoYXQKICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGFyZXNfc2F2ZV9vcHRpb25zKCkuCgoqIE5vdiAyNiAyMDA4IChZYW5nIFRzZSkKLSBCcmFkIFNwZW5jZXIgcHJvdmlkZWQgY2hhbmdlcyB0byBhbGxvdyBidWlsZGNvbmYgdG8gd29yayBvbiBPUyBYLgoKLSBHZXJhbGQgQ29tYnMgZml4ZWQgYSBidWcgaW4gYXJlc19wYXJzZV9wdHJfcmVwbHkoKSB3aGljaCB3b3VsZCBjYXVzZSBhCiAgYnVmZmVyIHRvIHNocmluayBpbnN0ZWFkIG9mIGV4cGFuZCBpZiBhIHJlcGx5IGNvbnRhaW5lZCA4IG9yIG1vcmUgcmVjb3Jkcy4KCiogTm92IDI1IDIwMDggKFlhbmcgVHNlKQotIEluIHByZXBhcmF0aW9uIGZvciB0aGUgdXBjb21taW5nIElQdjYgbmFtZXNlcnZlcnMgcGF0Y2gsIHRoZSBpbnRlcm5hbAogIGFyZXNfYWRkciB1bmlvbiBpcyBub3cgY2hhbmdlZCBpbnRvIGFuIGludGVybmFsIHN0cnVjdCB3aGljaCBhbHNvIGhvbGRzCiAgdGhlIGFkZHJlc3MgZmFtaWx5LgoKKiBOb3YgMTkgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQotIEJyYWQgU3BlbmNlciBicm91Z2h0IHRoZSBuZXcgZnVuY3Rpb24gYXJlc19nZXRob3N0YnluYW1lX2ZpbGUoKSB3aGljaCBzaW1wbHkKICByZXNvbHZlcyBhIGhvc3QgbmFtZSBmcm9tIHRoZSBnaXZlbiBmaWxlLCB1c2luZyB0aGUgcmVndWxhciBob3N0cyBzeW50YXguCgoqIE5vdiAxIDIwMDggKERhbmllbCBTdGVuYmVyZykKLSBDYXJsbyBDb250YXZhbGxpIGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBnbGliYyAicm90YXRlIiBvcHRpb24sIGFzIGRvY3VtZW50ZWQKICBpbiBtYW4gcmVzb2x2LmNvbmY6CgogIGNhdXNlcyByb3VuZCByb2JpbiBzZWxlY3Rpb24gb2YgbmFtZXNlcnZlcnMgZnJvbSBhbW9uZyB0aG9zZSBsaXN0ZWQuICBUaGlzCiAgaGFzIHRoZSBlZmZlY3Qgb2Ygc3ByZWFkaW5nIHRoZSBxdWVyeSBsb2FkIGFtb25nIGFsbCBsaXN0ZWQgc2VydmVycywgcmF0aGVyCiAgdGhhbiBoYXZpbmcgYWxsIGNsaWVudHMgdHJ5IHRoZSBmaXJzdCBsaXN0ZWQgc2VydmVyIGZpcnN0IGV2ZXJ5IHRpbWUuCgogIFlvdSBjYW4gZW5hYmxlIGl0IHdpdGggQVJFU19PUFRfUk9UQVRFCgoqIE9jdCAyMSAyMDA4IChZYW5nIFRzZSkKICBDaGFybGVzIEhhcmRpbiBhZGRlZCBoYW5kbGluZyBvZiBFSU5QUk9HUkVTUyBmb3IgVURQIGNvbm5lY3RzLgoKKiBPY3QgMTggMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQogIENoYXJsZXMgSGFyZGluIG1hZGUgYWRpZyBzdXBwb3J0IGEgcmVndWxhciBudW1lcmljYWwgZG90dGVkIElQIGFkZHJlc3MgZm9yIHRoZQogIC1zIG9wdGlvbiBhcyB3ZWxsLgoKKiBPY3QgNyAyMDA4IChZYW5nIFRzZSkKLSBBZGRlZCAtLWVuYWJsZS1vcHRpbWl6ZSBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBjb21waWxlcgogIG9wdGltaXphdGlvbnMgdG8gYWxsb3cgZGVjb3VwbGVkIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1Zy4KCiogT2N0IDIgMjAwOCAoWWFuZyBUc2UpCi0gQWRkZWQgLS1lbmFibGUtd2FybmluZ3MgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgYW5kIGRpc2FibGUgc3RyaWN0CiAgY29tcGlsZXIgd2FybmluZ3MgdG8gYWxsb3cgZGVjb3VwbGVkIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1Zy4KCiogU2VwIDE3IDIwMDggKFlhbmcgVHNlKQotIENvZGUgcmVvcmdhbml6YXRpb24gdG8gYWxsb3cgaW50ZXJuYWwvcHJpdmF0ZSB1c2Ugb2YgIm5hbWVzZXIuaCIgdG8gYW55CiAgc3lzdGVtIHRoYXQgbGFja3MgYXJwYS9uYW1lc2VyLmggb3IgYXJwYS9uYW1lc2VyX2NvbXBhdC5oIGhlYWRlciBmaWxlcy4KCiogU2VwIDE2IDIwMDggKFlhbmcgVHNlKQotIENvZGUgcmVvcmdhbml6YXRpb24gdG8gYWxsb3cgaW50ZXJuYWwvcHJpdmF0ZSB1c2Ugb2YgYXJlc193cml0ZXYgdG8gYW55CiAgc3lzdGVtIHRoYXQgbGFja3MgdGhlIHdyaXRldiBmdW5jdGlvbi4KCiogU2VwIDE1IDIwMDggKFlhbmcgVHNlKQotIENvZGUgcmVvcmdhbml6YXRpb24gdG8gYWxsb3cgaW50ZXJuYWwvcHJpdmF0ZSB1c2Ugb2YgYXJlc19zdHJjYXNlY21wIHRvIGFueQogIHN5c3RlbSB0aGF0IGxhY2tzIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLgoKLSBJbXByb3ZlIGNvbmZpZ3VyZSBkZXRlY3Rpb24gb2Ygc29tZSBzdHJpbmcgZnVuY3Rpb25zLgoKKiBTZXAgMTEgMjAwOCAoWWFuZyBUc2UpCi0gQ29kZSByZW9yZ2FuaXphdGlvbiB0byBhbGxvdyBpbnRlcm5hbC9wcml2YXRlIHVzZSBvZiBhcmVzX3N0cmR1cCB0byBhbnkKICBzeXN0ZW0gdGhhdCBsYWNrcyB0aGUgc3RyZHVwIGZ1bmN0aW9uLgoKVmVyc2lvbiAxLjUuMyAoQXVnIDI5LCAyMDA4KQoKKiBBdWcgMjUgMjAwOCAoWWFuZyBUc2UpCi0gSW1wcm92ZW1lbnQgYnkgQnJhZCBIb3VzZToKCiAgVGhpcyBwYXRjaCBhZGRyZXNzZXMgYW4gaXNzdWUgaW4gd2hpY2ggYSByZXNwb25zZSBjb3VsZCBiZSBzZW50IGJhY2sgdG8gdGhlCiAgc291cmNlIHBvcnQgb2YgYSBjbGllbnQgZnJvbSBhIGRpZmZlcmVudCBhZGRyZXNzIHRoYW4gdGhlIHJlcXVlc3Qgd2FzIG1hZGUgdG8uCiAgVGhpcyBpcyBvbmUgZm9ybSBvZiBhIEROUyBjYWNoZSBwb2lzb25pbmcgYXR0YWNrLgoKICBUaGUgcGF0Y2ggc2ltcGx5IHVzZXMgcmVjdmZyb20oKSByYXRoZXIgdGhhbiByZWN2KCkgYW5kIHZhbGlkYXRlcyB0aGF0IHRoZQogIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSByZWN2ZnJvbSgpIG1hdGNoZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciB3ZSBoYXZlCiAgY29ubmVjdGVkIHRvLiBPbmx5IG5lY2Vzc2FyeSBvbiBVRFAgc29ja2V0cyBhcyB0aGV5IGFyZSBjb25uZWN0aW9uLWxlc3MsIFRDUAogIGlzIHVuYWZmZWN0ZWQuCgotIEZpeCBieSBHZW9yZ2UgTmVpbGw6CiAgRml4ZWQgY29tcGlsYXRpb24gb2YgYWNvdW50cnkgc2FtcGxlIGFwcGxpY2F0aW9uIGZhaWx1cmUgb24gc29tZSBzeXN0ZW1zLgoKKiBBdWcgNCAyMDA4IChEYW5pZWwgU3RlbmJlcmcpCi0gRml4IGJ5IFRvZnUgTGluZGVuOgoKICBUaGUgc3ltcHRvbToKICAqIFVzZXJzICh1c3VhbGx5LCBidXQgbm90IGFsd2F5cykgb24gMi1XaXJlIHJvdXRlcnMgYW5kIHRoZSBDb21jYXN0IHNlcnZpY2UKICBhbmQgYSB3aXJlZCBjb25uZWN0aW9uIHRvIHRoZWlyIHJvdXRlciB3b3VsZCBmaW5kIHRoYXQgdGhlIHNlY29uZCBhbmQKICBzdWJzZXF1ZW50IEROUyBsb29rdXBzIGZyb20gZnJlc2ggcHJvY2Vzc2VzIHVzaW5nIGMtYXJlcyB0byByZXNvbHZlIHRoZSBzYW1lCiAgYWRkcmVzcyB3b3VsZCBjYXVzZSB0aGUgcHJvY2VzcyB0byBuZXZlciBzZWUgYSByZXBseSAoaXQga2VlcHMgcG9sbGluZyBmb3IKICBhcm91bmQgMW0xNXMgYmVmb3JlIGdpdmluZyB1cCkuCgogIFRoZSByZXBybzoKICAqIE9uIHN1Y2ggYSBtYWNoaW5lIChhbmQgeWVhaCwgaXQgdG9vayB1cyBhIGxvdCBvZiBRQSB0byBmaW5kIHRoZSBzeXN0ZW1zCiAgdGhhdCByZXByb2R1Y2Ugc3VjaCBhIHNwZWNpZmljIHByb2JsZW0hKSwgZG8gJ2Fob3N0IHd3dy5zZWNvbmRsaWZlLmNvbScsCiAgdGhlbiBkbyBpdCBhZ2Fpbi4gIFRoZSBmaXJzdCBwcm9jZXNzJ3MgbG9va3VwIHdpbGwgd29yaywgc3Vic2VxdWVudCBsb29rdXBzCiAgd2lsbCB0aW1lLW91dCBhbmQgZmFpbC4KCiAgVGhlIGNhdXNlOgogICogaW5pdF9pZF9rZXkoKSB3YXMgY2FsbGluZyByYW5kb21pemVfa2V5KCkgKmJlZm9yZSogaXQgaW5pdGlhbGl6ZWQKICBrZXktPnN0YXRlLCBtZWFuaW5nIHRoYXQgdGhlIHJhbmRvbW5lc3MgZ2VuZXJhdGVkIGJ5IHJhbmRvbWl6ZV9rZXkoKSBpcwogIGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIHdpdGggZGV0ZXJtaW5pc3RpYyB2YWx1ZXMuICgvZGV2L3VyYW5kb20gd2FzIGFsc28KICBiZWluZyByZWFkIGluY29ycmVjdGx5IGluIHRoZSBjLWFyZXMgdmVyc2lvbiB3ZSB3ZXJlIHVzaW5nLCBidXQgdGhpcyB3YXMKICBmaXhlZCBpbiBhIGxhdGVyIHZlcnNpb24uKQogICogVGhpcyBtYWtlcyB0aGUgc3RyZWFtIG9mIGdlbmVyYXRlZCBxdWVyeS1JRHMgZnJvbSBhbnkgbmV3IGMtYXJlcyBwcm9jZXNzCiAgYmUgYW4gaWRlbnRpY2FsIGFuZCBwcmVkaWN0YWJsZSBzZXF1ZW5jZSBvZiBJRHMuCiAgKiBUaGlzIG1ha2VzIHRoZSAyLVdpcmUncyBkZWZhdWx0IGJ1aWx0LWluIEROUyBzZXJ2ZXIgZGV0ZWN0IHRoZXNlIHF1ZXJpZXMKICBhcyBwcm9iYWJsZS1kdXBsaWNhdGVzIGFuZCAoZXJyb25lb3VzbHkpIG5vdCByZXNwb25kIGF0IGFsbC4KCgoqIEF1ZyA0IDIwMDggKFlhbmcgVHNlKQotIEF1dG9jb25mIDIuNjIgaGFzIGNoYW5nZWQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUNfQUlYIG1hY3JvIHdoaWNoIHdlIHVzZS4KICBQcmlvciB2ZXJzaW9ucyBvZiBhdXRvY29uZiBkZWZpbmVkIF9BTExfU09VUkNFIGlmIF9BSVggd2FzIGRlZmluZWQuIDIuNjIKICB2ZXJzaW9uIG9mIEFDX0FJWCBkZWZpbmVzIF9BTExfU09VUkNFIGFuZCBvdGhlciBmb3VyIHByZXByb2Nlc3NvciBzeW1ib2xzCiAgbm8gbWF0dGVyIGlmIHRoZSBzeXN0ZW0gaXMgQUlYIG9yIG5vdC4gVG8ga2VlcCB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3VyLAogIGFuZCBhbiB1bmlmb3JtIG9uZSBhY3Jvc3MgYXV0b2NvbmYgdmVyc2lvbnMgQUNfQUlYIGlzIHJlcGxhY2VkIHdpdGggb3VyCiAgb3duIGludGVybmFsIG1hY3JvIENBUkVTX0NIRUNLX0FJWF9BTExfU09VUkNFLgoKKiBBdWcgMSAyMDA4IChZYW5nIFRzZSkKLSBDb25maWd1cmUgcHJvY2VzcyBub3cgY2hlY2tzIGlmIHRoZSBwcmVwcm9jZXNzb3IgX1JFRU5UUkFOVCBzeW1ib2wgaXMgYWxyZWFkeQogIGRlZmluZWQuIElmIGl0IGlzbid0IGN1cnJlbnRseSBkZWZpbmVkIGEgc2V0IG9mIGNoZWNrcyBhcmUgcGVyZm9ybWVkIHRvIHRlc3QKICBpZiBpdHMgZGVmaW5pdGlvbiBpcyByZXF1aXJlZCB0byBtYWtlIHZpc2libGUgdG8gdGhlIGNvbXBpbGVyIGEgc2V0IG9mICpfcgogIGZ1bmN0aW9ucy4gRmluYWxseSwgaWYgX1JFRU5UUkFOVCBpcyBhbHJlYWR5IGRlZmluZWQgb3IgbmVlZGVkIGl0IHRha2VzIGNhcmUKICBvZiBtYWtpbmcgYWRqdXN0bWVudHMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGl0IGlzIGRlZmluZWQgZXF1YWxseSBmb3IgdGhlCiAgY29uZmlndXJlIHByb2Nlc3MgdGVzdHMgYW5kIGdlbmVyYXRlZCBjb25maWcgZmlsZS4KCiogSnVsIDIwIDIwMDggKFlhbmcgVHNlKQotIFdoZW4gcmVjdmZyb20gcHJvdG90eXBlIHVzZXMgYSB2b2lkIHBvaW50ZXIgZm9yIGFyZ3VtZW50cyAyLCA1IG9yIDYgdGhpcyB3aWxsCiAgbm93IGNhdXNlIHRoZSBkZWZpbml0aW9uLCBhcyBhcHByb3ByaWF0ZSwgb2YgUkVDVkZST01fVFlQRV9BUkcyX0lTX1ZPSUQsCiAgUkVDVkZST01fVFlQRV9BUkc1X0lTX1ZPSUQgb3IgUkVDVkZST01fVFlQRV9BUkc2X0lTX1ZPSUQuCgoqIEp1bCAxNyAyMDA4IChZYW5nIFRzZSkKLSBSRUNWRlJPTV9UWVBFX0FSRzIsIFJFQ1ZGUk9NX1RZUEVfQVJHNSBhbmQgUkVDVkZST01fVFlQRV9BUkc2IGFyZSBub3cgZGVmaW5lZAogIHRvIHRoZSBkYXRhIHR5cGUgcG9pbnRlZCBieSBpdHMgcmVzcGVjdGl2ZSBhcmd1bWVudCBhbmQgbm90IHRoZSBwb2ludGVyIHR5cGUuCgoqIEp1bCAxNiAyMDA4IChZYW5nIFRzZSkKLSBJbXByb3ZlZCBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGdldHNlcnZieXBvcnRfci4KICBEZXRlY3Rpb24gaXMgbm93IGJhc2VkIG9uIGNvbXBpbGF0aW9uIGNoZWNrcyBpbnN0ZWFkIG9mIGxpbmtlciBvbmVzLgoKLSBDb25maWd1cmUgcHJvY2VzcyBub3cgY2hlY2tzIGF2YWlsYWJpbGl0eSBvZiByZWN2ZnJvbSgpIHNvY2tldCBmdW5jdGlvbiBhbmQKICBmaW5kcyBvdXQgaXRzIHJldHVybiB0eXBlIGFuZCB0aGUgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gQWRkZWQgZGVmaW5pdGlvbnMKICBmb3Igbm9uLWNvbmZpZ3VyZSBzeXN0ZW1zIGNvbmZpZyBmaWxlcywgYW5kIGludHJvZHVjZWQgbWFjcm8gc3JlYWRmcm9tIHdoaWNoCiAgd2lsbCBiZSB1c2VkIG9uIHVkcCBzb2NrZXRzIGFzIGEgcmVjdmZyb20oKSB3cmFwcGVyIGluIHRoZSBmdXR1cmUuCgoqIEp1bCAxNSAyMDA4IChZYW5nIFRzZSkKLSBJbnRyb2R1Y2UgZGVmaW5pdGlvbiBvZiBfUkVFTlRSQU5UIHN5bWJvbCBpbiBzZXR1cC5oIHRvIGltcHJvdmUgbGlicmFyeQogIHVzYWJpbGl0eS4gIFByZXZpb3VzbHkgdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIG9ubHkgdXNlZCB0aGUgQUNfU1lTX0xBUkdFRklMRQogIG1hY3JvIGZvciBkZWJ1ZyBidWlsZHMsIG5vdyBpdCBpcyBhbHNvIHVzZWQgZm9yIG5vbi1kZWJ1ZyBvbmVzIGVuYWJsaW5nIHRoZQogIHVzZSBvZiBjb25maWd1cmUgb3B0aW9ucyAtLWVuYWJsZS1sYXJnZWZpbGUgYW5kIC0tZGlzYWJsZS1sYXJnZWZpbGUgd2hpY2gKICBtaWdodCBiZSBuZWVkZWQgZm9yIGxpYnJhcnkgY29tcGF0aWJpbGl0eS4gIFJlbW92ZSBjaGVja2luZyB0aGUgc2l6ZSBvZgogIGN1cmxfb2ZmX3QsIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCgoqIEp1bCAzIDIwMDggKERhbmllbCBTdGVuYmVyZykKLSBQaGlsIEJsdW5kZWxsOiBJZiB5b3UgYXNrIGFyZXNfZ2V0aG9zdGJ5bmFtZSgpIHRvIGRvIGFuIEFGX0lORVQ2IGxvb2t1cCBhbmQKICB0aGUgdGFyZ2V0IGhvc3QgaGFzIG9ubHkgQSByZWNvcmRzLCBpdCBhdXRvbWF0aWNhbGx5IGZhbGxzIGJhY2sgdG8gYW4KICBBRl9JTkVUIGxvb2t1cCBhbmQgZ2l2ZXMgeW91IHRoZSBBIHJlc3VsdHMuICBIb3dldmVyLCBpZiB0aGUgdGFyZ2V0IGhvc3QgaGFzCiAgYSBDTkFNRSByZWNvcmQsIHRoaXMgYmVoYXZpb3VyIGlzIGRlZmVhdGVkIHNpbmNlIHRoZSBvcmlnaW5hbCBxdWVyeSBkb2VzCiAgcmV0dXJuIHNvbWUgZGF0YSBldmVuIHRob3VnaCBhcmVzX3BhcnNlX2FhYV9yZXBseSgpIGRvZXNuJ3QgY29uc2lkZXIgaXQKICByZWxldmFudC4gSGVyZSdzIGEgc21hbGwgcGF0Y2ggdG8gbWFrZSBpdCBiZWhhdmUgdGhlIHNhbWUgd2l0aCBhbmQgd2l0aG91dAogIHRoZSBDTkFNRS4KCiogSnVsIDIgMjAwOCAoWWFuZyBUc2UpCi0gRmFsbGJhY2sgdG8gZ2V0dGltZW9mZGF5IHdoZW4gbW9ub3RvbmljIGNsb2NrIGlzIHVuYXZhaWxhYmxlIGF0IHJ1bi10aW1lLgoKKiBKdW4gMzAgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBBcyB3YXMgcG9pbnRlZCBvdXQgdG8gbWUgYnkgQW5kcmVhcyBTY2h1bGRlaSwgdGhlIE1BWEhPU1ROQU1FTEVOIGRlZmluZSBpcwogIG5vdCBwb3NpeCBvciBhbnl0aGluZyBhbmQgdGh1cyBjLWFyZXMgZmFpbGVkIHRvIGJ1aWxkIG9uIGh1cmQgKGFuZCBwb3NzaWJseQogIGVsc2V3aGVyZSkuIFRoZSBkZWZpbmUgd2FzIGFsc28gc29tZXdoYXQgYXJ0aWZpY2lhbGx5IHVzZWQgaW4gdGhlIHdpbmRvd3MKICBwb3J0LiBOb3csIEkgaW5zdGVhZCByZXdyb3RlIHRoZSB1c2Ugb2YgZ2V0aG9zdGJ5bmFtZSB0byBlbmxhcmdlIHRoZSBob3N0CiAgbmFtZSBidWZmZXIgaW4gY2FzZSBvZiBuZWVkIGFuZCB0b3RhbGx5IGF2b2lkIHRoZSB1c2Ugb2YgdGhlIE1BWEhPU1ROQU1FTEVOCiAgZGVmaW5lLiBJIHRodXMgYWxzbyByZW1vdmVkIHRoZSBkZWZpZW4gZnJvbSB0aGUgbmFtc2VyLmggZmlsZSB3aGVyZSBpdCB3YXMKICBvbmNlIGFkZGVkIGZvciB0aGUgd2luZG93cyBidWlsZC4KCiAgSSBhbHNvIGZpeGVkIGluaXRfYnlfZGVmYXVsdHMoKSBmdW5jdGlvbiB0byBub3QgbGVhayBtZW1vcnkgaW4gY2FzZSBpZgogIGVycm9yLgoKKiBKdW4gOSAyMDA4IChZYW5nIFRzZSkKCi0gTWFrZSBsaWJjYXJlcy5wYyBnZW5lcmF0ZWQgZmlsZSBmb3IgcGtnLWNvbmZpZyBpbmNsdWRlIGluZm9ybWF0aW9uIHJlbGF0aXZlCiAgdG8gdGhlIGxpYnJhcmllcyBuZWVkZWQgZm9yIHRoZSBzdGF0aWMgbGlua2luZyBvZiBjLWFyZXMuCgoqIE1heSAzMCAyMDA4IChZYW5nIFRzZSkKCi0gQnJhZCBIb3VzZSBmaXhlZCBhIG1pc3NpbmcgaGVhZGVyIGZpbGUgaW5jbHVzaW9uIGluIGFkaWcgc2FtcGxlIHByb2dyYW0uCgpWZXJzaW9uIDEuNS4yIChNYXkgMjksIDIwMDgpCgoqIE1heSAxMyAyMDA4IChEYW5pZWwgU3RlbmJlcmcpCgotIEludHJvZHVjaW5nIG1pbGxpc2Vjb25kIHJlc29sdXRpb24gc3VwcG9ydCBmb3IgdGhlIHRpbWVvdXQgb3B0aW9uLiBTZWUKICBhcmVzX2luaXRfb3B0aW9ucygpJ3MgQVJFU19PUFRfVElNRU9VVE1TLgoKKiBNYXkgOSAyMDA4IChZYW5nIFRzZSkKCi0gVXNlIG1vbm90b25pYyB0aW1lIHNvdXJjZSBpZiBhdmFpbGFibGUsIGZvciBwcml2YXRlIGZ1bmN0aW9uIGFyZXNfX3R2bm93KCkKCiogTWF5IDcgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBTZWJhc3RpYW4gbWFkZSBjLWFyZXMgYWJsZSB0byByZXR1cm4gYWxsIFBUUi1yZWNvcmRzIHdoZW4gZG9pbmcgcmV2ZXJzZQogIGxvb2t1cHMuIEl0IGlzIG5vdCBjb21tb24gcHJhY3RpY2UgdG8gaGF2ZSBtdWx0aXBsZSBQVFItUmVjb3JkcyBmb3IgYSBzaW5nbGUKICBJUCwgYnV0IGl0cyBwZXJmZWN0bHkgbGVnYWwgYW5kIHNvbWUgc2l0ZXMgaGF2ZSB0aG9zZS4KCi0gRG91ZyBHb2xkc3RlaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2g6IHVwZGF0ZXMgYXV0b2NvbmYgMi4xMyB1c2FnZSB0bwogIGF1dG9jb25mIDIuNTcgdXNhZ2UgKHdoaWNoIGlzIHRoZSB2ZXJzaW9uIHlvdSBoYXZlIHNwZWNpZmllZCBhcyB0aGUgbWluaW11bQogIHZlcnNpb24pLiBJdCdzIGEgbWlub3IgY2hhbmdlIGJ1dCBpdCBkb2VzIGNsZWFuIHVwIHNvbWUgd2FybmluZ3Mgd2l0aCBuZXdlcgogIGF1dG9jb25mIChzcGVjaWZpY2FsbHkgMi42MikuCgoqIE1heSA1IDIwMDggKFlhbmcgVHNlKQoKLSBJbXByb3ZlZCBwYXJzaW5nIG9mIHJlc29sdmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgoqIEFwcmlsIDQgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBFaW5vIFR1b21pbmVuIGltcHJvdmVkIHRoZSBjb2RlIHdoZW4gYSBmaWxlIGlzIHVzZWQgdG8gc2VlZCB0aGUgcmFuZG9taXplci4KCi0gQWxleGV5IFNpbWFrIG1hZGUgYWRpZyBzdXBwb3J0IE5BUFRSIHJlY29yZHMKCi0gQWxleGV5IFNpbWFrIGZpeGVkIHRoZSBWQyBkc3AgZmlsZSBieSBhZGRpbmcgdGhlIG1pc3Npbmcgc291cmNlIGZpbGUKICBhcmVzX2V4cGFuZF9zdHJpbmcuYwoKKiBEZWNlbWJlciAxMSAyMDA3IChHaXNsZSBWYW5lbSkKCi0gQWRkZWQgYW5vdGhlciBzYW1wbGUgYXBwbGljYXRpb247IGFjb3VudHJ5LmMgd2hpY2ggY29udmVydHMgYW4KICBJUHY0LWFkZHJlc3MoZXMpIGFuZC9vciBob3N0LW5hbWUocykgdG8gY291bnRyeS1uYW1lIGFuZCBjb3VudHJ5LWNvZGUuCiAgVGhpcyB1c2VzIHRoZSBzZXJ2aWNlIG9mIHRoZSBETlNCTCBhdCBjb3VudHJpZXMubmVyZC5kay4KCiogRGVjZW1iZXIgMyAyMDA3IChEYW5pZWwgU3RlbmJlcmcpCgotIEJyYWQgU3BlbmNlciBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhc3N1bWUgdGhhdCB0aGVyZSdzIG5vCiAgL2Rldi91cmFuZG9tIHdoZW4gYnVpbHQgY3Jvc3MtY29tcGlsZWQgYXMgdGhlbiB0aGUgc2NyaXB0IGNhbm5vdCBjaGVjayBmb3IKICBpdC4KCi0gRXJpayBLbGluZSBjbGVhbmVkIHVwIGFyZXNfZ2V0aG9zdGJ5YWRkci5jOm5leHRfbG9va3VwKCkgc29tZXdoYXQKClZlcnNpb24gMS41LjEgKE5vdiAyMSwgMjAwNykKCiogTm92ZW1iZXIgMjEgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBSb2JpbiBDb3JuZWxpdXMgcG9pbnRlZCBvdXQgdGhhdCBhcmVzX2xsaXN0Lmggd2FzIG1pc3NpbmcgaW4gdGhlIHJlbGVhc2UKICBhcmNoaXZlIGZvciAxLjUuMAoKVmVyc2lvbiAxLjUuMCAoTm92IDIxLCAyMDA3KQoKKiBPY3RvYmVyIDIgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBhcmVzX3N0cmVycm9yKCkgc2VnZmF1bHRlZCBpZiB0aGUgaW5wdXQgZXJyb3IgbnVtYmVyIHdhcyBvdXQgb2YgdGhlIGN1cnJlbnRseQogIHN1cHBvcnRlZCByYW5nZS4KCi0gWWFuZyBUc2U6IEF2b2lkIGEgc2VnZmF1bHQgd2hlbiBnZW5lcmF0aW5nIGEgRE5TICJUcmFuc2FjdGlvbiBJRCIgaW4KICBpbnRlcm5hbCBmdW5jdGlvbiBpbml0X2lkX2tleSgpIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucy4KCiogU2VwdGVtYmVyIDI4IDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gQnVtcGVkIHZlcnNpb24gdG8gMS41LjAgZm9yIG5leHQgcmVsZWFzZSBhbmQgc29uYW1lIGJ1bXBlZCB0byAyIGR1ZSB0byBBQkkKICBhbmQgQVBJIGNoYW5nZXMgaW4gdGhlIHByb2dyZXNzIGNhbGxiYWNrIChhbmQgcG9zc2libHkgbW9yZSBjb21pbmcgdXAgZnJvbQogIFN0ZWluYXIpCgoqIFNlcHRlbWJlciAyOCAyMDA3IChTdGVpbmFyIEguIEd1bmRlcnNvbikKCi0gRG9uJ3Qgc2tpcCBhIHNlcnZlciBpZiBpdCdzIHRoZSBvbmx5IG9uZS4gKEJ1Z2ZpeCBmcm9tIHRoZSBHb29nbGUgdHJlZS4pCgotIE1hZGUgdGhlIHF1ZXJ5IGNhbGxiYWNrcyByZWNlaXZlIHRoZSBudW1iZXIgb2YgdGltZW91dHMgdGhhdCBoYXBwZW5lZCBkdXJpbmcKICB0aGUgZXhlY3V0aW9uIG9mIGEgcXVlcnksIGFuZCB1cGRhdGVkIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuIChQYXRjaCBmcm9tCiAgdGhlIEdvb2dsZSB0cmVlLikKCi0gU3VwcG9ydCBhIGZldyBtb3JlIHNvY2tldCBvcHRpb25zOiBBUkVTX09QVF9TT0NLX1NOREJVRiBhbmQKICBBUkVTX09QVF9TT0NLX1JDVkJVRgoKLSBBbHdheXMgcmVnaXN0ZXIgZm9yIFRDUCBldmVudHMgZXZlbiBpZiB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcXVlcmllcywgYXMKICB0aGUgb3RoZXIgc2lkZSBjb3VsZCBhbHdheXMgY2xvc2UgdGhlIGNvbm5lY3Rpb24sIHdoaWNoIGlzIGEgdmFsaWQgZXZlbnQKICB3aGljaCBzaG91bGQgYmUgcmVzcG9uZGVkIHRvLgoKKiBTZXB0ZW1iZXIgMjIgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBTdGVpbmFyIEguIEd1bmRlcnNvbiBmaXhlZDogQ29ycmVjdGx5IGNsZWFyIHNvY2tldHMgZnJvbSB0aGUgZmRfc2V0IG9uIGluCiAgc2V2ZXJhbCBmdW5jdGlvbnMgKHdyaXRlX3RjcF9kYXRhLCByZWFkX3RjcF9kYXRhLCByZWFkX3VkcF9wYWNrZXRzKSBzbyB0aGF0CiAgaWYgaXQgZmFpbHMgYW5kIHRoZSBzb2NrZXQgaXMgY2xvc2VkIHRoZSBmb2xsb3dpbmcgY29kZSBkb2Vzbid0IHRyeSB0byB1c2UKICB0aGUgZmlsZSBkZXNjcmlwdG9yLgoKLSBTdGVpbmFyIEguIEd1bmRlcnNvbiBtb2RpZmllZCBjLWFyZXMgdG8gbm93IGFsc28gZG8gdG8gRE5TIHJldHJpZXMgZXZlbiB3aGVuCiAgVENQIGlzIHVzZWQgc2luY2UgdGhlcmUgYXJlIHNldmVyYWwgZWRnZSBjYXNlcyB3aGVyZSBpdCBzdGlsbCBtYWtlcyBzZW5zZS4KCi0gQnJhZCBIb3VzZSBwcm92aWRlZCBhIGZpeCBmb3IgYXJlc19zYXZlX29wdGlvbnMoKToKCiAgQXBwYXJlbnRseSBJIG92ZXJsb29rZWQgc29tZXRoaW5nIHdpdGggdGhlIGFyZXNfc2F2ZV9vcHRpb25zKCkgd2hlcmUgaXQKICB3b3VsZCB0cnkgdG8gZG8gYSBtYWxsb2MoMCkgd2hlbiBubyBvcHRpb25zIG9mIHRoYXQgdHlwZSBuZWVkZWQgdG8gYmUgc2F2ZWQuCiAgT24gbW9zdCBwbGF0Zm9ybXMsIHRoaXMgd2FzIGZpbmUgYmVjYXVzZSBtYWxsb2MoMCkgZG9lc24ndCBhY3R1YWxseSByZXR1cm4KICBOVUxMLCBidXQgb24gQUlYIGl0IGRvZXMsIHNvIGFyZXNfc2F2ZV9vcHRpb25zIHdvdWxkIHJldHVybiBBUkVTX0VOT01FTS4KCiogSnVseSAxNCAyMDA3IChEYW5pZWwgU3RlbmJlcmcpCgotIFZsYWQgRGludWxlc2N1IGZpeGVkIHR3byBvdXRzdGFuZGluZyB2YWxncmluZCByZXBvcnRzOgoKICAxLiBJbiBhcmVzX3F1ZXJ5LmMgLCBpbiBmaW5kX3F1ZXJ5X2J5X2lkIHdlIGNvbXBhcmUgcS0+cWlkICh3aGljaCBpcyBhIHNob3J0CiAgaW50IHZhcmlhYmxlKSB3aXRoIHFpZCwgd2hpY2ggaXMgZGVjbGFyZWQgYXMgYW4gaW50IHZhcmlhYmxlLiAgTW9yZW92ZXIsCiAgRE5TX0hFQURFUl9TRVRfUUlEIGlzIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZSBvZiBxaWQsIGJ1dCBETlNfSEVBREVSX1NFVF9RSUQKICBzZXRzIG9ubHkgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBxaWQuIEkgdGhpbmsgdGhhdCBxaWQgc2hvdWxkIGJlIGRlY2xhcmVkIGFzCiAgInVuc2lnbmVkIHNob3J0IiBpbiB0aGlzIGZ1bmN0aW9uLgoKICAyLiBUaGUgc2FtZSBwcm9ibGVtIG9jY3VycyBpbiBhcmVzX3Byb2Nlc3MuYywgcHJvY2Vzc19hbnN3ZXIoKSAuICBxdWVyeS0+cWlkCiAgKGFuIHVuc2lnbmVkIHNob3J0IGludGVnZXIgdmFyaWFibGUpIGlzIGNvbXBhcmVkIHdpdGggaWQsIHdoaWNoIGlzIGFuCiAgaW50ZWdlciB2YXJpYWJsZS4gTW9yZW92ZXIsIGlkIGlzIGluaXRpYWxpemVkIGZyb20gRE5TX0hFQURFUl9RSUQgd2hpY2ggc2V0cwogIG9ubHkgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBpZC4gSSB0aGluayB0aGF0IHRoZSBpZCB2YXJpYWJsZSBzaG91bGQgYmUKICBkZWNsYXJlZCBhcyAidW5zaWduZWQgc2hvcnQiIGluIHRoaXMgZnVuY3Rpb24uCgogIEV2ZW4gYWZ0ZXIgZGVjbGFyaW5nIHRoZXNlIHZhcmlhYmxlcyBhcyAidW5zaWduZWQgc2hvcnQiLCB0aGUgdmFsZ3JpbmQKICBlcnJvcnMgYXJlIHN0aWxsIHRoZXJlLiBXaGljaCBicmluZ3MgdXMgdG8gdGhlIHRoaXJkIHByb2JsZW0uCgogIDMuIFRoZSB0aGlyZCBwcm9ibGVtIGlzIHRoYXQgVmFsZ3JpbmQgYXNzdW1lcyB0aGF0IHF1ZXJ5LT5xaWQgaXMgbm90CiAgaW5pdGlhbGlzZWQgY29ycmVjdGx5LiBBbmQgaXQgZG9lcyB0aGF0IGJlY2F1c2UgcXVlcnktPnFpZCBpcyBzZXQgZnJvbQogIEROU19IRUFERVJfUUlEKHFidWYpOyBWYWxncmluZCBzYXlzIHRoYXQgcWJ1ZiBoYXMgdW5pdGlhbGlzZWQgYnl0ZXMuIEFuZAogIHFidWYgaGFzIHVuaW5pdGlhbGlzZWQgYnl0ZXMgYmVjYXVzZSBvZiBjaGFubmVsLT5uZXh0X2lkIC4gQW5kIG5leHRfaWQgaXMKICBzZXQgYnkgYXJlc19pbml0LmM6YXJlc19fZ2VuZXJhdGVfbmV3X2lkKCkgLiBJIGZvdW5kIHRoYXQgcHV0dGluZyBzaG9ydCByPTAKICBpbiB0aGlzIGZ1bmN0aW9uIChpbnN0ZWFkIG9mIHNob3J0IHIpIG1ha2VzIGFsbCBWYWxncmluZCB3YXJuaW5ncyBnbyBhd2F5LgogIEkgaGF2ZSBzdHVkaWVkIGFyZXNfX3JjNCgpIHRvbywgYW5kIHRoaXMgaXMgdGhlIG9mZmVuZGluZyBsaW5lOgoKICAgICAgICBidWZmZXJfcHRyW2NvdW50ZXJdIF49IHN0YXRlW3hvckluZGV4XTsgICAoYXJlc19xdWVyeS5jOjYyKQoKICBUaGlzIGlzIHdoYXQgdHJpZ2dlcnMgVmFsZ3JpbmQuLiBidWZmZXJfcHRyIGlzIHVuaXRpYWxpc2VkIGluIHRoaXMgZnVuY3Rpb24sCiAgYW5kIGJ5IGFwcGx5aW5nIF49IG9uIGl0LCBpdCByZW1haW5zIHVuaXRpYWxpc2VkLgoKVmVyc2lvbiAxLjQuMCAoSnVuZSA4LCAyMDA3KQoKKiBKdW5lIDQgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBKYW1lcyBCdXJzYSByZXBvcnRlZCBhIG1ham9yIG1lbW9yeSBwcm9ibGVtIHdoZW4gcmVzb2x2aW5nIG11bHRpLUlQIG5hbWVzCiAgYW5kIEkgZm91bmQgYW5kIGZpeGVkIHRoZSBwcm9ibGVtLiBJdCB3YXMgYWRkZWQgYnkgQXNoaXNoIFNoYXJtYSdzIHBhdGNoCiAgdHdvIGRheXMgYWdvLgoKICBXaGVuIEkgdGhlbiB0cmllZCB0byB2ZXJpZnkgbXVsdGlwbGUgZW50cmllcyBpbiAvZXRjL2hvc3RzIGFmdGVyIG15IGZpeCwgSQogIGdvdCBhbm90aGVyIHNlZ2ZhdWx0IGFuZCBkZWNpZGVkIHRoaXMgY29kZSB3YXMgbm90IHJpcGUgZm9yIGluY2x1c2lvbiBhbmQgSQogIHJldmVydGVkIHRoZSBwYXRjaC4KCiogSnVuZSAyIDIwMDcKCi0gQnJhZCBTcGVuY2VyIGZvdW5kIGFuZCBmaXhlZCB0aHJlZSBmbGF3cyBpbiB0aGUgY29kZSwgZm91bmQgd2l0aCB0aGUgbmV3CiAgZ2NjIDQuMi4wIHdhcm5pbmc6IC1XYWRkcmVzcwoKLSBCcmFkIEhvdXNlIGZpeGVkIFZTMjAwNSBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGltZV90IGJlaW5nIDY0Yml0LgogIEhlIGFsc28gbWFkZSByZWNlbnQgTWljcm9zb2Z0IGNvbXBpbGVycyB1c2UgX3N0cmR1cCgpIGluc3RlYWQgb2Ygc3RyZHVwKCkuCgotIEJyYWQgSG91c2UncyBtYW4gcGFnZXMgZm9yIGFyZXNfc2F2ZV9vcHRpb25zKCkgYW5kIGFyZXNfZGVzdHJveV9vcHRpb25zKCkKICB3ZXJlIGFkZGVkLgoKLSBBc2hpc2ggU2hhcm1hIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHN1cHBvcnRpbmcgbXVsdGlwbGUgZW50cmllcyBpbiB0aGUKICAvZXRjL2hvc3RzIGZpbGUuIFBhdGNoIGVkaXRlZCBmb3IgY29kaW5nIHN0eWxlIGFuZCBmdW5jdGlvbmFsaXR5IGJ5IG1lCiAgKERhbmllbCkuCgoqIE1heSAzMCAyMDA3CgotIFNobXVsaWsgUmVnZXYgYnJvdWdodCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgdHJhbnNhY3Rpb24gSURzOgoKICBUaGUgYy1hcmVzIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gdXNlcyBhIEROUyAiVHJhbnNhY3Rpb24gSUQiIGZpZWxkIHRoYXQgaXMKICBzZWVkZWQgd2l0aCBhIHBzZXVkbyByYW5kb20gbnVtYmVyIChiYXNlZCBvbiBnZXR0aW1lb2ZkYXkpIHdoaWNoIGlzCiAgaW5jcmVtZW50ZWQgKCsrKSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGNhbGxzIGFuZCBpcyB0aGVyZWZvcmUgcmF0aGVyCiAgcHJlZGljdGFibGUuIEluIGdlbmVyYWwsIHByZWRpY3RhYmlsaXR5IG9mIEROUyBUcmFuc2FjdGlvbiBJRCBpcyBhIHdlbGwKICBrbm93biBzZWN1cml0eSBwcm9ibGVtIChlLmcuCiAgaHR0cDovL2Jhay5zcGMub3JnL2Rtcy9hcmNoaXZlL2Ruc19pZF9hdHRhY2sudHh0KSBhbmQgbWFrZXMgYSBjLWFyZXMgYmFzZWQKICBpbXBsZW1lbnRhdGlvbiB2dWxuZXJhYmxlIHRvIEROUyBwb2lzb25pbmcuIENyZWRpdCBnb2VzIHRvIEFtaXQgS2xlaW4KICAoVHJ1c3RlZXIpIGZvciBpZGVudGlmeWluZyB0aGlzIHByb2JsZW0uCgogIFRoZSBwYXRjaCBJIHdyb3RlIGNoYW5nZXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZSBhIG1vcmUgc2VjdXJlIHdheSBvZgogIGdlbmVyYXRpbmcgdW5pcXVlIElEcy4gSXQgc3RhcnRzIGJ5IG9idGFpbmluZyBhIGtleSB3aXRoIHJlYXNvbmFibGUgZW50cm9weQogIHdoaWNoIGlzIHVzZWQgd2l0aCBhbiBSQzQgc3RyZWFtIHRvIGdlbmVyYXRlIHRoZSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUKICB0cmFuc2FjdGlvbiBJRHMuCgogIE5vdGUgdGhhdCB0aGUga2V5IGdlbmVyYXRpb24gY29kZSAoaW4gYXJlc19pbml0OnJhbmRvbWl6ZV9rZXkpIGhhcyB0d28KICB2ZXJzaW9ucywgdGhlIFdpbmRvd3Mgc3BlY2lmaWMgb25lIHVzZXMgYSBjcnlwdG9ncmFwaGljYWxseSBzYWZlIGZ1bmN0aW9uCiAgcHJvdmlkZWQgKGJ1dCB1bmRvY3VtZW50ZWQgOikgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gKGRlc2NyaWJlZCBhdAogIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9taWNoYWVsX2hvd2FyZC9hcmNoaXZlLzIwMDUvMDEvMTQvMzUzMzc5LmFzcHgpLiAgVGhlCiAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIGJpdCBuYWl2ZSBhbmQgdXNlcyB0aGUgc3RhbmRhcmQgJ3JhbmQnCiAgZnVuY3Rpb24uIFN1cmVseSBhIGJldHRlciB3YXkgdG8gZ2VuZXJhdGUgcmFuZG9tIGtleXMgZXhpc3RzIGZvciBvdGhlcgogIHBsYXRmb3Jtcy4KCiAgVGhlIHBhdGNoIGNhbiBiZSB0ZXN0ZWQgYnkgdXNpbmcgdGhlIGFkaWcgdXRpbGl0eSBhbmQgdXNpbmcgdGhlICctcycgb3B0aW9uLgoKLSBCcmFkIEhvdXNlIGFkZGVkIGFyZXNfc2F2ZV9vcHRpb25zKCkgYW5kIGFyZXNfZGVzdHJveV9vcHRpb25zKCkgdGhhdCBjYW4gYmUKICB1c2VkIHRvIGtlZXAgb3B0aW9ucyBmb3IgbGF0ZXIgcmUtdXNhbCB3aGVuIGFyZXNfaW5pdF9vcHRpb25zKCkgaXMgdXNlZC4KCiAgUHJvYmxlbTogQ2FsbGluZyBhcmVzX2luaXQoKSBmb3IgZWFjaCBsb29rdXAgY2FuIGJlIHVubmVjZXNzYXJpbHkgcmVzb3VyY2UKICAgICAgICAgaW50ZW5zaXZlLiAgT24gd2luZG93cywgaXQgbXVzdCBMb2FkTGlicmFyeSgpIG9yIHNlYXJjaCB0aGUgcmVnaXN0cnkKICAgICAgICAgb24gZWFjaCBjYWxsIHRvIGFyZXNfaW5pdCgpLiAgT24gdW5peCwgaXQgbXVzdCByZWFkIGFuZCBwYXJzZQogICAgICAgICBtdWx0aXBsZSBmaWxlcyB0byBvYnRhaW4gdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgSW4KICAgICAgICAgYSBzaW5nbGUtdGhyZWFkZWQgZW52aXJvbm1lbnQsIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gb25seQogICAgICAgICBhcmVzX2luaXQoKSBvbmNlLCBidXQgaW4gYSBoZWF2aWx5IG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LCBpdCBpcwogICAgICAgICB1bmRlc2lyYWJsZSB0byBhcmVzX2luaXQoKSBhbmQgYXJlc19kZXN0cm95KCkgZm9yIGVhY2ggdGhyZWFkIGNyZWF0ZWQKICAgICAgICAgYW5kIHRyYWNrIHRoYXQuCgogIFNvbHV0aW9uOiBDcmVhdGUgYXJlc19zYXZlX29wdGlvbnMoKSBhbmQgYXJlc19kZXN0cm95X29wdGlvbnMoKSBmdW5jdGlvbnMgdG8KICAgICAgICAgcmV0cmlldmUgYW5kIGZyZWUgb3B0aW9ucyBvYnRhaW5lZCBmcm9tIGFuIGluaXRpYWxpemVkIGNoYW5uZWwuICBUaGUKICAgICAgICAgb3B0aW9ucyBwb3B1bGF0ZWQgY2FuIGJlIHVzZWQgdG8gcGFzcyBiYWNrIGludG8gYXJlc19pbml0X29wdGlvbnMoKSwKICAgICAgICAgaXQgc2hvdWxkIHBvcHVsYXRlIGFsbCBuZWVkZWQgZmllbGRzIGFuZCBub3QgcmV0cmlldmUgYW55IGluZm9ybWF0aW9uCiAgICAgICAgIGZyb20gdGhlIHN5c3RlbS4gIFByb2JhYmx5IHdpc2UgdG8gZGVzdHJveSB0aGUgY2FjaGUgZXZlcnkgbWludXRlIG9yCiAgICAgICAgIHNvIHRvIHByZXZlbnQgdGhlIGRhdGEgZnJvbSBiZWNvbWluZyBzdGFsZS4KCi0gRGFuaWVsIFMgYWRkZWQgYXJlc19wcm9jZXNzX2ZkKCkgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIGFzayBmb3IgcHJvY2Vzc2luZwogIG9uIHNwZWNpZmljIHNvY2tldHMgYW5kIHRodXMgYXZvaWRpbmcgc2VsZWN0KCkgYW5kIGFzc29jaWF0ZWQKICBmdW5jdGlvbnMvbWFjcm9zLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgYnkgdXBjb21pbmcgbGliY3VybCByZWxlYXNlcwogIGZvciB0aGlzIHZlcnkgcmVhc29uLiBJdCBhbHNvIG1hZGUgbWUgZXhwb3J0IHRoZSBhcmVzX3NvY2tldF90IHR5cGUgaW4gdGhlCiAgcHVibGljIGFyZXMuaCBoZWFkZXIgZmlsZSwgc2luY2UgYXJlc19wcm9jZXNzX2ZkKCkgdXNlcyB0aGF0IHR5cGUgZm9yIHR3byBvZgogIHRoZSBhcmd1bWVudHMuCgoqIE1heSAyNSAyMDA3CgotIFJhdmkgUHJhdGFwIGZpeGVkIGEgZmxhdyBpbiB0aGUgaW5pdF9ieV9yZXNvbHZfY29uZigpIGZ1bmN0aW9uIGZvciB3aW5kb3dzCiAgdGhhdCBjb3VsZCBjYXVzZSBpdCB0byByZXR1cm4gYSBiYWQgcmV0dXJuIGNvZGUuCgoqIEFwcmlsIDE2IDIwMDcKCi0gWWFuZyBUc2U6IFByb3ZpZGUgYXJlc19nZXRvcHQoKSBjb21tYW5kLWxpbmUgcGFyc2VyIGZ1bmN0aW9uIGFzIGEgc291cmNlCiAgY29kZSBoZWxwZXIgZnVuY3Rpb24sIG5vdCBiZWxvbmdpbmcgdG8gdGhlIGFjdHVhbCBjLWFyZXMgbGlicmFyeS4KCiogRmVicnVhcnkgMTkgMjAwNwoKLSBWbGFkIERpbnVsZXNjdSBhZGRlZCBhcmVzX3BhcnNlX25zX3JlcGx5KCkuCgoqIEZlYnJ1YXJ5IDEzIDIwMDcKCi0gWWFuZyBUc2U6IEZpeCBmYWlsdXJlIHRvIGdldCB0aGUgc2VhcmNoIHNlcXVlbmNlIG9mIC9ldGMvaG9zdHMgYW5kCiAgRE5TIGZyb20gL2V0Yy9uc3N3aXRjaC5jb25mLCAvZXRjL2hvc3QuY29uZiBvciAvZXRjL3N2Yy5jb25mIHdoZW4KICAvZXRjL3Jlc29sdi5jb25mIGRpZCBub3QgZXhpc3Qgb3Igd2FzIHVuYWJsZSB0byByZWFkIGl0LgoKKiBOb3ZlbWJlciAyMiAyMDA2CgotIEluc3RhbGwgYXJlc19kbnMuaCB0b28KCi0gTWljaGFlbCBXYWxsbmVyIGZpeGVkIHRoaXMgcHJvYmxlbTogV2hlbiBJIHNldCBkb21haW5zIGluIHRoZSBvcHRpb25zCiAgc3RydWN0LCBhbmQgdGhlcmUgYXJlIGRvbWFpbi9zZWFyY2ggZW50cmllcyBpbiAvZXRjL3Jlc29sdi5jb25mLCB0aGUgZG9tYWlucwogIG9mIHRoZSBvcHRpb25zIHN0cnVjdCB3aWxsIGJlIG92ZXJyaWRkZW4uCgoqIE5vdmVtYmVyIDYgMjAwNgoKLSBZYW5nIFRzZSByZW1vdmVkIGEgY291cGxlIG9mIHBvdGVudGlhbCB6ZXJvIHNpemUgbWVtb3J5IGFsbG9jYXRpb25zLgoKLSBBbmRyZWFzIFJpZWtlIGZpeGVkIHRoZSBsaW5lIGVuZGluZ3MgaW4gdGhlIGFyZXNsaWIuZHNwIGZpbGUgdGhhdCBJIChEYW5pZWwpCiAgYnJva2UgaW4gdGhlIDEuMy4yIHJlbGVhc2UuIFdlIHNob3VsZCBzd2l0Y2ggdG8gYSBzeXN0ZW0gd2hlcmUgdGhhdCBmaWxlIGlzCiAgYXV0by1nZW5lcmF0ZWQuIFdlIGNvdWxkIHJpcCBzb21lIGNvZGUgZm9yIHRoYXQgZnJvbSBjdXJsLi4uCgpWZXJzaW9uIDEuMy4yIChOb3ZlbWJlciAzLCAyMDA2KQoKKiBPY3RvYmVyIDEyIDIwMDYKCi0gUHJldmVudCBhcmVzX2dldHNvY2soKSB0byBvdmVyZmxvdyBpZiBtb3JlIHRoYW4gMTYgc29ja2V0cyBhcmUgdXNlZC4KCiogU2VwdGVtYmVyIDExIDIwMDYKCi0gR3VpbGhlcm1lIEJhbGVuYSBWZXJzaWFuaTogSSBub3RlZCBhIHN0cmFuZ2UgQlVHIGluIFdpbjMyIHBvcnQKICAoYXJlc19pbml0LmMvZ2V0X2lwaGxwYXBpX2Ruc19pbmZvKCkgZnVuY3Rpb24pOiB3aGVuIEkgZGlzYWJsZSB0aGUgbmV0d29yawogIGJ5IGhhbmQgb3IgZGlzY29ubmVjdCB0aGUgbmV0d29yayBjYWJsZSBpbiBXaW5kb3dzIDIwMDAgb3IgV2luZG93cyBYUCwgbXkKICBhcHBsaWNhdGlvbiBnZXRzIDEyNy4wLjAuMSBhcyB0aGUgb25seSBuYW1lIHNlcnZlci4gVGhlIHByb2JsZW0gY29tZXMgZnJvbQogICdHZXROZXR3b3JrUGFyYW1zJyBmdW5jdGlvbiwgdGhhdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgIiIgYXMgdGhlIG9ubHkKICBuYW1lIHNlcnZlciBpbiB0aGF0IGNhc2UuIE1vcmVvdmVyLCB0aGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZgogIGluZXRfYWRkcigpIHJldHVybnMgSU5BRERSX0xPT1BCQUNLIGluc3RlYWQgb2YgSU5BRERSX05PTkUuCgoqIEF1Z3VzdCAyOSAyMDA2CgotIEJyYWQgU3BlbmNlciBkaWQKCiAgbyBtYWRlIGFyZXNfdmVyc2lvbi5oIHVzZSBleHRlcm4gIkMiIGZvciBjKysgY29tcGlsZXJzCiAgbyBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBhcmVzX2dldG5hbWVpbmZvLmMKICBvIGZpeGVkIGEgYnVmZmVyIHBvc2l0aW9uIGluaXQgZm9yIFRDUCByZWFkcwoKKiBBdWd1c3QgMyAyMDA2CgotIFJhdmkgUHJhdGFwIGZpeGVkIGFyZXNfZ2V0c29jaygpIHRvIGFjdHVhbGx5IHJldHVybiB0aGUgcHJvcGVyIGJpdG1hcCBhbmQKICBub3QgYWx3YXlzIHplcm8hCgpWZXJzaW9uIDEuMy4xIChKdW5lIDI0LCAyMDA2KQoKKiBKdWx5IDIzLCAyMDA2CgotIEdpc2xlIFZhbmVtIGFkZGVkIGdldG9wdCgpIHRvIHRoZSBhaG9zdCBwcm9ncmFtLiBDdXJyZW50bHkgYWNjZXB0cwogIG9ubHkgWy10IHthfGFhYWF9XSB0byBzcGVjaWZ5IGFkZHJlc3MgZmFtaWx5IGluIGFyZXNfZ2V0aG9zdGJ5bmFtZSgpLgoKKiBKdW5lIDE5LCAyMDA2CgotICh3YWhlcm4pIFJlbW92ZWQgImJpZyBlbmRpYW4iIEROUyBzZWN0aW9uIGFuZCBSUiBkYXRhIGludGVnZXIgcGFyc2VyCiAgbWFjcm9zIGZyb20gYXJlc19kbnMuaCwgd2hpY2ggYnJlYWsgYy1hcmVzIG9uIG15IFNwYXJjNjQuIEJpdC13aXNlCiAgb3BlcmF0aW9ucyBpbiBDIG9wZXJhdGUgb24gbG9naWNhbCB2YWx1ZXMuIEFuZCBpbiBhbnkgZXZlbnQgdGhlIG9jdGV0cyBhcmUKICBhbHJlYWR5IGluIGJpZy1lbmRpYW4gKGFrYSBuZXR3b3JrKSBieXRlIG9yZGVyIHNvIHRoZXkncmUgYmVpbmcgcmV2ZXJzZWQKICAodGh1cyB0aGUgc291cmNlIG9mIHRoZSBicmVha2FnZSkuCgoqIEp1bmUgMTgsIDIwMDYKCi0gV2lsbGlhbSBBaGVybiBoYW5kbGVzIEVBR0FJTi9FV09VTERCTE9DSyBlcnJvcnMgaW4gbW9zdCBvZiB0aGUgSS9PIGNhbGxzCiAgZnJvbSBhcmVhX3Byb2Nlc3MuYy4KCiAgVE9ETzogSGFuZGxlIG9uZSBsYXN0IEVBR0FJTiBmb3IgYSBVRFAgc29ja2V0IHNlbmQoMikgaW4KICBhcmVzX19zZW5kX3F1ZXJ5KCkuCgoqIE1heSAxMCwgMjAwNgoKLSBCcmFtIE1hdHRoeXMgYnJvdWdodCBteSBhdHRlbnRpb24gdG8gYSBsaWJ0b29sIHBlY3VsaWFyaXR5IHdoZXJlIGRldGVjdGluZwogIHRoaW5ncyBzdWNoIGFzIEMrKyBjb21waWxlciBhY3R1YWxseSBpcyBhIGJhZCB0aGluZyBhbmQgc2luY2Ugd2UgZG9uJ3QgbmVlZAogIHRoYXQgZGV0ZWN0aW9uIEkgYWRkZWQgYSB3b3JrLWFyb3VuZCwgbXVjaCBpbnNwaXJlZCBieSBhIHByZXZpb3VzIHBhdGNoIGJ5CiAgUGFvbG8gQm9uemluaS4gVGhpcyBhbHNvIHNob3J0ZW5zIHRoZSBjb25maWd1cmUgc2NyaXB0IHF1aXRlIGEgbG90LgoKKiBNYXkgMywgMjAwNgoKLSBOaWNrIE1hdGhld3NvbiBhZGRlZCB0aGUgQVJFU19PUFRfU09DS19TVEFURV9DQiBvcHRpb24gdGhhdCB3aGVuIHNldCBtYWtlcwogIGMtYXJlcyBjYWxsIGEgY2FsbGJhY2sgb24gc29ja2V0IHN0YXRlIGNoYW5nZXMuIEEgYmV0dGVyIHdheSB0aGFuIHRoZQogIGFyZXNfZ2V0c29jaygpIHRvIGdldCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgc29ja2V0IHN0YXRlLgoKKiBKYW51YXJ5IDksIDIwMDYKCi0gQWxleGFuZGVyIExhemljIGltcHJvdmVkIHRoZSBnZXRzZXJ2Ynlwb3J0X3IoKSBjb25maWd1cmUgY2hlY2suCgoqIEphbnVhcnkgNiwgMjAwNgoKLSBBbGV4YW5kZXIgTGF6aWMgcG9pbnRlZCBvdXQgdGhhdCB0aGUgYnVpbGRjb25mIHNob3VsZCB1c2UgdGhlIEFDTE9DQUxfRkxBR1MKICB2YXJpYWJsZSBmb3IgZWFzaWVyIGNvbnRyb2xsaW5nIHdoYXQgaXQgZG9lcyBhbmQgaG93IGl0IHJ1bnMuCgoqIEphbnVhcnkgNSwgMjAwNgoKLSBKYW1lcyBCdXJzYSBmaXhlZCBjLWFyZXMgdG8gZmluZCB0aGUgaG9zdHMgZmlsZSBvbiBSSVNDIE9TLCBhbmQgbWFkZSBpdAogIGJ1aWxkIHdpdGggbmV3ZXIgZ2NjIHZlcnNpb25zIHRoYXQgbm8gbG9uZ2VyIGRlZmluZXMgInJpc2NvcyIuCgoqIERlY2VtYmVyIDIyCgotIERhbmllbCBTdGVuYmVyZyBhZGRlZCBhcmVzX2dldHNvY2soKSB0aGF0IGV4dHJhY3RzIHRoZSBzZXQgb2Ygc29ja2V0cyB0bwogIHdhaXQgZm9yIGFjdGlvbiBvbi4gU2ltaWxhciB0byBhcmVzX2ZkcygpIGJ1dCBub3QgcmVzdHJpY3RlZCB0byB1c2luZwogIHNlbGVjdCgpIGZvciB0aGUgd2FpdGluZy4KCiogTm92ZW1iZXIgMjUKCi0gWWFuZyBUc2UgZml4ZWQgc29tZSBzZW5kKCkgLyByZWN2KCkgY29tcGlsZXIgd2FybmluZ3MKCiogU2VwdGVtYmVyIDE4CgotIEFkZGVkIGNvbnN0YW50cyB0aGF0IHdpbGwgYmUgdXNlZCBieSBhcmVzX2dldGFkZHJpbmZvCgotIE1hZGUgYXJlc19nZXRuYW1laW5mbyB1c2UgdGhlIHJlZW50cmFudCBnZXRzZXJ2Ynlwb3J0IChnZXRzZXJ2Ynlwb3J0X3IpIGlmIGl0CiAgaXMgYXZhaWxhYmxlIHRvIGVuc3VyZSBpdCB3b3JrcyBwcm9wZXJseSBpbiBhIHRocmVhZGVkIGVudmlyb25tZW50LgoKKiBTZXB0ZW1iZXIgMTAKCi0gY29uZmlndXJlIGZpeCBmb3IgZGV0ZWN0aW5nIGEgbWVtYmVyIGluIHRoZSBzb2NrYWRkcl9pbjYgc3RydWN0IHdoaWNoIGZhaWxlZAogIG9uIGlwdjYtZW5hYmxlZCBIUC1VWCAxMS4wMAoKVmVyc2lvbiAxLjMuMCAoQXVndXN0IDI5LCAyMDA1KQoKKiBBdWd1c3QgMjEKCi0gQWxmcmVkbyBUdXBvbmUgcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBXaW5kb3dzIGNvZGUgaW4gZ2V0X2lwaGxwYXBpX2Ruc19pbmZvKCkKICB3aGVuIGdldHRpbmcgdGhlIEROUyBzZXJ2ZXIgZXRjLgoKKiBKdW5lIDE5CgotIEFkZGVkIHNvbWUgY2hlY2tzIGZvciB0aGUgYWRkcmluZm8gc3RydWN0dXJlLgoKKiBKdW5lIDIKCi0gV2lsbGlhbSBBaGVybjoKCiAgTWFrZSBVRFAgc29ja2V0cyBub24tYmxvY2tpbmcuIEkndmUgY29uZmlybWVkIHRoYXQgYXQgbGVhc3Qgb24gTGludXggMi40IGEKICByZWFkIGV2ZW50IGNhbiBjb21lIGJhY2sgZnJvbSBwb2xsKCkgb24gYSB2YWxpZCBTT0NLX0RHUkFNIHNvY2tldCBidXQKICByZWN2KDIpIHdpbGwgc3RpbGwgYmxvY2suIFRoaXMgcGF0Y2ggZG9lc24ndCBpZ25vcmUgRUFHQUlOIGluCiAgcmVhZF91ZHBfcGFja2V0cygpLCB0aG91Z2ggbWF5YmUgaXQgc2hvdWxkLiAoVGhpcyBwYXRjaCB3YXMgZWRpdGVkIGJ5IERhbmllbAogIFN0ZW5iZXJnIGFuZCBhIG5ldyBjb25maWd1cmUgdGVzdCB3YXMgYWRkZWQgKGltcG9ydGVkIGZyb20gY3VybCdzIGNvbmZpZ3VyZSkKICB0byBwcm9wZXJseSBkZXRlY3Qgd2hhdCBub24tYmxvY2tpbmcgc29ja2V0IGFwcHJvYWNoIHRvIHVzZS4pCgogIEknbSBub3QgcXVpdGUgc3VyZSBob3cgdGhpcyB3YXMgaGFwcGVuaW5nLCBidXQgSSd2ZSBiZWVuIHNlZWluZyBQVFIgcXVlcmllcwogIHdoaWNoIHNlZW0gdG8gcmV0dXJuIGVtcHR5IHJlc3BvbnNlcy4gQXQgbGVhc3QsIHRoZXkgd2VyZSBlbXB0eSB3aGVuIGNhbGxpbmcKICBhcmVzX2V4cGFuZF9uYW1lKCkgb24gdGhlIHJlY29yZC4gSGVyZSdzIGEgcGF0Y2ggd2hpY2ggZ3VhcmFudGVlcyB0bwogIE5VTC10ZXJtaW5hdGUgdGhlIGV4cGFuZGVkIG5hbWUuIFRoZSBvbGQgYmVoYXZpb3IgZmFpbGVkIHRvIE5VTC10ZXJtaW5hdGUgaWYKICBsZW4gd2FzIDAsIGFuZCB0aGlzIHdhcyBjYXVzaW5nIHN0cmxlbigpIHRvIHJ1biBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgogIGFmdGVyIGNhbGxpbmcgYXJlc19leHBhbmRfbmFtZSgpIGFuZCBnZXR0aW5nIEFSRVNfU1VDQ0VTUyBhcyB0aGUgcmV0dXJuCiAgdmFsdWUuIElmIHEgaXMgbm90IGdyZWF0ZXIgdGhhbiAqcyB0aGVuIGl0J3MgZXF1YWwgYW5kICpzIGlzIGFsd2F5cwogIGFsbG9jYXRlZCB3aXRoIGF0IGxlYXN0IG9uZSBieXRlLgoKKiBNYXkgMTYKCi0gQWRkZWQgYXJlc19nZXRuYW1laW5mbyB3aGljaCBtaW1pY3MgdGhlIGdldG5hbWVpbmZvIEFQSSAoYW5vdGhlciBmZWF0dXJlCiAgdGhhdCBjb3VsZCB1c2UgdGVzdGluZykuCgoqIE1heSAxNAoKLSBBZGRlZCBhbiBpbmV0X250b3AgZnVuY3Rpb24gZnJvbSBCSU5EIGZvciBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgaXQuCgoqIEFwcmlsIDkKCi0gTWFkZSBzb3J0bGlzdCBzdXBwb3J0IElQdjYgKHRoaXMgY2FuIHByb2JhYmx5IHVzZSBzb21lIHRlc3RpbmcpLgoKLSBNYWRlIHNvcnRsaXN0IHN1cHBvcnQgQ0lEUiBtYXRjaGluZyBmb3IgSVB2NC4KCiogQXByaWwgOAoKLSBBZGRlZCBwcmVsaW1pbmFyeSBJUHY2IHN1cHBvcnQgdG8gYXJlc19nZXRob3N0YnluYW1lLiBDdXJyZW50bHksIHNvcnRsaXN0CiAgZG9lcyBub3Qgd29yayB3aXRoIElQdjYuIEFsc28gcHJvdmlkZWQgYW4gaW1wbGVtZW50YXRpb24gb2YgYml0bmNtcCBmcm9tCiAgQklORCBmb3Igc3lzdGVtcyB0aGF0IGRvIG5vdCBzdXBwbHkgdGhpcyBmdW5jdGlvbi4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gYWRkCiAgSVB2NiBzdXBwb3J0IHRvIHNvcnRsaXN0LgoKLSBNYWRlIGFyZXNfZ2V0aG9zdGJ5YWRkciBzdXBwb3J0IElQdjYgYnkgc3BlY2lmeWluZyBBRl9JTkVUNiBhcyB0aGUgZmFtaWx5LgogIFRoZSBmdW5jdGlvbiBjYW4gbG9va3VwIElQdjYgYWRkcmVzc2VzIGJvdGggZnJvbSBmaWxlcyAoL2V0Yy9ob3N0cykgYW5kCiAgRE5TIGxvb2t1cHMuCgoqIEFwcmlsIDcKCi0gVHVwb25lIEFsZnJlZG8gZml4ZWQgaW5jbHVkZXMgb2YgYXJwYS9uYW1lc2VyX2NvbXBhdC5oIHRvIGJ1aWxkIGZpbmUgb24gTWFjCiAgT1MgWC4KCiogQXByaWwgNQoKLSBEb21pbmljayBNZWdsaW86IFByb3ZpZGVkIGltcGxlbWVudGF0aW9ucyBvZiBpbmV0X25ldF9wdG9uIGFuZCBpbmV0X3B0b24KICBmcm9tIEJJTkQgZm9yIHN5c3RlbXMgdGhhdCBkbyBub3QgaW5jbHVkZSB0aGVzZSBmdW5jdGlvbnMuCgoqIE1hcmNoIDExLCAyMDA1CgotIERvbWluaWNrIE1lZ2xpbyBhZGRlZCBhcmVzX3BhcnNlX2FhYWFfcmVwbHkuYyBhbmQgZGlkIHZhcmlvdXMKICBhZGp1c3RtZW50cy4gVGhlIGZpcnN0IGxpdHRsZSBzdGVwcyB0b3dhcmRzIElQdjYgc3VwcG9ydCEKCiogTm92ZW1iZXIgNwoKLSBGaXhlZCB0aGUgVkMgcHJvamVjdCBhbmQgbWFrZWZpbGUgdG8gdXNlIGFyZXNfY2FuY2VsIGFuZCBhcmVzX3ZlcnNpb24KCiogT2N0b2JlciAyNAoKLSBUaGUgcmVsZWFzZWQgYXJlc192ZXJzaW9uLmggZnJvbSAxLjIuMSBzYXlzIDEuMi4wIGR1ZSB0byBhIG1ha2V0Z3ogZmxhdy4KICBUaGlzIGlzIG5vdyBmaXhlZC4KClZlcnNpb24gMS4yLjEgKE9jdG9iZXIgMjAsIDIwMDQpCgoqIFNlcHRlbWJlciAyOQoKLSBIZW5yaWsgU3RvZXJuZXIgZml4OiBnb3QgYSByZXBvcnQgdGhhdCBUcnU2NCBVbml4ICh0aGUgdW5peCBmcm9tIERpZ2l0YWwKICB3aGVuIHRoZXkgbWFkZSBBbHBoYSdzKSB1c2VzIC9ldGMvc3ZjLmNvbmYgZm9yIHRoZSBwdXJwb3NlIGZpeGVkIGJlbG93IGZvcgogIG90aGVyIE9TZXMuIEhlIG1hZGUgYy1hcmVzIGNoZWNrIGZvciBhbmQgdW5kZXJzdGFuZCBpdCBpZiBwcmVzZW50LgoKLSBOb3cgYy1hcmVzIHdpbGwgdXNlIGxvY2FsIGhvc3QgbmFtZSBsb29rdXAgX2JlZm9yZV8gRE5TIHJlc29sdmluZyBieSBkZWZhdWx0CiAgaWYgbm90aGluZyBlbHNlIGlzIHRvbGQuCgoqIFNlcHRlbWJlciAyNgoKLSBIZW5yaWsgU3RvZXJuZXI6IGZvdW5kIG91dCB0aGF0IGMtYXJlcyBkb2VzIG5vdCBsb29rIGF0IHRoZSAvZXRjL2hvc3QuY29uZgogIGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBzZXF1ZW5jZSBpbiB3aGljaCB0byBzZWFyY2ggL2V0Yy9ob3N0cyBhbmQgRE5TLiAgU28gb24KICBzeXN0ZW1zIHdoZXJlIHRoaXMgb3JkZXIgaXMgZGVmaW5lZCBieSAvZXRjL2hvc3QuY29uZiBpbnN0ZWFkIG9mIGEgImxvb2t1cCIKICBlbnRyeSBpbiAvZXRjL3Jlc29sdi5jb25mLCBjLWFyZXMgd2lsbCBhbHdheXMgZGVmYXVsdCB0byBsb29raW5nIGluIEROUwogIGZpcnN0LCBhbmQgL2V0Yy9ob3N0cyBzZWNvbmQuCgogIGMtYXJlcyBub3cgbG9va3MgYXQKCiAgMSkgcmVzb2x2LmNvbmYgKGZvciB0aGUgImxvb2t1cCIgbGluZSk7CiAgMikgbnNzd2l0Y2guZm9uIChmb3IgdGhlICJob3N0czoiIGxpbmUpOwogIDMpIGhvc3QuY29uZiAoZm9yIHRoZSAib3JkZXIiIGxpbmUpLgoKICBGaXJzdCBtYXRjaCB3aW5zLgoKLSBEb21pbmljayBNZWdsaW8gcGF0Y2hlZDogQy1hcmVzIG9uIFdpbmRvd3MgYXNzdW1lZCB0aGF0IHRoZSBIT1NUUyBmaWxlIGlzCiAgbG9jYXRlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbi4gSXQgYXNzdW1lZAogIEM6XFdpbmRvd3NcU3lzdGVtMzJcRHJpdmVyc1xFdGMuIFRoaXMgaXMgYSBwb29yIGFzc3VtcHRpb24gdG8gbWFrZS4gSW4gZmFjdCwKICB0aGUgbG9jYXRpb24gb2YgdGhlIEhPU1RTIGZpbGUgY2FuIGJlIGNoYW5nZWQgdmlhIGEgcmVnaXN0cnkgc2V0dGluZy4KCiAgVGhlcmUgaXMgYSBrZXkgY2FsbGVkIERhdGFiYXNlUGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIEhPU1RTCiAgZmlsZToKICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdGVjaG5ldC9pdHNvbHV0aW9ucy9uZXR3b3JrL2RlcGxveS9kZXBvdmcvdGNwaXAyay5tc3B4CgogIFRoZSBwYXRjaCB3aWxsIG1ha2UgYy1hcmVzIGNvcnJlY3RseSBjb25zdWx0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGxvY2F0aW9uCiAgb2YgdGhpcyBmaWxlLgoKKiBBdWd1c3QgMjkKCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIE1TVkMgYnVpbGQgZmlsZXMuCgoqIEF1Z3VzdCAyMAoKLSBHaXNsZSBWYW5lbSBtYWRlIGMtYXJlcyBidWlsZCBhbmQgd29yayB3aXRoIGhpcyBXYXR0LTMyIFRDUC9JUCBzdGFjay4KCiogQXVndXN0IDEzCgotIEhhcnNoYWwgUHJhZGhhbiBtYWRlIGEgbWlub3Igc3ludGF4IGNoYW5nZSBpbiBhcmVzX2luaXQuYyB0byBtYWtlIGl0IGJ1aWxkCiAgZmluZSB3aXRoIE1TVkMgNy4xCgoqIEp1bHkgMjQKCi0gTWFkZSB0aGUgbGliIGdldCBidWlsdCBzdGF0aWMgb25seSBpZiAtLWVuYWJsZS1kZWJ1ZyBpcyB1c2VkLgoKLSBHaXNsZSBWYW5lbSBmaXhlZDoKCiAgQmFzaWNhbGx5IGluIGxvb3BzIGxpa2UgaGFuZGxlX2Vycm9ycygpLCAncXVlcnktPm5leHQnIHdhcyBhc3NpZ25lZCBhIGxvY2FsCiAgdmFyaWFibGUgYW5kIHRoZW4gcXVlcnkgd2FzIHJlZmVyZW5jZWQgYWZ0ZXIgdGhlIG1lbW9yeSB3YXMgZnJlZWQgYnkKICBuZXh0X3NlcnZlcigpLiBJJ3ZlIGNoYW5nZWQgdGhhdCBzbyBuZXh0X3NlcnZlcigpIGFuZCBlbmRfcXVlcnkoKSByZXR1cm5zCiAgdGhlIG5leHQgcXVlcnkuIFNvIGNhbGxlcnMgc2hvdWxkIHVzZSB0aGlzIHJldC12YWx1ZS4KCiAgVGhlIG5leHQgcHJvYmxlbSB3YXMgdGhhdCAnc2VydmVyLT50Y3BfYnVmZmVyX3BvcycgaGFkIGEgcmFuZG9tIHZhbHVlIGF0CiAgZW50cnkgdG8gMXN0IHJlY3YoKSAobHVja2lseSBjYXVzaW5nIFdpbnNvY2sgdG8gcmV0dXJuIEVOT0JVRlMpLgoKICBJJ3ZlIGFsc28gYWRkZWQgYSBhcmVzX3dyaXRldigpIGZvciBXaW5kb3dzIHRvIHN0cmVhbWxpbmUgdGhlIGNvZGUgYSBiaXQKICBtb3JlLgoKKiBKdWx5IDIwCi0gRml4ZWQgYSBmZXcgdmFyaWFibGUgcmV0dXJuIHR5cGVzIGZvciBzb21lIHN5c3RlbSBjYWxscy4gTWFkZSBjb25maWd1cmUKICBjaGVjayBmb3Igc3NpemVfdCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGF0IHdoZW4gcmVjZWl2aW5nIHRoZSBzZW5kKCkKICBlcnJvciBjb2RlLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgc3lzdGVtcy4KCi0gTWFkZSBjb25maWd1cmUgY3JlYXRlIGNvbmZpZy5oLCBhbmQgYWxsIHNvdXJjZSBmaWxlcyBub3cgaW5jbHVkZSBzZXR1cC5oIHRoYXQKICBtaWdodCBpbmNsdWRlIHRoZSBwcm9wZXIgY29uZmlnLmggKG9yIGEgaGFuZGljcmFmdGVkIGFsdGVybmF0aXZlKS4KCi0gU3dpdGNoZWQgdG8gJ2FyZXNfc29ja2V0X3QnIHR5cGUgZm9yIHNvY2tldHMgaW4gYXJlcywgc2luY2UgV2luZG93cyBkb24ndAogIHVzZSAnaW50JyBmb3IgdGhhdC4KCi0gYXV0b21ha2UtaWZpZWQgYW5kIGxpYm9vbC1pZmllZCBjLWFyZXMuIE5vdyBpdCBidWlsZHMgbGliY2FyZXMgYXMgYSBzaGFyZWQKICBsaWIgb24gbW9zdCBwbGF0Zm9ybXMgaWYgd2FudGVkLiAoVGhpcyBibG9hdGVkIHRoZSBzaXplIG9mIHRoZSByZWxlYXNlCiAgYXJjaGl2ZSB3aXRoIGFub3RoZXIgMjAwSyEpCgotIE1ha2VmaWxlLmFtIG5vdyB1c2VzIE1ha2VmaWxlLmluYyBmb3IgdGhlIGMgc291cmNlcywgaCBoZWFkZXJzIGFuZCBtYW4KICBwYWdlcywgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIG90aGVyIG1ha2VmaWxlcyB0byB1c2UgdGhlIGV4YWN0IHNhbWUgc2V0IG9mCiAgZmlsZXMuCgotIEFkanVzdGVkICdtYWtldGd6JyB0byB1c2UgdGhlIG5ldyBhdXRvbWFrZSBtYWdpYyB3aGVuIGJ1aWxkaW5nIGRpc3RyaWJ1dGlvbgogIGFyY2hpdmVzLgoKLSBBbnlvbmUgZGVzaXJlcyBIVE1MIGFuZC9vciBQREYgdmVyc2lvbnMgb2YgdGhlIG1hbiBwYWdlcyBpbiB0aGUgcmVsZWFzZQogIGFyY2hpdmVzPwoKKiBKdWx5IDMKLSBH/G50ZXIgS25hdWYgbWFkZSBjLWFyZXMgYnVpbGQgYW5kIHJ1biBvbiBOb3ZlbGwgTmV0d2FyZS4KCiogSnVseSAxCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgTWFrZWZpbGUuZGogdG8gYnVpbGQgd2l0aCBkamdwcCwgYWRkZWQgYSBmZXcgbW9yZSBkamdwcAogIGZpeGVzIGFuZCBtYWRlIGFyZXMgbm90IHVzZSAnZXJybm8nIHRvIHByb3ZpZGUgZnVydGhlciBpbmZvIG9uIFdpbmRvd3MuCgoqIEp1bmUgMzAKLSBHaXNsZSBWYW5lbSBtYWRlIGl0IGJ1aWxkIHdpdGggZGpncHAgYW5kIHJ1biBmaW5lIHdpdGggdGhlIFdhdHQtMzIgc3RhY2suCgoqIEp1bmUgMTAKLSBHaXNsZSBWYW5lbSdzIGluaXQgcGF0Y2ggZm9yIFdpbmRvd3M6CgogIFRoZSBpbml0X2J5X3Jlc29sdl9jb25mKCkgZnVuY3Rpb24gZmV0Y2hlcyB0aGUgRE5TLXNlcnZlcihzKQogIGZyb20gYSBzZXJpZXMgb2YgcmVnaXN0cnkgYnJhbmNoZXMuCgogIFRoaXMgY2FuIGJlIHdyb25nIGluIHRoZSBjYXNlIHdoZXJlIERIQ1AgaGFzIGFzc2lnbmVkIG5hbWVzZXJ2ZXJzLCBidXQgdGhlCiAgdXNlciBoYXMgb3ZlcnJpZGRlbiB0aGVzZSBzZXJ2ZXJzIHdpdGggb3RoZXIgcHJlZmVyZWQgc2V0dGluZ3MuIFRoZW4gaXQncwogIHdyb25nIHRvIHVzZSB0aGUgREhDUE5BTUVTRVJWRVIgc2V0dGluZyBpbiByZWdpc3RyeS4KCiAgSW4gdGhlIGNhc2Ugb2Ygbm8gZ2xvYmFsIERIQ1AtYXNzaWduZWQgb3IgZml4ZWQgc2VydmVycywgYnV0IEROUyBzZXJ2ZXIocykKICBwZXIgYWRhcHRlciwgb25lIGhhcyB0byBxdWVyeSB0aGUgYWRhcHRlciBicmFuY2hlcy4gIEJ1dCBob3cgY2FuIGMtYXJlcyBrbm93CiAgd2hpY2ggYWRhcHRlciBpcyB2YWxpZCBmb3IgdXNlPyBBRkFJQ1MgaXQgY2FuJ3QuIFRoZXJlIGNvdWxkIGJlIG9uZSBhZGFwdGVyCiAgdGhhdCBpcyBkb3duIChlLmcuIGEgVlBOIGFkYXB0ZXIpLgoKICBTbyBpdCdzIGJldHRlciB0byBsZWF2ZSB0aGlzIHRvIHRoZSBJUCBIZWxwZXIgQVBJIChpcGhsYXBpKSBhdmFpbGFibGUgaW4KICBXaW4tOTgvMjAwMCBhbmQgbGF0ZXIuIE15IHBhdGNoIGZhbGxzLWJhY2sgdG8gdGhlIG9sZCB3YXkgaWYgbm90IGF2YWlsYWJsZS4KCiogSnVuZSA4Ci0gSmFtZXMgQnVyc2EgZml4ZWQgYW4gaW5pdCBpc3N1ZSBmb3IgUklTQyBPUy4KCiogTWF5IDExCi0gTmljbyBTdGFwcGVuYmVsdCByZXBvcnRlZCB0aGF0IHdoZW4gcHJvY2Vzc2luZyBkb21haW4gYW5kIHNlYXJjaCBsaW5lcyBpbgogIHRoZSByZXNvbHYuY29uZiBmaWxlLCB0aGUgZmlyc3QgZW50cnkgZW5jb3VudGVyZWQgaXMgcHJvY2Vzc2VkIGFuZCB1c2VkIGFzCiAgdGhlIHNlYXJjaCBsaXN0LiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCBwYWdlcyBmb3IgYm90aCBMaW51eCwgU29sYXJpcyBhbmQKICBUcnU2NCwgdGhlIGxhc3QgZW50cnkgb2YgZWl0aGVyIGEgZG9tYWluIG9yIGEgc2VhcmNoIGZpZWxkIGlzIHVzZWQuCgogIFRoaXMgaXMgbm93IGFkanVzdGVkIGluIHRoZSBjb2RlCgpWZXJzaW9uIDEuMi4wIChBcHJpbCAxMywgMjAwNCkKCiogQXByaWwgMiwgMjAwNAotIFVwZGF0ZWQgdmFyaW91cyBtYW4gcGFnZXMgdG8gbG9vayBuaWNlciB3aGVuIGNvbnZlcnRlZCB0byBIVE1MIG9uIHRoZSB3ZWIKICBzaXRlLgoKKiBBcHJpbCAxLCAyMDA0Ci0gRGlyayBNYW5za2UgcHJvdmlkZWQgYSBuZXcgZnVuY3Rpb24gdGhhdCBpcyBub3cgbmFtZWQgYXJlc19jYW5jZWwoKS4gSXQgaXMKICB1c2VkIHRvIGNhbmNlbC9jbGVhbnVwIGEgcmVzb2x2ZS9yZXF1ZXN0IG1hZGUgdXNpbmcgYXJlcyBmdW5jdGlvbnMgb24gdGhlCiAgZ2l2ZW4gYXJlcyBjaGFubmVsLiBJdCBkb2VzIG5vdCBkZXN0cm95L2tpbGwgdGhlIGFyZXMgY2hhbm5lbCBpdHNlbGYuCgotIERvbWluaWNrIE1lZ2xpbyBjbGVhbmVkIHVwIHRoZSBmb3JtYXR0aW5nIGluIHNldmVyYWwgbWFuIHBhZ2VzLgoKKiBNYXJjaCAzMCwgMjAwNAotIERvbWluaWNrIE1lZ2xpbydzIG5ldyBhcmVzX2V4cGFuZF9zdHJpbmcuIEEgaGVscGVyIGZ1bmN0aW9uIHdoZW4gZGVjb2RpbmcKICBpbmNvbWluZyBETlMgcGFja2FnZXMuCgotIERhbmllbCBTdGVuYmVyZyBtb2RpZmllZCB0aGUgTWFrZWZpbGUuaW4gdG8gdXNlIGEgZm9yIGxvb3AgZm9yIHRoZSBtYW4gcGFnZQogIGluc3RhbGxhdGlvbiB0byBpbXByb3ZlIG92ZXJ2aWV3IGFuZCBtYWtlIGl0IGVhc2llciB0byBhZGQgbWFuIHBhZ2VzLgoKVmVyc2lvbiAxLjEuMCAoTWFyY2ggMTEsIDIwMDQpCgoqIE1hcmNoIDksIDIwMDQKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCBidWlsZCBvbiBXaW5kb3dzLgoKKiBGZWJydWFyeSAyNSwgMjAwNAotIERhbiBGYW5kcmljaCBmb3VuZCBhIGZsYXcgaW4gdGhlIEZlYiAyMiBmaXguCgotIEFkZGVkIGJldHRlciBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgbG9naWMgKHRha2VuIGZyb20gdGhlIGN1cmwgY29uZmlndXJlCiAgc2NyaXB0KS4gQWRkZWQgYWNpbmNsdWRlLm00IHRvIHRoZSB0YXJiYWxsLgoKKiBGZWJydWFyeSAyMywgMjAwNAotIFJlbW92ZWQgYXJlc19mcmVlX2Vycm1lbSgpLCB0aGUgZnVuY3Rpb24sIHRoZSBmaWxlIGFuZCB0aGUgbWFuIHBhZ2UuIEl0IHdhcwogIG5vdCB1c2VkIGFuZCBpdCBkaWQgbm90aGluZy4KCi0gRml4ZWQgYSBsb3Qgb2YgY29kZSB0aGF0IHdhc24ndCAiNjRiaXQgY2xlYW4iIGFuZCB0aHVzIGNhdXNlZCBhIGxvdCBvZgogIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHBpY2t5IGNvbXBpbGVycy4KCiogRmVicnVhcnkgMjIsIDIwMDQKLSBEb21pbmljayBNZWdsaW8gbWFkZSBhcmVzIGluaXQgc3VwcG9ydCBtdWx0aXBsZSBuYW1lIHNlcnZlcnMgaW4gdGhlCiAgTmFtZVNlcnZlciBrZXkgb24gV2luZG93cy4KCiogRmVicnVhcnkgMTYsIDIwMDQKLSBNb2RpZmllZCBhcmVzX3ByaXZhdGUuaCB0byBpbmNsdWRlIGxpYmN1cmwncyBtZW1vcnkgZGVidWcgaGVhZGVyIGlmCiAgQ1VSTERFQlVHIGlzIHNldC4gVGhpcyBtYWtlcyBhbGwgdGhlIGFyZXMtZnVuY3Rpb25zIHN1cGVydmlzZWQgcHJvcGVybHkgYnkKICB0aGUgY3VybCB0ZXN0IHN1aXRlLiBUaGlzIGFsc28gZm9yY2VkIG1lIHRvIGFkZCBpbmNsdXNpb24gb2YgdGhlCiAgYXJlc19wcml2YXRlLmggaGVhZGVyIGluIGEgZmV3IG1vcmUgZmlsZXMgdGhhdCBhcmUgdXNpbmcgc29tZSBraW5kIG9mCiAgbWVtb3J5LXJlbGF0ZWQgcmVzb3VyY2VzLgoKLSBNYWRlIHRoZSBtYWtlZmlsZSBvbmx5IGJ1aWxkIGFob3N0IGFuZCBhZGlnIGlmICdtYWtlIGRlbW9zJyBpcyB1c2VkLgoKKiBGZWJydWFyeSAxMCwgMjAwNAotIERpcmsgTWFuc2tlIG1hZGUgYXJlc192ZXJzaW9uLmggaW5zdGFsbGVkIHdpdGggJ21ha2UgaW5zdGFsbCcKCiogRmVicnVhcnkgNCwgMjAwNAotIGFyZXNfZnJlZV9lcnJtZW0oKSBpcyBzdWJqZWN0IGZvciByZW1vdmFsLCBpdCBpcyBzaW1wbHkgcHJlc2VudCBmb3IgZnV0dXJlCiAgcHVycG9zZXMsIGFuZCBzaW5jZSB3ZSByZW1vdmVkIHRoZSBleHRyYSBwYXJhbWV0ZXIgaW4gc3RyZXJyb3IoKSBpdCB3b24ndAogIGJlIHVzZWQgYnkgYy1hcmVzIQotIGNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyBub3cgZW5hYmxlcyBwaWNreSBjb21waWxlciBvcHRpb25zIGlmIGdjYyBpcyB1c2VkCi0gZml4ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyAtLWVuYWJsZS1kZWJ1ZyBzaG93ZWQgYW5kIEpvZXJnIE11ZWxsZXItVG9sawogIHJlcG9ydGVkCgpWZXJzaW9uIDEuMC4wIChGZWJydWFyeSAzLCAyMDA0KQoKKiBGZWJydWFyeSAzLCAyMDA0Ci0gbm93IHdlIHByb2R1Y2UgdGhlIGxpYmNhcmVzLmEgbGlicmFyeSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBsaWJhcmVzLmEKICBzaW5jZSB3ZSBhcmUgbm8gbG9uZ2VyIGNvbXBhdGlibGUKCiogRmVicnVhcnkgMiwgMjAwNAoKLSBhcmVzX3N0cmVycm9yKCkgaGFzIG9uZSBhcmd1bWVudCBsZXNzLiBUaGlzIGlzIHRoZSBmaXJzdCBvZmZpY2lhbAogIG1vZGlmaWNhdGlvbiBvZiB0aGUgZXhpc3RpbmcgcHJvdmlkZWQgYXJlcyBBUEkuCgoqIEphbnVhcnkgMjksIDIwMDQKCi0gRGlyayBNYW5za2UgZml4ZWQgaG93IHRoZSBzb2NrZXQgaXMgc2V0IG5vbi1ibG9ja2luZy4KCiogSmFudWFyeSA0LCAyMDA0CgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIHRoZSBwcml2YXRlIGdldHRpbWVvZmRheSgpIGJlY29tZSBhcmVzX2dldHRpbWVvZmRheSgpCiAgaW5zdGVhZCBpbiBvcmRlciB0byBub3QgcG9sbHV0ZSB0aGUgbmFtZSBzcGFjZSBhbmQgcmlzayBjb2xsaWRpbmcgd2l0aAogIG90aGVyIGxpYnJhcmllcycgdmVyc2lvbnMgb2YgdGhpcyBmdW5jdGlvbi4KCiogT2N0b2JlciAyNCwgMjAwMy4gRGFuaWVsIFN0ZW5iZXJnCgogIEFkZGVkIGFyZXNfdmVyc2lvbigpLgoKVmVyc2lvbiAxLjAtcHJlMSAoOCBPY3RvYmVyIDIwMDMpCgotIEphbWVzIEJ1cnNhIG1hZGUgaXQgcnVuIG9uIFJJU0MgT1MKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgaXQgcnVuIGZpbmUgb24gTlQ0CgotIER1bmNhbiBXaWxjb3ggbWFkZSBpdCB3b3JrIGZpbmUgb24gTWFjIE9TIFgKCi0gRGFuaWVsIFN0ZW5iZXJnIGFkanVzdGVkIHRoZSB3aW5kb3dzIHBvcnQKCi0gbGlyZW4gYXQgdml2aXNpbW8uY29tIG1hZGUgdGhlIGluaXRpYWwgd2luZG93cyBwb3J0CgoqIEltcG9ydGVkIHRoZSBzb3VyY2VzIGZyb20gYXJlcyAxLjEuMQo=