PWhlYWQxIE5BTUUKCkNoYW5nZXMgLSBBcGFjaGUgbW9kX3BlcmwgY2hhbmdlIGxvZ2ZpbGUKCj1oZWFkMSBDSEFOR0VTCgphbGwgY2hhbmdlcyB3aXRob3V0IGF1dGhvciBhdHRyaWJ1dGlvbiBhcmUgYnkgRG91ZyBNYWNFYWNoZXJuCgpBbHNvIHJlZmVyIHRvIHRoZSBBcGFjaGU6OlRlc3QgY2hhbmdlcyBsb2cgZmlsZSwgYXQgQXBhY2hlLVRlc3QvQ2hhbmdlcwoKPW92ZXIgMwoKPWl0ZW0gMS45OV8xMSAtIE5vdmVtYmVyIDEwLCAyMDAzCgphZGQgYSBidWlsZC93aW4zMl9mZXRjaF9hcHhzIHNjcmlwdCAoY2FsbGVkIHdpdGhpbiB0aGUgdG9wLWxldmVsCk1ha2VmaWxlLlBMKSB0byBvZmZlciB0byBmZXRjaCBhbmQgaW5zdGFsbCBhIFdpbjMyIGRldmVsb3BtZW50CnZlcnNpb24gb2YgYXB4cyBhbmQgKGFwcnxhcHUpLWNvbmZpZyBbUmFuZHkgS29iZXNdCgpyZXdyaXRlICRyLT5yZWFkKCkgYW5kIHBlcmxpbyByZWFkIGZ1bmN0aW9ucyB0byB1c2UgdGhlIHNhbWUgZnVuY3Rpb24sCndoaWNoIGNvbXBsZXRlbHkgc2F0aXNmaWVzIHRoZSByZWFkIHJlcXVlc3QgaWYgcG9zc2libGUsIG9uIHRoZSB3YXkKZ2V0dGluZyByaWQgb2YgZ2V0X2NsaWVudF9ibG9jayBhbmQgaXRzIHN1cHBvcnRpbmcgZnVuY3Rpb25zIHdoaWNoCmhhdmUgcHJvYmxlbXMgYW5kIHdpbGwgbW9zdCBsaWtlbHkgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGh0dHBkLUFQSQppbiB0aGUgZnV0dXJlLiBEaXJlY3RseSBtYW5pcHVsYXRlIGJ1Y2tldCBicmlnYWRlcyBpbnN0ZWFkLiBbU3Rhc10KClNpbmNlIEFwYWNoZTIucG0gcG9wcyAvZm9vL0FwYWNoZTIgZGlycyB0byB0aGUgdG9wIG9mIEBJTkMsIGl0IG5vdwphbHNvIHRha2VzIGNhcmUgb2Yga2VlcGluZyBsaWIgYW5kIGJsaWIgZGlycyBiZWZvcmUgdGhlIHN5c3RlbSBkaXJzLApzbyB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIGxpYnJhcmllcyB3b24ndCBnZXQgbG9hZGVkIGluc3RlYWQgb2YgdGhlCmN1cnJlbnRseSB1bmluc3RhbGxlZCBsaWJyYXJpZXMgdGhhdCBhcmUgdW5kZXIgdGVzdC4gW1N0YXNdCgpXaGVuICdtYWtlIHRlc3QnIGZhaWxzIHdlIG5vdyBwcmludCB0aGUgaW5mbyBvbiB3aGF0IHRvIGRvIG5leHQgW1N0YXNdCgpBdCB0aGUgZW5kIG9mICdtYWtlIGluc3RhbGwnIHdlIG5vdyBwcmludCB0aGUgaW5mbyBob3cgdG8gcHJvY2VlZCB3aXRoCm1vZF9wZXJsIGFuZCB3aGF0IHRvIGRvIGluIHRoZSBjYXNlIG9mIHBvc3QtaW5zdGFsbCBwcm9ibGVtcyBbR2VvZmZdCgpBZGp1c3QgdGhlIHNvdXJjZSB0byBwcm9wZXJseSB3b3JrIHdpdGggNS44LjIncyBuZXcgYWxnb3JpdGhtIG9mCmR5bmFtaWMgcmUtaGFzaGluZyBvZiBoYXNoZXMgb24gaGFzaCBjb2xsaXNpb24gYXR0YWNrLiBbTmljaG9sYXMgQ2xhcmsKPG5pY2tAY2NsNC5vcmc+LCBTdGFzXS4gQWRkIGEgdGVzdCB0aGF0IG1vdW50cyBzdWNoIGFuIGF0dGFjayBzbyB3ZQpjYW4gdmVyaWZ5IHRoYXQgd2UgY2FuIHN1cnZpdmUgdGhpcyByZWhhc2hpbmcuIFtTY290dCBBIENyb3NieQo8c2Nyb3NieUBjcy5yaWNlLmVkdT4sIE5pY2hvbGFzIENsYXJrIDxuaWNrQGNjbDQub3JnPiwgVGVscwo8cGVybF9kdW1teUBibG9vZGdhdGUuY29tPiwgTWFyayBKYXNvbiBEb21pbnVzIDxtamRAcGxvdmVyLmNvbT4sIFN0YXNdCgpTdGFuZGFyZGl6ZSB0aGUgQXBhY2hlOjpQZXJsU2VjdGlvbnMgcGFja2FnZSBuYW1lIHRvIGl0J3MgcGx1cmFsIGZvcm0gZm9yCmNsYXJpdHkgYW5kIHNvIHRoYXQgdGhlIHBvZCBnZXRzIGdsdWVkIGluIGl0J3MgcHJvcGVyIHBsYWNlLgpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCnJldHVybiB2YWx1ZSBmcm9tIFBlcmwgY2FsbGJhY2tzIGFyZSBub3cgcGFzc2VkIGRpcmVjdGx5IHRvIEFwYWNoZQp3aXRob3V0IGFkZGl0aW9uYWwgcG9zdC1jYWxsIG1hbmlwdWxhdGlvbnMgKHN1Y2ggYXMgYXNzdW1pbmcgSFRUUF9PSwpzaG91bGQgcmVhbGx5IGJlIE9LKS4gIFtHZW9mZnJleSBZb3VuZ10KCnBlcmwgNS44LjEgdy8gaXRocmVhZHMgaGFzIGEgYnVnIHdoZXJlIGl0IHJlcG9ydHMgdGhlIHdyb25nIHBhcmVudCBwaWQKKGFzIGlmIHRoZSBwcm9jZXNzIHdhcyBuZXZlciBmb3JrZWQpLCBwcm92aWRlIGEgbG9jYWwgd29ya2Fyb3VuZCAoKyBuZXcKdGVzdCkuIFtSYWZhZWwgR2FyY2lhLVN1YXJleiA8cmdhcmNpYXN1YXJlekBmcmVlLmZyPl0KCm92ZXJyaWRlbiBTVEQqIHN0cmVhbXMgbm93IGNhbiBiZSBmdXJ0aGVyIG92ZXJyaWRlbiBhbmQgd2lsbCBiZQpwcm9wZXJseSByZXN0b3JlZCwgd2hpY2ggYWxsb3dzIGZ1bmN0aW9ucyBsaWtlICRyLT5pbnRlcm5hbF9yZWRpcmVjdAp3b3JrICgrYWRkIHRlc3RzKSBbU3Rhc10KCmltcGxlbWVudCBwZXJsaW8ncyBnZXRhcmcgaG9vaywgd2hpY2ggbm93IGFsbG93cyBkdXBwaW5nIFNURCogc3RyZWFtcwpvdmVybG9hZGVkIGJ5IG1vZHBlcmwgW1N0YXNdCgpBZGQgUGVybE1hcFRvU3RvcmFnZUhhbmRsZXIgW0dlb2ZmcmV5IFlvdW5nXQoKY2FsbGJhY2tzIGFyZSBub3cgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSAKKE9LLCBTRVJWRVJfRVJST1IsIGV0Yykgb3IgcmV0dXJuIHZpYSBhbiBvZmZpY2lhbCBBUEkgCihleGl0LCBkaWUsIGV0YykuICByZWx5aW5nIG9uIGltcGxpY2l0IHJldHVybnMgZnJvbSB0aGUgCmxhc3QgY2FsbCBldmFsdWF0ZWQgYnkgYSBzdWJyb3V0aW5lIG1heSByZXN1bHQgaW4gc2VydmVyIAplcnJvcnMuICBbU3RhcywgR2VvZmZyZXkgWW91bmddCgppbiB0aGUgTVBfTUFJTlRBSU5FUiBtb2RlIGFkZCB0aGUgLVdlcnJvciBjb21waWxhdGlvbiBmbGFnIHdoZW4gcGVybAp2NS42LjIgb3IgaGlnaGVyIGlzIHVzZWQsIHNvIHRoYXQgd2UgZG9uJ3QgbWlzcyBjb21waWxhdGlvbgp3YXJuaW5ncy4gW1N0YXNdCgpmaXggdGhlIE1ha2VmaWxlLlBMIG9wdGlvbiBwYXJzZXIgdG8gc3VwcG9ydCBvdmVycmlkaW5nIG9mIGNlcnRhaW4KYnVpbGQgb3B0aW9ucywgaW4gYWRkaXRpb24gdG8gYXBwZW5kaW5nIHRvIHRoZW0gKC5lLmcuIG5vdyBNUF9MSUJOQU1FCmlzIG92ZXJyaWRhYmxlKSBbQW5kcmV3IFd5bGxpZSA8d3lsbGllQGRpbGV4Lm5ldD5dCgptYWtlIHN1cmUgdGhhdCBjb25uZWN0aW9uIGZpbHRlcnMgd29uJ3QgYmUgaW5zZXJ0ZWQgYXMgcmVxdWVzdCBmaWx0ZXJzCltTdGFzXQoKUHJldmVudCB0aGUgJ1VzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlLicgd2FybmluZyB3aGVuCk1vZFBlcmw6OlV0aWw6OmV4aXQgaXMgdXNlZC4gW1N0YXNdCgpUbyBtYWtlIHRoZSB0ZXN0LXN1dGUgc2FuZGJveC1mcmllbmRseSwgd2hpY2ggYnJlYWsgd2hlbiB0aGluZ3MgdHJ5IHRvCnJ1biBvZmYgL3RtcCwgdXNlIHQvbG9ncyBhcyB0aGUgbG9jYXRpb24gb2YgdGhlIG1vZF9jZ2lkIHNvY2tldCBhbmQKVE1QRElSIGVudiB2YXIgW0hhcm9vbiBSYWZpcXVlIDxoYXJvb24ucmFmaXF1ZUB1dG9yb250by5jYT5dCgo9aXRlbSAxLjk5XzEwIC0gU2VwdGVtYmVyIDI5LCAyMDAzCgphZGRlZCBBcGFjaGU6OkNSTEYsIEFwYWNoZTo6Q1IsIGFuZCBBcGFjaGU6OkxGIHRvCkFwYWNoZTo6Q29uc3QncyA6cGxhdGZvcm0gZ3JvdXAgIFtHZW9mZnJleSBZb3VuZ10KCm1ha2Ugc3VyZSB0aGF0IHRoZSBjdXN0b20gcG9vbHMgYXJlIGRlc3Ryb3llZCBvbmx5IG9uY2UgYW5kIG9ubHkgd2hlbgphbGwgcmVmZXJlbmNlcyB3ZW50IG91dCBvZiBzY29wZSBbU3Rhc10KCigkcnwkYyktPmFkZF8oaW5wdXR8b3V0cHV0KV9maWx0ZXIoXCZoYW5kbGVyKSBub3cgdmVyaWZ5IHRoYXQgdGhlCmZpbHRlciBvZiB0aGUgcmlnaHQga2luZCBpcyBwYXNzZWQgYW5kIHdpbGwgcmVmdXNlIHRvIGFkZCBhIHJlcXVlc3QKZmlsdGVyIGFzIGEgY29ubmVjdGlvbiBmaWx0ZXIgYW5kIHZpY2UgdmVyc2EuIFRoZSByZXF1ZXN0IGZpbHRlcgpoYW5kbGVyIGlzIG5vdCByZXF1aXJlZCB0byBoYXZlIHRoZSBGaWx0ZXJSZXF1ZXN0SGFuZGxlciBhdHRyaWJ1dGUgYXMKbG9uZyBhcyBpdCBkb2Vzbid0IGhhdmUgYW55IG90aGVyIGF0dHJpYnV0ZXMuIFRoZSBjb25uZWN0aW9uIGZpbHRlcgpoYW5kbGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgdGhlIEZpbHRlckNvbm5lY3Rpb25IYW5kbGVyCmF0dHJpYnV0ZS4gW1N0YXNdCgpmaXggdHJhY2luZyB3aXRoIChQZXJsVHJhY2UvTU9EX1BFUkxfVFJBQ0UpIG9uIHdpbjMyICh0aGUgZXJyb3JfbG9nCmZpbGVoYW5kbGUgd2FzIGludmFsaWQgYWZ0ZXIgdGhlIG9wZW5fbG9ncyBwaGFzZSkgW1N0YXNdCgpmaXggYSBidWcgd2hlcmUgJUVOViB2YXJzIHNldCB2aWEgc3VicHJvY2Vzc19lbnYgcGVyc2lzdCBhY3Jvc3MKcmVxdWVzdHMuICAoZS5nLiBhIENvb2tpZSBpbmNvbWluZyBoZWFkZXIgd2hpY2ggZW5kcyB1cCBpbgokRU5We0hUVFBfQ09PS0lFfSB3b3VsZCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlcXVlc3Qgd2hpY2ggaGFzIG5vCkNvb2tpZSBoZWFkZXIgYXQgYWxsKS4gTm93IHdlIHVuc2V0IGFsbCB0aGUgJUVOViB2YXJzIHNldCBmcm9tCnN1YnByb2Nlc3NfZW52LiBJbXByb3ZlIGFuZCBleHRlbmQgdGhlIHRlc3RzIHRvIGNvdmVyIHRoaXMgYnVnLiBbU3Rhc10KCml0IGlzIGludmFsaWQgdG8gcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SIG9yIGFueSBvdGhlciBIVFRQCnJlc3BvbnNlIGNvZGUgZnJvbSBtb2RwZXJsX3didWNrZXRfcGFzcywgdGhlcmVmb3JlIHNldCB0aGUgZXJyb3IgY29kZQppbnRvIHItPnN0YXR1cyBhbmQgcmV0dXJuIEFQUl9TVUNDRVNTLiBVbnRpbGwgbm93IHJlc3BvbnNlIGhhbmRsZXIKd2l0aCBtZXNzZWQgdXAgcmVzcG9uc2UgaGVhZGVycywgd2VyZSBjYXVzaW5nIG5vIHJlc3BvbnNlIHdoYXQgc28gZXZlcgp0byB0aGUgY2xpZW50LiAgTFdQIHdhcyBhc3N1bWluZyA1MDAsIGFuZCBpdCB3YXMgYWxsIGZpbmUsIHRlc3RpbmcKd2l0aG91dCBMV1AgaGFzIGltbWVkaWF0ZWx5IHJldmVhbGVkIHRoYXQgdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUKaGFuZGxpbmcgb2YgdGhpcyBjYXNlLiBbU3Rhc10KCnB1dCB0aGUgZW5kIHRvIHRoZSAnTm90IGEgQ09ERSByZWZlcmVuY2UnIGVycm9ycywgaW5zdGVhZCBwcm92aWRlIGFuCmludGVsbGlnZW50IGVycm9yIG1lc3NhZ2UsIGhvcGVmdWxseSB0ZWxsaW5nIHdoaWNoIGZ1bmN0aW9uIGNhbid0IGJlCmZvdW5kLiAgYXQgdGhlIHNhbWUgdGltZSBpbXByb3ZlIHRoZSB0cmFjaW5nIHRvIGluY2x1ZGUgdGhlIHBpZC90aWQgb2YKdGhlIHNlcnZlciB0aGF0IGhhcyBlbmNvdW50ZXJlZCB0aGlzIHByb2JsZW0sIHRvIG1ha2UgaXQgZWFzaWVyIHRvCmRlYnVnLiBbU3Rhc10KCm1vZF9wZXJsIGhhbmRsZXIgbXVzdCBiZSBkdXBwZWQgZm9yIGFueSBtcG0gd2hpY2ggcnVucyB3aXRoaW4KVVNFX0lUSFJFQUQuICBVbnRpbGwgbm93IHRoZXJlIHdhcyBhIGJpZyBwcm9ibGVtIHdpdGggcHJlZm9yayBtcG0gaWYKYW55IG9mIGl0cyB2aG9zdHMgd2FzIHVzaW5nIFBlcmxPcHRpb25zICsoUGFyZW50fENsb25lKSBhbmQgaGFwcGVuZWQKdG8gbG9hZCBoYW5kbGVycyBiZWZvcmUgdGhlIG1haW4gc2VydmVyLiBXaGVuIHRoYXQgd2FzIGhhcHBlbmluZyB0aGUKbWFpbiBzZXJ2ZXIgd2lsbCBzZWUgdGhhdCB0aGUgaGFuZGxlciB3YXMgcmVzb2x2ZWQgKHNpbmNlIGl0IHNlZXMgdGhlCmhhbmRsZXIgc3RydWN0IGZyb20gdGhlIHZob3N0IHRoYXQgbG9hZGVkIHRoaXMgbW9kdWxlLCBpbnN0ZWFkIG9mIGl0cwpvd24pLCB3aGljaCBpbiBmYWN0IGl0IHdhc24ndCwgY2F1c2luZyB0aGUgZmFpbHVyZSB0byBydW4gdGhlIGhhbmRsZXIKd2l0aCB0aGUgaW5mYW1vdXMgJ05vdCBhIENPREUgcmVmZXJlbmNlJyBlcnJvci4gW1N0YXNdCgpNYWtlIHN1cmUgdGhhdCB0aGUgc3RhdGljIG1vZF9wZXJsIGxpYnJhcnkgaXMgYnVpbHQgYWZ0ZXIgdGhlIGR5bmFtaWMKKGEgcmVxdWlyZW1lbnQgb24gd2luMzIpIFtTdGV2ZSBIYXkgPHN0ZXZlLmhheUB1ay5yYWRhbi5jb20+XQoKQXBhY2hlOjpTdGF0dXMgbm93IGdlbmVyYXRlcyBIVE1MIDQuMDEgU3RyaWN0IChhbmQgaW4gbWFueSBjYXNlcywgYWxzbwpJU08tSFRNTCkgY29tcGxpYW50IG91dHB1dC4gQWxzbyBhZGQgYSBzaW1wbGUgQ1NTIHRvIG1ha2UgdGhlIHJlcG9ydHMKbG9vayBuaWNlci4gW1ZpbGxlIFNreXR05CA8dmlsbGUuc2t5dHRhQGlraS5maT5dCgpBUFI6OlBvb2w6OkRFU1RST1kgaW1wbGVtZW50ZWQgYW5kIHR3ZWFrZWQgdG8gb25seQpkZXN0cm95IHBvb2xzIGNyZWF0ZWQgdmlhIEFQUjo6UG9vbC0+bmV3KCkgW0dlb2ZmcmV5IFlvdW5nXQoKJHItPnNsdXJwX2ZpbGVuYW1lIGlzIG5vdyBpbXBsZW1lbnRlZCBpbiBDLiBbU3Rhc10KCnJlbW92ZSBzdXBwb3J0IGZvciBodHRwZCAyLjAuNDUvYXByIDAuOS4zIGFuZCBsb3dlci4KaHR0cGQgMi4wLjQ2IGlzIG5vdyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvbi4KW0dlb2ZmcmV5IFlvdW5nXQoKQVBSOjpQZXJsSU8gbm93IGFjY2VwdHMgdGhlIHBvb2wgb2JqZWN0IGluc3RlYWQgb2YgYSByZXF1ZXN0L3NlcnZlcgpvYmplY3RzLCBzbyBpdCBjYW4gYmUgdXNlZCBhbnl3aGVyZSwgaW5jbHVkaW5nIG91dHNpZGUgbW9kX3BlcmwgW1N0YXNdCgp3aGVuIHBlcmwgaXMgYnVpbHQgd2l0aCBwZXJsaW8gZW5hYmxlZCAoNS44KykgdGhlIG5ldyBQZXJsSU8gQXBhY2hlCmxheWVyIGlzIHVzZWQsIHNvIG5vdyBvbmUgY2FuIHB1c2ggbGF5ZXJzIG9udG8gU1RESU4sIFNURE9VVCBoYW5kbGVzCmUuZy4gYmlubW9kZShTVERPVVQsICc6dXRmOCcpOyBbU3Rhc10KCmFkZCBhcF90YWJsZV9jb21wcmVzcygpIHRvIEFQUjo6VGFibGUgW0dlb2ZmcmV5IFlvdW5nXQoKYWx0ZXIgc3RhY2tlZCBoYW5kbGVyIGludGVyZmFjZSBzbyB0aGF0IG1vZF9wZXJsIGZvbGxvd3MgQXBhY2hlIAphcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHdpdGggcmVzcGVjdCB0byBWT0lEL1JVTl9GSVJTVC9SVU5fQUxMCmhhbmRsZXIgdHlwZXMuICBub3csIGZvciBwaGFzZXMgd2hlcmUgT0sgZW5kcyB0aGUgQXBhY2hlCmNhbGwgbGlzdCAoUlVOX0ZJUlNUIGhhbmRsZXJzLCBzdWNoIGFzIHRoZSBQZXJsVHJhbnNIYW5kbGVyKSwgCm1vZF9wZXJsIGZvbGxvd3Mgc3VpdCBhbmQgbGVhdmVzIHNvbWUgaGFuZGxlcnMgdW5jYWxsZWQuCltHZW9mZnJleSBZb3VuZ10KCkFwYWNoZTo6QnVpbGQgbm93IHRyaWVzIHRvIHVzZSB0aGUgbmV3IEFQUl9CSU5ESVIgcXVlcnkgc3RyaW5nIHRvIGZpbmQKdGhlIGxvY2F0aW9uIG9mIGFwci1jb25maWcuIFtTdGFzXQoKbmV3IHBhY2thZ2UgQXBhY2hlOjpwb3J0aW5nIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHBvcnQgbXAxIGNvZGUgdG8gbXAyCltTdGFzXQoKbmV3IEFwYWNoZTo6QnVpbGQgbWV0aG9kczogbXBtX25hbWUoKSwgbXBtX2lzX3RocmVhZGVkKCkuIHVzZSB0aGVtIGluCnRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUuUEwgdG8gcmVxdWlyZSA1LjguMC9pdGhyZWFkcyBpZiBtcG0gcmVxdWlyZXMKdGhyZWFkcy4gW1N0YXNdCgphZGQgdGhlIG1pc3NpbmcgWFMgbWV0aG9kcyB0byBNb2RQZXJsOjpNZXRob2RMb29rdXAsIGFkZCBzdXBwb3J0IGZvcgptcDEgbWV0aG9kcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIG1vZF9wZXJsIDIuMCBBUEkuIFtTdGFzXQoKbW9kX3Blcmwgbm93IHJlZnVzZXMgdG8gYnVpbGQgYWdhaW5zdCB0aHJlYWRlZCBtcG1zIChub24tcHJlZm9yaykKdW5sZXNzIHBlcmwgNS44KyB3L2l0aHJlYWRzIGlzIHVzZWQgW1N0YXNdCgpkb24ndCB0cnkgdG8gcmVhZCBQRVJMX0hBU0hfU0VFRCBlbnYgdmFyLCB3aGVyZSBhcHJfZW52X2dldCBpcyBub3QKYXZhaWxhYmxlIChhcHIgPCAwLjkuMykgW1N0YXNdCgpBUFIuc28gbm93IGNhbiBiZSBsb2FkZWQgYW5kIHVzZWQgb3V0c2lkZSBtb2RfcGVybCAoYWxsIHRoZSB3YXkgYmFjawp0byBodHRwZCAyLjAuMzYpIFtTdGFzXQoKcGVybCA1LjguMSByYW5kb21pemVzIHRoZSBoYXNoIHNlZWQsIGJlY2F1c2Ugd2UgcHJlY2FsY3VsYXRlIHRoZSBoYXNoCnZhbHVlcyBvZiBtZ3YgZWxlbWVudHMgdGhlIGhhc2ggc2VlZCBoYXMgdG8gYmUgdGhlIHNhbWUgYWNyb3NzIGFsbApwZXJsIGludGVycHJldGVycy4gU28gbW9kX3Blcmwgbm93IGludGVyY2VwdHMgY2FzZXMgd2hlcmUgcGVybCB3b3VsZApoYXZlIHJhbmRvbWl6ZSBpdCwgZG8gdGhlIHNlZWQgcmFuZG9taXphdGlvbiBieSBpdHNlbGYgYW5kIHRlbGwgcGVybAp0byB1c2UgdGhhdCB2YWx1ZS4gW1N0YXNdCgpmaXggQVBSOjpQZXJsSU8gbGF5ZXIgdG8gcG9wIGl0c2VsZiBpZiBvcGVuKCkgaGFzIGZhaWxlZC4gW1N0YXNdCgptb3ZlIHRoZSBkZWZpbml0aW9uIG9mIERFRklORT0nLURNUF9IQVZFX0FQUl9MSUJTJyB0byB0aGUgdG9wIGxldmVsCk1ha2VmaWxlLlBMLCBzaW5jZSBpdCBvdmVycmlkZXMgTVk6OnBhc3RocnUgdGFyZ2V0IHdoaWNoIG1ha2VzIGl0CmltcG9zc2libGUgdG8gZGVmaW5lIGxvY2FsIERFRklORSBpbiBzdWJkaXJzLiBbU3Rhc10KCm1ha2UgQVBSIHBlcmwgZnVuY3Rpb25zIHdvcmsgb3V0c2lkZSBtb2RfcGVybDogc2V2ZXJhbCBsaWJyYXJpZXMKd2VyZW4ndCBsaW5rZWQuIEFsc28gTElCUyBuZWVkcyB0byByZWNlaXZlIGFsbCBsaWJzIGluIG9uZQpzdHJpbmcuIFtTdGFzXQoKQXBhY2hlOjpjb21wYXQ6ICRyLT5jZ2lfZW52LCAkci0+Y2dpX3ZhciBhcmUgbm93IGFsaWFzZXMgdG8KJHItPnN1YnByb2Nlc3NfZW52IFtTdGFzXQoKRm9yIFdpbjMyLCBnZW5lcmF0ZSAucGRiIGZpbGVzIGZvciBkZWJ1Z2dpbmcgd2hlbiBidWlsdCB3aXRoCk1QX0RFQlVHLiBUaGVzZSB3aWxsIGdldCBpbnN0YWxsZWQgaW50byB0aGUgc2FtZSBkaXJlY3RvcnkgYXMKdGhlIGFzc29jaWF0ZWQgZGxsL3NvIGxpYnMuIEFzIHdlbGwsIGluc3RhbGwgbW9kX3BlcmwubGliCmludG8gTVBfQVBfUFJFRklYL2xpYi8gZm9yIHVzZSBieSAzcmQgcGFydHkgbW9kdWxlcyBbUmFuZHkgS29iZXNdLgoKQXBhY2hlMi5wbSBpcyBub3cgYXV0b2dlbmVyYXRlZCBhbmQgd2lsbCBhZGp1c3QgQElOQyB0byBpbmNsdWRlCkFwYWNoZTIvIHN1YmRpcnMgb25seSBpZiBidWlsdCB3aXRoIE1QX0lOU1RfQVBBQ0hFMj0xIFtTdGFzXQoKQ2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnQgJ3JlYWRieXRlcycgZm9yCmFwX2dldF9icmlnYWRlKCksIGZyb20gMCB0byA4MTkyLiBvdGhlciB0aGFuIGJlaW5nIHVzZWxlc3MsIDAgYWx3YXlzCnRyaWdnZXJzIGFuIGFzc2VydCBpbiBodHRwZCBpbnRlcm5hbCBmaWx0ZXJzIGFuZCA4MTkyIGlzIGEgZ29vZApkZWZhdWx0LiBbU3Rhc10KCkZpeCBEeW5hTG9hZGVyIGJyZWFrZWFnZSB3aGVuIHVzaW5nIERMX0dMT0JBTCBvbiBPcGVuQlNECltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKcmVuYW1lZCB0aGUgcHJpdmF0ZSBtb2RwZXJsX21vZHVsZV9jb25maWdfZ2V0X29iaiBmdW5jdGlvbiB0byAKbW9kcGVybF9tb2R1bGVfY29uZmlnX2NyZWF0ZV9vYmosIHNpbmNlIHRoZSBsb2dpYyBjcmVhdGVzIAp0aGUgb2JqZWN0IGJ1dCBkb2Vzbid0IGRpZyBpdCBvdXQgaWYgaXQgYWxyZWFkeSBleGlzdHMuICB0aGVuLAptb3ZlZCBsb2dpYyBmcm9tIG1weHNfQXBhY2hlX19Nb2R1bGVfZ2V0X2NvbmZpZyBpbnRvIGEgbmV3IHB1YmxpYwpDIGZ1bmN0aW9uIHRoYXQgcmV1c2VkIHRoZSBvbGQgbmFtZSwgbW9kcGVybF9tb2R1bGVfY29uZmlnX2dldF9vYmouCndoaWxlIEFwYWNoZTo6TW9kdWxlLT5nZXRfY29uZmlnIGV4aXN0cyBhcyBhIHdyYXBwZXIgdG8gcmV0dXJuIHRoZQpvYmplY3QgdG8gUGVybCBzcGFjZSwgbm93IEMvWFMgZm9sa3MgY2FuIGFsc28gYWNjZXNzIHRoZSBvYmplY3QKZGlyZWN0bHkgd2l0aCB0aGUgcHVibGljIGZ1bmN0aW9uLgpbR2VvZmZyZXkgWW91bmddCgpBcGFjaGU6OlJlbG9hZDogYWRkIGEgbmV3IGNvbmZpZyB2YXJpYWJsZToKUmVsb2FkQ29uc3RhbnRSZWRlZmluZVdhcm5pbmdzIHRvIG9wdGlvbmFsbHkgc2h1dCBvZmYgdGhlIGNvbnN0YW50IHN1YgpyZWRlZmluZSB3YXJuaW5ncyBbU3Rhc10KCmltcGxlbWVudCAkcGFybXMtPmluZm8uICBkaXJlY3RpdmUgaGFuZGxlcnMgc2hvdWxkIG5vdyBiZSBjb21wbGV0ZS4KW0dlb2ZmcmV5IFlvdW5nXQoKTVBfR1RPUCBub3cgd29ya3Mgd2l0aCBtb2Rlcm4gR0NDCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmddCgphZGQgbWlzc2luZyBkZXBlbmRlbmNpZXMgdG8gQXBhY2hlOjpQZXJsU2VjdGlvbnMKW0dlb2ZmcmV5IFlvdW5nXQoKJHItPmdldF9jbGllbnRfYmxvY2sgaXMgYm9ndXMgaW4gaHR0cGQtMi4wLjQ1IChhbmQgZWFsaWVyKSwgYXMgaXQKY2FuJ3QgaGFuZGxlIEVPUyBidWNrZXRzIGFycml2aW5nIGluIHRoZSBzYW1lIGJ1Y2tldCBicmlnYWRlIHdpdGgKZGF0YS4gc28gcmV3cml0ZSBNb2RQZXJsOjpUZXN0OjpyZWFkX3Bvc3QgdG8gdXNlIGFuIGV4cGxpY2l0IHJlYWQKdGhyb3VnaCBhbGwgYnVja2V0IGJyaWdhZGVzIHRpbGwgaXQgc2VlcyBlb3MgYW5kIHRoZW4gaXQgc3RvcHMuIFRoZQpjb2RlIGlzIGxvbmdlciBidXQgaXQgd29ya3MgY29ycmVjdGx5LiBbU3Rhc10KCmFuIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgYmluYXJ5IGNvbXBhdGliaWxpdHkgcHJvYmxlbSBpbgpQZXJsSU9BUFJfc2VlayBBUEkgd2hlbiBBUFJfSEFTX0xBUkdFX0ZJTEVTPTAgW1N0YXNdCgpwZXJsIDUuOC4wIGZvcmdldHMgdG8gZXhwb3J0IFBlcmxJT0Jhc2Vfbm9vcF9mYWlsLCBjYXVzaW5nIHByb2JsZW1zIG9uCndpbjMyIGFuZCBhaXguIHJlaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gbG9jYWxseSB0byBzb2x2ZSB0aGUKcHJvYmxlbS4gQVBSOjpQZXJsSU8gc2hvdWxkIG5vdyBiZSB1c2VmdWwgb24gd2luMzIgYW5kIGFpeCBbU3Rhc10KCmltcGxlbWVudCBERUNMSU5FX0NNRCBhbmQgRElSX01BR0lDX1RZUEUgY29uc3RhbnRzCltHZW9mZnJleSBZb3VuZ10KCmFsbG93IGluaXQgZmlsdGVyIGhhbmRsZXJzIHRvIGNhbGwgb3RoZXIgbWV0aG9kcyB0aGFuIGp1c3QgJGYtPmN0eCBbU3Rhc10KCkZpeCBBcGFjaGU6OlJlbG9hZCB0byBncmFjZWZ1bGx5IGhhbmRsZSB0aGUgY2FzZSB3aXRoIGVtcHR5IFRvdWNoZmlsZXMKW0RtaXRyaSBUaWtob25vdiA8ZG1pdHJpQG5ldGlsbGEuY29tPl0KClBlcmxSZXF1aXJlIGVudHJpZWQgc2hvdWxkIGJlIGV4ZWN1dGVkIGJlZm9yZSBQZXJsTW9kdWxlIGVudHJpZXMgaW4KVmlydHVhbEhvc3QgY29udGFpbmVycywganVzdCBsaWtlIGluIHRoZSBiYXNlIHNlcnZlciBbU3Rhc10KCj1pdGVtIDEuOTlfMDkgLSBBcHJpbCAyOCwgMjAwMwoKJGZpbHRlci0+c2Vlbl9lb3MoKSBub3cgYWNjZXB0cyAxLzAgdG8gc2V0L3Vuc2V0IHRoZSBmbGFnIHNvIHN0cmVhbWluZwpmaWx0ZXJzIGNhbiBjb250cm9sIHRoZSBzZW5kaW5nIG9mIEVPUy4gW1N0YXNdCgpzdXBwb3J0IHN5c3RlbXMgd2hlcmUgYXByIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgZnJvbQpodHRwZCBoZWFkZXIgZmlsZXMgWyJBbmRyZXMgU2Fsb21vbiIgPGRpbGluZ2VyQHZveGVsLm5ldD5dCgppbXBsZW1lbnQgaW5pdCBmaWx0ZXIgaGFuZGxlcnMgKyB0ZXN0cyBbU3Rhc10KCmltcHJvdmluZyBNb2RQZXJsOjpNZXRob2RMb29rdXAgdG86Ci0gaGFuZGxlIG1vcmUgYWxpYXNlZCBwZXJsIFhTIGZ1bmN0aW9ucwotIHNvcnQgdGhlIG1ldGhvZHMgbWFwIHN0cnVjdCBzbyBvbmUgY2FuIHVzZSB0aGUgYXV0b2dlbmVyYXRlZCBtYXAgYXMgaXMKLSBhZGQgbG9va3VwX21vZHVsZSwgdGVsbHMgd2hpY2ggbWV0aG9kcyBhcmUgZGVmaW5lZCBieSBhIGdpdmVuIG1vZHVsZQotIGFkZCBsb29rdXBfb2JqZWN0LCB0ZWxscyB3aGljaCBtZXRob2RzIGNhbiBiZSBjYWxsZWQgb24gYSBnaXZlbiBvYmplY3QKLSBwcm92aWRlIGF1dG9leHBvcnRlZCB3cmFwcGVycyBwcmludF9tZXRob2QsIHByaW50X21vZHVsZSBhbmQKICBwcmludF9vYmplY3QgZm9yIGVhc3kgZGVwbG95bWVudCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKW1N0YXNdCgphZGQgUGVybCBnbHVlIGZvciBmdW5jdGlvbnM6IEFQUjo6U29ja2V0Ojp0aW1lb3V0X2dldApBUFI6OlNvY2tldDo6dGltZW91dF9zZXQgW1N0YXNdCgpzaW1pbGFyIHRvIFNldEVudiwgdXBjYXNlIHRoZSBlbnYga2V5cyBmb3IgUGFzc0VudiBvbiBwbGF0Zm9ybXMgd2l0aApjYXNlbGVzcyBlbnYgKGUuZy4gd2luMzIpIFtzdGV2ZS5zcGFybGluZ0Bwcy5nZS5jb21dCgpBZGQgYSBiYWNrY29tcGF0IHdyYXBwZXIgZm9yICRyLT5ub3RlcyAobXAyIHN1cHBvcnRzIG9ubHkgdGhlCkFQUjo6VGFibGUgQVBJKSBbU3Rhc10KCkFkZCBhIHNjcmlwdCBtcDJidWcgYW5kIGEgdGFyZ2V0ICdtYWtlIGJ1Z3JlcG9ydCcsIHNvIHBlb3BsZSBjYW4gdXNlCmJ1Z3JlcG9ydGluZyBkdXJpbmcgdGhlIGJ1aWxkIGFuZCBhZnRlciBtb2RwZXJsIGlzIGluc3RhbGxlZC4gW1N0YXNdCgpBZGQgYSBzY3JpcHQgbXAyZG9jIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHBlcmxkb2MgKGR1ZSB0byAyLjAgbW9kdWxlcwpsaXZpbmcgdW5kZXIgQXBhY2hlMiwgd2hpY2ggd29uJ3QgYmUgbG9va2VkIGF0IGJ5IHBlcmxkb2MpLiBbU3Rhc10KCkFkZCBhIGNvbnN0YW50IEFQUjo6UGVybElPOjpQRVJMSU9fTEFZRVJTX0FSRV9FTkFCTEVEIGFuZCB1c2UgaXQgaW4KdGVzdHMgW1N0YXNdCgpSZXF1aXJlIHBlcmwgNS44IG9yIGhpZ2hlciB3aGVuIGJ1aWxkaW5nIG1vZF9wZXJsIG9uIE9TZXMgcmVxdWlyaW5nCml0aHJlYWRzIChlLmcuLCB3aW4zMiksIHNpbmNlIDUuNi54IGl0aHJlYWRzIGFyZW4ndCBnb29kLiBbU3Rhc10KCk1QX0NPTVBBVF8xWD0wIG5vdyBjYW4gYmUgcGFzc2VkIHRvIE1ha2VmaWxlLlBMIHRvIGRpc2FibGUKbXAxLWJhY2stY29tcGF0IGNvbXBpbGUtdGltZSBmZWF0dXJlcyArIGFkanVzdCB0ZXN0cy4gW1N0YXNdCgo8U0VSVkVSX1JPT1Q+IGFuZCA8U0VSVkVSX1JPT1Q+L2xpYi9wZXJsIGFyZSBub3cgYWRkZWQgdG8gQElOQywganVzdApsaWtlIG1vZF9wZXJsIDEuMCB3aXRoIE1QX0NPTVBBVF8xWD0xIChjdXJyZW50bHkgZW5hYmxlZCBieQpkZWZhdWx0KS4gW1N0YXNdCgpUaGUgUGVybC01LjguMCBjcnlwdCgpIHdvcmthcm91bmQgaXMgbm93IHVzZWQgb25seSBpZiA1LjguMCBpcyB1c2VkLApzaW5jZSA1LjguMS10b2JlLzUuOS4wLXRvYmUoYmxlYWQtcGVybCkgd29uJ3QgY29tcGlsZSB3aXRoCml0LiBbR2VvZmZyZXkgWW91bmddCgpuZXcgZGlyZWN0aXZlcyBQZXJsU2V0SW5wdXRGaWx0ZXIgYW5kIFBlcmxTZXRPdXRwdXRGaWx0ZXIsIHdoaWNoIGFyZQp0aGUgc2FtZSBhcyBTZXRJbnB1dEZpbHRlciBhbmQgU2V0T3V0cHV0RmlsdGVyIHJlc3BlY3RpdmVseSwgYnV0IGFsbG93CnRvIGluc2VydCBub24tbW9kX3BlcmwgZmlsdGVycyBiZWZvcmUsIGJldHdlZW4gb3IgYWZ0ZXIgbW9kX3BlcmwKZmlsdGVycy4gKyB0ZXN0cyBbU3Rhc10KCmltcHJvdmVkIGZpbHRlcnMgZGVidWcgdHJhY2luZyBbU3Rhc10KCmltcGxlbWVudCAkZmlsdGVyLT5yZW1vdmUgKGZpbHRlciBzZWxmLXJlbW92YWwpICsgdGVzdHMgW1N0YXNdCgpyZW1vdmUgdGhlIHNlY29uZC1ndWVzc2luZyBjb2RlIHRoYXQgd2FzIHRyeWluZyB0byBndWVzcyB0aGUgcGFja2FnZQpuYW1lIHRvIGxvYWQgZnJvbSB0aGUgaGFuZGxlciBjb25maWd1cmF0aW9uIChieSBzdHJpcHBpbmcgOjpzdHJpbmcgYW5kCnRyeWluZyB0byBsb2FkIHRoZSBwYWNrYWdlKS4gZmFsbCBiYWNrIHRvIHVzaW5nIGV4cGxpY2l0IFBlcmxNb2R1bGUgdG8KbG9hZCBtb2R1bGVzIHdob3NlIGhhbmRsZXIgc3ViIG5hbWUgaXMgbm90IGNhbGxlZCAnaGFuZGxlcicgKyBhZGp1c3QKdGVzdHMuIFtTdGFzXQoKc2V0IHRoZSBtYWdpYyB0YWludCBmbGFncyBiZWZvcmUgbW9kdWxlcyBhcmUgcmVxdWlyZWQgW1N0YXNdCgptYWtlIHN1cmUgdG8gc2V0IGJhc2Ugc2VydmVyJ3MgbWlwIGJlZm9yZSBhbnkgb2YgdGhlClBlcmxSZXF1aXJlL1BlcmxNb2R1bGUgZGlyZWN0aXZlcyBhcmUgY2FsbGVkLCBzaW5jZSB0aGV5IG1heSBhZGQKYWRkX2NvbmZpZygpLCB3aGljaCBpbiB0dXJuIHJ1bnMgUGVybCBzZWN0aW9ucyBvciBQZXJsTG9hZE1vZHVsZSwKd2hpY2ggbWF5IG5lZWQgdGhlIHNjZmctPm1pcCB0byBiZSBzZXQuIFtTdGFzXQoKTW9kUGVybDo6TU0gaXMgbm93IHJlYWR5IHRvIGJlIHVzZWQgaW4gTWFrZWZpbGUuUEwgb2YgM3JkIHBhcnR5Cm1vZF9wZXJsIG1vZHVsZXMgW1N0YXMgYW5kIEdlb2ZmXQoKZml4IGEgc2VnZmF1bHQgY2F1c2VkIGJ5IFBlcmxNb2R1bGUgaW4gJHMtPmFkZF9jb25maWcsIGR1ZSB0byBzZXR0aW5nCnRoZSBNUF9pbml0X2RvbmUgZmxhZyBiZWZvcmUgaW5pdCB3YXMgZG9uZSArIGFkZCB0ZXN0IFtTdGFzXQoKYWRqdXN0IHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUncyB0byBwcm9wZXJseSBidWlsZCBvbiBhaXggKHRlc3RlZCBvbgpwb3dlcnBjLWlibS1haXg1LjEuMC4wKSBbU3Rhc10KCnRoZSBidWlsZCBub3cgYXV0b21hdGljYWxseSBnbHVlcyB0aGUgLnBvZCBmaWxlcyB0byB0aGUgcmVzcGVjdGl2ZSAucG0KZmlsZXMsIHNvIG9uZSBjYW4gdXNlIHBlcmxkb2Mgb24gLnBtIGZpbGVzIHRvIHJlYWQgdGhlCmRvY3VtZW50YXRpb24uIFtTdGFzXQoKcHJvdmlkZSBhIHdvcmthcm91bmQgZm9yIEV4dFV0aWxzOjpNYWtlTWFrZXI6Om12X2FsbF9tZXRob2RzLCBzbwpNb2RQZXJsOjpCdWlsZE1NIGFuZCBNb2RQZXJsOjpNTSBjYW4gb3ZlcnJpZGUgRVU6Ok1NIG1ldGhvZHMgYmVoaW5kCnRoZSBzY2VuZXMuIFtTdGFzXQoKYWRkaW5nIE1vZFBlcmw6OkJ1aWxkTU0sIHdoaWNoIGlzIG5vdyB1c2VkIGZvciBidWlsZGluZyBtb2RfcGVybC4KTW9kUGVybDo6TU0gd2lsbCBiZSB1c2VkIGZvciAzcmQgcGFydHkgbW9kdWxlcy4gTW9kUGVybDo6QnVpbGRNTQpyZXVzZXMgTW9kUGVybDo6TU0gd2hlcmUgcG9zc2libGUuIFtTdGFzXQoKZHJvcCB0aGUgZ2x1ZSBjb2RlIGZvciBhcHJfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzLCBzaW5jZSBpdCdzIG5vdAphdmFpbGFibGUgb24gYWxsIHBsYXRmb3Jtcy4gW1N0YXNdCgpTaW5jZSBub24tdGhyZWFkZWQgbXBtcyBkb24ndCB1c2UgdGlwb29scyBpbiBtaXBzLCBkb24ndCBjcmVhdGUgYW5kCmRlc3Ryb3kgdGhlbS4gW1N0YXNdCgpyZS11c2UgdGhlIHdvcmthcm91bmQgZm9yIGdsaWJjL1BlcmwtNS44LjAgY3J5cHQoKSBidWcgZm9yIHRoZQptYWluL3Zob3N0IGJhc2UgcGVybCBpbnRlcnByZXRlcnMgYXMgd2VsbC4gVGhpcyBzb2x2ZXMgdGhlIHByb2JsZW0gZm9yCnRoZSBidWdneSBnbGliYyBvbiBSSDguMC4gW1N0YXNdCgpzZW5kX2NnaV9oZWFkZXIgbm93IHR1cm5zIHRoZSBoZWFkZXIgcGFyc2luZyBvZmYgYW5kIGNhbiBzZW5kIGFueSBkYXRhCmF0dGFjaGVkIGFmdGVyIHRoZSByZXNwb25zZSBoZWFkZXJzIGFzIGEgcmVzcG9uc2UgYm9keS4gW1N0YXNdCgptb3ZlIHRoZSBjaGVjayB0aGF0IHByaW50L3ByaW50Zi9wdXRzL3dyaXRlL2V0YyBhcmUgY2FsbGVkIGluIHRoZQpyZXNwb25zZSBwaGFzZSBpbnRvIHRoZSBmdW5jdGlvbnMgdGhlbXNlbHZlcyBzbyAxKSB3ZSBjYW4gcHJpbnQgYSBtb3JlCnVzZWZ1bCBlcnJvciBtZXNzYWdlIDIpIHRoaXMgY2hlY2sgaXMgbm90IGFsd2F5cyBuZWVkZWQgaW4KbW9kcGVybF93YnVja2V0X3dyaXRlLCB3aGVuIGNhbGxlZCBpbnRlcm5hbGx5LCBzbyB3ZSBzYXZlIHNvbWUgY3ljbGVzLgpbU3Rhc10KCmFkZCBjaGVja3MgdGhhdCBwcmludC9wcmludGYvcHV0cy93cml0ZS9ldGMgYXJlIGNhbGxlZCBpbiB0aGUgcmVzcG9uc2UKcGhhc2UuIG1vdmUgdGhlIGNoZWNrIGludG8gdGhlIGZ1bmN0aW9ucyB0aGVtc2VsdmVzIHNvIHdlIGNhbiBwcmludCBhCm1vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UgW1N0YXNdCgonbWFrZSBpbnN0YWxsJyBub3cgaW5zdGFsbHMgbW9kX3BlcmwqaCBmaWxlcyB1bmRlciBodHRwZCdzIGluY2x1ZGUKdHJlZSBbU3Rhc10KCldoZW4gUGVybE9wdGlvbnMgK1BhcnNlSGVhZGVycyBpcyBhbiBlZmZlY3QsIHRoZSBDR0kgaGVhZGVycyBwYXJzaW5nCndvbid0IGJlIGRvbmUgaWYgYW55ICptb2RfcGVybCogaGFuZGxlciBiZWZvcmUgYW5kIGluY2x1ZGluZyB0aGUKcmVzcG9uc2UgcGhhc2UsIHNldHMgJHItPmNvbnRlbnRfdHlwZS4gIChzaW1pbGFyIGJlaGF2aW9yIHRvIG1wMSdzCnNlbmRfaHR0cF9oZWFkZXIoKSBbU3Rhc10KClJlZ2lzdHJ5OiBtYWtlIHN1cmUgdGhhdCAkciBpcyBub3QgaW4gdGhlIHNjb3BlIHdoZW4gdGhlIHNjcmlwdCBpcwpjb21waWxlZCBbU3Rhc10KCiRBcGFjaGU6OlNlcnZlcjo6U2F2ZUNvbmZpZyBhZGRlZC4gV2hlbiBzZXQgdG8gYSB0cnVlIHZhbHVlLAp3aWxsIG5vdCBjbGVhciB0aGUgY29udGVudCBvZiBBcGFjaGU6OlJlYWRDb25maWc6OiBvbmNlIDxQZXJsID4Kc2VjdGlvbnMgYXJlIHByb2Nlc3NlZC4gW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZ10KCkFwYWNoZTo6Y29tcGF0OiBzdXBwb3J0IDEuMCdzIEFwYWNoZS0+cHVzaF9oYW5kbGVycywKQXBhY2hlLT5zZXRfaGFuZGxlcnMgYW5kIEFwYWNoZS0+Z2V0X2hhbmRsZXJzIFtTdGFzXQoKcmV2YW1wIHRoZSBjb2RlIGhhbmRsaW5nIG91dHB1dCBmbHVzaGluZyBhbmQgZmx1c2ggYnVja2V0CnNlbmRpbmcuIE5hbWVsbHkgbW9kcGVybF93YnVja2V0X2ZsdXNoIGFuZCBtb2RwZXJsX3didWNrZXRfcGFzcyBub3cKY2FuIGJlIHRvbGQgdG8gc2VuZCBhIGZsdXNoIGJ1Y2tldCBieSB0aGVtc2VsdmVzLCBhdHRhY2hpbmcgaXQgdG8gdGhlCmRhdGEgYmIgdGhleSBhcmUgYWxyZWFkeSBzZW5kaW5nLiBUaGlzIGhhbGZzIHRoZSBudW1iZXIgb2Ygb3V0cHV0CmZpbHRlciBpbnZvY2F0aW9ucyB3aGVuIHRoZSByZXNwb25zZSBoYW5kbGVyIGZsdXNoZXMgb3V0cHV0IHZpYSAkfCBvcgpyZmx1c2guIGFkanVzdCB0ZXN0cywgd2hpY2ggd2VyZSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGludm9jYXRpb25zLgpbU3Rhc10KCm1vdmUgTW9kUGVybDo6UmVnaXN0cnlDb29rZXIgdG8gdXNlIGEgaGFzaCBhcyBvYmplY3QgKHNpbWlsYXIgdG8gbXAxKSwKdG8gbWFrZSBpdCBlYXNpZXIgdG8gc3ViY2xhc3MuIFtOYXRoYW4gQnlyZCA8bmF0aGFuQGJ5cmQubmV0Pl0KCiRyLT5yZmx1c2ggaGFzIHRvIGZsdXNoIGludGVybmFsIG1vZHBlcmwgYnVmZmVyIGJlZm9yZSBjYWxsaW5nCmFwX3JmbHVzaCwgc28gaW1wbGVtZW50IHJmbHVzaCwgaW5zdGVhZCBvZiBhdXRvZ2VuZXJhdGluZyB0aGUgeHMgY29kZQpmb3IgaXQuIFtTdGFzXQoKZml4IHRoZSBpbnB1dCBmaWx0ZXJzIGhhbmRsaW5nIG9mIERFQ0xJTkVEIGhhbmRsZXJzIChjb25zdW1lIHRoZSBkYXRhLApvbiBiZWhhbGYgb2YgdGhlIGhhbmRsZXIpICsgdGVzdHMgW1N0YXNdCgpmaXggdGhlIGNvZGUgdGhhdCBhdXRvZ2VuZXJhdGVzIG1vZHBlcmxfbGFyZ2VmaWxlcy5oIG5vdCB0byBkZWZpbmUKbWFjcm9zIG1hdGNoaW5nIG0vXi0vICh3YXMgYSBwcm9ibGVtIG9uIGFpeC00LjMuMykgW1N0YXNdCgokQXBhY2hlOjpTZXJ2ZXI6OlN0cmljdFBlcmxTZWN0aW9ucyBhZGRlZC4gV2hlbiBzZXQgdG8gYSB0cnVlCnZhbHVlLCB3aWxsIGFib3J0IHNlcnZlciBzdGFydHVwIGlmIHRoZXJlIGFyZSBzeW50YXggZXJyb3JzCmluIDxQZXJsID4gc2VjdGlvbnMgW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZ10KClVzZSBXaW4zMjo6R2V0U2hvcnRQYXRoTmFtZSBmb3IgV2luMzIgdG8gaGFuZGxlIGNhc2VzIHdoZW4KdGhlIHN1cHBsaWVkIE1QX0FQX1BSRUZJWCBjb250YWlucyBzcGFjZXMuIFtSYW5keSBLb2Jlc10KCkJ1bXAgdXAgVGhyZWFkc1BlckNoaWxkIGZvciBtcG1fd2lubnQgaW4gaHR0cGQuY29uZiwgd2hpY2ggc2VlbXMgCnRvIGhlbHAgYXZvaWQgc2VydmVyIHN0YXJ0dXAgcHJvYmxlbXMgd2hlbiBydW5uaW5nIHRoZSB0ZXN0cy4KW1JhbmR5IEtvYmVzXQoKaW1wbGVtZW50IGEgbmV3IGhlbHBlciBtb2R1bGUgTW9kUGVybDo6TWV0aG9kTG9va3VwIHRvIGhlbHAgZmlndXJlIG91dAp3aGljaCBtb2R1bGUgc2hvdWxkIGJlIGxvYWRlZCB3aGVuIGEgY2VydGFpbiBtZXRob2QgaXMgcmVwb3J0ZWQgdG8gYmUKbWlzc2luZy4gW1N0YXNdCgpmaXggYSBidWcgZm9yIGFwciA8IDAuOS4zLCB3aGVyZSBpdCBzZWdmYXVsdHMgaW4gYXByX3VyaV91bnBhcnNlLCBpZgpob3N0bmFtZSBpcyBzZXQsIGJ1dCBub3QgdGhlIHNjaGVtZS4gSW4gY2FzZSB0aGUgaG9zdG5hbWUgaXMgZGVmaW5lZApidXQgc2NoZW1lIGlzIG5vdCBBcGFjaGU6OmNvbXBhdCB3aWxsIGRlZmF1bHQgdG8gdGhlICdodHRwJyBzY2hlbWUsCndoZXJlYXMgQVBSOjpVUkk6OnVucGFyc2UgcHJvdmlkZXMgbm8gZGVmYXVsdCBbU3Rhc10KCm1vdmUgJHItPnNlbmRfaHR0cF9oZWFkZXIgaW1wbGVtZW50YXRpb24gdG8gQXBhY2hlOjpjb21wYXQuICBUaGlzCmFsbG93cyB0aGUgMS4wIGNvZGUgdG8gcnVuIHVubW9kaWZpZWQgaWYgJHItPnNlbmRfaHR0cF9oZWFkZXIgaXMKY2FsbGVkIGJlZm9yZSB0aGUgcmVzcG9uc2UgY2hhbmdlLiB3ZSBhbHJlYWR5IGhhbmRsZSB0aGUgY2hlY2sgd2hldGhlcgpjb250ZW50X3R5cGUgd2FzIHNldCwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRoZSBoZWFkZXJzIGFyZSB0byBiZQpwYXJzZWQgaW5zaWRlIG1vZHBlcmxfd2J1Y2tldF9wYXNzKCkuIFtTdGFzXQoKZml4ZXMgdG8gQXBhY2hlOjpjb21wYXQuIG1ha2UgJHItPmNvbm5lY3Rpb24tPmF1dGhfdHlwZSBpbnRlcmZhY2UKd2l0aCByLT5hcF9hdXRoX3R5cGUuIG1ha2UgYm90aCAkci0+Y29ubmVjdGlvbi0+YXV0aF90eXBlIGFuZAokci0+Y29ubmVjdGlvbi0+dXNlciB3cml0YWJsZS4gW0dlb2ZmcmV5IFlvdW5nXQoKT3BlbiB1cCByLT5hcF9hdXRoX3R5cGUsIG1ha2luZyBpdCBwb3NzaWJsZSB0byB3cml0ZSBjdXN0b20KYXV0aGVuIGhhbmRsZXJzIHRoYXQgZG9uJ3QgcmVseSBvbiBCYXNpYyBhdXRoZW50aWNhdGlvbiBvcgppdCdzIGFzc29jaWF0ZWQgYXBfKiBmdW5jdGlvbnMuCltHZW9mZnJleSBZb3VuZ10KCmFkZCBBcGFjaGU6OkJ1bmRsZTIgW1N0YXNdCgpBcGFjaGU6OlJlbG9hZCBub3cgc3VwcG9ydHMgdGhlIFBlcmxQcmVDb25uZWN0aW9uSGFuZGxlciBpbnZvY2F0aW9uCm1vZGUsIHNvIGNvbm5lY3Rpb24gZmlsdGVyIGFuZCBwcm90b2NvbCBtb2R1bGVzIGNhbiBiZSBhdXRvbWF0aWNhbGx5CnJlbG9hZGVkIG9uIGNoYW5nZS4gW1N0YXNdCgppbXBsZW1lbnQgQXBhY2hlOjpjdXJyZW50X2NhbGxiYWNrICsgJHItPmN1cnJlbnRfY2FsbGJhY2sgZ29lcyBpbnRvCkFwYWNoZTo6Y29tcGF0LCBzaW5jZSBub3cgd2UgaGF2ZSBhIHdheSB0b28gbWFueSBjYWxsYmFja3MgdW5yZWxhdGVkCnRvICRyIFtTdGFzXQoKQWRkIEFwYWNoZTo6Y29tcGF0IG1ldGhvZHM6ICRyLT5jb25uZWN0aW9uLT5hdXRoX3R5cGUgYW5kCiRyLT5jb25uZWN0aW9uLT51c2VyIChyZXF1aXJlcyAnUGVybE9wdGlvbnMgK0dsb2JhbFJlcXVlc3QnKSArIHRlc3RzCltTdGFzXQoKU2V2ZXJhbCBpc3N1ZXMgcmVzb2x2ZWQgd2l0aCBwYXJzaW5nIGhlYWRlcnMsIGluY2x1ZGluZyBtYWtpbmcgd29yawp0aGUgaGFuZGxlcnMgY2FsbGluZyAkci0+Y29udGVudF90eXBlKCkgYW5kIG5vdCBzZW5kaW5nIHJhdyBoZWFkZXJzLAp3aGVuIHRoZSBoZWFkZXJzIHNjYW5uaW5nIGlzIHR1cm5lZCBvbi4gTG90cyBvZiB0ZXN0cyBhZGRlZCB0bwpleGVyY2lzZSBkaWZmZXJlbnQgc2l0dWF0aW9ucy4gW1N0YXNdCgp3YXJuIG9uIHVzaW5nIC1UIGluIE1vZFBlcmw6OlJlZ2lzdHJ5IHNjcmlwdHMgd2hlbiBtb2RfcGVybCBpcyBub3QKcnVubmluZyB3aXRoIC1UIFtTdGFzXQoKcGVybCA1LjcuMysgaGFzIGEgYnVpbHQtaW4gJHteVEFJTlR9IHRvIHRlc3Qgd2hldGhlciBpdCdzIHJ1bm5pbmcKdW5kZXIgLShUfHQpLiBCYWNrcG9ydCAke15UQUlOVH0gZm9yIG1vZF9wZXJsIHJ1bm5pbmcgdW5kZXIKNS42LjAtNS43LjMsICh3aGF0IHVzZWQgdG8gYmUgJEFwYWNoZTo6X19ULiAgJEFwYWNoZTo6X19UIGlzIGF2YWlsYWJsZQp0b28sIGJ1dCBkZXByZWNhdGVkLiBbU3Rhc10KCmFkZCBQZXJsQ2hpbGRFeGl0SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBbU3Rhc10KCmFkZCBQZXJsQ2xlYW51cEhhbmRsZXIgaW1wbGVtZW50YXRpb24gKyB0ZXN0IFtTdGFzXQoKZGllIHdoZW4gQXBhY2hlLT5yZXF1ZXN0IHJldHVybnMgbm90aGluZyAoJ1BlcmxPcHRpb25zIC1HbG9iYWxSZXF1ZXN0JwpvciAnU2V0SGFuZGxlciBtb2RwZXJsJykgW1N0YXNdCgpOZXcgQXBhY2hlOjpEaXJlY3RpdmUgbWV0aG9kczogYXNfaGFzaCgpLCBsb29rdXAoKSArIHRlc3RzICsgZG9jcwpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KClN0YWNrZWQgaGFuZGxlcnMgY2hhaW4gZXhlY3V0aW9uIGlzIG5vdyBhYm9ydGVkIHdoZW4gYSBoYW5kbGVyIHJldHVybnMKc29tZXRoaW5nIG90aGVyIHRoYW4gT0sgb3IgREVDTElORUQgW1N0YXNdCgptYWtlICRmaWx0ZXItPnJlYWQoKSBpbiBpbnB1dCBzdHJlYW1pbmcgZmlsdGVycywgdXNlIHRoZSBzYW1lIG51bWJlcgpvZiBhcmd1bWVudHMgYXMgcmVhZCgpIGluIHRoZSBvdXRwdXQgZmlsdGVycy4gW1N0YXNdCgpJbXBsZW1lbnQgJHItPmFkZF9pbnB1dF9maWx0ZXIgYW5kICRyLT5hZGRfb3V0cHV0X2ZpbHRlcgogICAgICAgICAgJGMtPmFkZF9pbnB1dF9maWx0ZXIgYW5kICRjLT5hZGRfb3V0cHV0X2ZpbHRlcgphbmQgYWRkIHRlc3RzICBbU3Rhc10KClNraXAgdGhlIGhhbmRsZXIgcGFja2FnZTo6ZnVuYyByZXNvbHZpbmcgZXJyb3IsIG9ubHkgd2hlbiB0aGUgZXJyb3IKbWVzc2FnZSBtYXRjaGVzICJDYW4ndCBsb2NhdGUgLio/IGluIEBJTkMiLCByYXRoZXIgdGhhbiBqdXN0ICJDYW4ndApsb2NhdGUiLCBzaW5jZSB0aGVyZSBhcmUgbWFueSBvdGhlciBlcnJvcnMgdGhhdCBzdGFydCB3aXRoIHRoYXQKc3RyaW5nLiBbU3Rhc10KCnRoZSB0b3AgbGV2ZWwgJ21ha2UgdGVzdCcgbm93IGRlc2NlbmRzIGludG8gdGhlIE1vZFBlcmwtUmVnaXN0cnkgZGlyCnRvIHJ1biAnbWFrZSB0ZXN0JyB0aGVyZSBbU3Rhc10KCkFsbCByZXNwb25zZSBmdW5jdGlvbnMgYXJlIG5vdyByZXR1cm5pbmcgc3RhdHVzIGFuZCB0aGUgY2FsbGVycyBjaGVjawphbmQgY3JvYWsgb24gZmFpbHVyZSBvciBwcm9nYXRlIHRoZW0gZnVydGhlci4gW1N0YXNdCgpPUEVOLCBDTE9TRSBhbmQgRklMRU5PIGltcGxlbWVudGF0aW9uIGZvciBBcGFjaGU6OlJlcXVlc3RSZWMgW1N0YXNdCgpBbm90aGVyIGZpeCBmb3IgdGhlIGhhbmRsaW5nIG9mIHRoZSByZXR1cm4gc3RhdHVzIGluCk1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyOiByZXNldCB0aGUgc3RhdHVzIHRvIHRoZSBvcmlnaW5hbCBvbmUgb25seSBpZgppdCB3YXMgY2hhbmdlZCBieSB0aGUgc2NyaXB0LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBleGVjdXRpb24gc3RhdHVzCltTdGFzXQoKcHJldmVudCBzZWdmYXVsdCBpbiAkci0+cHJpbnQgLyAkZmlsdGVyLT5wcmludCAoaW4gb3V0cHV0IGZpbHRlcikgYW5kCnJlbGF0ZWQgZnVuY3Rpb25zIHdoZW4gdGhleSBhcmUgY2FsbGVkIGJlZm9yZSB0aGUgcmVzcG9uc2UgcGhhc2UKW1N0YXNdCgpwcmV2ZW50IHNlZ2ZhdWx0IGluIHNlbmRfaHR0cF9oZWFkZXIgd2hlbiBpdCdzIGNhbGxlZCBiZWZvcmUgdGhlCnJlc3BvbnNlIHBoYXNlIFtTdGFzXQoKaW5wdXQgc3RyZWFtIGZpbHRlcmluZyBzdXBwb3J0IHdhcyBhZGRlZCArIHRlc3RzIChwbHVzIHJlbmFtaW5nIGZpbHRlcgp0ZXN0cyBzbyB3ZSBjYW4ga25vdyBmcm9tIHRoZSB0ZXN0IG5hbWUgd2hhdCBraW5kIG9mIGZpbHRlciBpcyB0ZXN0ZWQpCltTdGFzXQoKQWRkIHByb3BlciBzdXBwb3J0IGZvciBtaXMtYmVoYXZlZCBmZWVkaW5nIGZpbHRlcnMgdGhhdCBzZW5kIG1vcmUgdGhhbgpvbmUgRU9TIGJ1Y2tldCBpbiBzdHJlYW1pbmcgZmlsdGVycyArIHRlc3QuIFtTdGFzXQoKcHJldmVudCBhIHNlZ2ZhdWx0IHdoZW4gcHVzaF9oYW5kbGVycyBhcmUgdXNlZCB0byBwdXNoIGEgaGFuZGxlciBpbnRvCnRoZSBjdXJyZW50bHkgcGhhc2UgYW5kIHN3aXRjaGluZyB0aGUgaGFuZGxlciAocGVybC1zY3JpcHQvbW9kcGVybCkgKwp0ZXN0cyBbU3Rhc10KCkFkZCAkZmlsdGVyLT5zZWVuX2VvcyB0byB0aGUgc3RyZWFtaW5nIGZpbHRlciBhcGkgdG8ga25vdyB3aGVuIGVvcyBoYXMKYmVlbiBzZWVuLCBzbyBzcGVjaWFsIHNpZ25hdHVyZXMgY2FuIGJlIHBhc3NlZCBhbmQgYW55IGRhdGEgc3RvcmVkIGluCnRoZSBjb250ZXh0IGZsdXNoZWQgKyB0ZXN0cy4gW1N0YXNdCgpBZGQgJGZpbHRlci0+Y3R4IHRvIG1haW50YWluIHN0YXRlIGJldHdlZW4gZmlsdGVyIGludm9jYXRpb24gKyB0ZXN0cwpbU3Rhc10KClJlcXVlc3QgaW5wdXQgYW5kIG91dHB1dCBmaWx0ZXJzIGFyZSBub3cgZ2V0dGluZyB0aGUgRU9TIGJ1Y2tldCwgd2hpY2gKd2Fzbid0IHBhc3NlZCB0aHJvdWdoIGJlZm9yZS4gTm93IHRoZSBjb250ZXh0IGNhbiBiZSBmbHVzaGVkIG9uCkVPUy4gW1N0YXNdCgo9aXRlbSAxLjk5XzA4IC0gSmFudWFyeSAxMCwgMjAwMwoKQ29ycmVjdCBNb2RQZXJsOjpSZWdpc3RyeUNvb2tlciB0byByZXNldCAlSU5DLCBhZnRlciBjb21waWxlIGZvciAucGwKZmlsZXMgd2hpY2ggZG9uJ3QgZGVjbGFyZSB0aGUgcGFja2FnZSArIGFkZCB0ZXN0cyB0byBjaGVjayB0aGF0IFtTdGFzXQoKTG9nIHRoZSByZWFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBGb286OkJhcjo6c3ViX25hbWUgZmFpbHMgdG8gcmVzb2x2ZSwKYmVjYXVzZSBvZiBhIHByb2JsZW0gaW4gRm9vOjpCYXIsIHdoZW4gRm9vOjpCYXIgKndhcyogZm91bmQgW1N0YXNdCgpBZGQgUGVybFByZUNvbm5lY3Rpb25IYW5kbGVyIHN1cHBvcnQgaW4gQXBhY2hlOjpUZXN0IFtTdGFzXQoKRW5hYmxlIFBlcmxQcmVDb25uZWN0aW9uSGFuZGxlciBbU3Rhc10KClN1cHBvcnQgdGhlIEhvc3Q6IHJlcXVlc3QgaGVhZGVyIGluIEFwYWNoZTo6VGVzdENsaWVudCBbU3Rhc10KCnJlc3RvcmUgdGhlIE1vZFBlcmw6OlJlZ2lzdHJ5TG9hZGVyOjpuZXcoKSBtZXRob2QgZm9yIGJhY2t3YXJkcwpjb21wYXRpYmlsaXR5ICBbU3Rhc10KCnBvcnQgdGhlIHN1cHBvcnQgZm9yIE5hbWVXaXRoVmlydHVhbEhvc3QgaW4gTW9kUGVybDo6UmVnaXN0cnlDb29rZXIKYW5kIE1vZFBlcmw6OlJlZ2lzdHJ5TG9hZGVyIFtTdGFzXQoKZml4IHRoZSBoYW5kbGluZyBvZiB0aGUgcmV0dXJuIHN0YXR1cyBpbiBNb2RQZXJsOjpSZWdpc3RyeUNvb2tlciwgYWRkCmEgdGVzdCB0byB2ZXJpZnkgdGhhdCBbU3Rhc10KCnVuZGVyIG5vbi10aHJlYWRlZCBwZXJsIG5lZWQgdG8gY2hlY2sgd2hldGhlciBtb2RfcGVybCBpcyBydW5uaW5nLAp3aGVuIG1vZHBlcmxfdmhvc3RfaXNfcnVubmluZyBjaGVjayBpcyBkb25lLiBbU3Rhc10KCmZpeCAkci0+cmVhZCB0byByZWFkIGFsbCB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlmIHBvc3NpYmxlLAphZGp1c3QgdGhlIHRlc3QgVGVzdEFwYWNoZTo6cmVhZCB0byB2ZXJpZnkgdGhhdCBbU3Rhc10KCmZpeCB0aGUgbWV0aG9kIGNvbnRlbnQoKSBpbiBBcGFjaGU6OmNvbXBhdCB0byByZWFkIGEgd2hvbGUgcmVxdWVzdApib2R5LiBzYW1lIGZvciBNb2RQZXJsOjpUZXN0OjpyZWFkX3Bvc3QuIGFkZCB0ZXN0cy4gIFtTdGFzXQoKQWRqdXN0IHRoZSByZXZlcnNlIGZpbHRlciB0ZXN0IHRvIHdvcmsgb24gd2luMzIgKHJlbW92ZSB0cmFpbGluZyBccikKW1JhbmR5IEtvYmVzIDxyYW5keUB0aGVvcnl4NS51d2lubmlwZWcuY2E+XQoKU3Ryb25nbHkgc3VnZ2VzdCB3aW4zMiB1c2VycyB0byB1cGdyYWRlIHRvIDUuOC4wLCBpZiB0aGV5IHJ1biA1LjYueApbUmFuZHkgS29iZXMgPHJhbmR5QHRoZW9yeXg1LnV3aW5uaXBlZy5jYT5dCgpXaGVuIGluc3RhbGxpbmcgdGhlIG1vZF9wZXJsIHNoYXJlZCBvYmplY3QsIGZpcnN0IG5lZWQgdG8gY2hlY2sKd2hldGhlciB0aGUgZGlyZWN0b3J5ICdtb2R1bGVzJyBhbHJlYWR5IGV4aXN0cywgYW5kIGNyZWF0ZSBpdCBpZiBub3QuCltSYW5keSBLb2JlcyA8cmFuZHlAdGhlb3J5eDUudXdpbm5pcGVnLmNhPl0KCkFkZCBhIGNhcGFiaWxpdHkgdG8gdHVuZSB0aGUgdGVzdCBjb25maWd1cmF0aW9uIHNlY3Rpb25zIG9yZGVyaW5nCmluIEFwYWNoZTo6VGVzdENvbmZpZ1BlcmwgW1N0YXMgQmVrbWFuXQoKZml4IHRoZSBjb21wbGFpbmluZyBjb2RlIGFib3V0IGxhdGUgUGVybFN3aXRjaGVzIHdoZW4gUGVybExvYWRNb2R1bGUKaXMgdXNlZCBiZWZvcmUgaXQgW1N0YXMgQmVrbWFuXQoKYWRkIHZhcmlvdXMgdGVzdHMgdGhhdCBleGVyY2lzZSBQZXJsTG9hZE1vZHVsZSBhbmQgdmhvc3RzCltTdGFzIEJla21hbl0KCmhhbmRsZSBjb3JyZWN0bHkgUGVybExvYWRNb2R1bGVzIChkaXJlY3RpdmVzKSB3aXRoIHZob3N0czoKICAtIGhhbmRsZSBncmFjZWZ1bGx5IGNhc2VzIHdoZW4gdGhpbmdzIGFyZSB1bmRlZi9OVUxMCiAgLSBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBzY2ZnPT1OVUxMLCBieSBzdGVhbGluZyB0aGUgYmFzZV9zZXJ2ZXJzJ3MgY29uZmlnCltTdGFzIEJla21hbl0KCm1ha2UgbW9kX3Blcmwgd29yayB3aXRoIHZob3N0cyB3aGVuIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCBwcmlvciB0bwogIHBvc3RfY29uZmlnKCk6CiAgLSBjYWxsIG1vZHBlcmxfaW5pdF9nbG9iYWxzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBiZWNhdXNlIHRoZSBtYWluIHNlcnZlcgogICAgcmVjb3JkIGlzIG5lZWRlZCBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcGFyc2luZywgZm9yIHBlcmxsb2FkbW9kdWxlCiAgICBhbmQgdmhvc3RzCiAgLSBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSB1c2luZyBhIHJlYWwgYmFzZV9zZXJ2ZXIsIHdoZW4gZGVhbGluZwogICAgd2l0aCBtb2RwZXJsX2luaXQsIGFuZCBpZiBub3QgcmV0cmlldmUgaXQgZnJvbSB0aGUgZ2xvYmFsIHJlY29yZApbU3RhcyBCZWttYW5dCgpwcmV2ZW50IHNlZ2ZhdWx0cywgd2hlbiBzY2ZnIGlzIE5VTEwgaW4gQXBhY2hlOjpNb2R1bGUtPmdldF9jb25maWcoKTsKW1N0YXMgQmVrbWFuXQoKZW5zdXJlIHRoYXQgYSBjb3JlIGZpbGUgaXMgYSBmaWxlIGluZGVlZCwgYmVmb3JlIGNvbXBsYWluaW5nIFtQaGlsaXBwZQpNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKYWRkICRyLT5hc19zdHJpbmcgW0dlb2ZmcmV5IFlvdW5nXQoKYWRkIGJhY2tjb21wYXQgdmFyczogJEFwYWNoZTo6U2VydmVyOjpDV0QgYW5kCiRBcGFjaGU6OlNlcnZlcjo6QWRkUGVybFZlcnNpb24gW1N0YXMgQmVrbWFuXQoKZW52IHZhciBNT0RfUEVSTF9UUkFDRSBpcyB3b3JraW5nIGFnYWluIFtTdGFzIEJla21hbl0KCmFkZCBhIG5ldyB0ZXN0IFRlc3REaXJlY3RpdmU6OnBlcmxsb2FkbW9kdWxlMiwgd2hpY2ggcGVyZm9ybXMgYSBtb3JlCmV2b2x2ZWQgbWVyZ2luZy4gIFtTdGFzIEJla21hbl0KCmZpeCBBcGFjaGU6OlRlc3RDb25maWdQZXJsIHVuZGVyIG1vZF9wZXJsIDEuMCwgbmVlZCB0byByZXF1aXJlCm1vZF9wZXJsLnBtIGJlZm9yZSB1c2luZyAkbW9kX3Blcmw6OlZFUlNJT04gW0dlb2ZmcmV5IFlvdW5nCjxHWW91bmdAY292YWQuY29tPl0KCmFkZCBhbiBBcGFjaGU6OlNJRyBiYWNrY29tcGF0IHN0dWIgdG8gQXBhY2hlOjpjb21wYXQgW1N0YXMgQmVrbWFuXQoKZml4IHRoZSBBcGFjaGU6OlRlc3RDb25maWdQZXJsJ3MgcnVuX2FwYWNoZV90ZXN0X2NvbmZpZygpIGZ1bmN0aW9uCndoZXJlIHRlc3QgcGFja2FnZXMgYXJlIHNjYW5uZWQgZm9yIHRoZSBtYWdpYyBBUEFDSEVfVEVTVF9DT05GSUdVUkUKYW5kIGlmIGZvdW5kIGdldCByZXF1aXJlKCknZC4gQXBhY2hlMiBuZWVkcyB0byBiZSBydW4gZm9yIG1vZF9wZXJsCjIuMC4gIFtTdGFzIEJla21hbl0KCm1vdmUgdGhlIGN1c3RvbSBtb2RfcGVybCAyLjAgY29uZmlndXJhdGlvbiBiaXRzIG91dCBvZiB0aGUKTW9kUGVybDo6VGVzdFJ1biwgd2hlcmUgdGhleSBkb24ndCBiZWxvbmcsIGludG8gYSBzcGVjaWFsIGNvbmZpZyBmaWxlCndoaWNoIGlzIGluY2x1ZGVkIGF0IHRoZSB2ZXJ5IGVuZCBvZiBodHRwZC5jb25mIFtTdGFzIEJla21hbl0KCmV4dGVuZCBBcGFjaGU6OlRlc3QgdG8gYWxsb3cgZXh0cmEgY29uZmlndXJhdGlvbiBmaWxlcyB0byBiZSBpbmNsdWRlZAphdCB0aGUgdmVyeSBlbmQgb2YgaHR0cGQuY29uZiwgd2hlbiBldmVyeXRoaW5nIHdhcyBsb2FkZWQgYW5kCmNvbmZpZ3VyZWQgW1N0YXMgQmVrbWFuXQoKcmVzb2x2ZSBhIHNlZ2ZhdWx0IGluIEFwYWNoZTo6TW9kdWxlOjpnZXRfY29uZmlnKCkgZm9yIHRoZSBlZGdlIGNhc2UKd2hlbiB0aGUgcGFja2FnZSBuYW1lIGlzIGJvZ3VzLiBbU3RhcyBCZWttYW5dCgpBcGFjaGU6OlJlbG9hZDogYWRkIHN1cHBvcnQgZm9yIHdhdGNoaW5nIGFuZCByZWxvYWRpbmcgbW9kdWxlcyBvbmx5IGluCnNwZWNpZmllZCBzdWItZGlycyBbSGFycnkgRGFuaWxldnNreSA8aGFycnlAZGVlcmZpZWxkY2FwaXRhbC5jb20+XQoKZW5hYmxlIEFQUi5wbSdzIGxpbmtpbmcgZm9yIGFwciAwLjkuMiBhbmQgaGlnaGVyLCB3aGljaCB1c2VzIGEgbmV3IGxpYgpuYW1pbmcgc2NoZW1lLCBzdWNoIGFzIGxpYmFwci0wLnNvLjAuOS4yLCBvbmx5IGlmIGFwci1jb25maWcgYW5kCmFwdS1jb25maWcgc2NyaXB0cyBleGlzdC4gW1N0YXMgQmVrbWFuXQoKZGVmaW5lIElvVFlQRV9SRE9OTFkvSW9UWVBFX1dST05MWSBmb3IgcGVybC01LjYuMCBzbyB0aGUgcHJvamVjdApjb21waWxlcyBhZ2FpbiB1bmRlciA1LjYuMCBbU3RhcyBCZWttYW5dCgphbGxvdyBvdXRwdXQgc3RyZWFtaW5nIGZpbHRlcnMgdG8gYXBwZW5kIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtCltTdGFzIEJla21hbl0KCmZpeGVzIHRvIGNvbXBpbGUgd2l0aCBBY3RpdmVQZXJsIDUuOCBiZXRhCltSYW5keSBLb2JlcyA8cmFuZHlAdGhlb3J5eDUudXdpbm5pcGVnLmNhPl0KCmZpeCBmb3IgZGlyZWN0aXZlIGhhbmRsZXJzIHdpdGhpbiB2aG9zdHMgdXNpbmcgdGhyZWFkZWQgTVBNcwpbU3RlcGhlbiBDbG91c2UgPHN0ZXBoZW5jQHRoZWlxZ3JvdXAuY29tPl0KCmZpeCA8SWZEZWZpbmUgTU9EUEVSTDI+IHN1cHBvcnQKCmRlZmF1bHQgQXV0aFR5cGUgdG8gQmFzaWMgaWYgbm90IHNldCBpbiAkci0+Z2V0X2Jhc2ljX2F1dGhfcHcoKQpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCndvcmthcm91bmQgZ2xpYmMvUGVybC01LjguMCBjcnlwdCgpIGJ1ZyAoc2VlbiB3aXRoIHRocmVhZGVkIE1QTXMpCgpmaXggZGVsZXRlICRFTlZ7JGtleX0gYnVnCgpmaXggcGFyc2VfYXJncyBjb21wYXQgbWV0aG9kIHRvIHN1cHBvcnQgbm9uLWFzY2lpIGNoYXJhY3RlcnMgYW5kIHRyLysvIC8KW1dhbGVyeSBTdHVkZW5uaWtvdiA8ZGVzcGFpckBzYW1hLnJ1Pl0KCmZpeCBwb3N0X2Nvbm5lY3Rpb24gY29tcGF0IG1ldGhvZCB0byBiZWhhdmUgYXMgaXQgZGlkIGluIDEueApbR2VvZmYgWW91bmcgPGdlb2ZmQG1vZHBlcmxjb29rYm9vay5vcmc+XQoKYWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgJHItPmF1dGhfbmFtZSBhbmQgJHItPmF1dGhfdHlwZQpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCmFkZCBBcGFjaGUtPmh0dHBkX2NvbmYgY29tcGF0IG1ldGhvZApbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCmFkZCBkZWZhdWx0IDxQZXJsPiBoYW5kbGVyIEFwYWNoZTo6UGVybFNlY3Rpb24uCm1ha2UgPFBlcmw+IGJsb2NrcyB0byBiZSBFWEVDX09OX1JFQUQgc28gYXBhY2hlIGRvZXMgbm90IHBhcnNlIHRoZSBjb250ZW50cy4KYWRkICJQZXJsIiBkaXJlY3RpdmUgZm9yIGdlbmVyYWwgdXNlIGFuZCBmb3Igd2hpY2ggPFBlcmw+IHNlY3Rpb25zIGFyZQpzdHVmZmVkIGludG8uCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKcmVuYW1lIG92ZXJsb2FkZWQgTG9hZE1vZHVsZSBkaXJlY3RpdmUgdG8gUGVybExvYWRNb2R1bGUgYW5kIGFkanVzdAp0aGUgdGVzdCBuYW1pbmcKCj1pdGVtIDEuOTlfMDcgLSBTZXB0ZW1iZXIgMjUsIDIwMDIKCmZpeCA9cG9kIGRpcmVjdGl2ZSB0ZXN0IGNvbmZpZyBwcm9ibGVtCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKPWl0ZW0gMS45OV8wNiAtIFNlcHRlbWJlciAyNSwgMjAwMgoKYWRkIHN1cHBvcnQgZm9yIHBvZCBkaXJlY3RpdmVzICg9cG9kLD1iYWNrLD1jdXQpIGFuZCBfX0VORF9fIGRpcmVjdGl2ZQpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCnR3ZWFrcyB0byBzdXBwb3J0IFRlc3QucG0gMS4yMSBbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCmFkZCAkci0+YWRkX2NvbmZpZyBtZXRob2QgdG8gYWRkIGR5bmFtaWMgY29uZmlndXJhdGlvbiBhdCByZXF1ZXN0IHRpbWUKCmFkZCBBcGFjaGU6OkRJUl9NQUdJQ19UWVBFIGNvbnN0YW50CgphZGQgc3VwcG9ydCBmb3IgZGlyZWN0aXZlIGhhbmRsZXJzCgpmaXggc291cmNlX3NjYW4gdG8gcnVuIHdpdGggY3VycmVudCBodHRwZC9hcHIKCmFkZCBBcGFjaGU6OlNlcnZlci0+YWRkX2NvbmZpZyBtZXRob2QgdG8gYWRkIGR5bmFtaWMgY29uZmlndXJhdGlvbiBhdApzZXJ2ZXIgc3RhcnR1cCB0aW1lCiAgCmFkZCBBcGFjaGU6OkRpcmVjdGl2ZS0+dG9fc3RyaW5nIG1ldGhvZAoKYWRkIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSA8UGVybD4gc2VjdGlvbnMKCmZpeCBjb21waWxhdGlvbiBwcm9icyB3aXRoIGdldF9yZW1vdGVfaG9zdCgpIHRoYXQgaGFkIGEgd3JvbmcKcHJvdG90eXBlIFtTdGFzIEJla21hbl0KCkFwYWNoZTo6U3ViUHJvY2VzcyBub3cgaGFzIGEgbWFucGFnZSBbU3RhcyBCZWttYW5dCgpmaXggdGhlIEFwYWNoZTo6U3ViUHJvY2VzcyB0ZXN0cyB0byB3b3JrIHdpdGggcGVybGlvLWRpc2FibGVkIFBlcmwKW1N0YXMgQmVrbWFuXQoKZml4IHRoZSBmaWxlaGFuZGxlIGxlYWsgaW4gQVBSOjpQZXJsSU8gKGJvdGggcGVybGlvLWRpc2FibGVkIGFuZApwZXJsaW8tZW5hYmxlZCBQZXJsKSBbU3RhcyBCZWttYW5dCgpyZW1vdmUgZHVwKCkgd2hlbiBjb252ZXJ0aW5nIGZpbGVoYW5kbGVzIGZyb20gYXByX2ZpbGVfdCB0byBGSUxFKgp1bmRlciBwZXJsaW8tZGlzYWJsZWQgUGVybCAoQVBSOjpQZXJsSU8pIFtTdGFzIEJla21hbl0KCmZpeCBjb21waWxhdGlvbiBpZiBhcGFjaGUvYXByIGRvIG5vdCBoYXZlIHRocmVhZCBzdXBwb3J0Cgo9aXRlbSAxLjk5XzA1IC0gQXVndXN0IDIwLCAyMDAyCgpmaXggUGVybE9wdGlvbnMgK1BhcnNlSGVhZGVycyB0byBvbmx5IHBhcnNlIG9uY2UgcGVyLXJlcXVlc3QKCmFkZCBleHRlcm5hbCByZWRpcmVjdHMgUmVnaXN0cnkgdGVzdHMgW1N0YXMgQmVrbWFuXQoKZ2V0IHJpZCBvZiB0aGUgY29tcGF0IGxheWVyIGluIE1vZFBlcmwtUmVnaXN0cnkgW1N0YXMgQmVrbWFuXQoKTW9kUGVybDo6UmVnaXN0cnlMb2FkZXIgaXMgbm93IGZ1bGx5IG9wZXJhdGlvbmFsIGFuZCB0ZXN0ZWQgW1N0YXMgQmVrbWFuXQoKUmVnaXN0cnkgbWV0aG9kIGhhbmRsZXJzIGFyZSBub3cgd29ya2luZyBbU3RhcyBCZWttYW5dCgpjb3JlIFJlZ2lzdHJ5IHBhY2thZ2VzIGFsbCBjb21waWxlIHRoZSBzY3JpcHRzIGludG8KTW9kUGVybDo6UmVnaXN0cnlST09UOjogbmFtZXNwYWNlIGFuZCBjYWNoZSB0aGVtIGluCiVNb2RQZXJsOjpSZWdpc3RyeUNhY2hlLiBCb3RoIG92ZXJyaWRhYmxlIGJ5IHRoZSBzdWItY2xhc3Nlcy4gW1N0YXMgQmVrbWFuXQoKY29tcGF0IHRlc3RzIHdlcmUgc3BsaXQgaW50byBncm91cHMgYnkgZnVuY3Rpb25hbGl0eSwgc2VuZF9mZCB0ZXN0Cm1vdmVkIHRvIGNvbXBhdC4gIFtTdGFzIEJla21hbl0KCmFkZGVkICRjLT5nZXRfcmVtb3RlX2hvc3QgYW5kIGEgY29tcGF0IHdyYXBwZXIgJHItPmdldF9yZW1vdGVfaG9zdCArCnRlc3RzIFtTdGFzIEJla21hbl0KCmFkanVzdCB0aGUgYnVpbGQgc3lzdGVtIHRvIHN1cHBvcnQgbW9kX3BlcmwgYnVpbGQgZnJvbSB0aGUgc291cmNlCnRyZWUuIFtTdGFzIEJla21hbl0KCk1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyIHN5bmNzIHdpdGggbW9kX3BlcmwgMS4wJ3MgcmVnaXN0cnk6CiAtIHByb3RvdHlwZXMgZGVmaW5lZCBjaGVja3MgaW4gZmx1c2hfbmFtZXNwYWNlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1lhaXIgTGVuZ2EgPHlhaXIubGVuZ2FAY2l0aWdyb3VwLmNvbT5dCiAtIHNldCBlcnJvci1ub3RlcyBvbiBlcnJvciBbR2VvZmYgWW91bmcgPGdlb2ZmQG1vZHBlcmxjb29rYm9vay5vcmc+XQogLSBwcmVzZXJ2ZSBzdGF0dXMgaW4gUmVnaXN0cnkgc2NyaXB0cyBbR2VvZmYgWW91bmcgPGdlb2ZmQG1vZHBlcmxjb29rYm9vay5vcmc+XQoKYXByX3RhYmxlX3QgaXMgbm93IGFuIG9wYXF1ZSB0eXBlLCB1c2UgYXByX3RhYmxlX2VsdHMoKSB0byBnZXQgdGhlIGFycmF5CnJlY29yZCBbU3RhcyBCZWttYW5dCgphZGQgc3VwcG9ydCBmb3IgcmVkaXJlY3RzIHdpdGggUGVybE9wdGlvbnMgK1BhcnNlSGVhZGVycwoKYmFja3BvcnQgdG8gMi4wLjM1CgphZGp1c3QgdG8gZmlsdGVyIHJlZ2lzdGVyIGFwaSBjaGFuZ2UKCmFkZGVkIEFQUjo6VGhyZWFkTXV0ZXggbW9kdWxlCgo9aXRlbSAxLjk5XzA0IC0gSnVuZSAyMSwgMjAwMgoKdmFyaW91cyBBUFIgUGVybElPIHVwZGF0ZXMgW1N0YXMgQmVrbWFuXQoKc3RvcCB1c2luZyBhbiBhcHJfcG9vbF90IHRvIGFsbG9jYXRlIGl0ZW1zIGZvciB0aGUgaW50ZXJwcmV0ZXIgcG9vbCwKc2FmZXIgZm9yIHRocmVhZGVkIE1QTXMgYW5kIHByZXZlbnRzICJsZWFrcyIgd2hlbiBpbnRlcnByZXRlcnMgYXJlCnJlbW92ZWQgZnJvbSBkdWUgdG8gUGVybEludGVycE1heHtSZXF1ZXN0cyxTcGFyZX0KCmltcGxlbWVudCBtb2RwZXJsX3N5c19kbGNsb3NlKCkgdG8gYXZvaWQgYXByL3Bvb2wgb3ZlcmhlYWQvdGhyZWFkIGlzc3VlcwoKZ2V0IHRoZSAtRFBFUkxfQ09SRSBvcHRpbWl6YXRpb24gd29ya2luZyBhZ2FpbgoKUEVSTF9TRVRfQ09OVEVYVCB0byB0aGUgcGFyZW50IGludGVycHJldGVyIHdoZW4gY2xvbmluZyBpbnRlcnByZXRlcnMgYXQKcmVxdWVzdCB0aW1lLCBlbHNlIGRUSFggbWlnaHQgYmUgTlVMTCBkdXJpbmcgY2xvbmUgaW4gdGhlIGdpdmVuIHRocmVhZCwKd2hpY2ggd291bGQgY3Jhc2ggdGhlIHNlcnZlci4KCj1pdGVtIDEuOTlfMDMgLSBKdW5lIDE1LCAyMDAyCgp3aW4zMiBmaXggZm9yIHRoZSBnbG9iYWwgQXBhY2hlLT5yZXF1ZXN0IG9iamVjdCB0byBtYWtlIHN1cmUgaXQgdXNlcwp0aGUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgbWVjaGFuaXNtCgphZGQgYSByZWZlcmVuY2UgY291bnQgbWVjaGFuaXNtIHRvIGludGVycHJldGVycyBmb3IgdXNlIGluIHRocmVhZGVkIE1QTXMsCnNvIGlmIEFQUjo6UG9vbCBjbGVhbnVwcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB0aGUgaW50ZXJwcmV0ZXIgaXMgbm90CnB1dGJhY2sgaW50byB0aGUgaW50ZXJwcmV0ZXIgcG9vbCB1bnRpbCBhbGwgY2xlYW51cHMgaGF2ZSBydW4uCgp1bmJ1ZmZlciBTVERFUlIgKGJ5IHR1cm5pbmcgb24gYXV0b2ZsdXNoIGJ5IGRlZmF1bHQpCgphZGQgc3VwcG9ydCBmb3IgUGVybCpIYW5kbGVyICtBcGFjaGU6OkZvbwoKZml4IG9wZW5fbG9ncyxwb3N0X2NvbmZpZyxjaGlsZF9pbml0IGhvb2tzIHRvIHJ1biBpbiB0aGUgcHJvcGVyIG9yZGVyCgphZGp1c3QgdG8gYXByX2J1Y2tldF90eXBlX3QgY2hhbmdlcyBpbiAyLjAuMzctZGV2CltNbGFkZW4gVHVyayA8bXR1cmtAbWFwcGluZ3NvZnQuY29tPl0KCmFkZCBNT0RQRVJMMiBjb25maWcgZGVmaW5lLCBhcyBpZiB0aGUgc2VydmVyIGhhZCBiZWVuIHN0YXJ0ZWQgd2l0aCAtRE1PRFBFUkwyCgpjb21wYXQgYWRkaXRpb25zIGFuZCBmaXhlczogJHItPmxvb2t1cF97ZmlsZSx1cml9LCAkci0+aXNfbWFpbiwgQXBhY2hlLT5kZWZpbmUKCmFkZGVkIGNvbXBhdCBmb3IgQXBhY2hlOjpsb2dfZXJyb3IgW1N0YXMgQmVrbWFuXQoKPWl0ZW0gMS45OV8wMiAtIEp1bmUgMSwgMjAwMgoKcGFzcyB0aGUgUEFUSCBhbmQgVFogZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IHN0YXJ0dXAgYnkgZGVmYXVsdCBhcyAxLnh4IGRpZAoKZml4IE1vZFBlcmw6OlV0aWw6OmV4aXQgc2VndiB3aXRoIDUuNi4wCgpubyBsb25nZXIgc3VwcG9ydCA1LjcueCBwZXJsIGRldmVsb3BtZW50IHZlcnNpb25zCgphZGRlZCBjb21wYXQgZm9yIEFwYWNoZTo6VGFibGUtPm5ldwoKdmFyaW91cyBmaXhlcyB0byBjb21waWxlL3J1biBvbiBkYXJ3aW4KCnNlcnZlci1zY29wZSBQZXJse1NldCxQYXNzfUVudiBjb25maWcgbm93IHByb3BhZ2F0ZWQgdG8gJUVOViBhdCBzdGFydHVwCgp1c2UgU3ZPSyhzdikgaW5zdGVhZCBvZiBzdiA9PSAmUExfc3ZfdW5kZWYgdG8gZGV0ZWN0IHVuZGVmIHZhbHVlcyBpbiB4cwpbU3RlcGhlbiBDbG91c2UgPHN0ZXBoZW5jQHRoZWlxZ3JvdXAuY29tPl0KCmNvbXBsZXRlIEFwYWNoZTo6VXRpbCAxLnggY29tcGF0CgphZGRlZCBBcGFjaGU6Ok1QTV9JU19USFJFQURFRCBjb25zdGFudAoKYWRkZWQgY29tcGF0IGZ1bmN0aW9uIGZvciBBcGFjaGU6OkNvbnN0YW50czo6U0VSVkVSX1ZFUlNJT04KCmFkZGVkIEFwYWNoZTo6Q29uc3RhbnRzOjpleHBvcnQgc3R1YiBmb3IgY29tcGF0CgphZGRlZCBub29wIHN0dWJzIGZvciB0aW1lb3V0IGZ1bmN0aW9ucyByZW1vdmVkIGZyb20gMi4wOgokci0+e3NvZnQsaGFyZCxyZXNldCxraWxsfV90aW1lb3V0Cgp0dXJuZWQgb24gUGVybE9wdGlvbnMgK0dsb2JhbFJlcXVlc3QgYnkgZGVmYXVsdCBmb3IgcGVybC1zY3JpcHQgaGFuZGxlcgp1bmxlc3MgaXQgaXMgZXhwbGljaXRseSB0dXJuZWQgb2ZmIHdpdGggUGVybE9wdGlvbnMgLUdsb2JhbFJlcXVlc3QKCmFkZGVkIEFQUjo6T1M6OnRocmVhZF9jdXJyZW50IGZ1bmN0aW9uCgphZGRlZCBzdXBwb3J0IGZvciAxLnggJHItPnN1YnByb2Nlc3NfZW52IGZ1bmN0aW9uYWxpdHkKCmFkZGVkIHN1cHBvcnQgZm9yICRyLT5wdXNoX2hhbmRsZXJzKFBlcmxIYW5kbGVyID0+IC4uLikKCmFkZGVkIHN1cHBvcnQgZm9yICRyLT5wcm94eXJlcSB0byBkZXRlY3QgcHJveHkgcmVxdWVzdHMKCiRyLT5jb250ZW50X3R5cGUoJHZhbCkgbm93IGNhbGxzIGFwX3NldF9jb250ZW50X3R5cGUgdW5kZXJuZWF0aAoKYWRkIHRoZSBlcnJfaGVhZGVyX291dCgpIHdyYXBwZXIgdG8gQXBhY2hlOjpjb21wYXQgKyBjb3JyZXNwb25kaW5nIHRlc3RzCltTdGFzIEJla21hbl0KCmZpeCAkci0+ZGlyX2NvbmZpZyBsb29rdXAgb2YgdmFsdWVzIHNldCBpbiB0aGUgc2VydmVyIGNvbnRleHQKCmFkZGVkIEFwYWNoZTo6UkVESVJFQ1Qgc2hvcnRjdXQgY29uc3RhbnQKCnZhcmlvdXMgZml4ZXMgZm9yIG1ldGhvZCBoYW5kbGVycwoKdXNlIEFwYWNoZTo6U2VydmVyVXRpbCBpbiBBcGFjaGU6OmNvbXBhdCBzbyBBcGFjaGUtPnNlcnZlciB3b3JrcyBpbiBjb21wYXQKbW9kZSBbRGF2ZSBSb2xza3kgPGF1dGFyY2hAdXJ0aC5vcmc+XQoKYWRkIEFwYWNoZTo6VXRpbDo6dW5lc2NhcGVfdXJpIGFsaWFzIHRvIEFwYWNoZTo6dW5lc2NhcGVfdXJsIGluIEFwYWNoZTo6Y29tcGF0CgpjaGFuZ2UgQXBhY2hlOjp1bmVzY2FwZV91cmwgdG8gcmV0dXJuIHRoZSBlc2NhcGVkIHVybCBhcyAxLnggZG9lcwoKZGlzYWJsZWQgdGVybSBjb2xvcmluZyBieSBkZWZhdWx0IChlbmFibGUgd2l0aCBlbnYgdmFyIEFQQUNIRV9URVNUX0NPTE9SPTEpCgpmaXggZm9yIEFQUjo6SXBTdWJuZXQtPm5ldyB0byBjaGVjayByZXR1cm4gc3RhdHVzIGFwcl9pcHN1Ym5ldF9jcmVhdGUKCmVuYWJsZWQgQVBSOjpTb2NrQWRkciBtb2R1bGUKCnR1cm4gb24gYmlubW9kZSBmb3IgZmlsZWhhbmRsZSB1c2VkIGluICRyLT5zZW5kX2ZkCgpnZXQgTVBfe1RSQUNFLERFQlVHfSBNYWtlZmlsZS5QTCBvcHRpb25zIHdvcmtpbmcgb24gd2luMzIKCnZhcmlvdXMgZml4ZXMgdG8gYnVpbGQvcnVuIHdpdGggYmxlZWRwZXJsCgp2YXJpb3VzIGZpeGVzIGZvciB3aW4zMiB0byBnZXQgbWFrZSB0ZXN0IHBhc3NpbmcKCm1vdmVkIGNvbnN0dWN0X3t1cmwsc2VydmVyfSBtZXRob2RzIHRvIEFwYWNoZTo6VVJJIG1vZHVsZQoKaW1wbGVtZW50IEFwYWNoZTo6VVJJOjpwYXJzZSBpbiBBcGFjaGU6OmNvbXBhdAoKZ2l2ZSBQZXJsKkhhbmRsZXJzIHByZWNlZGVuY2Ugb3ZlciBvdGhlciBoYW5kbGVycyBieSB1c2luZyBBUFJfSE9PS19GSVJTVApyYXRoZXIgdGhhbiBBUFJfSE9PS19MQVNUCgp3b3JrYXJvdW5kIGJ1ZyBpbiA1LjYuMSB3aGVuIFhTTG9hZGVyIGxvYWRzIER5bmFMb2FkZXIsIHdpcGluZyBvdXQgYW55CmRsIGhhbmRsZXMgaXQgaGFkIGJlZW4ga2VlcGluZyB0cmFjayBvZi4KCnRpZHkgdXAgdGVzdCB0byBydW4gc3RhbmRhbG9uZSAod2l0aG91dCBtb2RwZXJsIHRlc3QgY29uZmlnKSAKW1N0YXMgQmVrbWFuXQoKb3ZlcnJpZGUgVF9QVFJPQkogSU5QVVQgdHlwZW1hcCB0byBjcm9hayBpZiBvYmplY3QgaXMgbm90IGEgYmxlc3NlZApyZWZlcmVuY2UsIHRvIHByZXZlbnQgcG9zc2libGUgc2VndiBmcm9tIGUuZy4gQXBhY2hlOjpTZXJ2ZXItPnByb2Nlc3MKCmFwcl9sb2NrLmggaXMgZ29uZTsgZGlzYWJsZSBBUFI6OkxvY2sgZm9yIHRoZSBtb21lbnQKCmVuYWJsZWQgdGhlIEFwYWNoZTo6UHJvY2VzcyBtb2R1bGUKCmZpeCBNb2RQZXJsOjpVdGlsOjpleGl0IHRvIGNsZWFyICRAIGJlZm9yZSBjYWxsaW5nIFBlcmxfY3JvYWsKCmN1dCBkb3duIG9uIHNvbWUgYnVpbGQgbm9pc2UKCmZpeCAnUGVybE9wdGlvbnMgK0dsb2JhbFJlcXVlc3QnIHdoZW4gdXNlZCB3aXRoaW4gc3VicmVxdWVzdHMKCmdldCByaWQgb2Ygc29tZSAic3Vicm91dGluZSByZWRlZmluZWQiIHdhcm5pbmdzIGluIE1vZFBlcmw6Ok1NIHRoYXQKc2hvdyB1cCB3aXRoIG5ld2VyIGJsZWVkcGVybHMuCgphIGZldyBmaXhlcyBmb3IgQXBhY2hlOjpjb21wYXQgW0RhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPl0KCj1pdGVtIDEuOTlfMDEgLSBBcHJpbCA2LCAyMDAyCgpGaXJzdCBwdWJsaWMgcmVsZWFzZSBvZiBtb2RfcGVybC0yLjAtdG9iZS4KCj1iYWNrCgo9Y3V0Cg==