cGFja2FnZSBvcGVubmxwLnRvb2xzLnBhcnNlX3RoaWNrZXQucGF0dGVybl9zdHJ1Y3R1cmU7CgppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLmlvLio7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwoKaW1wb3J0IG9wZW5ubHAudG9vbHMucGFyc2VfdGhpY2tldC5QYXJzZUNvcmVmc0J1aWxkZXI7CmltcG9ydCBvcGVubmxwLnRvb2xzLnBhcnNlX3RoaWNrZXQuUGFyc2VUaGlja2V0OwppbXBvcnQgb3Blbm5scC50b29scy5wYXJzZV90aGlja2V0LlBhcnNlVHJlZU5vZGU7CmltcG9ydCBvcGVubmxwLnRvb2xzLnBhcnNlX3RoaWNrZXQubWF0Y2hpbmcuUFQyVGhpY2tldFBocmFzZUJ1aWxkZXI7CmltcG9ydCBvcGVubmxwLnRvb2xzLnRleHRzaW1pbGFyaXR5LlBhcnNlVHJlZUNodW5rOwppbXBvcnQgb3Blbm5scC50b29scy50ZXh0c2ltaWxhcml0eS5QYXJzZVRyZWVNYXRjaGVyRGV0ZXJtaW5pc3RpYzsKCgpwdWJsaWMgY2xhc3MgUGhyYXNlUGF0dGVyblN0cnVjdHVyZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZXsKCVBhcnNlVHJlZU1hdGNoZXJEZXRlcm1pbmlzdGljIG1kID0gbmV3IFBhcnNlVHJlZU1hdGNoZXJEZXRlcm1pbmlzdGljKCk7CglQYXJzZUNvcmVmc0J1aWxkZXIgcHRCdWlsZGVyID0gUGFyc2VDb3JlZnNCdWlsZGVyLmdldEluc3RhbmNlKCk7CglQVDJUaGlja2V0UGhyYXNlQnVpbGRlciBwaHJhc2VCdWlsZGVyID0gbmV3IFBUMlRoaWNrZXRQaHJhc2VCdWlsZGVyKCk7CgkKCXB1YmxpYyB2b2lkIHRlc3RMZW9Ub2xzdG95VGVzdCgpIHsKCQlQaHJhc2VQYXR0ZXJuU3RydWN0dXJlIGxhdCA9IG5ldyBQaHJhc2VQYXR0ZXJuU3RydWN0dXJlKDMsMSk7CQoJCQoJCVN0cmluZyBkZXNjcmlwdGlvbjsKCQlQYXJzZVRoaWNrZXQgcHQxOwoJCUxpc3Q8TGlzdDxQYXJzZVRyZWVOb2RlPj4gcGhyczE7CgkJTGlzdDxMaXN0PFBhcnNlVHJlZUNodW5rPj4gc2VudDFHcnBMc3Q7CgkJLy9FeGFtcGxlIDEKCQlkZXNjcmlwdGlvbiA9ICJFaCBiaWVuLCBtb24gcHJpbmNlLCBzbyBHZW5vYSBhbmQgTHVjY2EgYXJlIG5vdyBubyBtb3JlIHRoYW4gZmFtaWx5IGVzdGF0ZXMgb2YgdGhlIEJvbmFwYXJ0ZXMuIE5vLCBJIHdhcm4geW91LCBpZiB5b3UgZG9u1XQgc2F5IHRoYXQgdGhpcyBtZWFucyB3YXIsIGlmIHlvdSBzdGlsbCBwZXJtaXQgeW91cnNlbGYgdG8gY29uZG9uZSBhbGwgdGhlIGluZmFtaWVzLCBhbGwgdGhlIGF0cm9jaXRpZXMsIG9mIHRoaXMgQW50aWNocmlzdNFhbmQgdGhhdNVzIHdoYXQgSSByZWFsbHkgYmVsaWV2ZSBoZSBpc9FJIHdpbGwgaGF2ZSBub3RoaW5nIG1vcmUgdG8gZG8gd2l0aCB5b3UsIHlvdSBhcmUgbm8gbG9uZ2VyIG15IGZyaWVuZCwgbXkgZmFpdGhmdWwgc2xhdmUsIGFzIHlvdSBzYXkuIEJ1dCBob3cgZG8geW91IGRvLCBob3cgZG8geW91IGRvPyBJIHNlZSB0aGF0IEkgYW0gZnJpZ2h0ZW5pbmcgeW91LiBTaXQgZG93biBhbmQgdGVsbCBtZSBhbGwgYWJvdXQgaXQuIjsKCQlwdDEgPSBwdEJ1aWxkZXIuYnVpbGRQYXJzZVRoaWNrZXQoZGVzY3JpcHRpb24pOwkKCQlwaHJzMSA9IHBocmFzZUJ1aWxkZXIuYnVpbGRQVDJwdFBocmFzZXMocHQxKTsKCQlzZW50MUdycExzdCA9IGxhdC5mb3JtR3JvdXBlZFBocmFzZXNGcm9tQ2h1bmtzRm9yUGFyYShwaHJzMSk7CgkJbGF0LkFkZEludGVudChzZW50MUdycExzdCwgMCk7CgkJCgkJZGVzY3JpcHRpb24gPSAiV2VsbCwgUHJpbmNlLCBzbyBHZW5vYSBhbmQgTHVjY2EgYXJlIG5vdyBqdXN0IGZhbWlseSBlc3RhdGVzIG9mIHRoZSBCdW9uYXBhcnRlcy4gQnV0IEkgd2FybiB5b3UsIGlmIHlvdSBkb24ndCB0ZWxsIG1lIHRoYXQgdGhpcyBtZWFucyB3YXIsIGlmIHlvdSBzdGlsbCB0cnkgdG8gZGVmZW5kIHRoZSBpbmZhbWllcyBhbmQgaG9ycm9ycyBwZXJwZXRyYXRlZCBieSB0aGF0IEFudGljaHJpc3TRSSByZWFsbHkgYmVsaWV2ZSBoZSBpcyBBbnRpY2hyaXN00Ukgd2lsbCBoYXZlIG5vdGhpbmcgbW9yZSB0byBkbyB3aXRoIHlvdSBhbmQgeW91IGFyZSBubyBsb25nZXIgbXkgZnJpZW5kLCBubyBsb25nZXIgbXkgJ2ZhaXRoZnVsIHNsYXZlLCcgYXMgeW91IGNhbGwgeW91cnNlbGYhIEJ1dCBob3cgZG8geW91IGRvPyBJIHNlZSBJIGhhdmUgZnJpZ2h0ZW5lZCB5b3XRc2l0IGRvd24gYW5kIHRlbGwgbWUgYWxsIHRoZSBuZXdzIjsJCQoJCXB0MSA9IHB0QnVpbGRlci5idWlsZFBhcnNlVGhpY2tldChkZXNjcmlwdGlvbik7CQoJCXBocnMxID0gcGhyYXNlQnVpbGRlci5idWlsZFBUMnB0UGhyYXNlcyhwdDEpOwoJCXNlbnQxR3JwTHN0ID0gbGF0LmZvcm1Hcm91cGVkUGhyYXNlc0Zyb21DaHVua3NGb3JQYXJhKHBocnMxKTsKCQlsYXQuQWRkSW50ZW50KHNlbnQxR3JwTHN0LCAwKTsKCQkKCQkKCQlkZXNjcmlwdGlvbiA9ICJXZWxsLCBQcmluY2UsIEdlbm9hIGFuZCBMdWNjYSBhcmUgbm93IG5vdGhpbmcgbW9yZSB0aGFuIGVzdGF0ZXMgdGFrZW4gb3ZlciBieSB0aGUgQnVvbmFwYXJ0ZSBmYW1pbHkuMSBObywgSSBnaXZlIHlvdSBmYWlyIHdhcm5pbmcuIElmIHlvdSB3b27VdCBzYXkgdGhpcyBtZWFucyB3YXIsIGlmIHlvdSB3aWxsIGFsbG93IHlvdXJzZWxmIHRvIGNvbmRvbmUgYWxsIHRoZSBnaGFzdGx5IGF0cm9jaXRpZXMgcGVycGV0cmF0ZWQgYnkgdGhhdCBBbnRpY2hyaXN0INAgeWVzLCB0aGF01XMgd2hhdCBJIHRoaW5rIGhlIGlzINAgSSBzaGFsbCBkaXNvd24geW91LiBZb3XVcmUgbm8gZnJpZW5kIG9mIG1pbmUg0CBub3QgdGhlINJmYWl0aGZ1bCBzbGF2ZdMgeW91IGNsYWltIHRvIGJlIC4gLiAuIEJ1dCBob3cgYXJlIHlvdT8gSG93IGFyZSB5b3Uga2VlcGluZz8gSSBjYW4gc2VlIEnVbSBpbnRpbWlkYXRpbmcgeW91LiBEbyBzaXQgZG93biBhbmQgdGFsayB0byBtZS4iOwoJCXB0MSA9IHB0QnVpbGRlci5idWlsZFBhcnNlVGhpY2tldChkZXNjcmlwdGlvbik7CQoJCXBocnMxID0gcGhyYXNlQnVpbGRlci5idWlsZFBUMnB0UGhyYXNlcyhwdDEpOwoJCXNlbnQxR3JwTHN0ID0gbGF0LmZvcm1Hcm91cGVkUGhyYXNlc0Zyb21DaHVua3NGb3JQYXJhKHBocnMxKTsKCQlsYXQuQWRkSW50ZW50KHNlbnQxR3JwTHN0LCAwKTsKCQkKCQlkZXNjcmlwdGlvbiA9ICJXZWxsLCBwcmluY2UsIEdlbm9hIGFuZCBMdWNjYSBhcmUgbm93IG5vdGhpbmcgbW9yZSB0aGFuIHRoZSBhcGFuYWdlcywgdGhhbiB0aGUgcHJpdmF0ZSBwcm9wZXJ0eSBvZiB0aGUgQm9uYXBhcnRlIGZhbWlseS4gSSB3YXJuIHlvdSB0aGF0IGlmIHlvdSBkbyBub3QgdGVsbCBtZSB3ZSBhcmUgZ29pbmcgdG8gaGF2ZSB3YXIsIGlmIHlvdSBzdGlsbCBhbGxvdyB5b3Vyc2VsZiB0byBjb25kb25lIGFsbCB0aGUgaW5mYW1pZXMsIGFsbCB0aGUgYXRyb2NpdGllcyBvZiB0aGlzIEFudGljaHJpc3QgLSBvbiBteSB3b3JkIEkgYmVsaWV2ZSBoZSBpcyBBbnRpY2hyaXN0IC0gdGhhdCBpcyB0aGUgZW5kIG9mIG91ciBhY3F1YWludGFuY2U7IHlvdSBhcmUgbm8gbG9uZ2VyIG15IGZyaWVuZCwgeW91IGFyZSBubyBsb25nZXIgbXkgZmFpdGhmdWwgc2xhdmUsIGFzIHlvdSBjYWxsIHlvdXJzZWxmLiBOb3csIGJlIG9mIGdvb2QgY291cmFnZSwgSSBzZWUgSSBmcmlnaHRlbiB5b3UuIENvbWUsIHNpdCBkb3duIGFuZCB0ZWxsIG1lIGFsbCBhYm91dCBpdC4iOwoJCXB0MSA9IHB0QnVpbGRlci5idWlsZFBhcnNlVGhpY2tldChkZXNjcmlwdGlvbik7CQoJCXBocnMxID0gcGhyYXNlQnVpbGRlci5idWlsZFBUMnB0UGhyYXNlcyhwdDEpOwoJCXNlbnQxR3JwTHN0ID0gbGF0LmZvcm1Hcm91cGVkUGhyYXNlc0Zyb21DaHVua3NGb3JQYXJhKHBocnMxKTsKCQlsYXQuQWRkSW50ZW50KHNlbnQxR3JwTHN0LCAwKTsgCgkJCgkJbGF0LnByaW50TGF0dGljZSgpOwoJCWxhdC5wcmludExhdHRpY2VTdGF0cygpOwoJfQoJCS8vRXhhbXBsZSAyCglwdWJsaWMgdm9pZCB0ZXN0TmV3c1Rlc3QoKSB7CgkJUGhyYXNlUGF0dGVyblN0cnVjdHVyZSBsYXQgPSBuZXcgUGhyYXNlUGF0dGVyblN0cnVjdHVyZSgzLDQpOwkKCQkKCQlTdHJpbmcgZGVzY3JpcHRpb247CgkJUGFyc2VUaGlja2V0IHB0MTsKCQlMaXN0PExpc3Q8UGFyc2VUcmVlTm9kZT4+IHBocnMxOwoJCUxpc3Q8TGlzdDxQYXJzZVRyZWVDaHVuaz4+IHNlbnQxR3JwTHN0OwoJCS8qTGlzdDxMaXN0PFBhcnNlVHJlZUNodW5rPj4gcmVzID0gbS5hc3Nlc3NSZWxldmFuY2UoIkF0IGxlYXN0IDkgcGVvcGxlIHdlcmUga2lsbGVkIGFuZCA0MyBvdGhlcnMgd291bmRlZCBpbiBzaG9vdGluZ3MgYW5kIGJvbWIgYXR0YWNrcywgaW5jbHVkaW5nIGZvdXIgY2FyIGJvbWJpbmdzLCBpbiBjZW50cmFsIGFuZCB3ZXN0ZXJuIElyYXEgb24gVGh1cnNkYXksIHRoZSBwb2xpY2Ugc2FpZC4gQSBjYXIgYm9tYiBwYXJrZWQgbmVhciB0aGUgZW50cmFuY2Ugb2YgdGhlIGxvY2FsIGdvdmVybm1lbnQgY29tcG91bmQgaW4gQW5iYXIncyBwcm92aW5jaWFsIGNhcGl0YWwgb2YgUmFtYWRpLCBzb21lIDExMCBrbSB3ZXN0IG9mIEJhZ2hkYWQsIGRldG9uYXRlZCBpbiB0aGUgbW9ybmluZyBuZWFyIGEgY29udm95IG9mIHZlaGljbGVzIGNhcnJ5aW5nIHRoZSBwcm92aW5jaWFsIGdvdmVybm9yIFFhc3NpbSBhbC1GYWhkYXdpLCBhIHByb3ZpbmNpYWwgcG9saWNlIHNvdXJjZSB0b2xkIFhpbmh1YSBvbiBjb25kaXRpb24gb2YgYW5vbnltaXR5LiIsCgkJCQkiT2ZmaWNpYWxzIHNheSBhIGNhciBib21iIGluIG5vcnRoZWFzdCBCYWdoZGFkIGtpbGxlZCBmb3VyIHBlb3BsZSwgd2hpbGUgYW5vdGhlciBib21iaW5nIGF0IGEgbWFya2V0IGluIHRoZSBjZW50cmFsIHBhcnQgb2YgdGhlIGNhcGl0YWwga2lsbGVkIGF0IGxlYXN0IHR3byBhbmQgd291bmRlZCBtYW55IG1vcmUuIFNlY3VyaXR5IG9mZmljaWFscyBhbHNvIHNheSBhdCBsZWFzdCB0d28gcG9saWNlbWVuIHdlcmUga2lsbGVkIGJ5IGEgc3VpY2lkZSBjYXIgYm9tYiBhdHRhY2sgaW4gdGhlIG5vcnRoZXJuIGNpdHkgb2YgTW9zdWwuIE5vIGdyb3VwIGhhcyBjbGFpbWVkIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgYXR0YWNrcywgd2hpY2ggb2NjdXJyZWQgaW4gYm90aCBTdW5uaSBhbmQgU2hpJ2l0ZSBuZWlnaGJvcmhvb2RzLiIKCQkJCSk7Ki8KCQlkZXNjcmlwdGlvbiA9ICJBdCBsZWFzdCA5IHBlb3BsZSB3ZXJlIGtpbGxlZCBhbmQgNDMgb3RoZXJzIHdvdW5kZWQgaW4gc2hvb3RpbmdzIGFuZCBib21iIGF0dGFja3MsIGluY2x1ZGluZyBmb3VyIGNhciBib21iaW5ncywgaW4gY2VudHJhbCBhbmQgd2VzdGVybiBJcmFxIG9uIFRodXJzZGF5LCB0aGUgcG9saWNlIHNhaWQuIEEgY2FyIGJvbWIgcGFya2VkIG5lYXIgdGhlIGVudHJhbmNlIG9mIHRoZSBsb2NhbCBnb3Zlcm5tZW50IGNvbXBvdW5kIGluIEFuYmFyJ3MgcHJvdmluY2lhbCBjYXBpdGFsIG9mIFJhbWFkaSwgc29tZSAxMTAga20gd2VzdCBvZiBCYWdoZGFkLCBkZXRvbmF0ZWQgaW4gdGhlIG1vcm5pbmcgbmVhciBhIGNvbnZveSBvZiB2ZWhpY2xlcyBjYXJyeWluZyB0aGUgcHJvdmluY2lhbCBnb3Zlcm5vciBRYXNzaW0gYWwtRmFoZGF3aSwgYSBwcm92aW5jaWFsIHBvbGljZSBzb3VyY2UgdG9sZCBYaW5odWEgb24gY29uZGl0aW9uIG9mIGFub255bWl0eS4iOwoJCXB0MSA9IHB0QnVpbGRlci5idWlsZFBhcnNlVGhpY2tldChkZXNjcmlwdGlvbik7CQoJCXBocnMxID0gcGhyYXNlQnVpbGRlci5idWlsZFBUMnB0UGhyYXNlcyhwdDEpOwoJCXNlbnQxR3JwTHN0ID0gbGF0LmZvcm1Hcm91cGVkUGhyYXNlc0Zyb21DaHVua3NGb3JQYXJhKHBocnMxKTsKCQlsYXQuQWRkSW50ZW50KHNlbnQxR3JwTHN0LCAwKTsKCQkKCQlkZXNjcmlwdGlvbiA9ICJPZmZpY2lhbHMgc2F5IGEgY2FyIGJvbWIgaW4gbm9ydGhlYXN0IEJhZ2hkYWQga2lsbGVkIGZvdXIgcGVvcGxlLCB3aGlsZSBhbm90aGVyIGJvbWJpbmcgYXQgYSBtYXJrZXQgaW4gdGhlIGNlbnRyYWwgcGFydCBvZiB0aGUgY2FwaXRhbCBraWxsZWQgYXQgbGVhc3QgdHdvIGFuZCB3b3VuZGVkIG1hbnkgbW9yZS4gU2VjdXJpdHkgb2ZmaWNpYWxzIGFsc28gc2F5IGF0IGxlYXN0IHR3byBwb2xpY2VtZW4gd2VyZSBraWxsZWQgYnkgYSBzdWljaWRlIGNhciBib21iIGF0dGFjayBpbiB0aGUgbm9ydGhlcm4gY2l0eSBvZiBNb3N1bC4gTm8gZ3JvdXAgaGFzIGNsYWltZWQgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBhdHRhY2tzLCB3aGljaCBvY2N1cnJlZCBpbiBib3RoIFN1bm5pIGFuZCBTaGknaXRlIG5laWdoYm9yaG9vZHMuIjsKCQlwdDEgPSBwdEJ1aWxkZXIuYnVpbGRQYXJzZVRoaWNrZXQoZGVzY3JpcHRpb24pOwkKCQlwaHJzMSA9IHBocmFzZUJ1aWxkZXIuYnVpbGRQVDJwdFBocmFzZXMocHQxKTsKCQlzZW50MUdycExzdCA9IGxhdC5mb3JtR3JvdXBlZFBocmFzZXNGcm9tQ2h1bmtzRm9yUGFyYShwaHJzMSk7CgkJbGF0LkFkZEludGVudChzZW50MUdycExzdCwgMCk7CgkJCgkJZGVzY3JpcHRpb24gPSAiVHdvIGNhciBib21icyBraWxsZWQgYXQgbGVhc3QgZm91ciBwZW9wbGUgYW5kIHdvdW5kZWQgZG96ZW5zIG9mIG90aGVycyBvbiBNb25kYXkgaW4gb25lIG9mIHRoZSBibG9vZGllc3QgYXR0YWNrcyB0aGlzIHllYXIgaW4gRGFnZXN0YW4sIGEgdHVyYnVsZW50IHByb3ZpbmNlIGluIFJ1c3NpYSdzIE5vcnRoIENhdWNhc3VzIHJlZ2lvbiB3aGVyZSBhcm1lZCBncm91cHMgYXJlIHdhZ2luZyBhbiBJc2xhbWlzdCBpbnN1cmdlbmN5LiBDYXIgYm9tYnMsIHN1aWNpZGUgYm9tYmluZ3MgYW5kIGZpcmVmaWdodHMgYXJlIGNvbW1vbiBpbiBEYWdlc3RhbiwgYXQgdGhlIGNlbnRyZSBvZiBhbiBpbnN1cmdlbmN5IHJvb3RlZCBpbiB0d28gcG9zdC1Tb3ZpZXQgd2FycyBhZ2FpbnN0IHNlcGFyYXRpc3QgcmViZWxzIGluIG5laWdoYm91cmluZyBDaGVjaG55YS4gU3VjaCBhdHRhY2tzIGFyZSByYXJlIGluIG90aGVyIHBhcnRzIG9mIFJ1c3NpYSwgYnV0IGluIGEgc2VwYXJhdGUgaW5jaWRlbnQgaW4gYSBzdWJ1cmIgb2YgTW9zY293IG9uIE1vbmRheSwgc2VjdXJpdHkgZm9yY2VzIGtpbGxlZCB0d28gc3VzcGVjdGVkIG1pbGl0YW50cyBhbGxlZ2VkIHRvIGhhdmUgYmVlbiBwbG90dGluZyBhbiBhdHRhY2sgaW4gdGhlIGNhcGl0YWwgYW5kIGFycmVzdGVkIGEgdGhpcmQgc3VzcGVjdCBhZnRlciBhIGd1bmJhdHRsZSI7CgkvLwlEZXNjcmlwdGlvbiA9ICJBTU1BTiwgSm9yZGFuIChBUCkg0SBBIFN5cmlhbiBnb3Zlcm5tZW50IG9mZmljaWFsIHNheXMgYSBjYXIgYm9tYiBoYXMgZXhwbG9kZWQgaW4gYSBzdWJ1cmIgb2YgdGhlIGNhcGl0YWwgRGFtYXNjdXMsIGtpbGxpbmcgdGhyZWUgcGVvcGxlIGFuZCB3b3VuZGluZyBzZXZlcmFsIG90aGVycy4gVGhlIEJyaXRhaW4tYmFzZWQgU3lyaWFuIE9ic2VydmF0b3J5IGZvciBIdW1hbiBSaWdodHMgY29uZmlybWVkIHRoZSBTdW5kYXkgZXhwbG9zaW9uIGluIEpvdWJlciwgd2hpY2ggaXQgc2FpZCBoYXMgc2VlbiBoZWF2eSBjbGFzaGVzIHJlY2VudGx5IGJldHdlZW4gcmViZWxzIGFuZCB0aGUgU3lyaWFuIGFybXkuIEl0IGRpZCBub3QgaGF2ZSBhbnkgaW1tZWRpYXRlIHdvcmQgb24gY2FzdWFsdGllcy4gSXQgc2FpZCB0aGUgYmxhc3QgdGFyZ2V0ZWQgYSBwb2xpY2Ugc3RhdGlvbiBhbmQgd2FzIGNhcnJpZWQgb3V0IGJ5IHRoZSBKYWJoYXQgYWwtTnVzcmEsIGEgbWlsaXRhbnQgZ3JvdXAgbGlua2VkIHRvIGFsLVFhaWRhLCBkaWQgbm90IGVsYWJvcmF0ZS4iOwoJLy8JRGVzY3JpcHRpb24gPSAiQSBjYXIgYm9tYmluZyBpbiBEYW1hc2N1cyBoYXMga2lsbGVkIGF0IGxlYXN0IG5pbmUgc2VjdXJpdHkgZm9yY2VzLCB3aXRoIGFpZCBncm91cHMgdXJnaW5nIHRoZSBldmFjdWF0aW9uIG9mIGNpdmlsaWFucyB0cmFwcGVkIGluIHRoZSBlbWJhdHRsZWQgU3lyaWFuIHRvd24gb2YgUXVzYXlyLiBUaGUgU3lyaWFuIE9ic2VydmF0b3J5IGZvciBIdW1hbiBSaWdodHMgc2FpZCBvbiBTdW5kYXkgdGhlIGV4cGxvc2lvbiwgaW4gdGhlIGVhc3Qgb2YgdGhlIGNhcGl0YWwsIGFwcGVhcmVkIHRvIGhhdmUgYmVlbiBjYXJyaWVkIG91dCBieSB0aGUgZXh0cmVtaXN0IEFsLU51c3JhIEZyb250LCB3aGljaCBpcyBhbGxpZWQgdG8gYWwtUWFlZGEsIGFsdGhvdWdoIHRoZXJlIHdhcyBubyBpbW1lZGlhdGUgY29uZmlybWF0aW9uLiBJbiBMZWJhbm9uLCBzZWN1cml0eSBzb3VyY2VzIHNhaWQgdHdvIHJvY2tldHMgZmlyZWQgZnJvbSBTeXJpYSBsYW5kZWQgaW4gYSBib3JkZXIgYXJlYSwgYW5kIElzcmFlbGkgd2FyIHBsYW5lcyBjb3VsZCBiZSBoZWFyZCBmbHlpbmcgbG93IG92ZXIgc2V2ZXJhbCBwYXJ0cyBvZiB0aGUgY291bnRyeS4iOwoJCXB0MSA9IHB0QnVpbGRlci5idWlsZFBhcnNlVGhpY2tldChkZXNjcmlwdGlvbik7CQoJCXBocnMxID0gcGhyYXNlQnVpbGRlci5idWlsZFBUMnB0UGhyYXNlcyhwdDEpOwoJCXNlbnQxR3JwTHN0ID0gbGF0LmZvcm1Hcm91cGVkUGhyYXNlc0Zyb21DaHVua3NGb3JQYXJhKHBocnMxKTsKCQlsYXQuQWRkSW50ZW50KHNlbnQxR3JwTHN0LCAwKTsKCQkKCQkKCQoJCWxhdC5wcmludExhdHRpY2UoKTsKCQlsYXQucHJpbnRDb25jZXB0QnlQb3NpdGlvbigwKTsKCQkvKgoJCVNldDxJbnRlZ2VyPiBpbnRlbnQgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwoJCWludGVudC5hZGQoMCk7CgkJaW50ZW50LmFkZCgxKTsKCQlpbnQgZ2VuID0gbGF0LkdldE1heGltYWxDb25jZXB0KGludGVudCwwKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oImdlbmVyYXRvcjogIiArIGdlbik7CgkJaW50ZW50LmNsZWFyKCk7CgkJaW50ZW50LmFkZCgwKTsKCQlpbnRlbnQuYWRkKDMpOwoJCQoJCWxhdC5BZGRJbnRlbnQoaW50ZW50LCAwKTsKCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgZmlyc3QgYWRkaW50ZW50Iik7CgkJLy9sYXQucHJpbnRDb25jZXB0QnlQb3NpdGlvbigwKTsKCQkvL2xhdC5wcmludENvbmNlcHRCeVBvc2l0aW9uKDEpOwoJCWludGVudC5jbGVhcigpOwoJCWludGVudC5hZGQoMCk7CgkJaW50ZW50LmFkZCgyKTsKCQlsYXQuQWRkSW50ZW50KGludGVudCwgMCk7CgoJCWludGVudC5jbGVhcigpOwoJCWludGVudC5hZGQoMSk7CgkJaW50ZW50LmFkZCgyKTsKCgkJbGF0LkFkZEludGVudChpbnRlbnQsIDApOwoJCWludGVudC5jbGVhcigpOwoJCWludGVudC5hZGQoMSk7CgkJaW50ZW50LmFkZCgyKTsKCQlpbnRlbnQuYWRkKDMpOwoJCWxhdC5BZGRJbnRlbnQoaW50ZW50LCAwKTsKCQlsYXQucHJpbnRMYXR0aWNlKCk7CgkJbGF0LnByaW50TGF0dGljZVN0YXRzKCk7CgkJKi8KCX0KfQ==