ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmluZGV4IGQ1ZTMwY2QuLjk1N2U2YjkgMTAwNjQ0Ci0tLSBhL0FVVEhPUlMKKysrIGIvQVVUSE9SUwpAQCAtMSArMSBAQAotTWljaGFlbCBMaW5rLCBtbGlua0BmcmFjdGFsLm5ldAorTWljaGFlbCBMaW5rIDxtbGlua0BzeW50aGVtZXNjLmNvbT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTAppbmRleCAwN2YzZTA5Li5lYmY1NGRlIDEwMDY0NAotLS0gYS9JTlNUQUxMCisrKyBiL0lOU1RBTEwKQEAgLTEsNzAgKzEsMzU3IEBACi1NYWlsIGJ1ZyByZXBvcnRzIHRvOiBnZW5lcmFsQHRjbC5hcGFjaGUub3JnCitUaGlzIGlzIG15IGNvcHkgb2Ygc29tZSBpbmZvcm1hdGlvbiBJIHdyb3RlIGZvciBtb2RfdGNsIGZvciBBcGFjaGUgMi4wIGZyb206IFdyb3ggUHJlc3MuIElTQk4gMS04NjEwMDctMjItMSBBcGNoZSAyLjAuICBJZiB5b3Ugd2FudCBpdCBwcmV0dHkgcHJpbnRlZCBnZXQgdGhlIGJvb2suIChNS0wpCiAKK1RoaW5ncyB0aGF0IGFyZSBkaWZmZXJlbnQgc2luY2UgdGhpcyB3YXMgd3JpdHRlbi4KIAotbW9kX3RjbCAxLjBkOC0yMDAxMTEyOTAwIElOU1RBTEwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxLiBzdXBwb3J0cyBBcGFjaGUgMi4wLjQwCisyLiBmaXJzdCByZWxlYXNlIG9mIG1vZF90Y2wgMS4wLCBJJ3ZlIGJlZW4gcnVubmluZyB0aGlzIGZvciBtb250aHMgc3RhYmxlIG5vIGVycm9ycyBpbiBlcnJvcl9sb2cuCisgICBJIGRvbid0IHRoaW5rIGFsbCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBpcyBjb21wbGV0ZSBidXQgaXQncyBkZWNlbnRseSBicm9hZC4gIFNvbWUgdGhpbmdzIGFyZQorICAgbWlzc2luZyBsaWtlIHRoZSBib3VuZGFyeSBpbiB0aGUgcmVxdWVzdF9yZWMsIGJlY2F1c2UgaXQgZG9lc24ndCBleGlzdCBpbiBBcGFjaGUgYW55bW9yZS4uLgorMy4gSSByZWNvbW1lbmQgdXNpbmcgVGNsIDguNCBzaW5jZSBpdCBzdXBwb3J0cyBXaWRlSW50ICg2NC1iaXQpIGludGVnZXJzLgorNC4gUnVucyBvbiBTb2xhcmlzIDkgc3BhcmN2OSBBQkkgd2hpY2ggaXMgdGhlIDY0LWJpdCBBQkksIEkgYXNzdW1lIGl0IHdpbGwgcnVuIG9uIG90aGVycyBhcyB3ZWxsLgorICAgKHVzZWQgZ2NjIDMuMS4xIHdpdGggLW02NCkKKzUuIFlvdSBjYW4gdXNlIC0td2l0aC10Y2xkaXI9cGF0aF90b190Y2xDb25maWcuc2ggaW4gLi9jb25maWd1cmUKKzYuIC4vY29uZmlndXJlIGFsc28gYWRkcyAtUjx0Y2xfbGlicmFyeV9wYXRoPiB0byBsaW5rZXIgcGhhc2UuICBKdXN0IGluIGNhc2UgeW91IGRvbid0IGhhdmUKKyAgIC91c3IvbG9jYWwvbGliIHNldHVwIGFzIGRlZmF1bHQuCiAKLVRoaXMgaW5zdGFsbGF0aW9uIHJlZmVycyB0byBpbnN0YWxsaW5nIG1vZF90Y2wgMS4wZDgtMjAwMTExMjkwMCB3aXRoCi1BcGFjaGUgMi4wLjI4LiAgVGhpcyBpbnN0YWxsYXRpb24gZG9jdW1lbnQgcmVmZXJzIHRvIG5vIG90aGVyIHZlcnNpb25zCi1vZiBtb2RfdGNsIG9yIEFwYWNoZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0xLiAgVW5nemlwIGFuZCB1bnRhciB0aGUgbW9kX3RjbC50YXIuZ3ogZmlsZS4KLSAgICAodGFyIC16eGYgbW9kX3RjbC50YXIuZ3opCi0yLiAgTW92ZSB0aGUgbW9kX3RjbCBkaXJlY3RvcnkgdG8gdGhlIG1vZHVsZXMgZGlyZWN0b3J5IGluIHRoZSBodHRwZAotICAgIHJvb3QuCi0gICAgKG12IG1vZF90Y2wgaHR0cGQtMl8wXzI4L21vZHVsZXMpCi0zLiAgQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgaHR0cGQgZGlzdHJpYnV0aW9uIGFuZCBydW4KLSAgICB0aGUgYGF1dG9jb25mJyBhbmQgYGF1dG9oZWFkZXInIGNvbW1hbmRzLiAgWW91IG11c3QgaGF2ZSB0aGUKLSAgICBhdXRvY29uZiBkaXN0cmlidXRpb24gaW5zdGFsbGVkLCB3aGljaCBpcyBhdmFpbGFibGUgZnJvbSBhbnkgR05VIG1pcnJvci4KLSAgICAoY2QgaHR0cGQtMl8wXzI4O2F1dG9jb25mO2F1dG9oZWFkZXIpCi00LiAgQ29uZmlndXJlIHRoZSBtYWtlIHByb2Nlc3MgYnkgdHlwaW5nIGAuL2NvbmZpZ3VyZScuICBZb3UgbWF5IGluY2x1ZGUKLSAgICBvdGhlciBvcHRpb25zLgotICAgICguL2NvbmZpZ3VyZSkKLTUuICBNYWtlIHRoZSBkaXN0cmlidXRpb24gYW5kIGluc3RhbGwgaXQuCi0gICAgKG1ha2U7bWFrZSBpbnN0YWxsKQotNi4gIEF0IHRoaXMgcG9pbnQgdGhlIGNvbXBpbGUgYW5kIGluc3RhbGxhdGlvbiBoYXMgY29tcGxldGVkIGFuZCB5b3UKLSAgICBuZWVkIHRvIGVkaXQgdGhlIGh0dHBkLmNvbmYgZmlsZSwgdGhpcyBpcyB1c3VhbGx5IGxvY2F0ZWQgYXQKLSAgICAvdXNyL2xvY2FsL2FwYWNoZTIvY29uZiBmb3IgYSBkZWZhdWx0IGluc3RhbGwuCi0gICAgCi1TYW1wbGUgaHR0cGQuY29uZiBlbnRyeSBmb3IgdXNpbmcgbW9kX3RjbCBpbiBhIFZpcnR1YWxIb3N0IHN0YXRlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01vZF90Y2wgaW5jb3Jwb3JhdGVzIGEgVGNsIGludGVycHJldGVyIGludG8gdGhlIEFwYWNoZSB3ZWIgc2VydmVyLiAgVGhpcyB3aWxsIGFsbG93IEFwYWNoZSB0byBydW4gVGNsIHNjcmlwdHMgbmF0aXZlbHkgd2l0aG91dCBoYXZpbmcgdG8gcmVsb2FkIGEgVGNsIGludGVycHJldGVyIGV2ZXJ5IHRpbWUgdGhlIHNjcmlwdCBpcyBydW4uICBUaGUgVGNsIHNjcmlwdHMgYXJlIGNhY2hlZCBpbiB0aGUgVGNsIGludGVycHJldGVyIHVudGlsIHRoZSBzY3JpcHQgZmlsZSBtb2RpZmljYXRpb24gdGltZSBjaGFuZ2VzIG9yIEFwYWNoZSBpcyByZXN0YXJ0ZWQuICBUaGlzIGFsbG93cyBUY2wgc2NyaXB0cyB1c2luZyBtb2RfdGNsIGluIEFwYWNoZSB0byBleGVjdXRlIG11Y2ggZmFzdGVyIHRoYW4gdHJhZGl0aW9uYWwgQ0dJIHNjcmlwdHMgd2hpY2ggbXVzdCBpbml0aWFsaXplIGFuIGludGVycHJldGVyIGV2ZXJ5IHRpbWUgYSBzY3JpcHQgaXMgZXhlY3V0ZWQuICBBZGRpdGlvbmFsbHkgbW9kX3RjbCBleHBvcnRzIHRoZSBBcGFjaGUgQVBJIHdoaWNoIGFsbG93cyBhIHByb2dyYW1tZXIgdG8gaGF2ZSBjb21wbGV0ZSBjb250cm9sIG92ZXIgaHR0cCByZXF1ZXN0cyB0aGF0IENHSSBzY3JpcHRzIGNhbiBub3QgcHJvdmlkZS4KIAotPFZpcnR1YWxIb3N0IDIwNi45LjE2MS4yMz4KLSAgICBTZXJ2ZXJOYW1lIGFscGhhLWRlY2F5LmNvbQotICAgIFNlcnZlckFsaWFzIHd3dy5hbHBoYS1kZWNheS5jb20KK01vZF90Y2wgaXMgYW4gQXBhY2hlIG1vZHVsZSBpbiBpdHMgb3duIHJpZ2h0LCBidXQgaXQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIGdhdGV3YXkgZm9yIHdyaXRpbmcgQXBhY2hlIG1vZHVsZXMgaW4gVGNsIHZlcnN1cyBDLiAgRXhpc3RpbmcgVGNsIHBhY2thZ2VzIHdoZXRoZXIgd3JpdHRlbiBpbiBDIG9yIFRjbCBjYW4gYmUgZWFzaWx5IGludGVncmF0ZWQgaW50byBtb2RfdGNsIHNjcmlwdHMuICBUaGlzIGFsbG93cyBhIGxhcmdlIGNvbGxlY3Rpb24gb2YgZXhpc3RpbmcgVGNsIHBhY2thZ2VzIHRvIGJlIHVzZWQgd2l0aG91dCBoYXZpbmcgdG8gcmV3cml0ZSBmdW5jdGlvbmFsaXR5IG9yIGluY3VyIGEgcGVyZm9ybWFuY2UgaGl0IGJ5IHVzaW5nIGFuIGFsdGVybmF0aXZlIGV4ZWN1dGlvbiBtb2RlbCBsaWtlIENHSS4KIAotICAgIERvY3VtZW50Um9vdCAiL2V4cG9ydC93ZWIvYWxwaGEtZGVjYXkuY29tIgorTW9kX3RjbCBpcyBkZXNpZ25lZCB0byBiZSBwb3dlcmZ1bCwgbGlnaHR3ZWlnaHQsIGFuZCBmYXN0LiAgVGhlIGFkZGl0aW9uYWwgb3ZlcmhlYWQgZnJvbSB0aGUgVGNsIGludGVycHJldGVyIHdpbGwgYmUgbmVnbGlnaWJsZSB3aGVuIGNvbnNpZGVyaW5nIHRoZSBmbGV4aWJpbGl0eSBhbmQgc3BlZWQgYWNoaWV2ZWQuICBJbiBhZGRpdGlvbiB0aGVyZSBpcyBubyBmbHVmZiBpbnZvbHZlZCB3aXRoIG1vZF90Y2wsIG9ubHkgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgQXBhY2hlIEFQSSBhbmQgVGNsIGludGVycHJldGVyIGlzIHByb3ZpZGVkLiAgVGhlIHByb2dyYW1tZXIgaXMgZ2l2ZW4gdGhlIGNob2ljZSBvZiB3aGF0IHBhY2thZ2VzIG1heSBiZSBuZWNlc3NhcnkgZm9yIGVhY2ggc2NyaXB0LCBmb3IgZXhhbXBsZSBhIHBhY2thZ2UgbWF5IGJlIHJlcXVpcmVkIGZvciBjb21tdW5pY2F0aW9uIHdpdGggYSBkYXRhYmFzZS4gIFRoaXMgcHJvdmlkZXMgbGVzcyByZXNvdXJjZSBwb2xsdXRpb24sIGRlcGVuZGVuY3kgb24gYWRkaXRpb25hbCByZXF1aXJlZCBwYWNrYWdlcywgYW5kIGJldHRlciBlZmZpY2llbmN5IGluIHRoZSBodHRwIHJlcXVlc3QgcHJvY2Vzcy4KIAotICAgIDxEaXJlY3RvcnkgL2V4cG9ydC93ZWIvYWxwaGEtZGVjYXkuY29tPgotICAgICAgICBBZGRIYW5kbGVyIHRjbC1oYW5kbGVyIHRtCi0gICAgICAgIAotICAgICAgICBUY2xfQ29udGVudEhhbmRsZXIgY29udGVudF9oYW5kbGVyCi0gICAgPC9EaXJlY3Rvcnk+CitCdWlsZGluZyBhbmQgSW5zdGFsbGluZyBBcGFjaGUgd2l0aCBtb2RfdGNsCisKK01vZF90Y2wgaXMgY29uZmlndXJlZCB1c2luZyB0aGUgQXBhY2hlIDIuMCBjb25maWd1cmF0aW9uIHN5c3RlbS4gIE5vcm1hbGx5IGEgdmFuaWxsYSBpbnN0YWxsIG9mIEFwYWNoZSBkb2VzbtV0IHJlcXVpcmUgYSByZWJ1aWxkIG9mIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSwgYnV0IHNpbmNlIG1vZF90Y2wgcmVxdWlyZXMgbGlicmFyaWVzIG5vdCB1c3VhbGx5IGJ1aWx0IGludG8gQXBhY2hlIGl0IGlzIG5lY2Vzc2FyeSB0byByZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IHVzaW5nIEdOVSBhdXRvY29uZi4gIFRoZSBHTlUgYXV0b2NvbmYgdG9vbHMgbWF5IGFscmVhZHkgYmUgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBhIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQgdG8gY29uZmlybSB0aGlzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlaW5zdGFsbGF0aW9uLiAgSWYgdGhlIEdOVSBhdXRvY29uZiB0b29scyBhcmUgbm90IGluc3RhbGxlZCB0aGVuIHRoZXkgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBhIEdOVSBkaXN0cmlidXRpb24gc2l0ZSwgZm9yIG1vcmUgaW5mb3JtYXRpb24gY2hlY2sgdGhlIEdOVSBhdXRvY29uZiB3ZWJzaXRlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi8uICBQbGVhc2Ugbm90ZSB0aGF0IEdOVSBhdXRvY29uZiBhbHNvIHJlcXVpcmVzIGEgcmVjZW50IHJlbGVhc2Ugb2YgYW4gbTQgbWFjcm8gcHJvY2Vzc29yLiAgVGhlIG5leHQgc3RlcCBpcyB0byBkb3dubG9hZCB0aGUgbW9kX3RjbCBzb3VyY2UgZnJvbSB0aGUgQXBhY2hlIFRjbCBwcm9qZWN0IHdlYiBzaXRlIGF0IGh0dHA6Ly90Y2wuYXBhY2hlLm9yZyBvciBmcm9tIGFub255bW91cyBDVlMuICBUaGUgZm9sbG93aW5nIENWUyBjb21tYW5kcyB3aWxsIGNoZWNrb3V0IHRoZSBtb2RfdGNsIHNvdXJjZSBmcm9tIGN2cy5hcGFjaGUub3JnLCBubyBzYW5kYm94IGlzIHJlcXVpcmVkIGFzIHRoaXMgd2lsbCBkb3dubG9hZCBhbGwgdGhlIHNvdXJjZSB0byB0aGUgdGNsLW1vZHRjbCBkaXJlY3RvcnkuICBUaGUgQ1ZTIGxvZ2luIHBhc3N3b3JkIGlzIGFub25jdnMuCisKKyQgY3ZzIC1kOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgbG9naW4KKyhMb2dnaW5nIGluIHRvIGFub25jdnNAY3ZzLmFwYWNoZS5vcmcpCitDVlMgcGFzc3dvcmQ6IDxlbnRlciBhbm9uY3ZzPgorJCBjdnMgLWQ6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyBjaGVja291dCB0Y2wtbW9kdGNsCisKK0lmIG1vZF90Y2wgaXMgZG93bmxvYWRlZCBmcm9tIHRoZSBBcGFjaGUgVGNsIHByb2plY3Qgd2ViIHNpdGUgdGhlbiB0aGUgcGFja2FnZSBtdXN0IGJlIHVuLWFyY2hpdmVkIGFuZCBtb3ZlZCB0byB0aGUgQXBhY2hlIDIuMCBtb2R1bGVzIGRpcmVjdG9yeS4gIElmIENWUyBpcyB1c2VkIHRoZSBkaXJlY3RvcnkgbXVzdCBiZSByZW5hbWVkIHRvIG1vZF90Y2wgZnJvbSB0Y2wtbW9kdGNsIGFuZCB0aGVuIG1vdmVkIHRvIHRoZSBBcGFjaGUgMi4wIG1vZHVsZXMgZGlyZWN0b3J5LiAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIG1vZF90Y2wgc291cmNlIG11c3QgYmUgbmFtZWQgbW9kX3RjbCBvdGhlcndpc2UgdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIHN5c3RlbSB3aWxsIG5vdCByZWNvZ25pemUgbW9kX3RjbC4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhc3N1bWVzIHRoZSBBcGFjaGUgMi4wIHNvdXJjZSBkaXN0cmlidXRpb24gaXMgbG9jYXRlZCBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1vZF90Y2wgc291cmNlIHdhcyBhY3F1aXJlZCB0aHJvdWdoIENWUy4KKworJCBtdiB0Y2wtbW9kdGNsIGh0dHBkLTIuMC4zMi9tb2R1bGVzL21vZF90Y2wKKworTm93IHRoZSBBcGFjaGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gaXMgcmVhZHkgdG8gYmUgcmVidWlsdCBhbmQgaW5jbHVkZSBtb2RfdGNsLiAgQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgQXBhY2hlIDIuMCBzb3VyY2UgYW5kIHJlYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtLgorCiskIGNkIGh0dHBkLTIuMC4zMgorJCBhdXRvY29uZgorJCBhdXRvaGVhZGVyCisKK1J1bm5pbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2l0aCB0aGUgaGVscCBmbGFnIHdpbGwgc2hvdyB0aGF0IG1vZF90Y2wgY29uZmlndXJhdGlvbiBtYWNyb3MgaGF2ZSBiZWVuIGFzc2ltaWxhdGVkIGludG8gdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIHN5c3RlbS4KKworJCAuL2NvbmZpZ3VyZSAtLWhlbHAKK8kKKy0tZGlzYWJsZS10Y2wgICAgICAgICAgIGVtYmVkZGVkIHRjbCBpbnRlcnByZXRlcgoryQorCittb2RfdGNsIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBvbmNlIHRoZSBBcGFjaGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiByZWJ1aWx0LiAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgbW9kX3RjbCB0aGVuIHRoaXMgbWF5IGJlIGFjY29tcGxpc2hlZCBmcm9tIHRoZSAtLWRpc2FibGUtdGNsIG9wdGlvbiBwYXNzZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCisKK1RoZSBuZXh0IHN0ZXAgaXMgdG8gY29uZmlndXJlIHRoZSBBcGFjaGUgYnVpbGQgcHJvY2VzcyBieSBydW5uaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgRHVyaW5nIGNvbmZpZ3VyYXRpb24gd2Ugd2lsbCBzZWUgc3RhdHVzIG91dHB1dCwgdGhlIG1vZF90Y2wgY29uZmlndXJhdGlvbiBzdGF0dXMgb3V0cHV0IHdpbGwgbG9vayBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcuCisKK2NoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1vZF90Y2wuLi4geWVzIChkZWZhdWx0KQorY2hlY2tpbmcgZm9yIHRjbC5oLi4uIHllcworY2hlY2tpbmcgZm9yIGludHR5cGVzLmguLi4geWVzCitjaGVja2luZyBmb3IgaW50X3R5cGVzLmguLi4gbm8KK2NoZWNraW5nIGZvciBzeXMvbW1hbi5oLi4uIChjYWNoZWQpIHllcworY2hlY2tpbmcgZm9yIGFzcHJpbnRmLi4uIG5vCitjaGVja2luZyBmb3IgbW1hcC4uLiAoY2FjaGVkKSB5ZXMKK2NoZWNraW5nIGZvciB0Y2xDb25maWcuc2ggaW4gL3Vzci9sb2NhbC9saWIuLi4geWVzCitjaGVja2luZyBmb3IgdGNsIHZlcnNpb24uLi4gOC4zCisKK0l0IGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCBjb25maWd1cmF0aW9uIGZvdW5kIHRoZSB0Y2wuaCBoZWFkZXIgZmlsZS4gIElmIHRoZSB0Y2wuaCBoZWFkZXIgZmlsZSB3YXMgbm90IGZvdW5kIGV4dHJhIGluY2x1ZGUgcGF0aHMgbWF5IGJlIHJlcXVpcmVkIHdoZW4gY29tcGlsaW5nIEFwYWNoZSAyLjAsIG9yIGEgVGNsIGRpc3RyaWJ1dGlvbiBtYXkgbm90IGJlIGluc3RhbGxlZC4gIElmIFRjbCBpcyBub3QgaW5zdGFsbGVkIHRoZSBUY2wgc29mdHdhcmUgY2FuIGJlIG9idGFpbmVkIGZyb20gaHR0cDovL3d3dy50Y2wudGsuICBDb25maWd1cmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgdGNsQ29uZmlnLnNoIGZpbGUgaXMgbm90IGZvdW5kIG9yIHRoZSBtYWpvciBUY2wgdmVyc2lvbiBpbnN0YWxsZWQgaXMgbGVzcyB0aGFuIDguMC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGxhdGVzdCBUY2wgdmVyc2lvbiBiZSB1c2VkLiAgSWYgVGNsIGlzIGluc3RhbGxlZCBhbmQgY29uZmlndXJhdGlvbiB3YXMgdW5hYmxlIHRvIGZpbmQgdGhlIHRjbENvbmZpZy5zaCBmaWxlIHRoZW4gdGhlIG1vZF90Y2wgY29uZmlndXJhdGlvbiBtYWNyb3MgbWF5IGJlIG1vZGlmaWVkLiAgQnkgZGVmYXVsdCBtb2RfdGNsIGNvbmZpZ3VyYXRpb24gYXNzdW1lcyB0aGUgdGNsQ29uZmlnLnNoIHdpbGwgYmUgZm91bmQgaW4gdGhlIGRpcmVjdG9yaWVzIC91c3IvbGliIG9yIC91c3IvbG9jYWwvbGliLiAgSWYgdGhlIFRjbCBkaXN0cmlidXRpb24gb24gdGhlIHN5c3RlbSBpcyBpbnN0YWxsZWQgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhlbiB0aGUgZmlsZSBjb25maWcubTQgaW4gdGhlIG1vZF90Y2wgZGlyZWN0b3J5IGNhbiBiZSBtb2RpZmllZCB0byBzZWFyY2ggaW4gb3RoZXIgZGlyZWN0b3JpZXMuICBJZiB0aGlzIGlzIG5lY2Vzc2FyeSB0aGVuIGNoYW5nZSBkaXJlY3RvcnkgdG8gdGhlIG1vZF90Y2wgZGlyZWN0b3J5IGFuZCBlZGl0IHRoZSBjb25maWcubTQgZmlsZS4gIEluIHRoZSBjb25maWcubTQgZmlsZSB0aGVyZSBpcyBhIHZhcmlhYmxlIGNhbGxlZCBkaXJzLiAgQXBwZW5kIGFkZGl0aW9uYWwgc2VhcmNoIHBhdGhzIHRvIHRoaXMgc3RyaW5nIHRvIGFsbG93IG1vcmUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIGFkZGl0aW9uIG9mIHRoZSAvdXNyL2xvY2FsMi9saWIgZGlyZWN0b3J5LgorCivJCitBQ19DSEVDS19GVU5DUyhhc3ByaW50ZiBtbWFwKQorCitkaXJzPSIvdXNyL2xvY2FsL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsMi9saWIiCisKK2ZvdW5kPTAKK8kKKworSWYgYW55IG1vZGlmaWNhdGlvbnMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGNvbmZpZy5tNCBmaWxlIHRoZW4gYXV0b2NvbmYgYW5kIGF1dG9oZWFkZXIgd2lsbCBoYXZlIHRvIGJlIHJ1biBhZ2Fpbi4KKworQWZ0ZXIgY29uZmlndXJhdGlvbiBoYXMgY29tcGxldGVkIHRoZSBBcGFjaGUgd2ViIHNlcnZlciBjYW4gYmUgY29tcGlsZWQuICBDaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSByb290IGxldmVsIG9mIHRoZSBBcGFjaGUgMi4wIHNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcy4KKworJCBtYWtlCiskIG1ha2UgaW5zdGFsbAorCitUaGlzIHdpbGwgY29tcGlsZSBBcGFjaGUgMi4wIHdpdGggbW9kX3RjbCBhbmQgaW5zdGFsbCB0aGUgZGlzdHJpYnV0aW9uIGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYXQgY29uZmlndXJhdGlvbiB0aW1lLiAgVGhlIEFwYWNoZSAyLjAgYmluYXJ5IHdpbGwgY29udGFpbiBhIHN0YXRpY2FsbHkgbGlua2VkIG1vZF90Y2wgbW9kdWxlIHdoaWNoIG1heSBhbHNvIHN0YXRpY2FsbHkgbGluayBUY2wgbGlicmFyaWVzIGRlcGVuZGluZyBvbiB5b3VyIFRjbCBpbnN0YWxsYXRpb24uCisKK0NvbmZpZ3VyaW5nIG1vZF90Y2wgaW4gQXBhY2hlIENvbmZpZ3VyZSBGaWxlcworCitJbiBvcmRlciB0byB1c2UgbW9kX3RjbCBpbiBBcGFjaGUgMi4wIHNvbWUgbW9kX3RjbCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgYXJlIHJlcXVpcmVkIGluIHRoZSBBcGFjaGUgMi4wIGNvbmZpZ3VyYXRpb24gZmlsZSwgdXN1YWxseSBjYWxsZWQgaHR0cGQuY29uZi4gIE1vZF90Y2wgaXMgbWFkZSBhY3RpdmUgYnkgYWN0aXZhdGluZyBvbmUgb2YgdGhlIG1vZHVsZSBob29rIGNhbGxzLiAgVGhlcmUgYXJlIHRlbiBob29rIGNhbGxzIGluIHRvdGFsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF2YWlsYWJsZSBob29rIGNhbGxzIGluIHRoZSBBcGFjaGUgQVBJLiAgQWxsIGhvb2tzIHJlcXVpcmUgYW4gYXJndW1lbnQgb2YgdGhlIGVudGlyZSBwaHlzaWNhbCBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGhvb2sgcHJvY2VkdXJlIGV4Y2VwdCB0aGUgY29udGVudCBoYW5kbGVyIGhvb2sgY2FsbGVkIFRjbF9Ib29rX0hhbmRsZXIuICBFdmVyeSBob29rIGRvZXMgcmVxdWlyZSBhbiBhcmd1bWVudCBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwcm9jZWR1cmUgdG8gYmUgY2FsbGVkLiAgTW9kX3RjbCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgYXJlIHZhbGlkIHdpdGhpbiBBcGFjaGUgPERpcmVjdG9yeT7JPC9EaXJlY3Rvcnk+IG9yIDxMb2NhdGlvbj7JPC9Mb2NhdGlvbj4gYmxvY2tzLgorCitNb2RfdGNsIEhvb2sgQ29uZmlndXJhdGlvbiBEaXJlY3RpdmVzIGluIE9yZGVyIG9mIEV4ZWN1dGlvbgorVGNsX0hvb2tfUG9zdF9SZWFkX1JlcXVlc3QJRW5hYmxlcyB0aGUgcG9zdCByZWFkIHJlcXVlc3QgaGFuZGxlciBmb3IgcmVxdWVzdCBzZXR1cC4KK1RjbF9Ib29rX1RyYW5zbGF0ZV9OYW1lCUVuYWJsZXMgdGhlIHRyYW5zbGF0ZSBuYW1lIGhhbmRsZXIgZm9yIFVSSSB0byBmaWxlIHRyYW5zbGF0aW9uLgorVGNsX0hvb2tfSGVhZGVyX1BhcnNlcglFbmFibGVzIHRoZSBoZWFkZXIgcGFyc2VyIGhhbmRsZXIgZm9yIHBhcnNpbmcgaHR0cCBoZWFkZXJzLgorVGNsX0hvb2tfQWNjZXNzX0NoZWNrZXIJRW5hYmxlcyB0aGUgYWNjZXNzIGNoZWNrZXIuCitUY2xfSG9va19DaGVja19Vc2VyX0lECUVuYWJsZXMgdGhlIGNoZWNrIHVzZXIgaWQgaGFuZGxlci4KK1RjbF9Ib29rX0F1dGhfQ2hlY2tlcglFbmFibGVzIHRoZSBhdXRoIGNoZWNrZXIuCitUY2xfSG9va19UeXBlX0NoZWNrZXIJRW5hYmxlcyB0aGUgdHlwZSBjaGVja2VyLgorVGNsX0hvb2tfRml4dXBzCUVuYWJsZXMgYSBmaXggdXAgaGFuZGxlci4KK1RjbF9Ib29rX0hhbmRsZXIJRW5hYmxlcyB0aGUgY29udGVudCBoYW5kbGVyIGZvciBkZWxpdmVyeSBvZiBkYXRhIHRvIGNsaWVudC4KK1RjbF9Ib29rX0xvZ19UcmFuc2FjdGlvbglFbmFibGVzIHRoZSBsb2cgdHJhbnNhY3Rpb24gaGFuZGxlci4KKworQ2hhbmNlcyBhcmUgdGhlIFRjbF9Ib29rX0hhbmRsZXIgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgd2lsbCBiZSB0aGUgbW9zdCBjb21tb25seSBvbmUgdXNlZC4gIFRoaXMgaXMgdGhlIGhhbmRsZXIgdGhhdCBhY3R1YWxseSBkZWxpdmVycyB0aGUgY29udGVudCBhbmQgZG9lcyBtb3N0IG9mIHRoZSB3b3JrLiAgVGhpcyBoYW5kbGVyIGFsc28gZG9lcyBub3QgcmVxdWlyZSBhIGZpbGUgbmFtZSBhcmd1bWVudCBwYXNzZWQgdG8gaXQsIHRoaXMgaXMgYmVjYXVzZSBtYW55IGRpZmZlcmVudCBzY3JpcHQgZmlsZXMgbWF5IGNvbnRhaW4gaW5kaXZpZHVhbCBjb250ZW50IGhhbmRsZXJzLiAgSWYgdGhlIG90aGVyIHBoYXNlcyBvZiByZXF1ZXN0IHByb2Nlc3Npbmcgd2VyZSBhbGxvd2VkIHRvIG9wZXJhdGUgdGhpcyB3YXkgdGhlIHJlcXVlc3QgcHJvY2VzcyB3b3VsZCBiZSBtdWNoIG1vcmUgY29tcGxleCwgYW5kIG1peGluZyBkaWZmZXJlbnQgZmlsZSB0eXBlcyB3aXRoIG1vZF90Y2wgc2NyaXB0cyB3b3VsZCBiZSBpbXBvc3NpYmxlLgorCitJbiBhZGRpdGlvbiB0byB0aGUgaG9vayBkaXJlY3RpdmVzIHRoZXJlIGFyZSBhbHNvIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBmb3IgcHJlIHNldHRpbmcgdmFyaWFibGVzIGluIHNjcmlwdHMuICBUaGUgVGNsX1ZhciBkaXJlY3RpdmUgaXMgdXNlZCB3aGVuIHdlIHdhbnQgdG8gc2V0IHNjYWxhciB2YXJpYWJsZXMgb3IgYXJyYXkgdmFyaWFibGVzLiBUY2xfTGlzdFZhciBpcyB1c2VkIHRvIGNyZWF0ZSBhIGxpc3QuCisKKzxEaXJlY3RvcnkgLz4KK8kKK1RjbF9WYXIgbXlfbnVtYmVyIDcKK1RjbF9WYXIgbXlfYXJyYXkgbXlfdmFsdWUxIDEwCitUY2xfVmFyIG15X2FycmF5IG15X3ZhbHVlMiAyMAorVGNsX0xpc3RWYXIgbXlfbGlzdCAxCitUY2xfTGlzdFZhciBteV9saXN0IDIKK1RjbF9MaXN0VmFyIG15X2xpc3QgMworyQorPC9EaXJlY3Rvcnk+CisKK0luIHRoZSBhYm92ZSBleGFtcGxlIG15X251bWJlciBpcyBhIHNjYWxhciB2YXJpYWJsZSB3aXRoIHZhbHVlIDcsIG15X2FycmF5IGlzIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggMiBlbGVtZW50cywgYW5kIG15X2xpc3QgaXMgYSBsaXN0IHdpdGggdmFsdWUgezEsMiwzfS4gIFZhcmlhYmxlcyBzZXQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFyZSBhdXRvbWF0aWNhbGx5IHNldCBpbiB0aGUgY2FsbGluZyBzY3JpcHRzIG5hbWVzcGFjZSwgc28gdGhlIFRjbCBrZXl3b3JkIHZhcmlhYmxlIHdpbGwgYmUgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGVzZSB2YXJpYWJsZXMuICBUaGVzZSB2YXJpYWJsZXMgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgb25jZSBpbiBhIGZpbGVzIG5hbWVzcGFjZS4gIElmIGNvZGUgd2l0aGluIG9uZSBvZiB0aGUgaGFuZGxlcnMgaXMgY2FsbGVkIGFuZCBtb2RpZmllcyB0aGUgdmFyaWFibGVzIHRoZW4gdGhleSB3aWxsIGJlIHBlcm1hbmVudGx5IG1vZGlmaWVkIHVudGlsIEFwYWNoZSBpcyByZXN0YXJ0ZWQuICBWYXJpYWJsZXMgd2lsbCByZW1haW4gcGVyc2lzdGVudCBpbiB0aGUgVGNsIGludGVycHJldGVyIGV2ZW4gaWYgYSBzY3JpcHQgaXMgcmVsb2FkZWQgYmVjYXVzZSBpdCB3YXMgbW9kaWZpZWQuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgY29uZmlndXJhdGlvbiBzZXR1cCBmb3IgdXNpbmcgbW9kX3RjbCBpbiBhIHZpcnR1YWwgaG9zdCBkaXJlY3RpdmUuCisKKzxWaXJ0dWFsSG9zdCAxMjcuMC4wLjE+CisgICAgU2VydmVyTmFtZSBhbnkuaG9zdAorCisgICAgRG9jdW1lbnRSb290ICIvYW55Lmhvc3QiCiAKICAgICA8RGlyZWN0b3J5IC8+CiAgICAgICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKICAgICAgICAgQWxsb3dPdmVycmlkZSBOb25lCiAgICAgPC9EaXJlY3Rvcnk+CiAKLSAgICA8RGlyZWN0b3J5IC9leHBvcnQvd2ViL2FscGhhLWRlY2F5LmNvbS9pbWFnZXM+Ci0gICAgICAgIFNldEhhbmRsZXIgZGVmYXVsdC1oYW5kbGVyCisgICAgPERpcmVjdG9yeSAvYW55Lmhvc3Q+CisjIGFsbG93IGZpbGVzIGVuZGluZyB3aXRoIHRoZSBleHRlbnN0aW9uIC50bSB0byB1c2UgbW9kX3RjbCBhcyBhIGNvbnRlbnQgaGFuZGxlcgorICAgICAgICBBZGRIYW5kbGVyIHRjbC1oYW5kbGVyIHRtCiAKLSAgICAgICAgT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzCi0KLSAgICAgICAgQWxsb3dPdmVycmlkZSBOb25lCi0KLSAgICAgICAgT3JkZXIgYWxsb3csZGVueQotICAgICAgICBBbGxvdyBmcm9tIGFsbAorICAgICAgICBUY2xfSG9va19IYW5kbGVyIGNvbnRlbnRfaGFuZGxlcgogICAgIDwvRGlyZWN0b3J5PgotCi0gICAgPERpcmVjdG9yeSAvZXhwb3J0L3dlYi9hbHBoYS1kZWNheS5jb20vZmlsZXM+Ci0gICAgICAgIFNldEhhbmRsZXIgZGVmYXVsdC1oYW5kbGVyCi0KLSAgICAgICAgT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzCi0KLSAgICAgICAgQWxsb3dPdmVycmlkZSBOb25lCi0KLSAgICAgICAgT3JkZXIgYWxsb3csZGVueQotICAgICAgICBBbGxvdyBmcm9tIGFsbAotICAgICA8L0RpcmVjdG9yeT4KIDwvVmlydHVhbEhvc3Q+CisKK1RoaXMgY29uZmlndXJhdGlvbiBleGFtcGxlIHdpbGwgYWxsb3cgYW55IG1peGVkIGZpbGVzIGluIHRoZSAvYW55Lmhvc3QgZGlyZWN0b3J5IGFuZCB3aWxsIGV4ZWN1dGUgYW55IHNjcmlwdCB3aXRoIGEgZmlsZW5hbWUgZW5kaW5nIGluIC50bSB0byBiZSBleGVjdXRlZCBieSBtb2RfdGNsLiAgVGhpcyBhbGxvd3MgdXMgdG8gbWl4IGh0bWwgYW5kIG1vZF90Y2wgc2NyaXB0cyB0b2dldGhlciBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisKK1dyaXRpbmcgbW9kX3RjbCBTY3JpcHRzCisKK09uY2UgY29uZmlndXJhdGlvbiBpcyBzZXQgdXAgd2UgYXJlIHJlYWR5IHRvIHN0YXJ0IHdyaXRpbmcgdGhlIGFjdHVhbCBtb2RfdGNsIHNjcmlwdCB0aGF0IHdpbGwgY29udGFpbiB0aGUgbmVjZXNzYXJ5IGhhbmRsZXJzLiAgVXNpbmcgdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gZXhhbXBsZSB3ZSB3aWxsIGFzc3VtZSB0aGF0IHdlIGFyZSBnb2luZyB0byB3cml0ZSBhIG1vZF90Y2wgc2NyaXB0IGNhbGxlZCBoZWxsby50bSBpbiB0aGUgL2FueS5ob3N0IGRpcmVjdG9yeS4KKworbmFtZXNwYWNlIGltcG9ydCAtZm9yY2UgOjphcGFjaGU6OioKKworcHJvYyBjb250ZW50X2hhbmRsZXIgeyB9IHsKKyAgICB2YXJpYWJsZSA6OmFwYWNoZTo6T0sKKworICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIKKworICAgIHJwdXRzINJoZWxsbyB3b3JsZC7TCisKKyAgICByZXR1cm4gJE9LCit9CisKK1doZW4gdGhpcyBzY3JpcHQgaXMgcnVuIGl0IHdpbGwgcHJpbnQgaGVsbG8gd29ybGQgaW4gdGhlIGNsaWVudHMgYnJvd3Nlci4gIFRoZXJlIGFyZSBzZXZlcmFsIGl0ZW1zIHRvIG5vdGUgaW4gdGhpcyBzY3JpcHQuICBPbmUgdGhlIGZpcnN0IGxpbmUgaXMgYSBuYW1lc3BhY2UgaW1wb3J0IG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIDo6YXBhY2hlIG5hbWVzcGFjZSBpbnRvIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHVzZSB0aGUgQXBhY2hlIEFQSSBmdW5jdGlvbnMgKGxpa2UgcnB1dHMpIHdpdGhvdXQgaGF2aW5nIHRvIHByZWZpeCA6OmFwYWNoZTo6LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBpbXBvcnQgdGhlIEFwYWNoZSBBUEkgbGlrZSB0aGlzIGJ1dCBpdCB3aWxsIG1ha2UgaXQgZWFzaWVyIGlmIHRoZSBBcGFjaGUgQVBJIGlzIHJlZmVyZW5jZWQgZnJlcXVlbnRseS4gIEV2ZW4gaWYgdGhlIEFwYWNoZSBBUEkgaXMgaW1wb3J0ZWQgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgdmFyaWFibGVzIGluIHByb2NlZHVyZXMgZnJvbSBvdGhlciBuYW1lc3BhY2VzIChsaWtlIDo6YXBhY2hlOjpPSykuICBUaGUgYXBfc2VuZF9odHRwX2hlYWRlciBmdW5jdGlvbiB3aWxsIHNlbmQgaHR0cCBoZWFkZXJzIHRvIHRoZSBjbGllbnQgYnJvd3NlciwgZXZlbiBpZiB3ZSBkb27VdCBkZWZpbmUgYW55IGhlYWRlcnMgQXBhY2hlIHdpbGwgc2VuZCBkZWZhdWx0IGhlYWRlcnMuICBUaGUgcnB1dHMgY29tbWFuZCBvcGVyYXRlcyBhbG1vc3QgaWRlbnRpY2FsbHkgdG8gdGhlIFRjbCBjb21tYW5kIHB1dHMsIGluc3RlYWQgb2Ygd3JpdGluZyB0byBhIGZpbGUgZGVzY3JpcHRvciBycHV0cyB3cml0ZXMgdG8gdGhlIGNsaWVudHMgYnJvd3Nlci4gIHJwdXRzIGNhbiBub3Qgd3JpdGUgdG8gZGlmZmVyZW50IGZpbGUgZGVzY3JpcHRvcnMuICBBZnRlciBldmVyeSBoYW5kbGVyIGlzIHJ1biBpdCBtdXN0IHJldHVybiB3aXRoIGEgdmFsdWUgdGhhdCBzaWduaWZpZXMgdGhlIG91dGNvbWUgb2YgdGhlIHJlcXVlc3QgcGhhc2UuICBUaGUgc2V2ZW4gbW9zdCBjb21tb24gcmV0dXJuIHZhbHVlcyBhcmU6IE9LLCBERUNMSU5FRCwgRE9ORSwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIEhUVFBfQkFEX1JFUVVFU1QsIEhUVFBfTU9WRURfVEVNUE9SQVJJTFksIGFuZCBIVFRQX05PVF9GT1VORC4KKworVGhlIEFwYWNoZSBBUEkgaW4gbW9kX3RjbAorCitOb3cgdGhhdCB3ZSB1bmRlcnN0YW5kIHRoZSBiYXNpY3Mgb2Ygd3JpdGluZyBhIG1vZF90Y2wgc2NyaXB0IHdlIGNhbiB0YWtlIHRoZSBuZXh0IHN0ZXAgYW5kIGV4cGxvcmUgdGhlIEFwYWNoZSBBUEkgaW4gbW9kX3RjbC4gIEFsbCBBcGFjaGUgQVBJIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIFRjbF9DcmVhdGVPYmpDb21tYW5kKCkgVGNsIEFQSSBmdW5jdGlvbiwgdGhpcyBpcyB3aHkgVGNsIDguMCBpcyByZXF1aXJlZC4gIFVzaW5nIFRjbCBvYmplY3RzIGluc3RlYWQgb2Ygc3RyaW5ncyBpbmNyZWFzZXMgdGhlIGVmZmljaWVuY3kgb2YgdGhlIHJlcXVlc3QgcGhhc2VzLiAgVGhlIEFwYWNoZSBBUEkgaW1wbGVtZW50YXRpb24gaW4gbW9kX3RjbCBjYW4gYmUgYnJva2VuIGRvbmUgYXMgZm9sbG93cy4gIEFsbCBBcGFjaGUgQVBJIHByb2NlZHVyZXMgYXJlIGRlY2xhcmVkIGluIHRoZSA6OmFwYWNoZSBuYW1lc3BhY2UuCisKK2h0dHBfY29yZS5oIFByb2NlZHVyZXMJCQorYXBfYWxsb3dfb3B0aW9ucwlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9hbGxvd19vdmVycmlkZXMJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG5vIGFyZ3VtZW50cworYXBfZGVmYXVsdF90eXBlCXJldHVybnMgc3RyaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cworYXBfZG9jdW1lbnRfcm9vdAlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKK2FwX2dldF9yZW1vdGVfaG9zdAlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBpbnRlZ2VyIGFyZ3VtZW50CithcF9nZXRfcmVtb3RlX2xvZ25hbWUJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9jb25zdHJ1Y3RfdXJsCXJldHVybnMgc3RyaW5nCXJlcXVpcmVzIHVyaSBzdHJpbmcgYXJndW1lbnQKK2FwX2dldF9zZXJ2ZXJfbmFtZQlyZXR1cm5zIHN0cmluZ3MJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9nZXRfc2VydmVyX3BvcnQJcmV0dXJucyBpbnRlZ2VyCXJlcXVpcmVzIG5vIGFyZ3VtZW50cworYXBfZ2V0X2xpbWl0X3JlcV9ib2R5CXJldHVybnMgbG9uZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKK2FwX2dldF9saW1pdF94bWxfYm9keQlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9jdXN0b21fcmVzcG9uc2UJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIGludGVnZXIgYW5kIHN0cmluZyBhcmd1bWVudHMKK2FwX2V4aXN0c19jb25maWdfZGVmaW5lCXJldHVybnMgaW50ZWdlcglyZXF1aXJlcyBzdHJpbmcgYXJndW1lbnQKK2FwX2F1dGhfdHlwZQlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKK2FwX2F1dGhfbmFtZQlyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKK2FwX3NhdGlzZmllcwlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9yZXF1aXJlcwlyZXR1cm5zIGxpc3QJcmVxdWlyZXMgbm8gYXJndW1lbnRzCitodHRwX2xvZy5oIFByb2NlZHVyZXMJCQorYXBfbG9nX2Vycm9yCXJldHVybnMgbm90aGluZ3MJcmVxdWlyZXMgbGV2ZWwgaW50ZWdlcjsgc3RhdHVzIGludGVnZXIgYW5kIGxvZyBzdHJpbmcgYXJndW1lbnRzCitodHRwX3Byb3RvY29sLmggUHJvY2VkdXJlcwkJCithcF9zZW5kX2h0dHBfaGVhZGVyCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKK2FwX3NlbmRfaHR0cF90cmFjZQlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9zZW5kX2h0dHBfb3B0aW9ucwlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyBubyBhcmd1bWVudHMKK2FwX3NlbmRfZXJyb3JfcmVzcG9uc2UJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIHJlY3Vyc2l2ZSBlcnJvciBpbnRlZ2VyCithcF9zZXRfY29udGVudF9sZW5ndGgJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIGxlbmd0aCBpbnRlZ2VyCithcF9zZXRfa2VlcGFsaXZlCXJldHVybnMgaW50ZWdlcglyZXF1aXJlcyBubyBhcmd1bWVudHMKK2FwX3JhdGlvbmFsaXplX210aW1lCXJldHVybnMgaW50ZWdlcglyZXF1aXJlcyBtdGltZSBpbnRlZ2VyCithcF9tYWtlX2V0YWcJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgZm9yY2Vfd2VhayBpbnRlZ2VyCithcF9zZXRfZXRhZwlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9zZXRfbGFzdF9tb2RpZmllZAlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9tZWV0c19jb25kaXRpb25zCXJldHVybnMgaW50ZWdlcglyZXF1aXJlIG5vIGFyZ3VtZW50cworYXBfcnB1dHMJcmV0dXJucyBub3RoaW5nCWFjY2VwdHMg0G5vbmV3bGluZSBvcHRpb247IHJlcXVpcmVzIHN0cmluZworYXBfcndyaXRlCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyBkYXRhCithcF9yZmx1c2gJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cworYXBfZ2V0X3N0YXR1c19saW5lCXJldHVybnMgc3RyaW5nCXJlcXVpcmVzIHN0YXR1cyBpbnRnZXIKK2FwX3NldHVwX2NsaWVudF9ibG9jawlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgcmVhZCBwb2xpY3kgaW50ZWdlcgorYXBfZ2V0X2NsaWVudF9ibG9jawlyZXR1cm5zIGludGVnZXIgYW5kIHNldHMgdmFyaWFibGUgUiB0byByZXR1cm5lZCBkYXRhCXJlcXVpcmVzIGJ1ZnNpeiBpbnRlZ2VyCithcF9kaXNjYXJkX3JlcXVlc3RfYm9keQlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9ub3RlX2F1dGhfZmFpbHVyZQlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZQlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9ub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cworYXBfZ2V0X2Jhc2ljX2F1dGhfcHcJcmV0dXJucyBpbnRlZ2VyIGFuZCBzZXRzIHZhcmlhYmxlIFIgdG8gc3RyaW5nCXJlcXVpcmVzIG5vIGFyZ3VtZW50cworYXBfcGFyc2VfdXJpCXJldHVybnMgbm90aGluZwlyZXF1aXJlcyB1cmkgc3RyaW5nCithcF9tZXRob2RfbnVtYmVyX29mCXJldHVybnMgaW50ZWdlcglyZXF1aXJlcyBtZXRob2Qgc3RyaW5nCithcF9tZXRob2RfbmFtZV9vZglyZXR1cm5zIHN0cmluZwlyZXF1aXJlcyBtZXRob2QgaW50ZWdlcgoraHR0cF9yZXF1ZXN0LmgJCQorYXBfaW50ZXJuYWxfcmVkaXJlY3QJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIHVyaSBzdHJpbmcKK2FwX2ludGVybmFsX3JlZGlyZWN0X2hhbmRsZXIJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIHVyaSBzdHJpbmcKK2FwX3NvbWVfYXV0aF9yZXF1aXJlZAlyZXR1cm5zIGludGVnZXIJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF91cGRhdGVfbXRpbWUJcmV0dXJucyBub3RoaW5nCXJlcXVpcmVzIGRlcGVuZGVuY3kgbXRpbWUgaW50ZWdlcgorYXBfYWxsb3dfbWV0aG9kcwlyZXR1cm5zIG5vdGhpbmcJcmVxdWlyZXMgcmVzZXQgaW50Z2VyIGFuZCBtZXRob2RzIHN0cmluZworaHR0cGQuaAkJCithcF9nZXRfc2VydmVyX3ZlcnNpb24JcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCithcF9hZGRfdmVyc2lvbl9jb21wb25lbnQJcmV0dXJucyBubyBhcmd1bWVudHMJcmVxdWlyZXMgdmVyc2lvbiBzdHJpbmcKK2FwX2dldF9zZXJ2ZXJfYnVpbHQJcmV0dXJucyBzdHJpbmcJcmVxdWlyZXMgbm8gYXJndW1lbnRzCit1dGlsX3NjcmlwdC5oCQkKK2FwX2NyZWF0ZV9lbnZpcm9ubWVudAlyZXR1cm5zIG5vdGhpbmcgYW5kIHNldHMgdmFyaWFibGUgZW52CXJlcXVpcmVzIG5vIGFyZ3VtZW50cworCitUaGVyZSBhcmUgYWxzbyBzb21lIHV0aWxpdHkgcHJvY2VkdXJlcyBkZWZpbmVkIGZvciBpbnRlcmFjdGluZyB3aXRoIGxhcmdlIG91dHB1dCwgcmVhZGluZyBQT1NUIHJlcXVlc3RzLCBhbmQgcmVhZGluZyBhbmQgc2V0dGluZyB2YXJpYWJsZXMgaW4gQXBhY2hlIHJlcXVlc3RfcmVjIHN0cnVjdHVyZXMuICBUaGUgZmlyc3QgdXRpbGl0eSBmdW5jdGlvbiBpcyBhYm9ydC4gIFRoZSBhYm9ydCBwcm9jZWR1cmUgYWNjZXB0cyBhIHN0cmluZyBhcmd1bWVudCB3aGljaCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSwgYWJvcnQgcmV0dXJucyBub3RoaW5nIGFuZCB3aWxsIGltbWVkaWF0ZWx5IGFib3J0IHByb2Nlc3Npbmcgb2YgdGhlIGhhbmRsZXIgYW5kIHJldHVybiBhIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLiAgVGhlIHJlYWRfcG9zdCBwcm9jZWR1cmUgd2lsbCByZWFkIFBPU1QgcmVxdWVzdHMsIGl0IGFjY2VwdHMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIG5vdGhpbmcuICByZWFkX3Bvc3Qgd2lsbCBzZXQgYW4gYXJyYXkgbmFtZWQgcHJhbSBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIHdpdGggYWxsIHRoZSByZWFkIGRhdGEgZnJvbSB0aGUgUE9TVC4gIFRoZXJlIGlzIGFsc28gYSBzcGVjaWFsIHByb2NlZHVyZSBjYWxsZWQgb3V0cHV0IHdoaWNoIGhlbHBzIHdyaXRlIGxhcmdlIGFtb3VudHMgb2YgZGF0YSB0byBhIGNsaWVudC4gIFRoZSBvdXRwdXQgcHJvY2VkdXJlIGVzc2VudGlhbGx5IGNhbGxzIHJwdXRzIGZvciBlYWNoIGxpbmUsIG11bHRpcGxlIGxpbmVzIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBjdXJseSBicmFjZXMgKGxpa2UgdGhpczogb3V0cHV0IHsgySB9KS4gIFRoZSBuZXh0IHR3byBwcm9jZWR1cmVzIHJlYWQgYW5kIHdyaXRlIHZhcmlhYmxlcyB0byB0aGUgcmVxdWVzdF9yZWMgc3RydWN0dXJlIGluIHRoZSBBcGFjaGUgQVBJLiAgVG8gcmVhZCByZXF1ZXN0X3JlYyB2YXJpYWJsZXMgd2UgdXNlIHRoZSBjb21tYW5kIHIsIHRvIHNldCByZXF1ZXN0X3JlYyB2YXJpYWJsZXMgd2UgdXNlIHRoZSBjb21tYW5kIHJfc2V0LiAgQWxsIHZhcmlhYmxlcyBhcmUgcmVhZGFibGUgYnV0IG5vdCBhbGwgdmFyaWFibGVzIGFyZSB3cml0YWJsZS4KKworciBQcm9jZWR1cmUgQXJndW1lbnRzCithbGxvd2VkCVJldHVybnMgaW50ZWdlcglSZXF1aXJlcyA2NC1iaXQgaW50ZWdlcgorYWxsb3dlZF9tZXRob2RzCVJldHVybnMgbGlzdCBvZiBzdHJpbmdzCVJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncworYWxsb3dlZF94bWV0aG9kcwlSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncwlSZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MKK2FwX2F1dGhfdHlwZQlSZXR1cm5zIHN0cmluZwlSZXF1aXJlcyBzdHJpbmcKK2FyZ3MJUmV0dXJucyBzdHJpbmcJUmVxdWlyZXMgc3RyaW5nIAorYXNzYmFja3dhcmRzCVJldHVybnMgaW50ZWdlcglSZXF1aXJlcyBpbnRlZ2VyIAorYm91bmRhcnkJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCitieXRlc19zZW50CVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2NodW5rZWQJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQorY2xlbmd0aAlSZXR1cm5zIGxvbmcgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2NvbnRlbnRfZW5jb2RpbmcJUmV0dXJucyBzdHJpbmcJUmVxdWlyZXMgc3RyaW5nCitjb250ZW50X3R5cGUJUmV0dXJucyBzdHJpbmcJUmVxdWlyZXMgc3RyaW5nIAorZXJyX2hlYWRlcnNfb3V0CVJldHVybnMgbGlzdCBvZiBzdHJpbmdzIGFuZCBzZXRzIGVycl9oZWFkZXJzX291dCBhcnJheQlSZXF1aXJlcyBoZWFkZXIgbmFtZSBhbmQgdmFsdWUgc3RyaW5nCitleHBlY3RpbmdfMTAwCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2ZpbGVuYW1lCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZworaGFuZGxlcglSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKK2hlYWRlcnNfaW4JUmV0dXJucyBsaXN0IG9mIHN0cmluZ3MgYW5kIHNldHMgaGVhZGVyc19pbiBhcnJheQlOb3Qgd3JpdGFibGUKK2hlYWRlcnNfb3V0CVJldHVybnMgbGlzdCBvZiBzdHJpbmdzIGFuZCBzZXRzIGhlYWRlcnNfb3V0IGFycmF5CVJlcXVpcmVzIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSBzdHJpbmcgCitoZWFkZXJfb25seQlSZXR1cm5zIGludGVnZXIJUmVxdWlyZXMgaW50ZWdlciAKK2hvc3RuYW1lCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQorbWV0aG9kCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQorbWV0aG9kX251bWJlcglSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCittdGltZQlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCitub3RlcwlSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgc2V0cyBub3RlcyBhcnJheQlSZXF1aXJlcyBub3RlIG5hbWUgYW5kIHZhbHVlIHN0cmluZworbm9fY2FjaGUJUmV0dXJucyBpbnRlZ2VyCVJlcXVpcmVzIGludGVnZXIKK25vX2xvY2FsX2NvcHkJUmV0dXJucyBpbnRlZ2VyCVJlcXVpcmVzIGludGVnZXIgCitwYXJzZWRfdXJpCVJldHVybnMgbGlzdCBvZiBzdHJpbmdzCVJlcXVpcmVzIHN0cmluZworcGF0aF9pbmZvCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZworcHJvdG9jb2wJUmV0dXJucyBzdHJpbmcJUmVxdWlyZXMgc3RyaW5nCitwcm90b19udW0JUmV0dXJucyBpbnRlZ2VyCVJlcXVpcmVzIGludGVnZXIKK3Byb3h5cmVxCVJldHVybnMgaW50ZWdlcglSZXF1aXJlcyBpbnRlZ2VyCityYW5nZQlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKK3JlYWRfYm9keQlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCityZWFkX2NodW5rZWQJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQorcmVhZF9sZW5ndGgJUmV0dXJucyBsb25nIGludGVnZXIJTm90IHdyaXRhYmxlCityZW1haW5pbmcJUmV0dXJucyBsb25nIGludGVnZXIJTm90IHdyaXRhYmxlCityZXF1ZXN0X3RpbWUJUmV0dXJucyBsb25nIGludGVnZXIJTm90IHdyaXRhYmxlCitzZW50X2JvZHljdAlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCitzdGF0dXMJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQorc3RhdHVzX2xpbmUJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCitzdWJwcm9jZXNzX2VudglSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgc2V0cyBzdWJwcm9jZXNzX2VudiBhcnJheQlSZXF1aXJlcyBuYW1lIGFuZCB2YWx1ZSBzdHJpbmcKK3RoZV9yZXF1ZXN0CVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZyAKK3VucGFyc2VkX3VyaQlSZXR1cm5zIHN0cmluZwlSZXF1aXJlcyBzdHJpbmcKK3VyaQlSZXR1cm5zIHN0cmluZwlSZXF1aXJlcyBzdHJpbmcgCit1c2VyCVJldHVybnMgc3RyaW5nCVJlcXVpcmVzIHN0cmluZyAKK3ZsaXN0X3ZhbGlkYXRvcglSZXR1cm5zIHN0cmluZwlSZXF1aXJlcyBzdHJpbmcKKworciBjb25uZWN0aW9uIFByb2NlZHVyZSBBcmd1bWVudHMKK3JlbW90ZV9pcAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKK3JlbW90ZV9ob3N0CVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQorcmVtb3RlX2xvZ25hbWUJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCithYm9ydGVkCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2tlZXBhbGl2ZQlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCitkb3VibGVyZXZlcnNlCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2tlZXBhbGl2ZXMJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQorbG9jYWxfaXAJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCitsb2NhbF9ob3N0CVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQoraWQJUmV0dXJucyBzdHJpbmcJTm90IHdyaXRhYmxlCitub3RlcwlSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgc2V0cyBjb25uZWN0aW9uX25vdGVzIGFycmF5CVJlcXVpcmVzIG5vdGUgbmFtZSBhbmQgdmFsdWUgc3RyaW5nCisKK3Igc2VydmVyIFByb2NlZHVyZSBBcmd1bWVudHMKK2RlZm5fbmFtZQlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKK2RlZm5fbGluZV9udW1iZXIJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQorc2VydmVyX2FkbWluCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQorc2VydmVyX2hvc3RuYW1lCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQorcG9ydAlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCitlcnJvcl9mbmFtZQlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKK2xvZ2xldmVsCVJldHVybnMgc3RyaW5nCU5vdCB3cml0YWJsZQoraXNfdmlydHVhbAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKK2FkZHJzCVJldHVybnMgbGlzdAlOb3Qgd3JpdGFibGUKK3RpbWVvdXQJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQora2VlcF9hbGl2ZV90aW1lb3V0CVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2tlZXBfYWxpdmVfbWF4CVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2tlZXBfYWxpdmUJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQorcGF0aAlSZXR1cm5zIHN0cmluZwlOb3Qgd3JpdGFibGUKK25hbWVzCVJldHVybnMgbGlzdCBvZiBzdHJpbmdzCU5vdCB3cml0YWJsZQord2lsZF9uYW1lcwlSZXR1cm5zIGxpc3Qgb2Ygc3RyaW5ncwlOb3Qgd3JpdGFibGUKK2xpbWl0X3JlcV9saW5lCVJldHVybnMgaW50ZWdlcglOb3Qgd3JpdGFibGUKK2xpbWl0X3JlcV9maWVsZHNpemUJUmV0dXJucyBpbnRlZ2VyCU5vdCB3cml0YWJsZQorbGltaXRfcmVxX2ZpZWxkcwlSZXR1cm5zIGludGVnZXIJTm90IHdyaXRhYmxlCisKK1RoZSBmb2xsb3dpbmcgc2NyaXB0IHdpbGwgaWxsdXN0cmF0ZSBwb3J0aW9ucyBvZiBtb2RfdGNsIHRoYXQgd2lsbCBiZSBtb3N0IGNvbW1vbmx5IHVzZWQuICBUaGlzIGZpbGUgaXMgY2FsbGVkIGV4YW1wbGUudG0uCisKK3Byb2MgY29udGVudF9oYW5kbGVyIHsgfSB7CisgICAgICAgIHZhcmlhYmxlIHByYW0KKyAgICAgICAgdmFyaWFibGUgZW52CisgICAgICAgIHZhcmlhYmxlIDo6YXBhY2hlOjpPSworICAgICAgICB2YXJpYWJsZSA6OmFwYWNoZTo6TV9QT1NUCisKKyAgICAgICAgaWYgeyBbciBtZXRob2RfbnVtYmVyXSA9PSAkTV9QT1NUIH0geworICAgICAgICAgICAgICAgIHJlYWRfcG9zdAorICAgICAgICB9CisKKyAgICAgICAgcl9zZXQgY29udGVudF90eXBlICJ0ZXh0L2h0bWwiCisKKyAgICAgICAgYXBfY3JlYXRlX2Vudmlyb25tZW50CisgICAgICAgIAorICAgICAgICBzZXQgZW52X2xpc3QgW2FycmF5IG5hbWVzIGVudl0KKyAgICAgICAgc2V0IHBybV9saXN0IFthcnJheSBuYW1lcyBwcmFtXQorCisgICAgICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIKKyAgICAgICAgCisgICAgICAgIHJwdXRzICI8SFI+PEI+RW52aXJvbm1lbnQ8L0I+PEJSPjxCUj4iCisgICAgICAgIAorICAgICAgICBmb3JlYWNoIGkgJGVudl9saXN0IHsKKyAgICAgICAgICAgICAgICBycHV0cyAiJGk9JGVudigkaSk8QlI+IgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBycHV0cyAiPEhSPjxCPlBvc3RlZCBWYXJpYWJsZXM8L0I+PEJSPjxCUj4iCisgICAgICAgIAorICAgICAgICBmb3JlYWNoIGkgJHBybV9saXN0IHsKKyAgICAgICAgICAgICAgICBycHV0cyAiJGk9JHByYW0oJGkpPEJSPiIKKyAgICAgICAgfQorCisgICAgICAgIHJwdXRzICI8SFI+IgorCisgICAgICAgIG91dHB1dCB7CisgICAgICAgICAgICAgICAgPENFTlRFUj4KKyAgICAgICAgICAgICAgICA8Rk9STSBNRVRIT0Q9UE9TVCBBQ1RJT049W3IgdXJpXT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJTlBVVCBUWVBFPXRleHQgTkFNRT11c2VyX2lucHV0PgorICAgICAgICAgICAgICAgICAgICAgICAgPElOUFVUIFRZUEU9c3VibWl0PgorICAgICAgICAgICAgICAgIDwvRk9STT4KKyAgICAgICAgICAgICAgICA8QlI+CisgICAgICAgICAgICAgICAgW2FwX2dldF9zZXJ2ZXJfdmVyc2lvbl0sIFthcF9nZXRfc2VydmVyX2J1aWx0XQorICAgICAgICAgICAgICAgIDwvQ0VOVEVSPgorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRPSworfQorCitMb29raW5nIGF0IHRoaXMgc2NyaXB0IHdlIHNlZSB0aGF0IHRoZSBbciBtZXRob2RfbnVtYmVyXSBmdW5jdGlvbiBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIHR5cGUgb2YgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQuICBNX1BPU1QgaXMgYW4gQXBhY2hlIEFQSSBjb25zdGFudCB0aGF0IHNwZWNpZmllcyBhIHJlcXVlc3QgYXMgYW4gaHR0cCBQT1NUIHJlcXVlc3QgdHlwZS4gIFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIHJlcXVlc3QgdHlwZXMgZGVmaW5lZCBpbiB0aGUgQXBhY2hlIEFQSSBhbHNvLCB0aGUgb3RoZXIgbW9zdCB1c2VmdWwgb25lIHdpbGwgYmUgTV9HRVQuICBJZiB0aGUgcmVxdWVzdCBwcm9jZXNzZWQgaW4gdGhlIGV4YW1wbGUudG0gc2NyaXB0IGlzIGEgUE9TVCB0aGVuIHdlIG1ha2UgYSBjYWxsIHRvIHJlYWRfcG9zdCB0byBwYXJzZSB0aGUgUE9TVCBkYXRhIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgYXJyYXkgcHJhbS4gIE5leHQgd2UgaW5pdGlhbGl6ZSB0aGUgZW52aXJvbm1lbnQgd2l0aCBhIGNhbGwgdG8gW2FwX2NyZWF0ZV9lbnZpcm9ubWVudF0sIHRoaXMgd2lsbCBzZXQgdXAgdGhlIGVudiBhcnJheSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcy4gIE5vdGljZSB0aGF0IEFwYWNoZSB3aWxsIGFkZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBjb3JyZXNwb25kIHRvIENHSSBwYXJhbWV0ZXJzLCB0aGlzIGlzIHVzZWZ1bCBmb3IgZW11bGF0aW5nIENHSSBmdW5jdGlvbmFsaXR5IGFuZCBhbGxvd3MgcG9ydGluZyBvZiBDR0kgc2NyaXB0cyB0byBiZSBtb3JlIGZsZXhpYmxlLiAgVGhlIGNvbnRlbnRfaGFuZGxlciBpbiBleGFtcGxlLnRtIHdpbGwgZXNzZW50aWFsbHkgcHJpbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBhbnkgcHJhbSB2YXJpYWJsZXMgdGhhdCB3ZXJlIHNldCBmcm9tIGEgUE9TVCByZXF1ZXN0LiAgVGhlIHJlbWFpbmRlciBvZiB0aGUgc2NyaXB0IHVzZXMgdGhlIHByb3ZpZGVkIG91dHB1dCBwcm9jZWR1cmUgdG8gc2VuZCBhIGJsb2NrIG9mIEhUTUwgdG8gdGhlIGNsaWVudCwgbm90aWNlIHRoYXQgcHJvY2VkdXJlIGNhbGxzIGluIG91dHB1dCB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQuCisKK0FkZGl0aW9uYWwgUmVzb3VyY2VzCisKK01vZF90Y2wgaXMgcGFydCBvZiB0aGUgVGNsIEFwYWNoZSBQcm9qZWN0IGxvY2F0ZWQgYXQgaHR0cDovL3RjbC5hcGFjaGUub3JnLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRjbCBBcGFjaGUgUHJvamVjdCBhbmQgb3RoZXIgQXBhY2hlIG1vZHVsZXMgdXNpbmcgVGNsIGNhbiBiZSBmb3VuZCBoZXJlLiAgSW5mb3JtYXRpb24gb24gZ2VuZXJhbCBUY2wgdG9waWNzIGFuZCBkZXZlbG9wbWVudCBpcyBsb2NhdGVkIGF0IGh0dHA6Ly93d3cudGNsLnRrLgpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKaW5kZXggMjljZTNjNS4uZWQzYzQ5ZCAxMDA2NDQKLS0tIGEvTkVXUworKysgYi9ORVdTCkBAIC0xLDMgKzEsMTkgQEAKK1RISVMgRklMRSBXSUxMIE5PIExPTkdFUiBCRSBVU0VELiAgU2VlIGBJTlNUQUxMJyBpbnN0ZWFkLgorCisxLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxLiBzdXBwb3J0cyBBcGFjaGUgMi4wLjQwCisyLiBmaXJzdCByZWxlYXNlIG9mIG1vZF90Y2wgMS4wLCBJJ3ZlIGJlZW4gcnVubmluZyB0aGlzIGZvciBtb250aHMgc3RhYmxlIG5vIGVycm9ycyBpbiBlcnJvcl9sb2cuCisgICBJIGRvbid0IHRoaW5rIGFsbCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBpcyBjb21wbGV0ZSBidXQgaXQncyBkZWNlbnRseSBicm9hZC4gIFNvbWUgdGhpbmdzIGFyZQorICAgbWlzc2luZyBsaWtlIHRoZSBib3VuZGFyeSBpbiB0aGUgcmVxdWVzdF9yZWMsIGJlY2F1c2UgaXQgZG9lc24ndCBleGlzdCBpbiBBcGFjaGUgYW55bW9yZS4uLgorMy4gSSByZWNvbW1lbmQgdXNpbmcgVGNsIDguNCBzaW5jZSBpdCBzdXBwb3J0cyBXaWRlSW50ICg2NC1iaXQpIGludGVnZXJzLgorNC4gUnVucyBvbiBTb2xhcmlzIDkgc3BhcmN2OSBBQkkgd2hpY2ggaXMgdGhlIDY0LWJpdCBBQkksIEkgYXNzdW1lIGl0IHdpbGwgcnVuIG9uIG90aGVycyBhcyB3ZWxsLgorICAgKHVzZWQgZ2NjIDMuMS4xIHdpdGggLW02NCkKKzUuIFlvdSBjYW4gdXNlIC0td2l0aC10Y2xkaXI9cGF0aF90b190Y2xDb25maWcuc2ggaW4gLi9jb25maWd1cmUKKzYuIC4vY29uZmlndXJlIGFsc28gYWRkcyAtUjx0Y2xfbGlicmFyeV9wYXRoPiB0byBsaW5rZXIgcGhhc2UuICBKdXN0IGluIGNhc2UgeW91IGRvbid0IGhhdmUKKyAgIC91c3IvbG9jYWwvbGliIHNldHVwIGFzIGRlZmF1bHQuCisKKwogQ2hhbmdlcyBpbiAxLjBkOC0yMDAxMTEyOTAwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLSBTb21lIHN0cnVjdHVyZXMgY2hhbmdlZCBpbiBBcGFjaGUgMi4wLjI4LCBub3RlYWJseSBpbiB0aGUgY29ubmVjdGlvbiByZWNvcmQsCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggMWRlZjhiZC4uNzgyMDEwMiAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSwxMyArMSwxNCBAQAogVGVzdGVkIFBsYXRmb3JtcwogLS0tLS0tLS0tLS0tLS0tLQogCi1TdW5PUy01LjgvZ2NjLTMuMC40L3RjbC04LjRhNC9BcGFjaGUtMi4wLjM1CitTdW5PUy01LjgvZ2NjLTMuMC4yL3RjbC04LjMuNC9BcGFjaGUtMi4wLjI4CitTdW5PUy01LjgvZ2NjLTMuMC40L3RjbC04LjRiMS9BcGFjaGUtMi4wLjM5CitTdW5PUy01LjkvZ2NjLTMuMS4xL3RjbC04LjRiMS9BcGFjaGUtMi4wLjQwCiAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotQXMgdGhpcyBtb2R1bGUgaXMgc3RpbGwgaW4gZGV2ZWxvcG1lbnQgdGhlcmUgaXMgbm8gZW5kIHVzZXIgZG9jdW1lbnRhdGlvbi4KLVRoZSBzb3VyY2UgZmlsZSBicmVha3MgZG93biBsaWtlIHRoaXM6CitTZWUgdGhlIElOU1RBTEwgZmlsZS4KIAogdGNsX2NvcmUuYzoKICAgY29yZSByb3V0aW5lcywgaGFuZGxlcnMsIGNvbmZpZ3VyYXRpb24sIGluaXRpYWxpemF0aW9uCmRpZmYgLS1naXQgYS9jb25maWcubTQgYi9jb25maWcubTQKaW5kZXggNmNjODBhNi4uYzhiNDI1NSAxMDA2NDQKLS0tIGEvY29uZmlnLm00CisrKyBiL2NvbmZpZy5tNApAQCAtNyw4ICs3LDIyIEBACiBpZiB0ZXN0ICIkZW5hYmxlX3RjbCIgIT0gIm5vIjsgdGhlbgogCUFDX0NIRUNLX0hFQURFUlModGNsLmggaW50dHlwZXMuaCBpbnRfdHlwZXMuaCBzeXMvbW1hbi5oKQogCUFDX0NIRUNLX0ZVTkNTKGFzcHJpbnRmIG1tYXApCi0KLQlkaXJzPSIvdXNyL2xvY2FsL2xpYiAvdXNyL2xpYiIKKwkKKwlBQ19BUkdfV0lUSCh0Y2xkaXIsIAorCQlBUEFDSEVfSEVMUF9TVFJJTkcoLS13aXRoLXRjbGRpcj1ESVIsIFRjbCBjb25maWcgdGNsQ29uZmlnLnNoKSwgCisJCVsKKwkJCWRpcnM9JHdpdGh2YWwKKwkJCQorCQkJaWYgLXogJGRpcnM7IHRoZW4KKwkJCQlkaXJzPSIvdXNyL2xvY2FsL2xpYiAvdXNyL2xpYiIKKwkJCWZpCisJCQkKKwkJCUFDX01TR19SRVNVTFQodXNpbmcgYCRkaXJzJyB0byBzZWFyY2ggZm9yIHRjbENvbmZpZy5zaCkKKwkJXSwKKwkJWwkKKwkJCWRpcnM9Ii91c3IvbG9jYWwvbGliIC91c3IvbGliIgorCQkJQUNfTVNHX1JFU1VMVCh1c2luZyBgJGRpcnMnIHRvIHNlYXJjaCBmb3IgdGNsQ29uZmlnLnNoKQorCQldKQogCiAJZm91bmQ9MAogCkBAIC00MCw3ICs1NCw3IEBACiAJICAgIEFDX01TR19FUlJPUigidGNsIDguMCBvciBsYXRlciBuZWVkZWQiKQogCWZpCiAKLQlMSUJTPSIkTElCUyAtTCR0bm1fY3ZfcGF0aF90Y2xfY29uZmlnIC1sdGNsJFRDTF9WRVJTSU9OIgorCUxJQlM9IiRMSUJTIC1MJHRubV9jdl9wYXRoX3RjbF9jb25maWcgLVIkdG5tX2N2X3BhdGhfdGNsX2NvbmZpZyAtbHRjbCRUQ0xfVkVSU0lPTiIKIAlJTkNMVURFUz0iJElOQ0xVREVTIC1JJFRDTF9QUkVGSVgvaW5jbHVkZSIKIAlMREZMQUdTPSIkTERGTEFHUyAkVENMX0xEX0ZMQUdTIgogZmkKZGlmZiAtLWdpdCBhL21vZF90Y2wuaCBiL21vZF90Y2wuaAppbmRleCA0NjFiNjc4Li5jNDc5ZjM0IDEwMDY0NAotLS0gYS9tb2RfdGNsLmgKKysrIGIvbW9kX3RjbC5oCkBAIC02Miw2ICs2Miw3IEBACiAjaW5jbHVkZSAiYXByLmgiCiAjaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKICNpbmNsdWRlICJhcHJfbGliLmgiCisjaW5jbHVkZSAiYXByX3VyaS5oIgogCiAjaW5jbHVkZSAiYXBfY29uZmlnLmgiCiAjaW5jbHVkZSAiaHR0cGQuaCIKQEAgLTcyLDggKzczLDYgQEAKICNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCiAjaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCiAjaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLS8vI2luY2x1ZGUgInV0aWxfdXJpLmgiCi0jaW5jbHVkZSAiYXByX3VyaS5oIgogCiAjaW5jbHVkZSAiYXBfY29uZmlnX2F1dG8uaCIKIApkaWZmIC0tZ2l0IGEvdGNsX2NtZHMuYyBiL3RjbF9jbWRzLmMKaW5kZXggYWRiMjIzNi4uMzhlNmU5YyAxMDA2NDQKLS0tIGEvdGNsX2NtZHMuYworKysgYi90Y2xfY21kcy5jCkBAIC0xNTEsNyArMTUxLDYgQEAKIAkJb3V0W2orK10gPSAnPSc7CiAJCWJyZWFrOwogCSAgZGVmYXVsdDoKLQkJLy8gc29tZXRoaW5nIHdvbmtleSBoYXBwZW5lZC4uLgogCQlicmVhazsKIAl9CiAKQEAgLTI3NSwxOCArMjc0LDEyIEBACiAJCWNoYXIgYnVmW0hVR0VfU1RSSU5HX0xFTl07CiAJCWludCBsZW5fcmVhZDsKIAkJCi0vLwkJYXBfaGFyZF90aW1lb3V0KCJyZWFkX3Bvc3RfZGF0YSIsIHIpOwotCQkKIAkJd2hpbGUgKChsZW5fcmVhZCA9IGFwX2dldF9jbGllbnRfYmxvY2sociwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkgewotLy8JCQlhcF9yZXNldF90aW1lb3V0KHIpOwotCQkJCiAJCQltZW1jcHkobGJ1ZiArIGxwb3MsIGJ1ZiwgbGVuX3JlYWQpOwogCQkJbHBvcyArPSBsZW5fcmVhZDsKIAkJfQogCQkKIAkJbGJ1ZltscG9zXSA9ICdcMCc7Ci0JCQotLy8JCWFwX2tpbGxfdGltZW91dChyKTsKIAl9CiAJCiAJcHRyID0gc3Ryc3RyKGxidWYsIGJvdW5kYXJ5KTsKQEAgLTQxNywxMSArNDEwLDcgQEAKIAkJCiAJCXJidWYgPSAoY2hhciopIGFwcl9wY2FsbG9jKHItPnBvb2wsIGxlbmd0aCArIDEpOwogCQkKLS8vCQlhcF9oYXJkX3RpbWVvdXQoInJlYWRfcG9zdCIsIHIpOwotCQkKIAkJd2hpbGUgKChsZW5fcmVhZCA9IGFwX2dldF9jbGllbnRfYmxvY2sociwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkgewotLy8JCQlhcF9yZXNldF90aW1lb3V0KHIpOwotCQkJCiAJCQlpZiAoKHJwb3MgKyBsZW5fcmVhZCkgPiBsZW5ndGgpIHsKIAkJCQlyc2l6ZSA9IGxlbmd0aCAtIHJwb3M7CiAJCQl9CkBAIC00MzIsMTIgKzQyMSw4IEBACiAJCQltZW1jcHkocmJ1ZiArIHJwb3MsIGJ1ZiwgcnNpemUpOwogCQkJcnBvcyArPSByc2l6ZTsKIAkJfQotCQkKLS8vCQlhcF9raWxsX3RpbWVvdXQocik7CiAJfQogCQotLy8JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLT5zZXJ2ZXIsIDAsICJyZWFkX3Bvc3QoLi4uKTogJXUsIHJidWYgPSAlcyIsIGdldHBpZCgpLCByYnVmKTsKLQkKIAl3aGlsZSAocmJ1ZiAmJiAqcmJ1ZiAmJiAodmFsID0gYXBfZ2V0d29yZChyLT5wb29sLCAoY29uc3QgY2hhcioqKSAmcmJ1ZiwgJyYnKSkpIHsKIAkJa2V5ID0gYXBfZ2V0d29yZChyLT5wb29sLCAmdmFsLCAnPScpOwogCQkKQEAgLTU5OCw3ICs1ODMsOCBAQAogCiBzdGF0aWMgVGNsX09iaiogcl9ib3VuZGFyeSh2b2lkKQogewotCXJldHVybiBUY2xfTmV3U3RyaW5nT2JqKF9yLT5ib3VuZGFyeSwgLTEpOworLyogZG9lc24ndCBleGlzdCBhbnltb3JlLi4uLiA6KCAqLworLyoJcmV0dXJuIFRjbF9OZXdTdHJpbmdPYmooX3ItPmJvdW5kYXJ5LCAtMSk7ICovCiB9CiAKIHN0YXRpYyBUY2xfT2JqKiByX3JhbmdlKHZvaWQpCkBAIC0xNjYxLDcgKzE2NDcsNyBAQAogewogCS8qIGFwX2dldF9saW1pdF9yZXFfYm9keSByZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcsIGl0cyBwb3NzaWJsZSBpdCBjb3VsZCBvdmVyZmxvdyBpbiBUQ0wKIAkgICBhcyBpdCBkb2Vzbid0IGFwcGVhciB0byBoYXZlIGFueSB1bnNpZ25lZCBzdXBwb3J0Li4uIGl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGFzc2lnbiBpdAotCSAgIHRvIGEgZG91YmxlPworCSAgIHRvIGEgbG9uZyBsb25nPwogCSovCiAJVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIFRjbF9OZXdMb25nT2JqKGFwX2dldF9saW1pdF9yZXFfYm9keShfcikpKTsKIAkKQEAgLTE3NzAsNiArMTc1Niw3IEBACiAKIGludCBjbWRfYXBfc2VuZF9odHRwX2hlYWRlcihDbGllbnREYXRhIGNkLCBUY2xfSW50ZXJwICppeHgsIGludCBvYmpjLCBUY2xfT2JqICpDT05TVCBvYmp2W10pCiB7CisvKiBJIGRvbid0IGtub3cgaWYgdGhpcyBkb2VzIGFueXRoaW5nIGFueW1vcmU/ICovCiAvKgogCVRjbF9PYmogKm9iajsKIAkKZGlmZiAtLWdpdCBhL3RjbF9jb3JlLmMgYi90Y2xfY29yZS5jCmluZGV4IGYzZGIxMDEuLjc3Y2Q2NWYgMTAwNjQ0Ci0tLSBhL3RjbF9jb3JlLmMKKysrIGIvdGNsX2NvcmUuYwpAQCAtNzksOSArNzksNiBAQAogc3RhdGljIGNvbnN0IGNoYXIqIHNmbChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICptY29uZmlnLCBpbnQgZmxhZyk7CiBzdGF0aWMgY29uc3QgY2hhciogdGNsX3NldChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICptY29uZmlnLCBjb25zdCBjaGFyICpvbmUsIGNvbnN0IGNoYXIgKnR3bywgY29uc3QgY2hhciAqdGhyZWUpOwogc3RhdGljIGNvbnN0IGNoYXIqIHRjbF9zZXRsaXN0KGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKm1jb25maWcsIGNvbnN0IGNoYXIgKm9uZSwgY29uc3QgY2hhciAqdHdvKTsKLS8vc3RhdGljIGNvbnN0IGNoYXIqIHRjbF9yYXdfYXJncyhjbWRfcGFybXMgKnBhcm1zLCB2b2lkICptY29uZmlnLCBjaGFyICphcmcpOwotCi0vL3R5cGVkZWYgY29uc3QgY2hhciogKCpmel90KSh2b2lkKTsKIAogc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIHRjbF9jb21tYW5kc1tdID0gewogCS8qIHRoaXMgZG9lc24ndCBkbyBhbnl0aGluZyBhbnltb3JlICovCkBAIC0xMDMsNyArMTAwLDYgQEAKIAlBUF9JTklUX1RBS0UyKAkJIlRjbF9Ib29rX0ZpeHVwcyIsCQkJCS8qKGZ6X3QpKi8gYWRkX2hhbmQyLAkJKHZvaWQqKSA3LAlPUl9BVVRIQ0ZHLAkJImFkZCBmaXh1cHMgaGFuZGxlcnMuIiApLAogCUFQX0lOSVRfVEFLRTEoCQkiVGNsX0hvb2tfSGFuZGxlciIsCQkJCS8qKGZ6X3QpKi8gYWRkX2hhbmQxLAkJKHZvaWQqKSA4LAlPUl9BVVRIQ0ZHLAkJImFkZCBjb250ZW50IGhhbmRsZXIuIiApLAogCUFQX0lOSVRfVEFLRTIoCQkiVGNsX0hvb2tfTG9nX1RyYW5zYWN0aW9uIiwJCS8qKGZ6X3QpKi8gYWRkX2hhbmQyLAkJKHZvaWQqKSA5LAlPUl9BVVRIQ0ZHLAkJImFkZCBsb2dfdHJhbnNhY3Rpb24gaGFuZGxlcnMuIiApLAotLy8JQVBfSU5JVF9SQVdfQVJHUygJIjxUY2w+IiwJCQkJCQkvKihmel90KSovIHRjbF9yYXdfYXJncywJTlVMTCwJCVJTUkNfQ09ORnxFWEVDX09OX1JFQUQsCQkiYWRkIHJhdyB0Y2wgdG8gdGhlIGludGVycHJldGVyLiIgKSwKIAl7IE5VTEwgfQogfTsKIApAQCAtMjQ1LDMzICsyNDEsNyBAQAogCQogCXJldHVybiBOVUxMOwogfQotLyoKLXN0YXRpYyBjb25zdCBjaGFyKiB0Y2xfcmF3X2FyZ3MoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsIGNoYXIgKmFyZykKLXsKLQljaGFyICoqeHgsICp6ID0gYXByX3BzdHJkdXAoY21kLT5wb29sLCAiIik7Ci0JY2hhciBsW01BWF9TVFJJTkdfTEVOXTsKLQljb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKIAotCWlmIChlcnIgIT0gTlVMTCkgewotCQlyZXR1cm4gZXJyOwotCX0KLSAgICAKLSAgICB3aGlsZSAoIShhcF9jZmdfZ2V0bGluZShsLCBNQVhfU1RSSU5HX0xFTiwgY21kLT5jb25maWdfZmlsZSkpKSB7Ci0JCWlmICghc3RybmNhc2VjbXAobCwgIjwvVGNsPiIsIDYpKSB7Ci0JCQlicmVhazsKLQkJfQotCQkKLSAgICAJLy8gaWNrCi0gICAgCXogPSBhcHJfcHN0cmNhdChjbWQtPnBvb2wsIHosIGwsICJcbiIsIE5VTEwpOwotICAgIH0KLQkKLQkvLyBpY2sKLQlyYXdfdGNsID0gcmVhbGxvYyhyYXdfdGNsLCBzdHJsZW4oeikgKyAxKTsKLQlzdHJjYXQocmF3X3RjbCwgeik7Ci0JCi0JcmV0dXJuIE5VTEw7Ci19Ci0qLwogdm9pZCBydW5fc2NyaXB0KFRjbF9JbnRlcnAqIGludGVycCwgY2hhciAqZm10LCAuLi4pCiB7CiAJY2hhciAqYnB0ciA9IE5VTEw7CkBAIC01NzIsNyArNTQyLDcgQEAKIAogc3RhdGljIGludCB0Y2xfaW5pdF9oYW5kbGVyKGFwcl9wb29sX3QgKnBjb25mLCBhcHJfcG9vbF90ICpwbG9nLCBhcHJfcG9vbF90ICpwdGVtcCwgc2VydmVyX3JlYyAqcykKIHsKLQlhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQocGNvbmYsICJtb2RfdGNsLzEuMGQ4LTIwMDIwMzEwMDAiKTsKKwlhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQocGNvbmYsICJtb2RfdGNsLzEuMCIpOwogCQogCXJldHVybiBPSzsKIH0KQEAgLTc2MSw3ICs3MzEsNiBAQAogCQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLT5zZXJ2ZXIsICJUY2xfRXZhbE9iakV4KCVzKTogJXMiLCBlcHRyLCBUY2xfR2V0U3RyaW5nUmVzdWx0KGludGVycCkpOwogCQkJCiAJCQlyLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKLS8vCQkJYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKIAkJCQogCQkJYXBfcnByaW50ZihyLCAiPEgzPlRDTCBFcnJvcjwvSDM+PEJSPjxQUkU+JXM8L1BSRT4iLCBUY2xfR2V0U3RyaW5nKFRjbF9HZXRWYXIyRXgoaW50ZXJwLCAiZXJyb3JJbmZvIiwgTlVMTCwgMCkpKTsKIAkJCQpAQCAtODI5LDQgKzc5OCwzIEBACiB7CiAJcmV0dXJuIHJ1bl9oYW5kbGVyKHIsIDkpOwogfQotCmRpZmYgLS1naXQgYS90Y2xfbWlzYy5jIGIvdGNsX21pc2MuYwppbmRleCBlMDMxM2I5Li40MmU0ODVmIDEwMDY0NAotLS0gYS90Y2xfbWlzYy5jCisrKyBiL3RjbF9taXNjLmMKQEAgLTYwLDk1ICs2MCwyNCBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogCisvKiBxdWl0ZSBob25lc3RseSBpZiB5b3UgZG9uJ3QgaGF2ZSBhc3ByaW50ZiB0b28gYmFkCisJdGhpcyB3b3JrcyBvbiBTb2xhcmlzIDUuOSB0aG91Z2ggKi8KICNpZm5kZWYgSEFWRV9BU1BSSU5URgotLy8gcmlwcGVkIGZyb20gZ2NjCi1pbnQgaW50X3Zhc3ByaW50ZihjaGFyICoqcmVzdWx0LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgKmFyZ3MpCi17Ci0JY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKLSAgLyogQWRkIG9uZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBuZXZlciB6ZXJvLCB3aGljaCBtaWdodCBjYXVzZSBtYWxsb2MKLSAgICAgdG8gcmV0dXJuIE5VTEwuICAqLwotCWludCB0b3RhbF93aWR0aCA9IHN0cmxlbihmb3JtYXQpICsgMTsKLQl2YV9saXN0IGFwOwotCi0JbWVtY3B5KChjaGFyKikgJmFwLCAoY2hhciopIGFyZ3MsIHNpemVvZih2YV9saXN0KSk7Ci0KLQl3aGlsZSAoKnAgIT0gJ1wwJykgewotCQlpZiAoKnArKyA9PSAnJScpIHsKLQkJCXdoaWxlIChzdHJjaHIgKCItKyAjMCIsICpwKSkgewotICAgICAgICAgICAgCSsrcDsKLSAgICAgICAgICAgIH0KLQotCQkJaWYgKCpwID09ICcqJykgewotCQkJCSsrcDsKLQkJCQl0b3RhbF93aWR0aCArPSBhYnModmFfYXJnKGFwLCBpbnQpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRvdGFsX3dpZHRoICs9ICh1bnNpZ25lZCBsb25nKSBzdHJ0b2wocCwgKGNoYXIqKikgJnAsIDEwKTsKLQkJCX0KLQkJCQotCQkJaWYgKCpwID09ICcuJykgewotCQkJCSsrcDsKLQotCQkJCWlmICgqcCA9PSAnKicpIHsKLQkJCQkJKytwOwotCQkJCQl0b3RhbF93aWR0aCArPSBhYnModmFfYXJnKGFwLCBpbnQpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0gICAgICAgICAgICAgIAkJdG90YWxfd2lkdGggKz0gKHVuc2lnbmVkIGxvbmcpIHN0cnRvbChwLCAoY2hhcioqKSAmcCwgMTApOwotICAgICAgICAgICAgICAJfQotCQkJfQotICAgICAgICAgCi0JCQl3aGlsZSAoc3RyY2hyICgiaGxMIiwgKnApKSB7Ci0JCQkJKytwOwotCQkJfQotCQkJCi0JCQkvKiBTaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgYW55IGZvcm1hdCBzcGVjaWZpZXIgZXhjZXB0ICVzIGFuZCBmbG9hdHMuICAqLwotCQkJdG90YWxfd2lkdGggKz0gMzA7Ci0KLQkJCXN3aXRjaCAoKnApIHsKLQkJCSAgY2FzZSAnZCc6Ci0JCQkgIGNhc2UgJ2knOgotCQkJICBjYXNlICdvJzoKLQkJCSAgY2FzZSAndSc6Ci0JCQkgIGNhc2UgJ3gnOgotCQkJICBjYXNlICdYJzoKLQkJCSAgY2FzZSAnYyc6Ci0JCQkJKHZvaWQpIHZhX2FyZyhhcCwgaW50KTsKLQkJCQlicmVhazsKLQkJCSAgY2FzZSAnZic6Ci0JCQkgIGNhc2UgJ2UnOgotCQkJICBjYXNlICdFJzoKLQkJCSAgY2FzZSAnZyc6Ci0JCQkgIGNhc2UgJ0cnOgotCQkJCSh2b2lkKSB2YV9hcmcoYXAsIGRvdWJsZSk7Ci0gICAgICAgICAgICAgIC8qIFNpbmNlIGFuIGllZWUgZG91YmxlIGNhbiBoYXZlIGFuIGV4cG9uZW50IG9mIDMwNywgd2UnbGwKLSAgICAgICAgICAgICAgICAgbWFrZSB0aGUgYnVmZmVyIHdpZGUgZW5vdWdoIHRvIGNvdmVyIHRoZSBncm9zcyBjYXNlLiAqLwotCQkJCXRvdGFsX3dpZHRoICs9IDMwNzsKLQkJCQlicmVhazsKLQkJCSAgY2FzZSAncyc6Ci0JCQkJdG90YWxfd2lkdGggKz0gc3RybGVuKHZhX2FyZyhhcCwgY2hhciopKTsKLQkJCQlicmVhazsKLQkJCSAgY2FzZSAncCc6Ci0JCQkgIGNhc2UgJ24nOgotCQkJCSh2b2lkKSB2YV9hcmcoYXAsIGNoYXIqKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCSpyZXN1bHQgPSAoY2hhciopIG1hbGxvYyh0b3RhbF93aWR0aCk7Ci0KLQlpZiAoKnJlc3VsdCAhPSBOVUxMKSB7Ci0JCXJldHVybiB2c3ByaW50ZigqcmVzdWx0LCBmb3JtYXQsICphcmdzKTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQogaW50IHZhc3ByaW50ZihjaGFyICoqcmVzdWx0LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKIHsKLQlyZXR1cm4gaW50X3Zhc3ByaW50ZihyZXN1bHQsIGZvcm1hdCwgJmFyZ3MpOworCWNoYXIgcDsKKwlpbnQgcmV0OworCQorCXJldCA9IHZzbnByaW50ZigmcCwgMSwgZm9ybWF0LCBhcmdzKTsKKwkKKwlpZiAocmV0ID4gMCkgeworCQkqcmVzdWx0ID0gbWFsbG9jKHJldCArIDEpOworCQlyZXR1cm4gdnNwcmludGYoKnJlc3VsdCwgZm9ybWF0LCBhcmdzKTsKKwl9CisJCisJKnJlc3VsdCA9IE5VTEw7CisJCisJcmV0dXJuIHJldDsKIH0KIAogaW50IGFzcHJpbnRmKGNoYXIgKipyZXN1bHQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpkaWZmIC0tZ2l0IGEvdGVzdF9zY3JpcHQudG0gYi90ZXN0X3NjcmlwdC50bQppbmRleCA2NDBhZjVkLi5jM2M0NWMxIDEwMDY0NAotLS0gYS90ZXN0X3NjcmlwdC50bQorKysgYi90ZXN0X3NjcmlwdC50bQpAQCAtODUsMTQgKzg1LDExIEBACiBbciBjb25uZWN0aW9uIHJlbW90ZV9ob3N0XQogW3IgY29ubmVjdGlvbiByZW1vdGVfbG9nbmFtZV0KIFtyIGNvbm5lY3Rpb24gYWJvcnRlZF0KLSNbciBjb25uZWN0aW9uIGtlZXBhbGl2ZV0KIFtyIGNvbm5lY3Rpb24gZG91YmxlcmV2ZXJzZV0KLSNbciBjb25uZWN0aW9uIGtlZXBhbGl2ZXNdCiBbciBjb25uZWN0aW9uIGxvY2FsX2lwXQogW3IgY29ubmVjdGlvbiBsb2NhbF9ob3N0XQogW3IgY29ubmVjdGlvbiBpZF0KIFtyIGNvbm5lY3Rpb24gbm90ZXNdCi1bciBjb25uZWN0aW9uIHJlbWFpbl0KIAogW3Igc2VydmVyIGRlZm5fbmFtZV0KIFtyIHNlcnZlciBkZWZuX2xpbmVfbnVtYmVyXQo=